rolldown-plugin-copy 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2,6 +2,82 @@ import { AsyncPluginHooks, Plugin } from "rolldown";
2
2
  import { Format, Partial } from "ts-vista";
3
3
  import { writeFile } from "node:fs/promises";
4
4
  /**
5
+ * Kind of the resolved target.
6
+ */
7
+ type ResolvedTargetKind = "file" | "directory";
8
+ /**
9
+ * Resolved target.
10
+ */
11
+ type ResolvedTarget = {
12
+ /**
13
+ * Kind of the copied item.
14
+ */
15
+ kind: ResolvedTargetKind;
16
+ /**
17
+ * Absolute source path of the target.
18
+ */
19
+ src: string;
20
+ /**
21
+ * Absolute destination path of target.
22
+ */
23
+ dest: string;
24
+ /**
25
+ * Whether the target was renamed.
26
+ */
27
+ renamed: boolean;
28
+ /**
29
+ * Whether the target was transformed.
30
+ */
31
+ transformed: boolean;
32
+ };
33
+ /**
34
+ * Copy start event.
35
+ */
36
+ type CopyStartEvent = {
37
+ /**
38
+ * Current working directory.
39
+ */
40
+ cwd: string;
41
+ /**
42
+ * Resolved targets.
43
+ */
44
+ targets: ResolvedTarget[];
45
+ };
46
+ /**
47
+ * Listener for copy start event.
48
+ */
49
+ type CopyStartEventListener = (event: CopyStartEvent) => void | Promise<void>;
50
+ /**
51
+ * Copy event.
52
+ */
53
+ type CopyEvent = {
54
+ /**
55
+ * Resolved target.
56
+ */
57
+ target: ResolvedTarget;
58
+ };
59
+ /**
60
+ * Listener for copy event.
61
+ */
62
+ type CopyEventListener = (event: CopyEvent) => void | Promise<void>;
63
+ /**
64
+ * Copy end event.
65
+ */
66
+ type CopyEndEvent = {
67
+ /**
68
+ * Current working directory.
69
+ */
70
+ cwd: string;
71
+ /**
72
+ * Error when copy failed.
73
+ */
74
+ error?: unknown;
75
+ };
76
+ /**
77
+ * Listener for copy end event.
78
+ */
79
+ type CopyEndEventListener = (event: CopyEndEvent) => void | Promise<void>;
80
+ /**
5
81
  * Write file data.
6
82
  */
7
83
  type WriteFileData = Parameters<typeof writeFile>[1];
@@ -85,6 +161,12 @@ type CompleteOptions = {
85
161
  */
86
162
  hook: AsyncPluginHooks;
87
163
  /**
164
+ * Array of targets to copy.
165
+ *
166
+ * By default, it is `[]`.
167
+ */
168
+ targets: Target[];
169
+ /**
88
170
  * Copy items once. Useful in watch mode.
89
171
  *
90
172
  * By default, it is `false`.
@@ -109,11 +191,17 @@ type CompleteOptions = {
109
191
  */
110
192
  verbose: boolean;
111
193
  /**
112
- * Array of targets to copy.
113
- *
114
- * By default, it is `[]`.
194
+ * Listener called before any copy begins.
115
195
  */
116
- targets: Target[];
196
+ onStart: CopyStartEventListener | undefined;
197
+ /**
198
+ * Listener for copy events. Called for each copied item.
199
+ */
200
+ onCopy: CopyEventListener | undefined;
201
+ /**
202
+ * Listener called after all copies complete.
203
+ */
204
+ onEnd: CopyEndEventListener | undefined;
117
205
  };
118
206
  /**
119
207
  * Options for `copy` plugin.
@@ -143,5 +231,5 @@ type Options = Format<Partial<CompleteOptions>>;
143
231
  * ```
144
232
  */
145
233
  declare const copy: (options?: Options) => Plugin;
146
- export { type Options, type Target, type TargetRename, type TargetRenameOptions, type TargetTransform, type TargetTransformOptions, type WriteFileData, copy, copy as default };
234
+ export { type CopyEndEvent, type CopyEndEventListener, type CopyEvent, type CopyEventListener, type CopyStartEvent, type CopyStartEventListener, type Options, type ResolvedTarget, type ResolvedTargetKind, type Target, type TargetRename, type TargetRenameOptions, type TargetTransform, type TargetTransformOptions, type WriteFileData, copy, copy as default };
147
235
  //# sourceMappingURL=index.d.ts.map
package/dist/index.js CHANGED
@@ -37,11 +37,14 @@ let tinyglobby = require("tinyglobby");
37
37
  const OPTIONS_DEFAULT = {
38
38
  cwd: process.cwd(),
39
39
  hook: "generateBundle",
40
+ targets: [],
40
41
  copyOnce: false,
41
42
  copySync: false,
42
43
  flatten: false,
43
44
  verbose: false,
44
- targets: []
45
+ onStart: void 0,
46
+ onCopy: void 0,
47
+ onEnd: void 0
45
48
  };
46
49
 
47
50
  const log = (0, consola.createConsola)({ formatOptions: { date: false } });
@@ -112,9 +115,19 @@ const buildLogMessage = ({ cwd, target }) => {
112
115
  if (flags.length > 0) message += ` [${flags.join(",")}]`;
113
116
  return message;
114
117
  };
