{"version":3,"sources":["../src/fs/copyFiles.ts"],"names":["copyFiles","pattern","targetDir","options","opts","assignObject","ignore","cwd","srcDir","path","existsSync","mkdir","cleanDir","copyedFiles","resolve","reject","glob","files","file","isAbsoluteFile","fromFile","fromDir","toFile","fileInfo","targetFileDir","ABORT","copyFile","e"],"mappings":"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","file":"chunk-TTTBZG7J.mjs","sourcesContent":["/**\n* \n* \n* 复制文件夹，并且支持模板文件\n* \n*  1. 支持深度复制文件夹，保持文件夹结构\n*  2. 支持模板文件，模板文件以 .art 结尾，复制后去掉 .art后缀，采用art-template渲染\n   3. 支持忽略文件或文件夹\n   4. 支持文件或文件夹重命名\n \n   copyFiles(\"/temp/a*.ts\", targetDir, options)\n\n* \n*/\n\nimport { glob} from \"glob\";\nimport { assignObject } from \"../object/assignObject\";\nimport { mkdir } from \"./nodefs\";\nimport { existsSync } from \"node:fs\"; \nimport { ABORT } from \"../consts\";\nimport path from \"node:path\"\nimport { cleanDir } from \"./cleanDir\"; \nimport { copyFile } from \"./copyFile\";\n\n\nexport interface CopyFileInfo{\n    file?  : string                                             // 相对于源文件夹的文件路径\n    source?: string                                             // 源文件路径\n    target?: string                                             // 目标文件路径\n    vars?  : null | undefined | Record<string,any>             // 模板变量\n}\n \nexport interface CopyFilesOptions {\n\tvars?           : Record<string, any> | ((file: string) => Record<string, any> | Promise<Record<string, any>>); // 传递给模板的变量\n\tignore?         : string[];                                        // 忽略的文件或文件夹，支持通配符\n    clean?          : boolean;                                         // 是否清空目标文件夹\n    cwd?            : string;                                          // pattern的cwd\n    overwrite?      : boolean | ((filename: string) => boolean | Promise<boolean>); // 是否覆盖已存在的文件，可以是boolean或返回boolean的同步/异步函数\n\tbefore?         : (info:CopyFileInfo) => void | typeof ABORT;      // 复制前的回调\n\tafter?          : (info:CopyFileInfo) => void | typeof ABORT;      // 复制后的回调\n    error?          : (error:Error,{source,target}:{source: string, target: string})=>void | typeof ABORT // 复制出错的回调\n    templateOptions?: Record<string, any> | ((file: string) => Record<string, any> | Promise<Record<string, any>>); \n}\n/**\n * 拷贝满足条件的文件到目标文件夹\n * \n * @param pattern \n * @param targetDir \n * @param options \n * @returns  返回实际拷贝的文件列表\n */\nexport async function copyFiles( pattern: string, targetDir: string, options?: CopyFilesOptions):Promise<string[]> {\n\n\tconst opts = assignObject({  \n        ignore   : [],\n        clean    : false,\n        overwrite: false\n    }, options);\n\n\tconst { ignore, cwd=process.cwd() } = opts;\n\n    const srcDir = path.isAbsolute(pattern) ? path.dirname(pattern) : cwd;    \n \n\tif (!path.isAbsolute(targetDir)) targetDir = path.join(process.cwd(), targetDir);\n\tif (!existsSync(targetDir)) {\n\t\tawait mkdir(targetDir, { recursive: true });\n\t}\n\n    if (opts.clean) {\n        try{await cleanDir(targetDir)}catch{}\n    }\n    \n    const copyedFiles:string[] = []\n\n\treturn new Promise<string[]>((resolve, reject) => {\n\t\tglob(pattern, {\n\t\t\tignore,\n\t\t\tcwd:srcDir,\n            dot:true\n\t\t}).then(async (files) => {\n\t\t\tfor (let file of files) {\n                const isAbsoluteFile = path.isAbsolute(file); \n                const fromFile       = isAbsoluteFile ? file: path.join(srcDir, file)\n                const fromDir        = path.dirname(fromFile);\n                const toFile         = path.join(targetDir, isAbsoluteFile ? path.relative(fromDir,file) : file)           \n\n                const fileInfo:Required<CopyFileInfo> = {\n                    file,\n                    source: fromFile,\n                    target: toFile,\n                    vars:opts.vars\n                } \n\t\t\t\tlet targetFileDir = path.dirname(fileInfo.target);\n\t\t\t\tif (!existsSync(targetFileDir)) {\n\t\t\t\t\tawait mkdir(targetFileDir, { recursive: true });  \n\t\t\t\t}\n\t\t\t\tif (typeof options?.before == \"function\") {\n\t\t\t\t\tif(options.before(fileInfo)===ABORT){\n                        break\n                    }\n\t\t\t\t}\t\t\t\t\n\t\t\t\ttry {\n                    await copyFile(fromFile, toFile, opts); \n                    copyedFiles.push(toFile)\n                    if (typeof options?.after == \"function\") {\n                        if(options.after(fileInfo)===ABORT){\n                            break\n                        }\n                    }\n\t\t\t\t} catch (e: any) {                \n                    if (typeof options?.error == \"function\") {\n                        if(options.error(e,fileInfo)===ABORT){\n                            break\n                        }\n                    }\n                }\n\t\t\t}\n\t\t\tresolve(copyedFiles);\n\t\t}).catch(reject);\n\t});\n}"]}