{"version":3,"sources":["../src/fs/copyDirs.ts"],"names":["copyDirs","srcDir","targetDir","options","opts","assignObject","ignore","pattern","existsSync","path","mkdir","cleanDir","resolve","reject","glob","files","file","isAbsoluteFile","fromFile","fromDir","toFile","fileInfo","targetFileDir","ABORT","copyFile","e"],"mappings":";;;;AAuCA,eAAsBA,CAAAA,CAAUC,EAAgBC,CAAmBC,CAAAA,CAAAA,CAA2B,CAC7F,IAAMC,CAAOC,CAAAA,CAAAA,CAAa,CACnB,OAAS,CAAA,QAAA,CACT,MAAO,CAAA,EACP,CAAA,KAAA,CAAM,KACV,CAAGF,CAAAA,CAAO,CACP,CAAA,CAAE,MAAAG,CAAAA,CAAAA,CAAQ,QAAAC,CAAQ,CAAA,CAAIH,CAE5B,CAAA,GAAI,CAACI,UAAAA,CAAWP,CAAM,CAAG,CAAA,MAAM,IAAI,KAAA,CAAM,CAAUA,OAAAA,EAAAA,CAAM,aAAa,CAOnE,CAAA,GANEQ,CAAK,CAAA,UAAA,CAAWP,CAAS,CAAA,GAC7BA,EAAYO,CAAK,CAAA,IAAA,CAAK,OAAQ,CAAA,GAAA,EAAOP,CAAAA,CAAS,GAC1CM,UAAWN,CAAAA,CAAS,CACxB,EAAA,MAAMQ,CAAMR,CAAAA,CAAAA,CAAW,CAAE,SAAW,CAAA,IAAK,CAAC,CAAA,CAGpCE,CAAK,CAAA,KAAA,CACL,GAAG,CAAC,MAAMO,GAAST,CAAAA,CAAS,EAAC,CAAA,KAAM,EAI1C,OAAO,IAAI,OAAA,CAAc,CAACU,CAAAA,CAASC,IAAW,CAC7CC,IAAAA,CAAKP,CAAS,CAAA,CACb,MAAAD,CAAAA,CAAAA,CACA,IAAKL,CACN,CAAC,CAAE,CAAA,IAAA,CAAK,MAAOc,CAAAA,EAAU,CACxB,IAAA,IAASC,CAAQD,IAAAA,CAAAA,CAAO,CACX,IAAME,CAAiBR,CAAAA,CAAAA,CAAK,WAAWO,CAAI,CAAA,CACrCE,CAAiBD,CAAAA,CAAAA,CAAiBD,CAAMP,CAAAA,CAAAA,CAAK,KAAKR,CAAQe,CAAAA,CAAI,CAC9DG,CAAAA,CAAAA,CAAiBV,CAAK,CAAA,OAAA,CAAQS,CAAQ,CACtCE,CAAAA,CAAAA,CAAiBX,CAAK,CAAA,IAAA,CAAKP,CAAWe,CAAAA,CAAAA,CAAiBR,EAAK,QAASU,CAAAA,CAAAA,CAAQH,CAAI,CAAA,CAAIA,CAAI,CAAA,CAEzFK,EAAkC,CACpC,IAAA,CAAAL,CACA,CAAA,MAAA,CAAOE,CACP,CAAA,MAAA,CAAOE,EACP,IAAKhB,CAAAA,CAAAA,CAAK,IACd,CAAA,CAERkB,CAAgBb,CAAAA,CAAAA,CAAK,QAAQY,CAAS,CAAA,MAAM,CAIhD,CAAA,GAHKb,UAAWc,CAAAA,CAAa,CAC5B,EAAA,MAAMZ,CAAMY,CAAAA,CAAAA,CAAe,CAAE,SAAA,CAAW,IAAK,CAAC,EAE3C,OAAOnB,CAAAA,EAAS,MAAU,EAAA,UAAA,EAC1BA,CAAQ,CAAA,MAAA,CAAOkB,CAAQ,CAAIE,GAAAA,GAAAA,CACX,MAGpB,GAAI,CAEY,GADA,MAAMC,GAASN,CAAAA,CAAAA,CAAUE,CAAQhB,CAAAA,CAAI,CACjC,CAAA,OAAOD,GAAS,KAAS,EAAA,UAAA,EACtBA,CAAQ,CAAA,KAAA,CAAMkB,CAAQ,CAAA,GAAIE,IACzB,KAGxB,CAAA,MAASE,CAAQ,CAAA,CACD,GAAI,OAAOtB,GAAS,KAAS,EAAA,UAAA,EACtBA,CAAQ,CAAA,KAAA,CAAMsB,CAAEJ,CAAAA,CAAQ,IAAIE,GAC3B,CAAA,KAGZ,CACb,CACAX,CAAQ,GACT,CAAC,CAAA,CAAE,KAAMC,CAAAA,CAAM,EAChB,CAAC,CACF","file":"chunk-G6MTBPS3.mjs","sourcesContent":["/**\r\n* \r\n* \r\n* 复制文件夹，并且支持模板文件\r\n* \r\n*  1. 支持深度复制文件夹，保持文件夹结构\r\n*  2. 支持模板文件，模板文件以 .art 结尾，复制后去掉 .art后缀，采用art-template渲染\r\n   3. 支持忽略文件或文件夹\r\n   4. 支持文件或文件夹重命名 \r\n* \r\n*/\r\n\r\nimport { glob} from \"glob\";\r\nimport { assignObject } from \"../object/assignObject\";\r\nimport { mkdir } from \"./nodefs\";\r\nimport { existsSync } from \"node:fs\";\r\nimport { ABORT } from \"../consts\";\r\nimport path from \"node:path\"\r\nimport { cleanDir } from \"./cleanDir\";\r\nimport type {CopyFileInfo} from \"./copyFiles\" \r\nimport { copyFile } from \"./copyFile\";\r\n\r\nexport type { CopyFileInfo } from \"./copyFiles\"\r\n\r\nexport interface CopyDirsOptions {\r\n\tvars?            : Record<string, any> | ((file: string) => Record<string, any> | Promise<Record<string, any>>); // 传递给模板的变量\r\n\tpattern?         : string;                    // 匹配的文件或文件夹，支持通配符\r\n\tignore?          : string[];                  // 忽略的文件或文件夹，支持通配符\r\n    clean?           : boolean                    // 是否清空目标文件夹\r\n    overwrite?       : boolean | ((filename: string) => boolean | Promise<boolean>); // 是否覆盖已存在的文件，可以是boolean或返回boolean的同步/异步函数\r\n\tbefore?          : (info:CopyFileInfo) => void | typeof ABORT; // 复制前的回调\r\n\tafter?           : (info:CopyFileInfo) => void | typeof ABORT; // 复制后的回调\r\n    error?           : (error:Error,{source,target}:{source: string, target: string})=>void | typeof ABORT // 复制出错的回调\r\n    templateOptions? : Record<string, any> | ((file: string) => Record<string, any> | Promise<Record<string, any>>); \r\n}\r\n\r\n\r\n \r\n\r\nexport async function copyDirs(\tsrcDir: string,\ttargetDir: string, options?: CopyDirsOptions) {\r\n\tconst opts = assignObject({ \r\n        pattern: \"**/*.*\",\r\n        ignore:[],\r\n        clean:false \r\n    }, options);\r\n\tconst { ignore, pattern } = opts;\r\n\r\n\tif (!existsSync(srcDir)) throw new Error(`srcDir=${srcDir} not exists`);\r\n\tif (!path.isAbsolute(targetDir))\r\n\t\ttargetDir = path.join(process.cwd(), targetDir);\r\n\tif (!existsSync(targetDir)) {\r\n\t\tawait mkdir(targetDir, { recursive: true });\r\n\t}\r\n\r\n    if (opts.clean) {\r\n        try{await cleanDir(targetDir)}catch{}\r\n    }\r\n\r\n\r\n\treturn new Promise<void>((resolve, reject) => {\r\n\t\tglob(pattern, {\r\n\t\t\tignore,\r\n\t\t\tcwd: srcDir,\r\n\t\t}).then(async (files) => {\r\n\t\t\tfor (let file of files) { \r\n                const isAbsoluteFile = path.isAbsolute(file); \r\n                const fromFile       = isAbsoluteFile ? file: path.join(srcDir, file)\r\n                const fromDir        = path.dirname(fromFile);\r\n                const toFile         = path.join(targetDir, isAbsoluteFile ? path.relative(fromDir,file) : file)           \r\n\r\n                const fileInfo:Required<CopyFileInfo> = {\r\n                    file,\r\n                    source:fromFile,\r\n                    target:toFile,\r\n                    vars:opts.vars\r\n                }                 \r\n\r\n\t\t\t\tlet targetFileDir = path.dirname(fileInfo.target);\r\n\t\t\t\tif (!existsSync(targetFileDir)) {\r\n\t\t\t\t\tawait mkdir(targetFileDir, { recursive: true }); // 创建目录\r\n\t\t\t\t}\r\n\t\t\t\tif (typeof options?.before == \"function\") {\r\n\t\t\t\t\tif(options.before(fileInfo)===ABORT){\r\n                        break\r\n                    }\r\n\t\t\t\t}\t\t\t\t\r\n\t\t\t\ttry { \r\n                    await copyFile(fromFile, toFile, opts);\r\n                    if (typeof options?.after == \"function\") {\r\n                        if(options.after(fileInfo)===ABORT){\r\n                            break\r\n                        }\r\n                    }\r\n\t\t\t\t} catch (e: any) {                \r\n                    if (typeof options?.error == \"function\") {\r\n                        if(options.error(e,fileInfo)===ABORT){\r\n                            break\r\n                        }\r\n                    }                    \r\n                }\r\n\t\t\t}\r\n\t\t\tresolve();\r\n\t\t}).catch(reject)\r\n\t});\r\n}\r\n\r\nexport { ABORT } from \"../consts\";\r\n\r\n "]}