115
- const copyTargets = async ({ cwd, targets, copySync, verbose }) => {
118
+ const emitCopy = async ({ onCopy, target }) => {
119
+ if (onCopy !== void 0) await onCopy({ target: {
120
+ kind: target.kind,
121
+ src: target.src,
122
+ dest: target.dest,
123
+ renamed: target.renamed,
124
+ transformed: target.transformed
125
+ } });
126
+ };
127
+ const tryCopyTargets = async ({ cwd, targets, copySync, verbose, onCopy }) => {
116
128
  if (targets.length === 0) {
117
129
  if (verbose) {
130
+ console.log("");
118
131
  log.success("no items to copy");
119
132
  console.log("");
120
133
  }
@@ -127,6 +140,10 @@ const copyTargets = async ({ cwd, targets, copySync, verbose }) => {
127
140
  target,
128
141
  copySync
129
142
  });
143
+ await emitCopy({
144
+ onCopy,
145
+ target
146
+ });
130
147
  return verbose ? buildLogMessage({
131
148
  cwd,
132
149
  target
@@ -144,16 +161,40 @@ const copyTargets = async ({ cwd, targets, copySync, verbose }) => {
144
161
  target,
145
162
  copySync
146
163
  });
164
+ await emitCopy({
165
+ onCopy,
166
+ target
167
+ });
147
168
  if (verbose) logs.push(buildLogMessage({
148
169
  cwd,
149
170
  target
150
171
  }));
151
172
  }
152
173
  if (verbose) {
174
+ console.log("");
153
175
  for (let i = 0; i < logs.length; i++) log.success(logs[i]);
154
176
  console.log("");
155
177
  }
156
178
  };
179
+ const copyTargets = async (options) => {
180
+ const { onStart, onEnd, targets } = options;
181
+ let error = void 0;
182
+ try {
183
+ if (onStart !== void 0) await onStart({
184
+ cwd: options.cwd,
185
+ targets
186
+ });
187
+ await tryCopyTargets(options);
188
+ } catch (err) {
189
+ error = err;
190
+ } finally {
191
+ if (onEnd !== void 0) await onEnd({
192
+ cwd: options.cwd,
193
+ error
194
+ });
195
+ }
196
+ if (error !== void 0) throw error;
197
+ };
157
198
 
158
199
  const renameTarget = (options) => {
159
200
  const parsed = node_path.parse(options.fileName);
@@ -252,7 +293,7 @@ const resolveSourcePaths = async ({ cwd, sources }) => {
252
293
  };
253
294
 
254
295
  var name = "rolldown-plugin-copy";
255
- var version = "0.1.1";
296
+ var version = "0.2.0";
256
297
 
257
298
  /**
258
299
  * A utility to copy files and directories.
@@ -285,7 +326,6 @@ const copy = (options) => {
285
326
  version,
286
327
  [opts.hook]: async () => {
287
328
  if (opts.copyOnce === true && copied === true) return void 0;
288
- if (opts.targets.length === 0) return void 0;
289
329
  const targets = [];
290
330
  for (let i = 0; i < opts.targets.length; i++) {
291
331
  const target = opts.targets[i];
@@ -310,7 +350,10 @@ const copy = (options) => {
310
350
  cwd: opts.cwd,
311
351
  targets,
312
352
  copySync: opts.copySync,
313
- verbose: opts.verbose
353
+ verbose: opts.verbose,
354
+ onStart: opts.onStart,
355
+ onEnd: opts.onEnd,
356
+ onCopy: opts.onCopy
314
357
  });
315
358
  copied = true;
316
359
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["Path","Fsp","Path","Path","Fsp","Path","Fsp"],"sources":["../src/const/options.ts","../src/configs/log.ts","../src/functions/copy.ts","../src/functions/rename.ts","../src/functions/generate.ts","../src/functions/resolve.ts","../package.json","../src/plugins/copy.ts","../src/index.ts"],"sourcesContent":["import type { CompleteOptions } from \"#/@types/options\";\n\nconst OPTIONS_DEFAULT = {\n cwd: process.cwd(),\n hook: \"generateBundle\",\n copyOnce: false,\n copySync: false,\n flatten: false,\n verbose: false,\n targets: [],\n} as const satisfies CompleteOptions;\n\nexport { OPTIONS_DEFAULT };\n","import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import type { GeneratedTarget } from \"#/functions/generate\";\n\nimport * as Fs from \"node:fs\";\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { log } from \"#/configs/log\";\n\nconst canCopyInParallel = (targets: GeneratedTarget[]): boolean => {\n const destinations: Set<string> = new Set();\n\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n /**\n * Raw directory copies write a whole subtree, so exact destination checks\n * cannot detect nested conflicts with other targets in parallel.\n */\n if (target.kind === \"directory\") return false;\n\n /**\n * Multiple targets writing the same path leads to conflicts, so\n * keep the original target order by falling back to sequential copies.\n */\n if (destinations.has(target.dest)) return false;\n\n destinations.add(target.dest);\n }\n\n return true;\n};\n\nconst ensureDirSync = (filePath: string): void => {\n Fs.mkdirSync(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\nconst ensureDirAsync = async (filePath: string): Promise<void> => {\n await Fsp.mkdir(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\ntype CopyFileOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyFile = async ({\n src,\n dest,\n copySync,\n}: CopyFileOptions): Promise<void> => {\n if (copySync) {\n ensureDirSync(dest);\n\n Fs.copyFileSync(src, dest);\n\n return void 0;\n }\n\n await ensureDirAsync(dest);\n\n await Fsp.copyFile(src, dest);\n};\n\ntype CopyDirectoryOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyDirectory = async ({\n src,\n dest,\n copySync,\n}: CopyDirectoryOptions): Promise<void> => {\n if (copySync) {\n Fs.cpSync(src, dest, {\n recursive: true,\n });\n\n return void 0;\n }\n\n await Fsp.cp(src, dest, {\n recursive: true,\n });\n};\n\nconst writeTransformed = async (target: GeneratedTarget): Promise<void> => {\n await ensureDirAsync(target.dest);\n await Fsp.writeFile(target.dest, target.content ?? \"\");\n};\n\ntype CopyTargetOptions = {\n target: GeneratedTarget;\n copySync: boolean;\n};\n\nconst copyTarget = async ({\n target,\n copySync,\n}: CopyTargetOptions): Promise<void> => {\n if (target.transformed) {\n return await writeTransformed(target);\n }\n\n if (target.kind === \"file\") {\n return await copyFile({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n }\n\n return await copyDirectory({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n};\n\ntype BuildLogMessageOptions = {\n cwd: string;\n target: GeneratedTarget;\n};\n\nconst buildLogMessage = ({ cwd, target }: BuildLogMessageOptions): string => {\n let message: string = `${Path.relative(cwd, target.src)} → ${target.dest}`;\n\n const flags: string[] = [];\n\n if (target.renamed) flags.push(\"R\");\n if (target.transformed) flags.push(\"T\");\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n return message;\n};\n\ntype CopyTargetsOptions = {\n cwd: string;\n targets: GeneratedTarget[];\n copySync: boolean;\n verbose: boolean;\n};\n\nconst copyTargets = async ({\n cwd,\n targets,\n copySync,\n verbose,\n}: CopyTargetsOptions): Promise<void> => {\n if (targets.length === 0) {\n if (verbose) {\n log.success(\"no items to copy\");\n console.log(\"\");\n }\n\n return void 0;\n }\n\n const logs: string[] = [];\n\n if (!copySync && canCopyInParallel(targets)) {\n const result: string[] = (\n await Promise.all(\n targets.map(\n async (\n target: GeneratedTarget,\n ): Promise<string | undefined> => {\n await copyTarget({\n target,\n copySync,\n });\n\n return verbose\n ? buildLogMessage({\n cwd,\n target,\n })\n : void 0;\n },\n ),\n )\n ).filter((item: string | undefined): item is string => item !== void 0);\n\n if (verbose) {\n for (let i: number = 0; i < result.length; i++) {\n const message: string | undefined = result[i];\n\n if (message === void 0) continue;\n\n logs.push(message);\n }\n }\n } else {\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n await copyTarget({\n target,\n copySync,\n });\n\n if (verbose) {\n logs.push(\n buildLogMessage({\n cwd,\n target,\n }),\n );\n }\n }\n }\n\n if (verbose) {\n for (let i: number = 0; i < logs.length; i++) {\n log.success(logs[i]);\n }\n\n console.log(\"\");\n }\n};\n\nexport type { CopyTargetsOptions };\nexport { copyTargets };\n","import type { TargetRename } from \"#/@types/target\";\n\nimport * as Path from \"node:path\";\n\ntype RenameTargetOptions = {\n path: string;\n fileName: string;\n rename: TargetRename;\n};\n\nconst renameTarget = (options: RenameTargetOptions): string => {\n const parsed: Path.ParsedPath = Path.parse(options.fileName);\n\n return typeof options.rename === \"function\"\n ? options.rename({\n path: options.path,\n name: parsed.name,\n extension: parsed.ext.replace(\".\", \"\"),\n })\n : options.rename;\n};\n\nexport { renameTarget };\n","import type * as Fs from \"node:fs\";\n\nimport type { Target, WriteFileData } from \"#/@types/target\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { renameTarget } from \"./rename\";\n\ntype ResolveDestDirOptions = {\n cwd: string;\n src: string;\n dest: string;\n flatten: boolean;\n};\n\nconst resolveDestDir = ({\n cwd,\n src,\n dest,\n flatten,\n}: ResolveDestDirOptions): string => {\n if (flatten) return dest;\n\n const relativeDir: string = Path.dirname(Path.relative(cwd, src));\n\n if (relativeDir === \".\") return dest;\n\n const relativeDirParts: string[] = relativeDir.split(Path.sep);\n\n return Path.join(dest, ...relativeDirParts.slice(1));\n};\n\ntype GenerateTargetsOptions = {\n cwd: string;\n src: string;\n target: Target;\n flatten: boolean;\n};\n\ntype GeneratedTargetKind = \"file\" | \"directory\";\n\ntype GeneratedTarget = {\n kind: GeneratedTargetKind;\n src: string;\n dest: string;\n renamed: boolean;\n transformed: boolean;\n content?: WriteFileData;\n};\n\nconst generateTargets = async ({\n cwd,\n src,\n target,\n flatten,\n}: GenerateTargetsOptions): Promise<GeneratedTarget[]> => {\n const stats: Fs.Stats = await Fsp.stat(src);\n\n if (target.transform && stats.isDirectory()) return [];\n\n const parsed = Path.parse(src);\n\n const destinations =\n typeof target.dest === \"string\"\n ? [\n target.dest,\n ]\n : target.dest;\n\n const result: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < destinations.length; i++) {\n const dest: string | undefined = destinations[i];\n\n if (dest === void 0) continue;\n\n const destDir: string = resolveDestDir({\n cwd,\n src,\n dest,\n flatten,\n });\n\n const destPath: string = target.rename\n ? renameTarget({\n path: src,\n fileName: parsed.base,\n rename: target.rename,\n })\n : parsed.base;\n\n result.push({\n kind: stats.isFile() ? \"file\" : \"directory\",\n src,\n dest: Path.join(destDir, destPath),\n renamed: Boolean(target.rename),\n transformed: Boolean(target.transform),\n ...(target.transform && {\n content:\n typeof target.transform === \"function\"\n ? await target.transform({\n fileName: parsed.base,\n content: await Fsp.readFile(src),\n })\n : target.transform,\n }),\n });\n }\n\n return result;\n};\n\nexport type { GeneratedTarget, GeneratedTargetKind, GenerateTargetsOptions };\nexport { generateTargets };\n","import * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { glob } from \"tinyglobby\";\n\ntype ResolveSourcePathsOptions = {\n cwd: string;\n sources: string[];\n};\n\nconst isGlobSource = (source: string): boolean =>\n source.startsWith(\"!\") ||\n source.includes(\"*\") ||\n source.includes(\"?\") ||\n source.includes(\"[\") ||\n source.includes(\"{\");\n\nconst normalizeGlobSource = (cwd: string, source: string): string => {\n const negated: boolean = source.startsWith(\"!\");\n\n const path: string = negated ? source.slice(1) : source;\n\n const pattern: string = Path.isAbsolute(path)\n ? Path.relative(cwd, path)\n : path;\n\n return negated ? `!${pattern}` : pattern;\n};\n\nconst resolveExplicitSourcePath = async (\n cwd: string,\n source: string,\n): Promise<string[]> => {\n const path: string = Path.resolve(cwd, source);\n\n try {\n await Fsp.stat(path);\n\n return [\n path,\n ];\n } catch {\n return [];\n }\n};\n\nconst resolveGlobSourcePaths = async (\n cwd: string,\n sources: string[],\n): Promise<string[]> => {\n const patterns: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n patterns.push(normalizeGlobSource(cwd, source));\n }\n\n return await glob(patterns, {\n absolute: true,\n cwd,\n onlyFiles: true,\n });\n};\n\nconst resolveSourcePaths = async ({\n cwd,\n sources,\n}: ResolveSourcePathsOptions): Promise<string[]> => {\n const paths: string[] = [];\n const globSources: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n if (isGlobSource(source)) {\n globSources.push(source);\n continue;\n }\n\n paths.push(...(await resolveExplicitSourcePath(cwd, source)));\n }\n\n if (globSources.length > 0) {\n paths.push(...(await resolveGlobSourcePaths(cwd, globSources)));\n }\n\n return paths;\n};\n\nexport type { ResolveSourcePathsOptions };\nexport { resolveSourcePaths };\n","","import type { Plugin } from \"rolldown\";\n\nimport type { CompleteOptions, Options } from \"#/@types/options\";\nimport type { Target } from \"#/@types/target\";\nimport type { GeneratedTarget } from \"#/functions/generate\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { OPTIONS_DEFAULT } from \"#/const/options\";\nimport { copyTargets } from \"#/functions/copy\";\nimport { generateTargets } from \"#/functions/generate\";\nimport { resolveSourcePaths } from \"#/functions/resolve\";\nimport { name, version } from \"../../package.json\";\n\n/**\n * A utility to copy files and directories.\n *\n * ### Example\n *\n * ```ts\n * import { defineConfig } from \"rolldown\";\n * import { copy } from \"rolldown-plugin-copy\";\n *\n * export default defineConfig({\n * plugins: [\n * copy({\n * targets: [\n * {\n * src: \"./public/static/css/index.css\",\n * dest: \"./dist/public/static/css\",\n * },\n * ],\n * }),\n * ],\n * });\n * ```\n */\nconst copy = (options?: Options): Plugin => {\n const opts: CompleteOptions = toMerged(OPTIONS_DEFAULT, options ?? {});\n\n let copied: boolean = false;\n\n return {\n name,\n version,\n [opts.hook]: async (): Promise<void> => {\n if (opts.copyOnce === true && copied === true) return void 0;\n\n if (opts.targets.length === 0) return void 0;\n\n const targets: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < opts.targets.length; i++) {\n const target: Target | undefined = opts.targets[i];\n\n if (target === void 0) continue;\n\n const paths: string[] = await resolveSourcePaths({\n cwd: opts.cwd,\n sources:\n typeof target.src === \"string\"\n ? [\n target.src,\n ]\n : target.src,\n });\n\n for (let j: number = 0; j < paths.length; j++) {\n const src: string | undefined = paths[j];\n\n if (src === void 0) continue;\n\n const tg: GeneratedTarget[] = await generateTargets({\n cwd: opts.cwd,\n src,\n target,\n flatten: opts.flatten,\n });\n\n targets.push(...tg);\n }\n }\n\n await copyTargets({\n cwd: opts.cwd,\n targets,\n copySync: opts.copySync,\n verbose: opts.verbose,\n });\n\n copied = true;\n },\n };\n};\n\nexport { copy };\n","import { copy } from \"#/plugins/copy\";\n\nexport default copy;\n\nexport type { Options } from \"#/@types/options\";\nexport type {\n Target,\n TargetRename,\n TargetRenameOptions,\n TargetTransform,\n TargetTransformOptions,\n WriteFileData,\n} from \"#/@types/target\";\n\nexport { copy } from \"#/plugins/copy\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["Path","Fsp","Path","Path","Fsp","Path","Fsp"],"sources":["../src/const/options.ts","../src/configs/log.ts","../src/functions/copy.ts","../src/functions/rename.ts","../src/functions/generate.ts","../src/functions/resolve.ts","../package.json","../src/plugins/copy.ts","../src/index.ts"],"sourcesContent":["import type { CompleteOptions } from \"#/@types/options\";\n\nconst OPTIONS_DEFAULT = {\n cwd: process.cwd(),\n hook: \"generateBundle\",\n targets: [],\n copyOnce: false,\n copySync: false,\n flatten: false,\n verbose: false,\n onStart: void 0,\n onCopy: void 0,\n onEnd: void 0,\n} as const satisfies CompleteOptions;\n\nexport { OPTIONS_DEFAULT };\n","import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import type {\n CopyEndEventListener,\n CopyEventListener,\n CopyStartEventListener,\n} from \"#/@types/event\";\nimport type { GeneratedTarget } from \"#/functions/generate\";\n\nimport * as Fs from \"node:fs\";\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { log } from \"#/configs/log\";\n\nconst canCopyInParallel = (targets: GeneratedTarget[]): boolean => {\n const destinations: Set<string> = new Set();\n\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n /**\n * Raw directory copies write a whole subtree, so exact destination checks\n * cannot detect nested conflicts with other targets in parallel.\n */\n if (target.kind === \"directory\") return false;\n\n /**\n * Multiple targets writing the same path leads to conflicts, so\n * keep the original target order by falling back to sequential copies.\n */\n if (destinations.has(target.dest)) return false;\n\n destinations.add(target.dest);\n }\n\n return true;\n};\n\nconst ensureDirSync = (filePath: string): void => {\n Fs.mkdirSync(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\nconst ensureDirAsync = async (filePath: string): Promise<void> => {\n await Fsp.mkdir(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\ntype CopyFileOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyFile = async ({\n src,\n dest,\n copySync,\n}: CopyFileOptions): Promise<void> => {\n if (copySync) {\n ensureDirSync(dest);\n\n Fs.copyFileSync(src, dest);\n\n return void 0;\n }\n\n await ensureDirAsync(dest);\n\n await Fsp.copyFile(src, dest);\n};\n\ntype CopyDirectoryOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyDirectory = async ({\n src,\n dest,\n copySync,\n}: CopyDirectoryOptions): Promise<void> => {\n if (copySync) {\n Fs.cpSync(src, dest, {\n recursive: true,\n });\n\n return void 0;\n }\n\n await Fsp.cp(src, dest, {\n recursive: true,\n });\n};\n\nconst writeTransformed = async (target: GeneratedTarget): Promise<void> => {\n await ensureDirAsync(target.dest);\n await Fsp.writeFile(target.dest, target.content ?? \"\");\n};\n\ntype CopyTargetOptions = {\n target: GeneratedTarget;\n copySync: boolean;\n};\n\nconst copyTarget = async ({\n target,\n copySync,\n}: CopyTargetOptions): Promise<void> => {\n if (target.transformed) {\n return await writeTransformed(target);\n }\n\n if (target.kind === \"file\") {\n return await copyFile({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n }\n\n return await copyDirectory({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n};\n\ntype BuildLogMessageOptions = {\n cwd: string;\n target: GeneratedTarget;\n};\n\nconst buildLogMessage = ({ cwd, target }: BuildLogMessageOptions): string => {\n let message: string = `${Path.relative(cwd, target.src)} → ${target.dest}`;\n\n const flags: string[] = [];\n\n if (target.renamed) flags.push(\"R\");\n if (target.transformed) flags.push(\"T\");\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n return message;\n};\n\ntype EmitCopyOptions = {\n onCopy: CopyEventListener | undefined;\n target: GeneratedTarget;\n};\n\nconst emitCopy = async ({ onCopy, target }: EmitCopyOptions): Promise<void> => {\n if (onCopy !== void 0) {\n await onCopy({\n target: {\n kind: target.kind,\n src: target.src,\n dest: target.dest,\n renamed: target.renamed,\n transformed: target.transformed,\n },\n });\n }\n};\n\ntype TryCopyTargetsOptions = {\n cwd: string;\n targets: GeneratedTarget[];\n copySync: boolean;\n verbose: boolean;\n onCopy: CopyEventListener | undefined;\n};\n\nconst tryCopyTargets = async ({\n cwd,\n targets,\n copySync,\n verbose,\n onCopy,\n}: TryCopyTargetsOptions): Promise<void> => {\n if (targets.length === 0) {\n if (verbose) {\n console.log(\"\");\n log.success(\"no items to copy\");\n console.log(\"\");\n }\n\n return void 0;\n }\n\n const logs: string[] = [];\n\n if (!copySync && canCopyInParallel(targets)) {\n const result: string[] = (\n await Promise.all(\n targets.map(\n async (\n target: GeneratedTarget,\n ): Promise<string | undefined> => {\n await copyTarget({\n target,\n copySync,\n });\n\n await emitCopy({\n onCopy,\n target,\n });\n\n return verbose\n ? buildLogMessage({\n cwd,\n target,\n })\n : void 0;\n },\n ),\n )\n ).filter((item: string | undefined): item is string => item !== void 0);\n\n if (verbose) {\n for (let i: number = 0; i < result.length; i++) {\n const message: string | undefined = result[i];\n\n if (message === void 0) continue;\n\n logs.push(message);\n }\n }\n } else {\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n await copyTarget({\n target,\n copySync,\n });\n\n await emitCopy({\n onCopy,\n target,\n });\n\n if (verbose) {\n logs.push(\n buildLogMessage({\n cwd,\n target,\n }),\n );\n }\n }\n }\n\n if (verbose) {\n console.log(\"\");\n\n for (let i: number = 0; i < logs.length; i++) {\n log.success(logs[i]);\n }\n\n console.log(\"\");\n }\n};\n\ntype CopyTargetsOptions = TryCopyTargetsOptions & {\n onStart: CopyStartEventListener | undefined;\n onEnd: CopyEndEventListener | undefined;\n};\n\nconst copyTargets = async (options: CopyTargetsOptions): Promise<void> => {\n const { onStart, onEnd, targets } = options;\n\n let error: unknown = void 0;\n\n try {\n if (onStart !== void 0) {\n await onStart({\n cwd: options.cwd,\n targets,\n });\n }\n\n await tryCopyTargets(options);\n } catch (err: unknown) {\n error = err;\n } finally {\n if (onEnd !== void 0) {\n await onEnd({\n cwd: options.cwd,\n error,\n });\n }\n }\n\n if (error !== void 0) throw error;\n};\n\nexport type { CopyTargetsOptions };\nexport { copyTargets };\n","import type { TargetRename } from \"#/@types/target\";\n\nimport * as Path from \"node:path\";\n\ntype RenameTargetOptions = {\n path: string;\n fileName: string;\n rename: TargetRename;\n};\n\nconst renameTarget = (options: RenameTargetOptions): string => {\n const parsed: Path.ParsedPath = Path.parse(options.fileName);\n\n return typeof options.rename === \"function\"\n ? options.rename({\n path: options.path,\n name: parsed.name,\n extension: parsed.ext.replace(\".\", \"\"),\n })\n : options.rename;\n};\n\nexport { renameTarget };\n","import type * as Fs from \"node:fs\";\n\nimport type { ResolvedTargetKind } from \"#/@types/event\";\nimport type { Target, WriteFileData } from \"#/@types/target\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { renameTarget } from \"./rename\";\n\ntype ResolveDestDirOptions = {\n cwd: string;\n src: string;\n dest: string;\n flatten: boolean;\n};\n\nconst resolveDestDir = ({\n cwd,\n src,\n dest,\n flatten,\n}: ResolveDestDirOptions): string => {\n if (flatten) return dest;\n\n const relativeDir: string = Path.dirname(Path.relative(cwd, src));\n\n if (relativeDir === \".\") return dest;\n\n const relativeDirParts: string[] = relativeDir.split(Path.sep);\n\n return Path.join(dest, ...relativeDirParts.slice(1));\n};\n\ntype GenerateTargetsOptions = {\n cwd: string;\n src: string;\n target: Target;\n flatten: boolean;\n};\n\ntype GeneratedTargetKind = ResolvedTargetKind;\n\ntype GeneratedTarget = {\n kind: GeneratedTargetKind;\n src: string;\n dest: string;\n renamed: boolean;\n transformed: boolean;\n content?: WriteFileData;\n};\n\nconst generateTargets = async ({\n cwd,\n src,\n target,\n flatten,\n}: GenerateTargetsOptions): Promise<GeneratedTarget[]> => {\n const stats: Fs.Stats = await Fsp.stat(src);\n\n if (target.transform && stats.isDirectory()) return [];\n\n const parsed = Path.parse(src);\n\n const destinations =\n typeof target.dest === \"string\"\n ? [\n target.dest,\n ]\n : target.dest;\n\n const result: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < destinations.length; i++) {\n const dest: string | undefined = destinations[i];\n\n if (dest === void 0) continue;\n\n const destDir: string = resolveDestDir({\n cwd,\n src,\n dest,\n flatten,\n });\n\n const destPath: string = target.rename\n ? renameTarget({\n path: src,\n fileName: parsed.base,\n rename: target.rename,\n })\n : parsed.base;\n\n result.push({\n kind: stats.isFile() ? \"file\" : \"directory\",\n src,\n dest: Path.join(destDir, destPath),\n renamed: Boolean(target.rename),\n transformed: Boolean(target.transform),\n ...(target.transform && {\n content:\n typeof target.transform === \"function\"\n ? await target.transform({\n fileName: parsed.base,\n content: await Fsp.readFile(src),\n })\n : target.transform,\n }),\n });\n }\n\n return result;\n};\n\nexport type { GeneratedTarget, GeneratedTargetKind, GenerateTargetsOptions };\nexport { generateTargets };\n","import * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { glob } from \"tinyglobby\";\n\ntype ResolveSourcePathsOptions = {\n cwd: string;\n sources: string[];\n};\n\nconst isGlobSource = (source: string): boolean =>\n source.startsWith(\"!\") ||\n source.includes(\"*\") ||\n source.includes(\"?\") ||\n source.includes(\"[\") ||\n source.includes(\"{\");\n\nconst normalizeGlobSource = (cwd: string, source: string): string => {\n const negated: boolean = source.startsWith(\"!\");\n\n const path: string = negated ? source.slice(1) : source;\n\n const pattern: string = Path.isAbsolute(path)\n ? Path.relative(cwd, path)\n : path;\n\n return negated ? `!${pattern}` : pattern;\n};\n\nconst resolveExplicitSourcePath = async (\n cwd: string,\n source: string,\n): Promise<string[]> => {\n const path: string = Path.resolve(cwd, source);\n\n try {\n await Fsp.stat(path);\n\n return [\n path,\n ];\n } catch {\n return [];\n }\n};\n\nconst resolveGlobSourcePaths = async (\n cwd: string,\n sources: string[],\n): Promise<string[]> => {\n const patterns: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n patterns.push(normalizeGlobSource(cwd, source));\n }\n\n return await glob(patterns, {\n absolute: true,\n cwd,\n onlyFiles: true,\n });\n};\n\nconst resolveSourcePaths = async ({\n cwd,\n sources,\n}: ResolveSourcePathsOptions): Promise<string[]> => {\n const paths: string[] = [];\n const globSources: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n if (isGlobSource(source)) {\n globSources.push(source);\n continue;\n }\n\n paths.push(...(await resolveExplicitSourcePath(cwd, source)));\n }\n\n if (globSources.length > 0) {\n paths.push(...(await resolveGlobSourcePaths(cwd, globSources)));\n }\n\n return paths;\n};\n\nexport type { ResolveSourcePathsOptions };\nexport { resolveSourcePaths };\n","","import type { Plugin } from \"rolldown\";\n\nimport type { CompleteOptions, Options } from \"#/@types/options\";\nimport type { Target } from \"#/@types/target\";\nimport type { GeneratedTarget } from \"#/functions/generate\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { OPTIONS_DEFAULT } from \"#/const/options\";\nimport { copyTargets } from \"#/functions/copy\";\nimport { generateTargets } from \"#/functions/generate\";\nimport { resolveSourcePaths } from \"#/functions/resolve\";\nimport { name, version } from \"../../package.json\";\n\n/**\n * A utility to copy files and directories.\n *\n * ### Example\n *\n * ```ts\n * import { defineConfig } from \"rolldown\";\n * import { copy } from \"rolldown-plugin-copy\";\n *\n * export default defineConfig({\n * plugins: [\n * copy({\n * targets: [\n * {\n * src: \"./public/static/css/index.css\",\n * dest: \"./dist/public/static/css\",\n * },\n * ],\n * }),\n * ],\n * });\n * ```\n */\nconst copy = (options?: Options): Plugin => {\n const opts: CompleteOptions = toMerged(OPTIONS_DEFAULT, options ?? {});\n\n let copied: boolean = false;\n\n return {\n name,\n version,\n [opts.hook]: async (): Promise<void> => {\n if (opts.copyOnce === true && copied === true) return void 0;\n\n const targets: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < opts.targets.length; i++) {\n const target: Target | undefined = opts.targets[i];\n\n if (target === void 0) continue;\n\n const paths: string[] = await resolveSourcePaths({\n cwd: opts.cwd,\n sources:\n typeof target.src === \"string\"\n ? [\n target.src,\n ]\n : target.src,\n });\n\n for (let j: number = 0; j < paths.length; j++) {\n const src: string | undefined = paths[j];\n\n if (src === void 0) continue;\n\n const tg: GeneratedTarget[] = await generateTargets({\n cwd: opts.cwd,\n src,\n target,\n flatten: opts.flatten,\n });\n\n targets.push(...tg);\n }\n }\n\n await copyTargets({\n cwd: opts.cwd,\n targets,\n copySync: opts.copySync,\n verbose: opts.verbose,\n onStart: opts.onStart,\n onEnd: opts.onEnd,\n onCopy: opts.onCopy,\n });\n\n copied = true;\n },\n };\n};\n\nexport { copy };\n","import { copy } from \"#/plugins/copy\";\n\nexport default copy;\n\nexport type {\n CopyEndEvent,\n CopyEndEventListener,\n CopyEvent,\n CopyEventListener,\n CopyStartEvent,\n CopyStartEventListener,\n ResolvedTarget,\n ResolvedTargetKind,\n} from \"#/@types/event\";\nexport type { Options } from \"#/@types/options\";\nexport type {\n Target,\n TargetRename,\n TargetRenameOptions,\n TargetTransform,\n TargetTransformOptions,\n WriteFileData,\n} from \"#/@types/target\";\n\nexport { copy } from \"#/plugins/copy\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAEA,MAAM,kBAAkB;CACpB,KAAK,QAAQ,KAAK;CAClB,MAAM;CACN,SAAS,EAAE;CACX,UAAU;CACV,UAAU;CACV,SAAS;CACT,SAAS;CACT,SAAS,KAAK;CACd,QAAQ,KAAK;CACb,OAAO,KAAK;CACf;;ACTD,MAAM,iCAAqC,EACvC,eAAe,EACX,MAAM,OACT,EACJ,CAAC;;ACKF,MAAM,qBAAqB,YAAwC;CAC/D,MAAM,+BAA4B,IAAI,KAAK;CAE3C,KAAK,IAAI,IAAY,GAAG,IAAI,QAAQ,QAAQ,KAAK;EAC7C,MAAM,SAAsC,QAAQ;EAEpD,IAAI,WAAW,KAAK,GAAG;;;;;EAMvB,IAAI,OAAO,SAAS,aAAa,OAAO;;;;;EAMxC,IAAI,aAAa,IAAI,OAAO,KAAK,EAAE,OAAO;EAE1C,aAAa,IAAI,OAAO,KAAK;;CAGjC,OAAO;;AAGX,MAAM,iBAAiB,aAA2B;CAC9C,QAAG,UAAUA,UAAK,QAAQ,SAAS,EAAE,EACjC,WAAW,MACd,CAAC;;AAGN,MAAM,iBAAiB,OAAO,aAAoC;CAC9D,MAAMC,iBAAI,MAAMD,UAAK,QAAQ,SAAS,EAAE,EACpC,WAAW,MACd,CAAC;;AASN,MAAM,WAAW,OAAO,EACpB,KACA,MACA,eACkC;CAClC,IAAI,UAAU;EACV,cAAc,KAAK;EAEnB,QAAG,aAAa,KAAK,KAAK;EAE1B;;CAGJ,MAAM,eAAe,KAAK;CAE1B,MAAMC,iBAAI,SAAS,KAAK,KAAK;;AASjC,MAAM,gBAAgB,OAAO,EACzB,KACA,MACA,eACuC;CACvC,IAAI,UAAU;EACV,QAAG,OAAO,KAAK,MAAM,EACjB,WAAW,MACd,CAAC;EAEF;;CAGJ,MAAMA,iBAAI,GAAG,KAAK,MAAM,EACpB,WAAW,MACd,CAAC;;AAGN,MAAM,mBAAmB,OAAO,WAA2C;CACvE,MAAM,eAAe,OAAO,KAAK;CACjC,MAAMA,iBAAI,UAAU,OAAO,MAAM,OAAO,WAAW,GAAG;;AAQ1D,MAAM,aAAa,OAAO,EACtB,QACA,eACoC;CACpC,IAAI,OAAO,aACP,OAAO,MAAM,iBAAiB,OAAO;CAGzC,IAAI,OAAO,SAAS,QAChB,OAAO,MAAM,SAAS;EAClB,KAAK,OAAO;EACZ,MAAM,OAAO;EACb;EACH,CAAC;CAGN,OAAO,MAAM,cAAc;EACvB,KAAK,OAAO;EACZ,MAAM,OAAO;EACb;EACH,CAAC;;AAQN,MAAM,mBAAmB,EAAE,KAAK,aAA6C;CACzE,IAAI,UAAkB,GAAGD,UAAK,SAAS,KAAK,OAAO,IAAI,CAAC,KAAK,OAAO;CAEpE,MAAM,QAAkB,EAAE;CAE1B,IAAI,OAAO,SAAS,MAAM,KAAK,IAAI;CACnC,IAAI,OAAO,aAAa,MAAM,KAAK,IAAI;CAEvC,IAAI,MAAM,SAAS,GACf,WAAW,KAAK,MAAM,KAAK,IAAI,CAAC;CAGpC,OAAO;;AAQX,MAAM,WAAW,OAAO,EAAE,QAAQ,aAA6C;CAC3E,IAAI,WAAW,KAAK,GAChB,MAAM,OAAO,EACT,QAAQ;EACJ,MAAM,OAAO;EACb,KAAK,OAAO;EACZ,MAAM,OAAO;EACb,SAAS,OAAO;EAChB,aAAa,OAAO;EACvB,EACJ,CAAC;;AAYV,MAAM,iBAAiB,OAAO,EAC1B,KACA,SACA,UACA,SACA,aACwC;CACxC,IAAI,QAAQ,WAAW,GAAG;EACtB,IAAI,SAAS;GACT,QAAQ,IAAI,GAAG;GACf,IAAI,QAAQ,mBAAmB;GAC/B,QAAQ,IAAI,GAAG;;EAGnB;;CAGJ,MAAM,OAAiB,EAAE;CAEzB,IAAI,CAAC,YAAY,kBAAkB,QAAQ,EAAE;EACzC,MAAM,UACF,MAAM,QAAQ,IACV,QAAQ,IACJ,OACI,WAC8B;GAC9B,MAAM,WAAW;IACb;IACA;IACH,CAAC;GAEF,MAAM,SAAS;IACX;IACA;IACH,CAAC;GAEF,OAAO,UACD,gBAAgB;IACZ;IACA;IACH,CAAC,GACF,KAAK;IAElB,CACJ,EACH,QAAQ,SAA6C,SAAS,KAAK,EAAE;EAEvE,IAAI,SACA,KAAK,IAAI,IAAY,GAAG,IAAI,OAAO,QAAQ,KAAK;GAC5C,MAAM,UAA8B,OAAO;GAE3C,IAAI,YAAY,KAAK,GAAG;GAExB,KAAK,KAAK,QAAQ;;QAI1B,KAAK,IAAI,IAAY,GAAG,IAAI,QAAQ,QAAQ,KAAK;EAC7C,MAAM,SAAsC,QAAQ;EAEpD,IAAI,WAAW,KAAK,GAAG;EAEvB,MAAM,WAAW;GACb;GACA;GACH,CAAC;EAEF,MAAM,SAAS;GACX;GACA;GACH,CAAC;EAEF,IAAI,SACA,KAAK,KACD,gBAAgB;GACZ;GACA;GACH,CAAC,CACL;;CAKb,IAAI,SAAS;EACT,QAAQ,IAAI,GAAG;EAEf,KAAK,IAAI,IAAY,GAAG,IAAI,KAAK,QAAQ,KACrC,IAAI,QAAQ,KAAK,GAAG;EAGxB,QAAQ,IAAI,GAAG;;;AASvB,MAAM,cAAc,OAAO,YAA+C;CACtE,MAAM,EAAE,SAAS,OAAO,YAAY;CAEpC,IAAI,QAAiB,KAAK;CAE1B,IAAI;EACA,IAAI,YAAY,KAAK,GACjB,MAAM,QAAQ;GACV,KAAK,QAAQ;GACb;GACH,CAAC;EAGN,MAAM,eAAe,QAAQ;UACxB,KAAc;EACnB,QAAQ;WACF;EACN,IAAI,UAAU,KAAK,GACf,MAAM,MAAM;GACR,KAAK,QAAQ;GACb;GACH,CAAC;;CAIV,IAAI,UAAU,KAAK,GAAG,MAAM;;;ACrShC,MAAM,gBAAgB,YAAyC;CAC3D,MAAM,SAA0BE,UAAK,MAAM,QAAQ,SAAS;CAE5D,OAAO,OAAO,QAAQ,WAAW,aAC3B,QAAQ,OAAO;EACX,MAAM,QAAQ;EACd,MAAM,OAAO;EACb,WAAW,OAAO,IAAI,QAAQ,KAAK,GAAG;EACzC,CAAC,GACF,QAAQ;;;ACFlB,MAAM,kBAAkB,EACpB,KACA,KACA,MACA,cACiC;CACjC,IAAI,SAAS,OAAO;CAEpB,MAAM,cAAsBC,UAAK,QAAQA,UAAK,SAAS,KAAK,IAAI,CAAC;CAEjE,IAAI,gBAAgB,KAAK,OAAO;CAEhC,MAAM,mBAA6B,YAAY,MAAMA,UAAK,IAAI;CAE9D,OAAOA,UAAK,KAAK,MAAM,GAAG,iBAAiB,MAAM,EAAE,CAAC;;AAqBxD,MAAM,kBAAkB,OAAO,EAC3B,KACA,KACA,QACA,cACsD;CACtD,MAAM,QAAkB,MAAMC,iBAAI,KAAK,IAAI;CAE3C,IAAI,OAAO,aAAa,MAAM,aAAa,EAAE,OAAO,EAAE;CAEtD,MAAM,SAASD,UAAK,MAAM,IAAI;CAE9B,MAAM,eACF,OAAO,OAAO,SAAS,WACjB,CACI,OAAO,KACV,GACD,OAAO;CAEjB,MAAM,SAA4B,EAAE;CAEpC,KAAK,IAAI,IAAY,GAAG,IAAI,aAAa,QAAQ,KAAK;EAClD,MAAM,OAA2B,aAAa;EAE9C,IAAI,SAAS,KAAK,GAAG;EAErB,MAAM,UAAkB,eAAe;GACnC;GACA;GACA;GACA;GACH,CAAC;EAEF,MAAM,WAAmB,OAAO,SAC1B,aAAa;GACT,MAAM;GACN,UAAU,OAAO;GACjB,QAAQ,OAAO;GAClB,CAAC,GACF,OAAO;EAEb,OAAO,KAAK;GACR,MAAM,MAAM,QAAQ,GAAG,SAAS;GAChC;GACA,MAAMA,UAAK,KAAK,SAAS,SAAS;GAClC,SAAS,QAAQ,OAAO,OAAO;GAC/B,aAAa,QAAQ,OAAO,UAAU;GACtC,GAAI,OAAO,aAAa,EACpB,SACI,OAAO,OAAO,cAAc,aACtB,MAAM,OAAO,UAAU;IACnB,UAAU,OAAO;IACjB,SAAS,MAAMC,iBAAI,SAAS,IAAI;IACnC,CAAC,GACF,OAAO,WACpB;GACJ,CAAC;;CAGN,OAAO;;;ACrGX,MAAM,gBAAgB,WAClB,OAAO,WAAW,IAAI,IACtB,OAAO,SAAS,IAAI,IACpB,OAAO,SAAS,IAAI,IACpB,OAAO,SAAS,IAAI,IACpB,OAAO,SAAS,IAAI;AAExB,MAAM,uBAAuB,KAAa,WAA2B;CACjE,MAAM,UAAmB,OAAO,WAAW,IAAI;CAE/C,MAAM,OAAe,UAAU,OAAO,MAAM,EAAE,GAAG;CAEjD,MAAM,UAAkBC,UAAK,WAAW,KAAK,GACvCA,UAAK,SAAS,KAAK,KAAK,GACxB;CAEN,OAAO,UAAU,IAAI,YAAY;;AAGrC,MAAM,4BAA4B,OAC9B,KACA,WACoB;CACpB,MAAM,OAAeA,UAAK,QAAQ,KAAK,OAAO;CAE9C,IAAI;EACA,MAAMC,iBAAI,KAAK,KAAK;EAEpB,OAAO,CACH,KACH;SACG;EACJ,OAAO,EAAE;;;AAIjB,MAAM,yBAAyB,OAC3B,KACA,YACoB;CACpB,MAAM,WAAqB,EAAE;CAE7B,KAAK,IAAI,IAAY,GAAG,IAAI,QAAQ,QAAQ,KAAK;EAC7C,MAAM,SAA6B,QAAQ;EAE3C,IAAI,WAAW,KAAK,GAAG;EAEvB,SAAS,KAAK,oBAAoB,KAAK,OAAO,CAAC;;CAGnD,OAAO,2BAAW,UAAU;EACxB,UAAU;EACV;EACA,WAAW;EACd,CAAC;;AAGN,MAAM,qBAAqB,OAAO,EAC9B,KACA,cACgD;CAChD,MAAM,QAAkB,EAAE;CAC1B,MAAM,cAAwB,EAAE;CAEhC,KAAK,IAAI,IAAY,GAAG,IAAI,QAAQ,QAAQ,KAAK;EAC7C,MAAM,SAA6B,QAAQ;EAE3C,IAAI,WAAW,KAAK,GAAG;EAEvB,IAAI,aAAa,OAAO,EAAE;GACtB,YAAY,KAAK,OAAO;GACxB;;EAGJ,MAAM,KAAK,GAAI,MAAM,0BAA0B,KAAK,OAAO,CAAE;;CAGjE,IAAI,YAAY,SAAS,GACrB,MAAM,KAAK,GAAI,MAAM,uBAAuB,KAAK,YAAY,CAAE;CAGnE,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AEtDX,MAAM,QAAQ,YAA8B;CACxC,MAAM,gCAAiC,iBAAiB,WAAW,EAAE,CAAC;CAEtE,IAAI,SAAkB;CAEtB,OAAO;EACH;EACA;GACC,KAAK,OAAO,YAA2B;GACpC,IAAI,KAAK,aAAa,QAAQ,WAAW,MAAM,OAAO,KAAK;GAE3D,MAAM,UAA6B,EAAE;GAErC,KAAK,IAAI,IAAY,GAAG,IAAI,KAAK,QAAQ,QAAQ,KAAK;IAClD,MAAM,SAA6B,KAAK,QAAQ;IAEhD,IAAI,WAAW,KAAK,GAAG;IAEvB,MAAM,QAAkB,MAAM,mBAAmB;KAC7C,KAAK,KAAK;KACV,SACI,OAAO,OAAO,QAAQ,WAChB,CACI,OAAO,IACV,GACD,OAAO;KACpB,CAAC;IAEF,KAAK,IAAI,IAAY,GAAG,IAAI,MAAM,QAAQ,KAAK;KAC3C,MAAM,MAA0B,MAAM;KAEtC,IAAI,QAAQ,KAAK,GAAG;KAEpB,MAAM,KAAwB,MAAM,gBAAgB;MAChD,KAAK,KAAK;MACV;MACA;MACA,SAAS,KAAK;MACjB,CAAC;KAEF,QAAQ,KAAK,GAAG,GAAG;;;GAI3B,MAAM,YAAY;IACd,KAAK,KAAK;IACV;IACA,UAAU,KAAK;IACf,SAAS,KAAK;IACd,SAAS,KAAK;IACd,OAAO,KAAK;IACZ,QAAQ,KAAK;IAChB,CAAC;GAEF,SAAS;;EAEhB;;;AC3FL,kBAAe"}
package/dist/index.mjs CHANGED
@@ -8,11 +8,14 @@ import { glob } from "tinyglobby";
8
8
  const OPTIONS_DEFAULT = {
9
9
  cwd: process.cwd(),
10
10
  hook: "generateBundle",
11
+ targets: [],
11
12
  copyOnce: false,
12
13
  copySync: false,
13
14
  flatten: false,
14
15
  verbose: false,
15
- targets: []
16
+ onStart: void 0,
17
+ onCopy: void 0,
18
+ onEnd: void 0
16
19
  };
17
20
 
18
21
  const log = createConsola({ formatOptions: { date: false } });
@@ -83,9 +86,19 @@ const buildLogMessage = ({ cwd, target }) => {
83
86
  if (flags.length > 0) message += ` [${flags.join(",")}]`;
84
87
  return message;
85
88
  };
86
- const copyTargets = async ({ cwd, targets, copySync, verbose }) => {
89
+ const emitCopy = async ({ onCopy, target }) => {
90
+ if (onCopy !== void 0) await onCopy({ target: {
91
+ kind: target.kind,
92
+ src: target.src,
93
+ dest: target.dest,
94
+ renamed: target.renamed,
95
+ transformed: target.transformed
96
+ } });
97
+ };
98
+ const tryCopyTargets = async ({ cwd, targets, copySync, verbose, onCopy }) => {
87
99
  if (targets.length === 0) {
88
100
  if (verbose) {
101
+ console.log("");
89
102
  log.success("no items to copy");
90
103
  console.log("");
91
104
  }
@@ -98,6 +111,10 @@ const copyTargets = async ({ cwd, targets, copySync, verbose }) => {
98
111
  target,
99
112
  copySync
100
113
  });
114
+ await emitCopy({
115
+ onCopy,
116
+ target
117
+ });
101
118
  return verbose ? buildLogMessage({
102
119
  cwd,
103
120
  target
@@ -115,16 +132,40 @@ const copyTargets = async ({ cwd, targets, copySync, verbose }) => {
115
132
  target,
116
133
  copySync
117
134
  });
135
+ await emitCopy({
136
+ onCopy,
137
+ target
138
+ });
118
139
  if (verbose) logs.push(buildLogMessage({
119
140
  cwd,
120
141
  target
121
142
  }));
122
143
  }
123
144
  if (verbose) {
145
+ console.log("");
124
146
  for (let i = 0; i < logs.length; i++) log.success(logs[i]);
125
147
  console.log("");
126
148
  }
127
149
  };
150
+ const copyTargets = async (options) => {
151
+ const { onStart, onEnd, targets } = options;
152
+ let error = void 0;
153
+ try {
154
+ if (onStart !== void 0) await onStart({
155
+ cwd: options.cwd,
156
+ targets
157
+ });
158
+ await tryCopyTargets(options);
159
+ } catch (err) {
160
+ error = err;
161
+ } finally {
162
+ if (onEnd !== void 0) await onEnd({
163
+ cwd: options.cwd,
164
+ error
165
+ });
166
+ }
167
+ if (error !== void 0) throw error;
168
+ };
128
169
 
129
170
  const renameTarget = (options) => {
130
171
  const parsed = Path.parse(options.fileName);
@@ -223,7 +264,7 @@ const resolveSourcePaths = async ({ cwd, sources }) => {
223
264
  };
224
265
 
225
266
  var name = "rolldown-plugin-copy";
226
- var version = "0.1.1";
267
+ var version = "0.2.0";
227
268
 
228
269
  /**
229
270
  * A utility to copy files and directories.
@@ -256,7 +297,6 @@ const copy = (options) => {
256
297
  version,
257
298
  [opts.hook]: async () => {
258
299
  if (opts.copyOnce === true && copied === true) return void 0;
259
- if (opts.targets.length === 0) return void 0;
260
300
  const targets = [];
261
301
  for (let i = 0; i < opts.targets.length; i++) {
262
302
  const target = opts.targets[i];
@@ -281,7 +321,10 @@ const copy = (options) => {
281
321
  cwd: opts.cwd,
282
322
  targets,
283
323
  copySync: opts.copySync,
284
- verbose: opts.verbose
324
+ verbose: opts.verbose,
325
+ onStart: opts.onStart,
326
+ onEnd: opts.onEnd,
327
+ onCopy: opts.onCopy
285
328
  });
286
329
  copied = true;
287
330
  }
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/const/options.ts","../src/configs/log.ts","../src/functions/copy.ts","../src/functions/rename.ts","../src/functions/generate.ts","../src/functions/resolve.ts","../package.json","../src/plugins/copy.ts","../src/index.ts"],"sourcesContent":["import type { CompleteOptions } from \"#/@types/options\";\n\nconst OPTIONS_DEFAULT = {\n cwd: process.cwd(),\n hook: \"generateBundle\",\n copyOnce: false,\n copySync: false,\n flatten: false,\n verbose: false,\n targets: [],\n} as const satisfies CompleteOptions;\n\nexport { OPTIONS_DEFAULT };\n","import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import type { GeneratedTarget } from \"#/functions/generate\";\n\nimport * as Fs from \"node:fs\";\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { log } from \"#/configs/log\";\n\nconst canCopyInParallel = (targets: GeneratedTarget[]): boolean => {\n const destinations: Set<string> = new Set();\n\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n /**\n * Raw directory copies write a whole subtree, so exact destination checks\n * cannot detect nested conflicts with other targets in parallel.\n */\n if (target.kind === \"directory\") return false;\n\n /**\n * Multiple targets writing the same path leads to conflicts, so\n * keep the original target order by falling back to sequential copies.\n */\n if (destinations.has(target.dest)) return false;\n\n destinations.add(target.dest);\n }\n\n return true;\n};\n\nconst ensureDirSync = (filePath: string): void => {\n Fs.mkdirSync(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\nconst ensureDirAsync = async (filePath: string): Promise<void> => {\n await Fsp.mkdir(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\ntype CopyFileOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyFile = async ({\n src,\n dest,\n copySync,\n}: CopyFileOptions): Promise<void> => {\n if (copySync) {\n ensureDirSync(dest);\n\n Fs.copyFileSync(src, dest);\n\n return void 0;\n }\n\n await ensureDirAsync(dest);\n\n await Fsp.copyFile(src, dest);\n};\n\ntype CopyDirectoryOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyDirectory = async ({\n src,\n dest,\n copySync,\n}: CopyDirectoryOptions): Promise<void> => {\n if (copySync) {\n Fs.cpSync(src, dest, {\n recursive: true,\n });\n\n return void 0;\n }\n\n await Fsp.cp(src, dest, {\n recursive: true,\n });\n};\n\nconst writeTransformed = async (target: GeneratedTarget): Promise<void> => {\n await ensureDirAsync(target.dest);\n await Fsp.writeFile(target.dest, target.content ?? \"\");\n};\n\ntype CopyTargetOptions = {\n target: GeneratedTarget;\n copySync: boolean;\n};\n\nconst copyTarget = async ({\n target,\n copySync,\n}: CopyTargetOptions): Promise<void> => {\n if (target.transformed) {\n return await writeTransformed(target);\n }\n\n if (target.kind === \"file\") {\n return await copyFile({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n }\n\n return await copyDirectory({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n};\n\ntype BuildLogMessageOptions = {\n cwd: string;\n target: GeneratedTarget;\n};\n\nconst buildLogMessage = ({ cwd, target }: BuildLogMessageOptions): string => {\n let message: string = `${Path.relative(cwd, target.src)} → ${target.dest}`;\n\n const flags: string[] = [];\n\n if (target.renamed) flags.push(\"R\");\n if (target.transformed) flags.push(\"T\");\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n return message;\n};\n\ntype CopyTargetsOptions = {\n cwd: string;\n targets: GeneratedTarget[];\n copySync: boolean;\n verbose: boolean;\n};\n\nconst copyTargets = async ({\n cwd,\n targets,\n copySync,\n verbose,\n}: CopyTargetsOptions): Promise<void> => {\n if (targets.length === 0) {\n if (verbose) {\n log.success(\"no items to copy\");\n console.log(\"\");\n }\n\n return void 0;\n }\n\n const logs: string[] = [];\n\n if (!copySync && canCopyInParallel(targets)) {\n const result: string[] = (\n await Promise.all(\n targets.map(\n async (\n target: GeneratedTarget,\n ): Promise<string | undefined> => {\n await copyTarget({\n target,\n copySync,\n });\n\n return verbose\n ? buildLogMessage({\n cwd,\n target,\n })\n : void 0;\n },\n ),\n )\n ).filter((item: string | undefined): item is string => item !== void 0);\n\n if (verbose) {\n for (let i: number = 0; i < result.length; i++) {\n const message: string | undefined = result[i];\n\n if (message === void 0) continue;\n\n logs.push(message);\n }\n }\n } else {\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n await copyTarget({\n target,\n copySync,\n });\n\n if (verbose) {\n logs.push(\n buildLogMessage({\n cwd,\n target,\n }),\n );\n }\n }\n }\n\n if (verbose) {\n for (let i: number = 0; i < logs.length; i++) {\n log.success(logs[i]);\n }\n\n console.log(\"\");\n }\n};\n\nexport type { CopyTargetsOptions };\nexport { copyTargets };\n","import type { TargetRename } from \"#/@types/target\";\n\nimport * as Path from \"node:path\";\n\ntype RenameTargetOptions = {\n path: string;\n fileName: string;\n rename: TargetRename;\n};\n\nconst renameTarget = (options: RenameTargetOptions): string => {\n const parsed: Path.ParsedPath = Path.parse(options.fileName);\n\n return typeof options.rename === \"function\"\n ? options.rename({\n path: options.path,\n name: parsed.name,\n extension: parsed.ext.replace(\".\", \"\"),\n })\n : options.rename;\n};\n\nexport { renameTarget };\n","import type * as Fs from \"node:fs\";\n\nimport type { Target, WriteFileData } from \"#/@types/target\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { renameTarget } from \"./rename\";\n\ntype ResolveDestDirOptions = {\n cwd: string;\n src: string;\n dest: string;\n flatten: boolean;\n};\n\nconst resolveDestDir = ({\n cwd,\n src,\n dest,\n flatten,\n}: ResolveDestDirOptions): string => {\n if (flatten) return dest;\n\n const relativeDir: string = Path.dirname(Path.relative(cwd, src));\n\n if (relativeDir === \".\") return dest;\n\n const relativeDirParts: string[] = relativeDir.split(Path.sep);\n\n return Path.join(dest, ...relativeDirParts.slice(1));\n};\n\ntype GenerateTargetsOptions = {\n cwd: string;\n src: string;\n target: Target;\n flatten: boolean;\n};\n\ntype GeneratedTargetKind = \"file\" | \"directory\";\n\ntype GeneratedTarget = {\n kind: GeneratedTargetKind;\n src: string;\n dest: string;\n renamed: boolean;\n transformed: boolean;\n content?: WriteFileData;\n};\n\nconst generateTargets = async ({\n cwd,\n src,\n target,\n flatten,\n}: GenerateTargetsOptions): Promise<GeneratedTarget[]> => {\n const stats: Fs.Stats = await Fsp.stat(src);\n\n if (target.transform && stats.isDirectory()) return [];\n\n const parsed = Path.parse(src);\n\n const destinations =\n typeof target.dest === \"string\"\n ? [\n target.dest,\n ]\n : target.dest;\n\n const result: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < destinations.length; i++) {\n const dest: string | undefined = destinations[i];\n\n if (dest === void 0) continue;\n\n const destDir: string = resolveDestDir({\n cwd,\n src,\n dest,\n flatten,\n });\n\n const destPath: string = target.rename\n ? renameTarget({\n path: src,\n fileName: parsed.base,\n rename: target.rename,\n })\n : parsed.base;\n\n result.push({\n kind: stats.isFile() ? \"file\" : \"directory\",\n src,\n dest: Path.join(destDir, destPath),\n renamed: Boolean(target.rename),\n transformed: Boolean(target.transform),\n ...(target.transform && {\n content:\n typeof target.transform === \"function\"\n ? await target.transform({\n fileName: parsed.base,\n content: await Fsp.readFile(src),\n })\n : target.transform,\n }),\n });\n }\n\n return result;\n};\n\nexport type { GeneratedTarget, GeneratedTargetKind, GenerateTargetsOptions };\nexport { generateTargets };\n","import * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { glob } from \"tinyglobby\";\n\ntype ResolveSourcePathsOptions = {\n cwd: string;\n sources: string[];\n};\n\nconst isGlobSource = (source: string): boolean =>\n source.startsWith(\"!\") ||\n source.includes(\"*\") ||\n source.includes(\"?\") ||\n source.includes(\"[\") ||\n source.includes(\"{\");\n\nconst normalizeGlobSource = (cwd: string, source: string): string => {\n const negated: boolean = source.startsWith(\"!\");\n\n const path: string = negated ? source.slice(1) : source;\n\n const pattern: string = Path.isAbsolute(path)\n ? Path.relative(cwd, path)\n : path;\n\n return negated ? `!${pattern}` : pattern;\n};\n\nconst resolveExplicitSourcePath = async (\n cwd: string,\n source: string,\n): Promise<string[]> => {\n const path: string = Path.resolve(cwd, source);\n\n try {\n await Fsp.stat(path);\n\n return [\n path,\n ];\n } catch {\n return [];\n }\n};\n\nconst resolveGlobSourcePaths = async (\n cwd: string,\n sources: string[],\n): Promise<string[]> => {\n const patterns: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n patterns.push(normalizeGlobSource(cwd, source));\n }\n\n return await glob(patterns, {\n absolute: true,\n cwd,\n onlyFiles: true,\n });\n};\n\nconst resolveSourcePaths = async ({\n cwd,\n sources,\n}: ResolveSourcePathsOptions): Promise<string[]> => {\n const paths: string[] = [];\n const globSources: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n if (isGlobSource(source)) {\n globSources.push(source);\n continue;\n }\n\n paths.push(...(await resolveExplicitSourcePath(cwd, source)));\n }\n\n if (globSources.length > 0) {\n paths.push(...(await resolveGlobSourcePaths(cwd, globSources)));\n }\n\n return paths;\n};\n\nexport type { ResolveSourcePathsOptions };\nexport { resolveSourcePaths };\n","","import type { Plugin } from \"rolldown\";\n\nimport type { CompleteOptions, Options } from \"#/@types/options\";\nimport type { Target } from \"#/@types/target\";\nimport type { GeneratedTarget } from \"#/functions/generate\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { OPTIONS_DEFAULT } from \"#/const/options\";\nimport { copyTargets } from \"#/functions/copy\";\nimport { generateTargets } from \"#/functions/generate\";\nimport { resolveSourcePaths } from \"#/functions/resolve\";\nimport { name, version } from \"../../package.json\";\n\n/**\n * A utility to copy files and directories.\n *\n * ### Example\n *\n * ```ts\n * import { defineConfig } from \"rolldown\";\n * import { copy } from \"rolldown-plugin-copy\";\n *\n * export default defineConfig({\n * plugins: [\n * copy({\n * targets: [\n * {\n * src: \"./public/static/css/index.css\",\n * dest: \"./dist/public/static/css\",\n * },\n * ],\n * }),\n * ],\n * });\n * ```\n */\nconst copy = (options?: Options): Plugin => {\n const opts: CompleteOptions = toMerged(OPTIONS_DEFAULT, options ?? {});\n\n let copied: boolean = false;\n\n return {\n name,\n version,\n [opts.hook]: async (): Promise<void> => {\n if (opts.copyOnce === true && copied === true) return void 0;\n\n if (opts.targets.length === 0) return void 0;\n\n const targets: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < opts.targets.length; i++) {\n const target: Target | undefined = opts.targets[i];\n\n if (target === void 0) continue;\n\n const paths: string[] = await resolveSourcePaths({\n cwd: opts.cwd,\n sources:\n typeof target.src === \"string\"\n ? [\n target.src,\n ]\n : target.src,\n });\n\n for (let j: number = 0; j < paths.length; j++) {\n const src: string | undefined = paths[j];\n\n if (src === void 0) continue;\n\n const tg: GeneratedTarget[] = await generateTargets({\n cwd: opts.cwd,\n src,\n target,\n flatten: opts.flatten,\n });\n\n targets.push(...tg);\n }\n }\n\n await copyTargets({\n cwd: opts.cwd,\n targets,\n copySync: opts.copySync,\n verbose: opts.verbose,\n });\n\n copied = true;\n },\n };\n};\n\nexport { copy };\n","import { copy } from \"#/plugins/copy\";\n\nexport default copy;\n\nexport type { Options } from \"#/@types/options\";\nexport type {\n Target,\n TargetRename,\n TargetRenameOptions,\n TargetTransform,\n TargetTransformOptions,\n WriteFileData,\n} from \"#/@types/target\";\n\nexport { copy } from \"#/plugins/copy\";\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/const/options.ts","../src/configs/log.ts","../src/functions/copy.ts","../src/functions/rename.ts","../src/functions/generate.ts","../src/functions/resolve.ts","../package.json","../src/plugins/copy.ts","../src/index.ts"],"sourcesContent":["import type { CompleteOptions } from \"#/@types/options\";\n\nconst OPTIONS_DEFAULT = {\n cwd: process.cwd(),\n hook: \"generateBundle\",\n targets: [],\n copyOnce: false,\n copySync: false,\n flatten: false,\n verbose: false,\n onStart: void 0,\n onCopy: void 0,\n onEnd: void 0,\n} as const satisfies CompleteOptions;\n\nexport { OPTIONS_DEFAULT };\n","import type { ConsolaInstance } from \"consola\";\n\nimport { createConsola } from \"consola\";\n\nconst log: ConsolaInstance = createConsola({\n formatOptions: {\n date: false,\n },\n});\n\nexport { log };\n","import type {\n CopyEndEventListener,\n CopyEventListener,\n CopyStartEventListener,\n} from \"#/@types/event\";\nimport type { GeneratedTarget } from \"#/functions/generate\";\n\nimport * as Fs from \"node:fs\";\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { log } from \"#/configs/log\";\n\nconst canCopyInParallel = (targets: GeneratedTarget[]): boolean => {\n const destinations: Set<string> = new Set();\n\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n /**\n * Raw directory copies write a whole subtree, so exact destination checks\n * cannot detect nested conflicts with other targets in parallel.\n */\n if (target.kind === \"directory\") return false;\n\n /**\n * Multiple targets writing the same path leads to conflicts, so\n * keep the original target order by falling back to sequential copies.\n */\n if (destinations.has(target.dest)) return false;\n\n destinations.add(target.dest);\n }\n\n return true;\n};\n\nconst ensureDirSync = (filePath: string): void => {\n Fs.mkdirSync(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\nconst ensureDirAsync = async (filePath: string): Promise<void> => {\n await Fsp.mkdir(Path.dirname(filePath), {\n recursive: true,\n });\n};\n\ntype CopyFileOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyFile = async ({\n src,\n dest,\n copySync,\n}: CopyFileOptions): Promise<void> => {\n if (copySync) {\n ensureDirSync(dest);\n\n Fs.copyFileSync(src, dest);\n\n return void 0;\n }\n\n await ensureDirAsync(dest);\n\n await Fsp.copyFile(src, dest);\n};\n\ntype CopyDirectoryOptions = {\n src: string;\n dest: string;\n copySync: boolean;\n};\n\nconst copyDirectory = async ({\n src,\n dest,\n copySync,\n}: CopyDirectoryOptions): Promise<void> => {\n if (copySync) {\n Fs.cpSync(src, dest, {\n recursive: true,\n });\n\n return void 0;\n }\n\n await Fsp.cp(src, dest, {\n recursive: true,\n });\n};\n\nconst writeTransformed = async (target: GeneratedTarget): Promise<void> => {\n await ensureDirAsync(target.dest);\n await Fsp.writeFile(target.dest, target.content ?? \"\");\n};\n\ntype CopyTargetOptions = {\n target: GeneratedTarget;\n copySync: boolean;\n};\n\nconst copyTarget = async ({\n target,\n copySync,\n}: CopyTargetOptions): Promise<void> => {\n if (target.transformed) {\n return await writeTransformed(target);\n }\n\n if (target.kind === \"file\") {\n return await copyFile({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n }\n\n return await copyDirectory({\n src: target.src,\n dest: target.dest,\n copySync,\n });\n};\n\ntype BuildLogMessageOptions = {\n cwd: string;\n target: GeneratedTarget;\n};\n\nconst buildLogMessage = ({ cwd, target }: BuildLogMessageOptions): string => {\n let message: string = `${Path.relative(cwd, target.src)} → ${target.dest}`;\n\n const flags: string[] = [];\n\n if (target.renamed) flags.push(\"R\");\n if (target.transformed) flags.push(\"T\");\n\n if (flags.length > 0) {\n message += ` [${flags.join(\",\")}]`;\n }\n\n return message;\n};\n\ntype EmitCopyOptions = {\n onCopy: CopyEventListener | undefined;\n target: GeneratedTarget;\n};\n\nconst emitCopy = async ({ onCopy, target }: EmitCopyOptions): Promise<void> => {\n if (onCopy !== void 0) {\n await onCopy({\n target: {\n kind: target.kind,\n src: target.src,\n dest: target.dest,\n renamed: target.renamed,\n transformed: target.transformed,\n },\n });\n }\n};\n\ntype TryCopyTargetsOptions = {\n cwd: string;\n targets: GeneratedTarget[];\n copySync: boolean;\n verbose: boolean;\n onCopy: CopyEventListener | undefined;\n};\n\nconst tryCopyTargets = async ({\n cwd,\n targets,\n copySync,\n verbose,\n onCopy,\n}: TryCopyTargetsOptions): Promise<void> => {\n if (targets.length === 0) {\n if (verbose) {\n console.log(\"\");\n log.success(\"no items to copy\");\n console.log(\"\");\n }\n\n return void 0;\n }\n\n const logs: string[] = [];\n\n if (!copySync && canCopyInParallel(targets)) {\n const result: string[] = (\n await Promise.all(\n targets.map(\n async (\n target: GeneratedTarget,\n ): Promise<string | undefined> => {\n await copyTarget({\n target,\n copySync,\n });\n\n await emitCopy({\n onCopy,\n target,\n });\n\n return verbose\n ? buildLogMessage({\n cwd,\n target,\n })\n : void 0;\n },\n ),\n )\n ).filter((item: string | undefined): item is string => item !== void 0);\n\n if (verbose) {\n for (let i: number = 0; i < result.length; i++) {\n const message: string | undefined = result[i];\n\n if (message === void 0) continue;\n\n logs.push(message);\n }\n }\n } else {\n for (let i: number = 0; i < targets.length; i++) {\n const target: GeneratedTarget | undefined = targets[i];\n\n if (target === void 0) continue;\n\n await copyTarget({\n target,\n copySync,\n });\n\n await emitCopy({\n onCopy,\n target,\n });\n\n if (verbose) {\n logs.push(\n buildLogMessage({\n cwd,\n target,\n }),\n );\n }\n }\n }\n\n if (verbose) {\n console.log(\"\");\n\n for (let i: number = 0; i < logs.length; i++) {\n log.success(logs[i]);\n }\n\n console.log(\"\");\n }\n};\n\ntype CopyTargetsOptions = TryCopyTargetsOptions & {\n onStart: CopyStartEventListener | undefined;\n onEnd: CopyEndEventListener | undefined;\n};\n\nconst copyTargets = async (options: CopyTargetsOptions): Promise<void> => {\n const { onStart, onEnd, targets } = options;\n\n let error: unknown = void 0;\n\n try {\n if (onStart !== void 0) {\n await onStart({\n cwd: options.cwd,\n targets,\n });\n }\n\n await tryCopyTargets(options);\n } catch (err: unknown) {\n error = err;\n } finally {\n if (onEnd !== void 0) {\n await onEnd({\n cwd: options.cwd,\n error,\n });\n }\n }\n\n if (error !== void 0) throw error;\n};\n\nexport type { CopyTargetsOptions };\nexport { copyTargets };\n","import type { TargetRename } from \"#/@types/target\";\n\nimport * as Path from \"node:path\";\n\ntype RenameTargetOptions = {\n path: string;\n fileName: string;\n rename: TargetRename;\n};\n\nconst renameTarget = (options: RenameTargetOptions): string => {\n const parsed: Path.ParsedPath = Path.parse(options.fileName);\n\n return typeof options.rename === \"function\"\n ? options.rename({\n path: options.path,\n name: parsed.name,\n extension: parsed.ext.replace(\".\", \"\"),\n })\n : options.rename;\n};\n\nexport { renameTarget };\n","import type * as Fs from \"node:fs\";\n\nimport type { ResolvedTargetKind } from \"#/@types/event\";\nimport type { Target, WriteFileData } from \"#/@types/target\";\n\nimport * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { renameTarget } from \"./rename\";\n\ntype ResolveDestDirOptions = {\n cwd: string;\n src: string;\n dest: string;\n flatten: boolean;\n};\n\nconst resolveDestDir = ({\n cwd,\n src,\n dest,\n flatten,\n}: ResolveDestDirOptions): string => {\n if (flatten) return dest;\n\n const relativeDir: string = Path.dirname(Path.relative(cwd, src));\n\n if (relativeDir === \".\") return dest;\n\n const relativeDirParts: string[] = relativeDir.split(Path.sep);\n\n return Path.join(dest, ...relativeDirParts.slice(1));\n};\n\ntype GenerateTargetsOptions = {\n cwd: string;\n src: string;\n target: Target;\n flatten: boolean;\n};\n\ntype GeneratedTargetKind = ResolvedTargetKind;\n\ntype GeneratedTarget = {\n kind: GeneratedTargetKind;\n src: string;\n dest: string;\n renamed: boolean;\n transformed: boolean;\n content?: WriteFileData;\n};\n\nconst generateTargets = async ({\n cwd,\n src,\n target,\n flatten,\n}: GenerateTargetsOptions): Promise<GeneratedTarget[]> => {\n const stats: Fs.Stats = await Fsp.stat(src);\n\n if (target.transform && stats.isDirectory()) return [];\n\n const parsed = Path.parse(src);\n\n const destinations =\n typeof target.dest === \"string\"\n ? [\n target.dest,\n ]\n : target.dest;\n\n const result: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < destinations.length; i++) {\n const dest: string | undefined = destinations[i];\n\n if (dest === void 0) continue;\n\n const destDir: string = resolveDestDir({\n cwd,\n src,\n dest,\n flatten,\n });\n\n const destPath: string = target.rename\n ? renameTarget({\n path: src,\n fileName: parsed.base,\n rename: target.rename,\n })\n : parsed.base;\n\n result.push({\n kind: stats.isFile() ? \"file\" : \"directory\",\n src,\n dest: Path.join(destDir, destPath),\n renamed: Boolean(target.rename),\n transformed: Boolean(target.transform),\n ...(target.transform && {\n content:\n typeof target.transform === \"function\"\n ? await target.transform({\n fileName: parsed.base,\n content: await Fsp.readFile(src),\n })\n : target.transform,\n }),\n });\n }\n\n return result;\n};\n\nexport type { GeneratedTarget, GeneratedTargetKind, GenerateTargetsOptions };\nexport { generateTargets };\n","import * as Fsp from \"node:fs/promises\";\nimport * as Path from \"node:path\";\n\nimport { glob } from \"tinyglobby\";\n\ntype ResolveSourcePathsOptions = {\n cwd: string;\n sources: string[];\n};\n\nconst isGlobSource = (source: string): boolean =>\n source.startsWith(\"!\") ||\n source.includes(\"*\") ||\n source.includes(\"?\") ||\n source.includes(\"[\") ||\n source.includes(\"{\");\n\nconst normalizeGlobSource = (cwd: string, source: string): string => {\n const negated: boolean = source.startsWith(\"!\");\n\n const path: string = negated ? source.slice(1) : source;\n\n const pattern: string = Path.isAbsolute(path)\n ? Path.relative(cwd, path)\n : path;\n\n return negated ? `!${pattern}` : pattern;\n};\n\nconst resolveExplicitSourcePath = async (\n cwd: string,\n source: string,\n): Promise<string[]> => {\n const path: string = Path.resolve(cwd, source);\n\n try {\n await Fsp.stat(path);\n\n return [\n path,\n ];\n } catch {\n return [];\n }\n};\n\nconst resolveGlobSourcePaths = async (\n cwd: string,\n sources: string[],\n): Promise<string[]> => {\n const patterns: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n patterns.push(normalizeGlobSource(cwd, source));\n }\n\n return await glob(patterns, {\n absolute: true,\n cwd,\n onlyFiles: true,\n });\n};\n\nconst resolveSourcePaths = async ({\n cwd,\n sources,\n}: ResolveSourcePathsOptions): Promise<string[]> => {\n const paths: string[] = [];\n const globSources: string[] = [];\n\n for (let i: number = 0; i < sources.length; i++) {\n const source: string | undefined = sources[i];\n\n if (source === void 0) continue;\n\n if (isGlobSource(source)) {\n globSources.push(source);\n continue;\n }\n\n paths.push(...(await resolveExplicitSourcePath(cwd, source)));\n }\n\n if (globSources.length > 0) {\n paths.push(...(await resolveGlobSourcePaths(cwd, globSources)));\n }\n\n return paths;\n};\n\nexport type { ResolveSourcePathsOptions };\nexport { resolveSourcePaths };\n","","import type { Plugin } from \"rolldown\";\n\nimport type { CompleteOptions, Options } from \"#/@types/options\";\nimport type { Target } from \"#/@types/target\";\nimport type { GeneratedTarget } from \"#/functions/generate\";\n\nimport { toMerged } from \"es-toolkit\";\n\nimport { OPTIONS_DEFAULT } from \"#/const/options\";\nimport { copyTargets } from \"#/functions/copy\";\nimport { generateTargets } from \"#/functions/generate\";\nimport { resolveSourcePaths } from \"#/functions/resolve\";\nimport { name, version } from \"../../package.json\";\n\n/**\n * A utility to copy files and directories.\n *\n * ### Example\n *\n * ```ts\n * import { defineConfig } from \"rolldown\";\n * import { copy } from \"rolldown-plugin-copy\";\n *\n * export default defineConfig({\n * plugins: [\n * copy({\n * targets: [\n * {\n * src: \"./public/static/css/index.css\",\n * dest: \"./dist/public/static/css\",\n * },\n * ],\n * }),\n * ],\n * });\n * ```\n */\nconst copy = (options?: Options): Plugin => {\n const opts: CompleteOptions = toMerged(OPTIONS_DEFAULT, options ?? {});\n\n let copied: boolean = false;\n\n return {\n name,\n version,\n [opts.hook]: async (): Promise<void> => {\n if (opts.copyOnce === true && copied === true) return void 0;\n\n const targets: GeneratedTarget[] = [];\n\n for (let i: number = 0; i < opts.targets.length; i++) {\n const target: Target | undefined = opts.targets[i];\n\n if (target === void 0) continue;\n\n const paths: string[] = await resolveSourcePaths({\n cwd: opts.cwd,\n sources:\n typeof target.src === \"string\"\n ? [\n target.src,\n ]\n : target.src,\n });\n\n for (let j: number = 0; j < paths.length; j++) {\n const src: string | undefined = paths[j];\n\n if (src === void 0) continue;\n\n const tg: GeneratedTarget[] = await generateTargets({\n cwd: opts.cwd,\n src,\n target,\n flatten: opts.flatten,\n });\n\n targets.push(...tg);\n }\n }\n\n await copyTargets({\n cwd: opts.cwd,\n targets,\n copySync: opts.copySync,\n verbose: opts.verbose,\n onStart: opts.onStart,\n onEnd: opts.onEnd,\n onCopy: opts.onCopy,\n });\n\n copied = true;\n },\n };\n};\n\nexport { copy };\n","import { copy } from \"#/plugins/copy\";\n\nexport default copy;\n\nexport type {\n CopyEndEvent,\n CopyEndEventListener,\n CopyEvent,\n CopyEventListener,\n CopyStartEvent,\n CopyStartEventListener,\n ResolvedTarget,\n ResolvedTargetKind,\n} from \"#/@types/event\";\nexport type { Options } from \"#/@types/options\";\nexport type {\n Target,\n TargetRename,\n TargetRenameOptions,\n TargetTransform,\n TargetTransformOptions,\n WriteFileData,\n} from \"#/@types/target\";\n\nexport { copy } from \"#/plugins/copy\";\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "$schema": "https://raw.githubusercontent.com/vitejs/vite-plugin-registry/refs/heads/main/data/schema/extended-package-json.schema.json",
3
3
  "name": "rolldown-plugin-copy",
4
- "version": "0.1.1",
4
+ "version": "0.2.0",
5
5
  "description": "A utility to copy files and directories",
6
6
  "keywords": [
7
7
  "rolldown-plugin-copy",