From 46c896eacfce28c6aa72d008bcd8e18ca4745f1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=89=A7=E6=AF=85?= Date: Mon, 17 Aug 2020 16:45:48 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=F0=9F=8E=B8=20=E5=87=BA=E7=A0=81?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E7=9A=84=20DiskPublisher=20=E6=94=B9?= =?UTF-8?q?=E6=88=90=E6=94=AF=E6=8C=81=E4=BC=A0=E5=85=A5=E8=87=AA=E5=AE=9A?= =?UTF-8?q?=E4=B9=89=20FS?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/publisher/disk/index.ts | 32 ++++++--------- .../src/publisher/disk/utils.ts | 41 ++++++++++--------- 2 files changed, 33 insertions(+), 40 deletions(-) diff --git a/packages/code-generator/src/publisher/disk/index.ts b/packages/code-generator/src/publisher/disk/index.ts index b63649ab9..ff85d6487 100644 --- a/packages/code-generator/src/publisher/disk/index.ts +++ b/packages/code-generator/src/publisher/disk/index.ts @@ -1,16 +1,14 @@ -import { - IResultDir, - PublisherFactory, - IPublisher, - IPublisherFactoryParams, - PublisherError, -} from '../../types'; -import { writeFolder } from './utils'; +import * as defaultFs from 'fs'; +import { IResultDir, PublisherFactory, IPublisher, IPublisherFactoryParams, PublisherError } from '../../types'; +import { writeFolder, IFileSystem } from './utils'; + +export type { IFileSystem }; export interface IDiskFactoryParams extends IPublisherFactoryParams { outputPath?: string; projectSlug?: string; createProjectFolder?: boolean; + fs?: IFileSystem; } export interface IDiskPublisher extends IPublisher { @@ -18,11 +16,10 @@ export interface IDiskPublisher extends IPublisher { setOutputPath: (path: string) => void; } -export const createDiskPublisher: PublisherFactory< - IDiskFactoryParams, - IDiskPublisher -> = (params: IDiskFactoryParams = {}): IDiskPublisher => { - let { project, outputPath = './' } = params; +export const createDiskPublisher: PublisherFactory = ( + params: IDiskFactoryParams = {}, +): IDiskPublisher => { + let { project, outputPath = './', fs = defaultFs } = params; const getProject = (): IResultDir => { if (!project) { @@ -49,19 +46,14 @@ export const createDiskPublisher: PublisherFactory< const projectOutputPath = options.outputPath || outputPath; const overrideProjectSlug = options.projectSlug || params.projectSlug; - const createProjectFolder = - options.createProjectFolder || params.createProjectFolder; + const createProjectFolder = options.createProjectFolder || params.createProjectFolder; if (overrideProjectSlug) { projectToPublish.name = overrideProjectSlug; } try { - await writeFolder( - projectToPublish, - projectOutputPath, - createProjectFolder, - ); + await writeFolder(projectToPublish, projectOutputPath, createProjectFolder, fs); return { success: true, payload: projectOutputPath }; } catch (error) { throw new PublisherError(error); diff --git a/packages/code-generator/src/publisher/disk/utils.ts b/packages/code-generator/src/publisher/disk/utils.ts index 35fbbc2ad..1bceffef8 100644 --- a/packages/code-generator/src/publisher/disk/utils.ts +++ b/packages/code-generator/src/publisher/disk/utils.ts @@ -1,39 +1,38 @@ -import { existsSync, mkdir, writeFile } from 'fs'; +import * as systemFs from 'fs'; import { join } from 'path'; import { IResultDir, IResultFile } from '../../types'; +export interface IFileSystem { + existsSync: typeof systemFs.existsSync; + mkdir: typeof systemFs.mkdir; + writeFile: typeof systemFs.writeFile; +} + export const writeFolder = async ( folder: IResultDir, currentPath: string, createProjectFolder = true, + fs: IFileSystem = systemFs, ): Promise => { const { name, files, dirs } = folder; - const folderPath = createProjectFolder - ? join(currentPath, name) - : currentPath; + const folderPath = createProjectFolder ? join(currentPath, name) : currentPath; - if (!existsSync(folderPath)) { - await createDirectory(folderPath); + if (!fs.existsSync(folderPath)) { + await createDirectory(folderPath, fs); } - const promises = [ - writeFilesToFolder(folderPath, files), - writeSubFoldersToFolder(folderPath, dirs), - ]; + const promises = [writeFilesToFolder(folderPath, files, fs), writeSubFoldersToFolder(folderPath, dirs, fs)]; await Promise.all(promises); }; -const writeFilesToFolder = async ( - folderPath: string, - files: IResultFile[], -): Promise => { - const promises = files.map(file => { +const writeFilesToFolder = async (folderPath: string, files: IResultFile[], fs: IFileSystem): Promise => { + const promises = files.map((file) => { const fileName = file.ext ? `${file.name}.${file.ext}` : file.name; const filePath = join(folderPath, fileName); - return writeContentToFile(filePath, file.content); + return writeContentToFile(filePath, file.content, 'utf8', fs); }); await Promise.all(promises); @@ -42,17 +41,18 @@ const writeFilesToFolder = async ( const writeSubFoldersToFolder = async ( folderPath: string, subFolders: IResultDir[], + fs: IFileSystem, ): Promise => { - const promises = subFolders.map(subFolder => { + const promises = subFolders.map((subFolder) => { return writeFolder(subFolder, folderPath); }); await Promise.all(promises); }; -const createDirectory = (pathToDir: string): Promise => { +const createDirectory = (pathToDir: string, fs: IFileSystem): Promise => { return new Promise((resolve, reject) => { - mkdir(pathToDir, { recursive: true }, err => { + fs.mkdir(pathToDir, { recursive: true }, (err) => { err ? reject(err) : resolve(); }); }); @@ -62,9 +62,10 @@ const writeContentToFile = ( filePath: string, fileContent: string, encoding: string = 'utf8', + fs: IFileSystem, ): Promise => { return new Promise((resolve, reject) => { - writeFile(filePath, fileContent, encoding, err => { + fs.writeFile(filePath, fileContent, encoding, (err) => { err ? reject(err) : resolve(); }); });