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 +93 -5
- package/dist/index.js +48 -5
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +48 -5
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
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
|
-
*
|
|
113
|
-
*
|
|
114
|
-
* By default, it is `[]`.
|
|
194
|
+
* Listener called before any copy begins.
|
|
115
195
|
*/
|
|
116
|
-
|
|
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
|
-
|
|
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
|
|
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.
|
|
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":"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"}
|
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
|
-
|
|
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
|
|
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.
|
|
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
|
}
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
4
|
+
"version": "0.2.0",
|
|
5
5
|
"description": "A utility to copy files and directories",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"rolldown-plugin-copy",
|