dtsroll 1.2.0 → 1.3.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/README.md +4 -0
- package/dist/cli.mjs +2 -3
- package/dist/{index--BBQtOEp.mjs → index-0B0-hvfH.mjs} +127 -22
- package/dist/index.mjs +2 -1
- package/dist/vite.mjs +11 -7
- package/package.json +1 -1
- package/dist/log-output-CwMUFOmQ.mjs +0 -100
package/README.md
CHANGED
package/dist/cli.mjs
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { cli } from 'cleye';
|
|
3
|
-
import { b as bgYellow, a as black, d as dtsroll } from './index
|
|
4
|
-
import { l as logOutput } from './log-output-CwMUFOmQ.mjs';
|
|
3
|
+
import { b as bgYellow, a as black, d as dtsroll, l as logOutput } from './index-0B0-hvfH.mjs';
|
|
5
4
|
import 'node:path';
|
|
6
5
|
import 'node:fs/promises';
|
|
7
6
|
import 'rollup';
|
|
@@ -10,7 +9,7 @@ import '@rollup/plugin-node-resolve';
|
|
|
10
9
|
import 'byte-size';
|
|
11
10
|
|
|
12
11
|
var name = "dtsroll";
|
|
13
|
-
var version = "1.
|
|
12
|
+
var version = "1.3.0";
|
|
14
13
|
var description = "Bundle dts files";
|
|
15
14
|
|
|
16
15
|
const argv = cli({
|
|
@@ -3,6 +3,7 @@ import fs from 'node:fs/promises';
|
|
|
3
3
|
import { rollup } from 'rollup';
|
|
4
4
|
import { dts } from 'rollup-plugin-dts';
|
|
5
5
|
import nodeResolve from '@rollup/plugin-node-resolve';
|
|
6
|
+
import byteSize from 'byte-size';
|
|
6
7
|
|
|
7
8
|
let enabled = true;
|
|
8
9
|
// Support both browser and node environments
|
|
@@ -90,8 +91,116 @@ const magenta = kolorist(35, 39);
|
|
|
90
91
|
const lightYellow = kolorist(93, 39);
|
|
91
92
|
const bgYellow = kolorist(43, 49);
|
|
92
93
|
|
|
93
|
-
const
|
|
94
|
+
const cwd = process.cwd();
|
|
95
|
+
|
|
96
|
+
const isPath = (filePath) => filePath[0] === "." || path.isAbsolute(filePath);
|
|
97
|
+
const normalizePath = (filepath) => filepath.replaceAll("\\", "/");
|
|
98
|
+
|
|
94
99
|
const warningSignUnicode = "\u26A0";
|
|
100
|
+
const warningPrefix = yellow("Warning:");
|
|
101
|
+
const logOutput = (dtsOutput) => {
|
|
102
|
+
console.log(underline("dtsroll"));
|
|
103
|
+
const { inputs } = dtsOutput;
|
|
104
|
+
const isCliInput = inputs[0]?.[1] === void 0;
|
|
105
|
+
console.log(bold(`
|
|
106
|
+
\u{1F4E5} Entry points${isCliInput ? "" : " in package.json"}`));
|
|
107
|
+
console.log(
|
|
108
|
+
inputs.map(([inputFile, inputSource, error]) => {
|
|
109
|
+
const relativeInputFile = path.relative(cwd, inputFile);
|
|
110
|
+
const logPath2 = normalizePath(
|
|
111
|
+
relativeInputFile.length < inputFile.length ? relativeInputFile : inputFile
|
|
112
|
+
);
|
|
113
|
+
if (error) {
|
|
114
|
+
return ` ${lightYellow(`${warningSignUnicode} ${logPath2} ${dim(error)}`)}`;
|
|
115
|
+
}
|
|
116
|
+
return ` \u2192 ${green(logPath2)}${inputSource ? ` ${dim(`from ${inputSource}`)}` : ""}`;
|
|
117
|
+
}).join("\n")
|
|
118
|
+
);
|
|
119
|
+
if ("error" in dtsOutput) {
|
|
120
|
+
console.error(`${red("Error:")} ${dtsOutput.error}`);
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
const {
|
|
124
|
+
outputDirectory,
|
|
125
|
+
output: {
|
|
126
|
+
entries: outputEntries,
|
|
127
|
+
chunks: outputChunks
|
|
128
|
+
},
|
|
129
|
+
size,
|
|
130
|
+
externals
|
|
131
|
+
} = dtsOutput;
|
|
132
|
+
const outputDirectoryRelative = path.relative(cwd, outputDirectory);
|
|
133
|
+
const logPath = `${normalizePath(
|
|
134
|
+
outputDirectoryRelative.length < outputDirectory.length ? outputDirectoryRelative : outputDirectory
|
|
135
|
+
)}/`;
|
|
136
|
+
const logChunk = ({
|
|
137
|
+
file,
|
|
138
|
+
indent,
|
|
139
|
+
bullet,
|
|
140
|
+
color
|
|
141
|
+
}) => {
|
|
142
|
+
const sizeFormatted = byteSize(file.size).toString();
|
|
143
|
+
let log = `${indent}${bullet} ${dim(color(logPath))}${color(file.fileName)} ${sizeFormatted}`;
|
|
144
|
+
const { moduleIds, moduleToPackage } = file;
|
|
145
|
+
log += `
|
|
146
|
+
${moduleIds.sort().map((moduleId, index) => {
|
|
147
|
+
const isLast = index === moduleIds.length - 1;
|
|
148
|
+
const prefix = `${indent} ${isLast ? "\u2514\u2500 " : "\u251C\u2500 "}`;
|
|
149
|
+
const relativeModuleId = path.relative(cwd, moduleId);
|
|
150
|
+
const logModuleId = normalizePath(
|
|
151
|
+
relativeModuleId.length < moduleId.length ? relativeModuleId : moduleId
|
|
152
|
+
);
|
|
153
|
+
const bareSpecifier = moduleToPackage[moduleId];
|
|
154
|
+
if (bareSpecifier) {
|
|
155
|
+
return `${prefix}${dim(`${magenta(bareSpecifier)} (${logModuleId})`)}`;
|
|
156
|
+
}
|
|
157
|
+
return `${prefix}${dim(logModuleId)}`;
|
|
158
|
+
}).join("\n")}`;
|
|
159
|
+
return log;
|
|
160
|
+
};
|
|
161
|
+
console.log(bold("\n\u{1F4A0} Bundled output"));
|
|
162
|
+
console.log(
|
|
163
|
+
outputEntries.map((file) => logChunk({
|
|
164
|
+
file,
|
|
165
|
+
indent: " ",
|
|
166
|
+
bullet: "\u25CF",
|
|
167
|
+
color: green
|
|
168
|
+
})).join("\n\n")
|
|
169
|
+
);
|
|
170
|
+
if (outputChunks.length > 0) {
|
|
171
|
+
console.log(bold("\n Chunks"));
|
|
172
|
+
console.log(
|
|
173
|
+
outputChunks.map((file) => logChunk({
|
|
174
|
+
file,
|
|
175
|
+
indent: " ",
|
|
176
|
+
bullet: "\u25A0",
|
|
177
|
+
color: yellow
|
|
178
|
+
})).join("\n\n")
|
|
179
|
+
);
|
|
180
|
+
}
|
|
181
|
+
console.log(bold("\n\u2696\uFE0F Size savings"));
|
|
182
|
+
const difference = size.input - size.output;
|
|
183
|
+
const direction = difference > 0 ? "decrease" : "increase";
|
|
184
|
+
const percentage = (Math.abs(difference / size.input) * 100).toFixed(0);
|
|
185
|
+
console.log(` Input source size: ${byteSize(size.input).toString()}`);
|
|
186
|
+
console.log(` Bundled output size: ${byteSize(size.output).toString()}${difference === 0 ? "" : ` (${percentage}% ${direction})`}`);
|
|
187
|
+
if (externals.length > 0) {
|
|
188
|
+
console.log(bold("\n\u{1F4E6} External packages"));
|
|
189
|
+
console.log(
|
|
190
|
+
externals.map(([packageName, reason, devTypePackage]) => {
|
|
191
|
+
let stdout = ` \u2500 ${magenta(packageName)} ${dim(`externalized ${reason}`)}`;
|
|
192
|
+
if (devTypePackage) {
|
|
193
|
+
stdout += `
|
|
194
|
+
${warningPrefix} ${magenta(devTypePackage)} should not be in devDependencies if ${magenta(packageName)} is externalized`;
|
|
195
|
+
}
|
|
196
|
+
return stdout;
|
|
197
|
+
}).sort().join("\n")
|
|
198
|
+
);
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
const dtsExtensions = [".d.ts", ".d.cts", ".d.mts"];
|
|
203
|
+
const isDts = (fileName) => dtsExtensions.some((extension) => fileName.endsWith(extension));
|
|
95
204
|
|
|
96
205
|
const isValidIdentifier = /^[$_\p{ID_Start}][$\u200C\u200D\p{ID_Continue}]*$/u;
|
|
97
206
|
const reservedWords = /* @__PURE__ */ new Set([
|
|
@@ -189,7 +298,7 @@ const readPackageJson = async (filePath) => {
|
|
|
189
298
|
const getDtsEntryPoints = (packageJson, packageJsonDirectory) => {
|
|
190
299
|
const entryPoints = {};
|
|
191
300
|
const addEntry = (subpath, from) => {
|
|
192
|
-
if (!subpath
|
|
301
|
+
if (!isDts(subpath)) {
|
|
193
302
|
return;
|
|
194
303
|
}
|
|
195
304
|
const entryPath = path.join(packageJsonDirectory, subpath);
|
|
@@ -282,8 +391,7 @@ const validateInput = async (inputFiles) => {
|
|
|
282
391
|
const inputNormalized = isCliInput ? inputFiles.map((i) => [i]) : Object.entries(inputFiles);
|
|
283
392
|
return await Promise.all(inputNormalized.map(
|
|
284
393
|
async ([inputFile, inputSource]) => {
|
|
285
|
-
|
|
286
|
-
if (notDts) {
|
|
394
|
+
if (!isDts(inputFile)) {
|
|
287
395
|
return [inputFile, inputSource, "Ignoring non-d.ts input"];
|
|
288
396
|
}
|
|
289
397
|
const exists = await pathExists(inputFile);
|
|
@@ -295,8 +403,6 @@ const validateInput = async (inputFiles) => {
|
|
|
295
403
|
));
|
|
296
404
|
};
|
|
297
405
|
|
|
298
|
-
const isPath = ([firstCharacter]) => firstCharacter === "." || firstCharacter === path.sep;
|
|
299
|
-
|
|
300
406
|
const createExternalizePlugin = (configuredExternals) => {
|
|
301
407
|
const resolvedBareSpecifiers = /* @__PURE__ */ new Map();
|
|
302
408
|
const importPath = /* @__PURE__ */ new Map();
|
|
@@ -330,11 +436,11 @@ const createExternalizePlugin = (configuredExternals) => {
|
|
|
330
436
|
}
|
|
331
437
|
if (packageName) {
|
|
332
438
|
externalized.set(packageName, "because unresolvable");
|
|
439
|
+
return {
|
|
440
|
+
id,
|
|
441
|
+
external: true
|
|
442
|
+
};
|
|
333
443
|
}
|
|
334
|
-
return {
|
|
335
|
-
id,
|
|
336
|
-
external: true
|
|
337
|
-
};
|
|
338
444
|
}
|
|
339
445
|
};
|
|
340
446
|
const getPackageEntryPoint = (subpackagePath) => {
|
|
@@ -371,17 +477,15 @@ const removeBundledModulesPlugin = (outputDirectory, sizeRef) => {
|
|
|
371
477
|
},
|
|
372
478
|
async generateBundle(options, bundle) {
|
|
373
479
|
const modules = Object.values(bundle);
|
|
374
|
-
const
|
|
375
|
-
|
|
376
|
-
// To avoid deleting files from symlinked dependencies
|
|
377
|
-
moduleId.startsWith(outputDirectory) && !moduleId.includes(nodeModules)
|
|
378
|
-
))
|
|
379
|
-
));
|
|
380
|
-
const fileSizes = bundledSourceFiles.map((moduleId) => this.getModuleInfo(moduleId).meta);
|
|
480
|
+
const bundledFiles = Array.from(new Set(modules.flatMap(({ moduleIds }) => moduleIds)));
|
|
481
|
+
const fileSizes = bundledFiles.map((moduleId) => this.getModuleInfo(moduleId).meta);
|
|
381
482
|
const totalSize = fileSizes.reduce((total, { size }) => total + size, 0);
|
|
382
483
|
sizeRef.value = totalSize;
|
|
383
484
|
const outputFiles = new Set(modules.map(({ fileName }) => path.join(options.dir, fileName)));
|
|
384
|
-
deleteFiles =
|
|
485
|
+
deleteFiles = bundledFiles.filter((moduleId) => (
|
|
486
|
+
// To avoid deleting files from symlinked dependencies
|
|
487
|
+
moduleId.startsWith(outputDirectory) && !moduleId.includes(nodeModules) && !outputFiles.has(moduleId)
|
|
488
|
+
));
|
|
385
489
|
},
|
|
386
490
|
writeBundle: async () => {
|
|
387
491
|
await Promise.all(
|
|
@@ -393,7 +497,7 @@ const removeBundledModulesPlugin = (outputDirectory, sizeRef) => {
|
|
|
393
497
|
|
|
394
498
|
const createInputMap = (input, outputDirectory) => Object.fromEntries(
|
|
395
499
|
input.map((inputFile) => [
|
|
396
|
-
inputFile.slice(outputDirectory.length + 1)
|
|
500
|
+
inputFile.slice(outputDirectory.length + 1),
|
|
397
501
|
inputFile
|
|
398
502
|
])
|
|
399
503
|
);
|
|
@@ -409,13 +513,14 @@ const build = async (input, outputDirectory, externals, mode, conditions) => {
|
|
|
409
513
|
output: {
|
|
410
514
|
// sourcemap: true,
|
|
411
515
|
dir: outputDirectory,
|
|
516
|
+
entryFileNames: "[name]",
|
|
412
517
|
chunkFileNames: "_dtsroll-chunks/[name].ts"
|
|
413
518
|
},
|
|
414
519
|
plugins: [
|
|
415
520
|
externalizePlugin,
|
|
416
521
|
removeBundledModulesPlugin(outputDirectory, sizeRef),
|
|
417
522
|
nodeResolve({
|
|
418
|
-
extensions: [".ts",
|
|
523
|
+
extensions: [".ts", ...dtsExtensions],
|
|
419
524
|
exportConditions: conditions
|
|
420
525
|
}),
|
|
421
526
|
dts({
|
|
@@ -452,7 +557,7 @@ const dtsroll = async ({
|
|
|
452
557
|
const externals = pkgJson ? pkgJson.getExternals() : /* @__PURE__ */ new Map();
|
|
453
558
|
if (external && external.length > 0) {
|
|
454
559
|
if (pkgJson) {
|
|
455
|
-
console.warn(`${
|
|
560
|
+
console.warn(`${warningPrefix} The --external flag is only supported when there is no package.json`);
|
|
456
561
|
} else {
|
|
457
562
|
for (const externalDependency of external) {
|
|
458
563
|
externals.set(externalDependency, "by --external flag");
|
|
@@ -532,4 +637,4 @@ const dtsroll = async ({
|
|
|
532
637
|
};
|
|
533
638
|
};
|
|
534
639
|
|
|
535
|
-
export { black as a, bgYellow as b,
|
|
640
|
+
export { black as a, bgYellow as b, dtsroll as d, logOutput as l };
|
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import 'node:path';
|
|
2
|
-
export { d as dtsroll } from './index
|
|
2
|
+
export { d as dtsroll } from './index-0B0-hvfH.mjs';
|
|
3
3
|
import 'node:fs/promises';
|
|
4
4
|
import 'rollup';
|
|
5
5
|
import 'rollup-plugin-dts';
|
|
6
6
|
import '@rollup/plugin-node-resolve';
|
|
7
|
+
import 'byte-size';
|
package/dist/vite.mjs
CHANGED
|
@@ -1,21 +1,22 @@
|
|
|
1
|
-
import { l as logOutput } from './
|
|
2
|
-
import { d as dtsroll } from './index--BBQtOEp.mjs';
|
|
1
|
+
import { d as dtsroll, l as logOutput } from './index-0B0-hvfH.mjs';
|
|
3
2
|
import 'node:path';
|
|
4
|
-
import 'byte-size';
|
|
5
3
|
import 'node:fs/promises';
|
|
6
4
|
import 'rollup';
|
|
7
5
|
import 'rollup-plugin-dts';
|
|
8
6
|
import '@rollup/plugin-node-resolve';
|
|
7
|
+
import 'byte-size';
|
|
9
8
|
|
|
10
9
|
const dtsrollPlugin = (options) => {
|
|
11
10
|
let built = false;
|
|
12
11
|
let cwd;
|
|
12
|
+
let noLog = false;
|
|
13
13
|
return {
|
|
14
14
|
name: "dtsroll",
|
|
15
15
|
apply: "build",
|
|
16
16
|
enforce: "post",
|
|
17
|
-
config: ({ root }) => {
|
|
17
|
+
config: ({ root, logLevel }) => {
|
|
18
18
|
cwd = root;
|
|
19
|
+
noLog = logLevel === "silent";
|
|
19
20
|
},
|
|
20
21
|
writeBundle: {
|
|
21
22
|
sequential: true,
|
|
@@ -24,12 +25,15 @@ const dtsrollPlugin = (options) => {
|
|
|
24
25
|
if (built) {
|
|
25
26
|
return;
|
|
26
27
|
}
|
|
27
|
-
|
|
28
|
+
const output = await dtsroll({
|
|
28
29
|
cwd,
|
|
29
30
|
...options
|
|
30
|
-
})
|
|
31
|
-
console.log();
|
|
31
|
+
});
|
|
32
32
|
built = true;
|
|
33
|
+
if (!noLog) {
|
|
34
|
+
logOutput(output);
|
|
35
|
+
console.log();
|
|
36
|
+
}
|
|
33
37
|
}
|
|
34
38
|
}
|
|
35
39
|
};
|
package/package.json
CHANGED
|
@@ -1,100 +0,0 @@
|
|
|
1
|
-
import path from 'node:path';
|
|
2
|
-
import byteSize from 'byte-size';
|
|
3
|
-
import { u as underline, c as bold, l as lightYellow, w as warningSignUnicode, e as dim, g as green, r as red, m as magenta, y as yellow } from './index--BBQtOEp.mjs';
|
|
4
|
-
|
|
5
|
-
const cwd = process.cwd();
|
|
6
|
-
|
|
7
|
-
const logOutput = (dtsOutput) => {
|
|
8
|
-
console.log(underline("dtsroll"));
|
|
9
|
-
const { inputs } = dtsOutput;
|
|
10
|
-
const isCliInput = inputs[0]?.[1] === void 0;
|
|
11
|
-
console.log(bold(`
|
|
12
|
-
\u{1F4E5} Entry points${isCliInput ? "" : " in package.json"}`));
|
|
13
|
-
console.log(
|
|
14
|
-
inputs.map(([inputFile, inputSource, error]) => {
|
|
15
|
-
const relativeInputFile = path.relative(cwd, inputFile);
|
|
16
|
-
const logPath2 = relativeInputFile.length < inputFile.length ? relativeInputFile : inputFile;
|
|
17
|
-
if (error) {
|
|
18
|
-
return ` ${lightYellow(`${warningSignUnicode} ${logPath2} ${dim(error)}`)}`;
|
|
19
|
-
}
|
|
20
|
-
return ` \u2192 ${green(logPath2)}${inputSource ? ` ${dim(`from ${inputSource}`)}` : ""}`;
|
|
21
|
-
}).join("\n")
|
|
22
|
-
);
|
|
23
|
-
if ("error" in dtsOutput) {
|
|
24
|
-
console.error(`${red("Error:")} ${dtsOutput.error}`);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const {
|
|
28
|
-
outputDirectory,
|
|
29
|
-
output: {
|
|
30
|
-
entries: outputEntries,
|
|
31
|
-
chunks: outputChunks
|
|
32
|
-
},
|
|
33
|
-
size,
|
|
34
|
-
externals
|
|
35
|
-
} = dtsOutput;
|
|
36
|
-
const outputDirectoryRelative = path.relative(cwd, outputDirectory);
|
|
37
|
-
const logPath = (outputDirectoryRelative.length < outputDirectory.length ? outputDirectoryRelative : outputDirectory) + path.sep;
|
|
38
|
-
const logChunk = ({
|
|
39
|
-
file,
|
|
40
|
-
indent,
|
|
41
|
-
bullet,
|
|
42
|
-
color
|
|
43
|
-
}) => {
|
|
44
|
-
const sizeFormatted = byteSize(file.size).toString();
|
|
45
|
-
let log = `${indent}${bullet} ${dim(color(logPath))}${color(file.fileName)} ${sizeFormatted}`;
|
|
46
|
-
const { moduleIds, moduleToPackage } = file;
|
|
47
|
-
log += `
|
|
48
|
-
${moduleIds.sort().map((moduleId, index) => {
|
|
49
|
-
const isLast = index === moduleIds.length - 1;
|
|
50
|
-
const prefix = `${indent} ${isLast ? "\u2514\u2500 " : "\u251C\u2500 "}`;
|
|
51
|
-
const relativeModuleId = path.relative(cwd, moduleId);
|
|
52
|
-
const logModuleId = relativeModuleId.length < moduleId.length ? relativeModuleId : moduleId;
|
|
53
|
-
const bareSpecifier = moduleToPackage[moduleId];
|
|
54
|
-
if (bareSpecifier) {
|
|
55
|
-
return `${prefix}${dim(`${magenta(bareSpecifier)} (${logModuleId})`)}`;
|
|
56
|
-
}
|
|
57
|
-
return `${prefix}${dim(logModuleId)}`;
|
|
58
|
-
}).join("\n")}`;
|
|
59
|
-
return log;
|
|
60
|
-
};
|
|
61
|
-
console.log(bold("\n\u{1F4A0} Bundled output"));
|
|
62
|
-
console.log(
|
|
63
|
-
outputEntries.map((file) => logChunk({
|
|
64
|
-
file,
|
|
65
|
-
indent: " ",
|
|
66
|
-
bullet: "\u25CF",
|
|
67
|
-
color: green
|
|
68
|
-
})).join("\n\n")
|
|
69
|
-
);
|
|
70
|
-
if (outputChunks.length > 0) {
|
|
71
|
-
console.log(bold("\n Chunks"));
|
|
72
|
-
console.log(
|
|
73
|
-
outputChunks.map((file) => logChunk({
|
|
74
|
-
file,
|
|
75
|
-
indent: " ",
|
|
76
|
-
bullet: "\u25A0",
|
|
77
|
-
color: yellow
|
|
78
|
-
})).join("\n\n")
|
|
79
|
-
);
|
|
80
|
-
}
|
|
81
|
-
console.log(bold("\n\u2696\uFE0F Size savings"));
|
|
82
|
-
const percentage = ((size.input - size.output) / size.input * 100).toFixed(0);
|
|
83
|
-
console.log(` Input source size: ${byteSize(size.input).toString()}`);
|
|
84
|
-
console.log(` Bundled output size: ${byteSize(size.output).toString()} (${percentage}% decrease)`);
|
|
85
|
-
if (externals.length > 0) {
|
|
86
|
-
console.log(bold("\n\u{1F4E6} External packages"));
|
|
87
|
-
console.log(
|
|
88
|
-
externals.map(([packageName, reason, devTypePackage]) => {
|
|
89
|
-
let stdout = ` \u2500 ${magenta(packageName)} ${dim(`externalized ${reason}`)}`;
|
|
90
|
-
if (devTypePackage) {
|
|
91
|
-
stdout += `
|
|
92
|
-
${yellow("Warning:")} ${magenta(devTypePackage)} should not be in devDependencies if ${magenta(packageName)} is externalized`;
|
|
93
|
-
}
|
|
94
|
-
return stdout;
|
|
95
|
-
}).sort().join("\n")
|
|
96
|
-
);
|
|
97
|
-
}
|
|
98
|
-
};
|
|
99
|
-
|
|
100
|
-
export { logOutput as l };
|