bunup 0.14.12 → 0.14.13
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/cli/index.js +148 -24
- package/dist/index.d.ts +1 -1
- package/dist/index.js +2 -2
- package/dist/plugins.d.ts +1 -1
- package/dist/plugins.js +1 -1
- package/dist/shared/{bunup-es9v2p5v.js → bunup-025ckbke.js} +9 -12
- package/dist/shared/{bunup-6xvphypm.js → bunup-0cz3ntgr.js} +29 -135
- package/dist/shared/{bunup-fwrvv30e.d.ts → bunup-kgz99eee.d.ts} +2 -0
- package/package.json +3 -3
package/dist/cli/index.js
CHANGED
|
@@ -2,33 +2,153 @@
|
|
|
2
2
|
// @bun
|
|
3
3
|
import {
|
|
4
4
|
build,
|
|
5
|
-
printBuildReport,
|
|
6
5
|
processLoadedConfigs,
|
|
7
6
|
resolveBuildOptions
|
|
8
|
-
} from "../shared/bunup-
|
|
7
|
+
} from "../shared/bunup-0cz3ntgr.js";
|
|
9
8
|
import {
|
|
10
9
|
BunupCLIError,
|
|
11
10
|
BunupWatchError,
|
|
12
11
|
__require,
|
|
13
12
|
__toESM,
|
|
14
13
|
ensureArray,
|
|
14
|
+
formatFileSize,
|
|
15
15
|
getShortFilePath,
|
|
16
16
|
handleError,
|
|
17
17
|
handleErrorAndExit,
|
|
18
|
+
isJavascriptFile,
|
|
19
|
+
isTypeScriptFile,
|
|
18
20
|
logTime,
|
|
19
21
|
logger,
|
|
20
22
|
parseErrorMessage
|
|
21
|
-
} from "../shared/bunup-
|
|
23
|
+
} from "../shared/bunup-025ckbke.js";
|
|
22
24
|
|
|
23
25
|
// packages/bunup/src/cli/index.ts
|
|
24
26
|
import { loadConfig } from "coffi";
|
|
25
|
-
import
|
|
27
|
+
import pc4 from "picocolors";
|
|
26
28
|
// packages/bunup/package.json
|
|
27
|
-
var version = "0.14.
|
|
29
|
+
var version = "0.14.13";
|
|
30
|
+
|
|
31
|
+
// packages/bunup/src/printer/print-build-report.ts
|
|
32
|
+
import { promisify } from "util";
|
|
33
|
+
import { brotliCompress } from "zlib";
|
|
34
|
+
import pc from "picocolors";
|
|
35
|
+
var brotliAsync = promisify(brotliCompress);
|
|
36
|
+
async function printBuildReport(buildOutput) {
|
|
37
|
+
const options = buildOutput.options;
|
|
38
|
+
const { gzip = true, brotli = false, maxBundleSize } = options.report ?? {};
|
|
39
|
+
const showCompression = gzip || brotli;
|
|
40
|
+
const files = await Promise.all(buildOutput.files.map(async (file) => {
|
|
41
|
+
const pathRelative = file.pathRelativeToOutdir;
|
|
42
|
+
const bunFile = Bun.file(file.fullPath);
|
|
43
|
+
const size = bunFile.size;
|
|
44
|
+
const isDts = file.dts && file.kind === "entry-point";
|
|
45
|
+
const isJs = isTypeScriptFile(file.fullPath) || isJavascriptFile(file.fullPath);
|
|
46
|
+
let gzipSize;
|
|
47
|
+
let brotliSize;
|
|
48
|
+
if (showCompression) {
|
|
49
|
+
const uint8 = new Uint8Array(await bunFile.arrayBuffer());
|
|
50
|
+
const [gzipResult, brotliResult] = await Promise.all([
|
|
51
|
+
gzip ? Promise.resolve(Bun.gzipSync(uint8)) : Promise.resolve(null),
|
|
52
|
+
brotli ? brotliAsync(uint8) : Promise.resolve(null)
|
|
53
|
+
]);
|
|
54
|
+
gzipSize = gzipResult?.length;
|
|
55
|
+
brotliSize = brotliResult?.length;
|
|
56
|
+
}
|
|
57
|
+
return {
|
|
58
|
+
path: pathRelative,
|
|
59
|
+
fullPath: `${options.outDir}/${pathRelative}`,
|
|
60
|
+
size,
|
|
61
|
+
gzipSize,
|
|
62
|
+
brotliSize,
|
|
63
|
+
format: file.format,
|
|
64
|
+
isDts,
|
|
65
|
+
isJs
|
|
66
|
+
};
|
|
67
|
+
}));
|
|
68
|
+
const totalSize = files.reduce((sum, file) => sum + file.size, 0);
|
|
69
|
+
const totalGzipSize = files.reduce((sum, file) => sum + (file.gzipSize || 0), 0);
|
|
70
|
+
const totalBrotliSize = files.reduce((sum, file) => sum + (file.brotliSize || 0), 0);
|
|
71
|
+
const formats = ensureArray(options.format);
|
|
72
|
+
const showFormat = formats.length > 1 || formats[0] === "cjs";
|
|
73
|
+
const formatLabelWidth = showFormat ? Math.max(...formats.map((f) => `[${f}] `.length)) : 0;
|
|
74
|
+
const pathWidth = Math.max(...files.map((f) => f.fullPath.length), "Output".length);
|
|
75
|
+
const sizeWidth = Math.max(formatFileSize(totalSize).length, "Raw".length);
|
|
76
|
+
const gzipWidth = gzip ? Math.max(formatFileSize(totalGzipSize).length, "Gzip".length) : 0;
|
|
77
|
+
const brotliWidth = brotli ? Math.max(formatFileSize(totalBrotliSize).length, "Brotli".length) : 0;
|
|
78
|
+
const pad = (str, width, align = "left") => {
|
|
79
|
+
const diff = width - str.length;
|
|
80
|
+
return align === "left" ? str + " ".repeat(Math.max(0, diff)) : " ".repeat(Math.max(0, diff)) + str;
|
|
81
|
+
};
|
|
82
|
+
console.log("");
|
|
83
|
+
if (options.name) {
|
|
84
|
+
console.log("");
|
|
85
|
+
console.log(` ${pc.bgBlueBright(` ${options.name} `)}`);
|
|
86
|
+
}
|
|
87
|
+
console.log("");
|
|
88
|
+
const headers = [
|
|
89
|
+
pad(" Output", pathWidth + formatLabelWidth + 2),
|
|
90
|
+
pad("Raw", sizeWidth, "right")
|
|
91
|
+
];
|
|
92
|
+
if (gzip)
|
|
93
|
+
headers.push(pad("Gzip", gzipWidth, "right"));
|
|
94
|
+
if (brotli)
|
|
95
|
+
headers.push(pad("Brotli", brotliWidth, "right"));
|
|
96
|
+
console.log(pc.dim(headers.join(" ")));
|
|
97
|
+
console.log("");
|
|
98
|
+
for (const file of files) {
|
|
99
|
+
let formatLabel = "";
|
|
100
|
+
if (showFormat) {
|
|
101
|
+
let plainFormatLabel = "";
|
|
102
|
+
if (file.isJs) {
|
|
103
|
+
plainFormatLabel = `[${file.format}] `;
|
|
104
|
+
}
|
|
105
|
+
formatLabel = pc.dim(pad(plainFormatLabel, formatLabelWidth));
|
|
106
|
+
}
|
|
107
|
+
const outDirWithSlash = `${options.outDir}/`;
|
|
108
|
+
const fileName = file.isDts ? pc.green(pc.bold(file.path)) : file.path;
|
|
109
|
+
const styledPath = `${pc.dim(outDirWithSlash)}${fileName}`;
|
|
110
|
+
const plainPath = `${outDirWithSlash}${file.path}`;
|
|
111
|
+
const filePathColumn = ` ${formatLabel}${styledPath}${" ".repeat(Math.max(0, pathWidth - plainPath.length))}`;
|
|
112
|
+
const fileRow = [
|
|
113
|
+
filePathColumn,
|
|
114
|
+
pad(formatFileSize(file.size), sizeWidth, "right")
|
|
115
|
+
];
|
|
116
|
+
if (gzip) {
|
|
117
|
+
const gzipStr = file.gzipSize ? formatFileSize(file.gzipSize) : pc.dim("-");
|
|
118
|
+
fileRow.push(pad(gzipStr, gzipWidth, "right"));
|
|
119
|
+
}
|
|
120
|
+
if (brotli) {
|
|
121
|
+
const brotliStr = file.brotliSize ? formatFileSize(file.brotliSize) : pc.dim("-");
|
|
122
|
+
fileRow.push(pad(brotliStr, brotliWidth, "right"));
|
|
123
|
+
}
|
|
124
|
+
console.log(fileRow.join(" "));
|
|
125
|
+
}
|
|
126
|
+
console.log("");
|
|
127
|
+
const summaryRow = [
|
|
128
|
+
` ${pc.bold(pad(`${files.length} files`, pathWidth + formatLabelWidth))}`,
|
|
129
|
+
pc.bold(pad(formatFileSize(totalSize), sizeWidth, "right"))
|
|
130
|
+
];
|
|
131
|
+
if (gzip && totalGzipSize > 0) {
|
|
132
|
+
summaryRow.push(pc.bold(pad(formatFileSize(totalGzipSize), gzipWidth, "right")));
|
|
133
|
+
} else if (gzip) {
|
|
134
|
+
summaryRow.push(pad("", gzipWidth));
|
|
135
|
+
}
|
|
136
|
+
if (brotli && totalBrotliSize > 0) {
|
|
137
|
+
summaryRow.push(pc.bold(pad(formatFileSize(totalBrotliSize), brotliWidth, "right")));
|
|
138
|
+
} else if (brotli) {
|
|
139
|
+
summaryRow.push(pad("", brotliWidth));
|
|
140
|
+
}
|
|
141
|
+
console.log(summaryRow.join(" "));
|
|
142
|
+
if (maxBundleSize && totalSize > maxBundleSize) {
|
|
143
|
+
console.log("");
|
|
144
|
+
console.warn(pc.yellow(` Bundle size ${pc.bold(formatFileSize(totalSize))} exceeds limit ${pc.bold(formatFileSize(maxBundleSize))}`));
|
|
145
|
+
}
|
|
146
|
+
console.log("");
|
|
147
|
+
}
|
|
28
148
|
|
|
29
149
|
// packages/bunup/src/watch.ts
|
|
30
150
|
import path from "path";
|
|
31
|
-
import
|
|
151
|
+
import pc2 from "picocolors";
|
|
32
152
|
async function watch(userOptions, rootDir, configFilePath) {
|
|
33
153
|
const watchPaths = new Set;
|
|
34
154
|
const options = resolveBuildOptions(userOptions);
|
|
@@ -70,14 +190,14 @@ async function watch(userOptions, rootDir, configFilePath) {
|
|
|
70
190
|
lastChangedFile = changed;
|
|
71
191
|
if (!initial) {
|
|
72
192
|
console.log(`
|
|
73
|
-
${buildCount > 1 ?
|
|
193
|
+
${buildCount > 1 ? pc2.magentaBright(`[x${buildCount}] `) : ""}${pc2.green(`Changed:`)} ${changed}${options.name ? ` ${pc2.bgBlueBright(` ${options.name} `)}` : ""}`);
|
|
74
194
|
}
|
|
75
195
|
const start = performance.now();
|
|
76
196
|
const buildOutput = await build(userOptions, rootDir);
|
|
77
|
-
await printBuildReport(buildOutput
|
|
197
|
+
await printBuildReport(buildOutput);
|
|
78
198
|
if (!initial) {
|
|
79
199
|
console.log(`
|
|
80
|
-
${
|
|
200
|
+
${pc2.green("\u2713")} Rebuild completed in ${pc2.green(logTime(performance.now() - start))}`);
|
|
81
201
|
}
|
|
82
202
|
} catch (error) {
|
|
83
203
|
handleError(error);
|
|
@@ -87,7 +207,7 @@ async function watch(userOptions, rootDir, configFilePath) {
|
|
|
87
207
|
};
|
|
88
208
|
watcher.on("change", (changedPath) => {
|
|
89
209
|
if (configFilePath && changedPath === configFilePath) {
|
|
90
|
-
console.log(
|
|
210
|
+
console.log(pc2.yellow(` Please restart watch mode to apply configuration changes.
|
|
91
211
|
`));
|
|
92
212
|
cleanup();
|
|
93
213
|
return;
|
|
@@ -107,20 +227,20 @@ async function watch(userOptions, rootDir, configFilePath) {
|
|
|
107
227
|
}
|
|
108
228
|
|
|
109
229
|
// packages/bunup/src/cli/options.ts
|
|
110
|
-
import
|
|
230
|
+
import pc3 from "picocolors";
|
|
111
231
|
import { cli, z } from "zlye";
|
|
112
232
|
var program = cli().name("bunup").version(version).description("A blazing-fast build tool for your TypeScript/React libraries - built on Bun").with({
|
|
113
233
|
ignoreOptionDefaultValue: true
|
|
114
234
|
}).example([
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
235
|
+
pc3.gray(`${pc3.blue("bunup")} # Basic build`),
|
|
236
|
+
pc3.gray(`${pc3.blue("bunup src/index.ts")} # Single entry file`),
|
|
237
|
+
pc3.gray(`${pc3.blue("bunup src/**/*.ts")} # Glob pattern for multiple files`),
|
|
238
|
+
pc3.gray(`${pc3.blue("bunup --watch")} # Watch mode`),
|
|
239
|
+
pc3.gray(`${pc3.blue("bunup --format cjs,esm")} # Multiple formats`),
|
|
240
|
+
pc3.gray(`${pc3.blue("bunup --target bun")} # Bun target`),
|
|
241
|
+
pc3.gray(`${pc3.blue("bunup src/cli.ts")} # Multiple entries`),
|
|
242
|
+
pc3.gray(`${pc3.blue("bunup --dts.splitting")} # Declaration splitting`),
|
|
243
|
+
pc3.gray(`${pc3.blue("bunup --no-clean")} # Disable cleaning output directory before build`)
|
|
124
244
|
]).option("entry", z.union(z.string().describe("Entry file or glob pattern"), z.array(z.string()).describe("Multiple entry files or globs")).alias("e").optional()).option("config", z.union(z.string().describe("Path to a custom configuration file").alias("c").example("./configs/custom.bunup.config.js"), z.boolean().describe("Whether to use a configuration file").default(true)).optional()).option("filter", z.array(z.string()).describe("Filter workspace packages by name").optional()).option("name", z.string().describe("Name of the build configuration (for logging and identification)").example("my-library").optional()).option("out-dir", z.string().describe("Output directory for bundled files").alias("o").default("dist")).option("format", z.union(z.string().choices(["esm", "cjs", "iife"]).describe("Single output format"), z.array(z.string().choices(["esm", "cjs", "iife"])).describe("Multiple output formats")).alias("f").default("esm")).option("minify", z.boolean().describe("Enable all minification options (whitespace, identifiers, syntax)").optional()).option("minify-whitespace", z.boolean().describe("Minify whitespace in the output to reduce file size").optional()).option("minify-identifiers", z.boolean().describe("Minify identifiers by renaming variables to shorter names").optional()).option("minify-syntax", z.boolean().describe("Minify syntax by optimizing code structure").optional()).option("watch", z.boolean().describe("Watch for file changes and rebuild automatically").optional()).option("clean", z.boolean().describe("Clean the output directory before building").default(true)).option("silent", z.boolean().describe("Disable logging during the build process").alias("q").optional()).option("splitting", z.boolean().describe("Enable code splitting").default(true, "enabled by default for ESM format")).option("conditions", z.array(z.string()).describe("Package.json export conditions for import resolution").optional()).option("target", z.string().choices(["bun", "node", "browser"]).describe("Target environment for the bundle").alias("t").default("node")).option("external", z.array(z.string()).describe("External packages that should not be bundled").optional()).option("no-external", z.array(z.string()).describe("Packages that should be bundled even if listed in external").optional()).option("shims", z.boolean().describe("Enable shims for Node.js globals and ESM/CJS interoperability").optional()).option("report", z.object({
|
|
125
245
|
gzip: z.boolean().describe("Enable gzip compression size calculation").default(true),
|
|
126
246
|
brotli: z.boolean().describe("Enable brotli compression size calculation").optional(),
|
|
@@ -200,6 +320,7 @@ async function main(args = Bun.argv.slice(2)) {
|
|
|
200
320
|
}
|
|
201
321
|
logger.info("Build started");
|
|
202
322
|
const startTime = performance.now();
|
|
323
|
+
const buildOutputs = [];
|
|
203
324
|
await Promise.all(configsToProcess.flatMap(({ options, rootDir }) => {
|
|
204
325
|
const optionsArray = ensureArray(options);
|
|
205
326
|
return optionsArray.map(async (o) => {
|
|
@@ -210,18 +331,21 @@ async function main(args = Bun.argv.slice(2)) {
|
|
|
210
331
|
if (userOptions.watch) {
|
|
211
332
|
await watch(userOptions, rootDir, filepath);
|
|
212
333
|
} else {
|
|
213
|
-
await build(userOptions, rootDir);
|
|
334
|
+
buildOutputs.push(await build(userOptions, rootDir));
|
|
214
335
|
}
|
|
215
336
|
});
|
|
216
337
|
}));
|
|
338
|
+
const buildTimeMs = performance.now() - startTime;
|
|
339
|
+
if (!cliOptions.watch && !shouldSilent) {
|
|
340
|
+
await Promise.all(buildOutputs.map((o) => printBuildReport(o)));
|
|
341
|
+
}
|
|
217
342
|
if (cliOptions.watch) {
|
|
218
343
|
console.log(`
|
|
219
|
-
${
|
|
344
|
+
${pc4.bgMagentaBright(" WATCH ")} Watching for file changes...
|
|
220
345
|
`);
|
|
221
346
|
}
|
|
222
|
-
const buildTimeMs = performance.now() - startTime;
|
|
223
347
|
logger.space();
|
|
224
|
-
logger.success(`Build completed in ${
|
|
348
|
+
logger.success(`Build completed in ${pc4.green(logTime(buildTimeMs))}`);
|
|
225
349
|
}
|
|
226
350
|
var CLI_ONLY_OPTIONS = ["config", "filter"];
|
|
227
351
|
function removeCliOnlyOptions(options) {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Arrayable, BuildContext, BuildMeta, BuildOptions, BuildOutput, BuildOutputFile, BunupPlugin, DefineConfigItem, DefineWorkspaceItem, WithOptional } from "./shared/bunup-
|
|
1
|
+
import { Arrayable, BuildContext, BuildMeta, BuildOptions, BuildOutput, BuildOutputFile, BunupPlugin, DefineConfigItem, DefineWorkspaceItem, WithOptional } from "./shared/bunup-kgz99eee";
|
|
2
2
|
declare function build(userOptions: Partial<BuildOptions>, rootDir?: string): Promise<BuildOutput>;
|
|
3
3
|
declare function defineConfig(options: Arrayable<DefineConfigItem>): Arrayable<DefineConfigItem>;
|
|
4
4
|
declare function defineWorkspace(options: WithOptional<DefineWorkspaceItem, "config">[], sharedOptions?: Partial<DefineConfigItem>): DefineWorkspaceItem[];
|
package/dist/index.js
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
import {
|
|
3
3
|
build
|
|
4
|
-
} from "./shared/bunup-
|
|
5
|
-
import"./shared/bunup-
|
|
4
|
+
} from "./shared/bunup-0cz3ntgr.js";
|
|
5
|
+
import"./shared/bunup-025ckbke.js";
|
|
6
6
|
// packages/bunup/src/define.ts
|
|
7
7
|
function defineConfig(options) {
|
|
8
8
|
return options;
|
package/dist/plugins.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { BuildOptions, BunupPlugin, BunupPluginHooks, exports, injectStyles, unused } from "./shared/bunup-
|
|
1
|
+
import { BuildOptions, BunupPlugin, BunupPluginHooks, exports, injectStyles, unused } from "./shared/bunup-kgz99eee";
|
|
2
2
|
type CopyOptions = {
|
|
3
3
|
/** Whether to follow symbolic links when copying files. */
|
|
4
4
|
followSymlinks?: boolean
|
package/dist/plugins.js
CHANGED
|
@@ -369,32 +369,29 @@ async function cleanOutDir(rootDir, outDir) {
|
|
|
369
369
|
}
|
|
370
370
|
}
|
|
371
371
|
function cleanPath(path2) {
|
|
372
|
-
|
|
373
|
-
cleaned = cleaned.replace(/^[a-zA-Z]:\//, "");
|
|
374
|
-
cleaned = cleaned.replace(/^\/+/, "");
|
|
375
|
-
cleaned = cleaned.replace(/\/+/g, "/");
|
|
376
|
-
return cleaned;
|
|
372
|
+
return normalize(path2).replace(/\\/g, "/").replace(/^[a-zA-Z]:\//, "").replace(/^\/+/, "").replace(/\/+/g, "/");
|
|
377
373
|
}
|
|
374
|
+
var listFormatter = new Intl.ListFormat("en", {
|
|
375
|
+
style: "long",
|
|
376
|
+
type: "conjunction"
|
|
377
|
+
});
|
|
378
378
|
function formatListWithAnd(arr) {
|
|
379
|
-
return
|
|
380
|
-
style: "long",
|
|
381
|
-
type: "conjunction"
|
|
382
|
-
}).format(arr);
|
|
379
|
+
return listFormatter.format(arr);
|
|
383
380
|
}
|
|
384
|
-
|
|
381
|
+
function getFilesFromGlobs(patterns, cwd) {
|
|
385
382
|
const includePatterns = patterns.filter((p) => !p.startsWith("!"));
|
|
386
383
|
const excludePatterns = patterns.filter((p) => p.startsWith("!")).map((p) => p.slice(1));
|
|
387
384
|
const includedFiles = new Set;
|
|
388
385
|
for (const pattern of includePatterns) {
|
|
389
386
|
const glob = new Bun.Glob(pattern);
|
|
390
|
-
for
|
|
387
|
+
for (const file of glob.scanSync(cwd)) {
|
|
391
388
|
includedFiles.add(file);
|
|
392
389
|
}
|
|
393
390
|
}
|
|
394
391
|
if (excludePatterns.length > 0) {
|
|
395
392
|
for (const pattern of excludePatterns) {
|
|
396
393
|
const glob = new Bun.Glob(pattern);
|
|
397
|
-
for
|
|
394
|
+
for (const file of glob.scanSync(cwd)) {
|
|
398
395
|
includedFiles.delete(file);
|
|
399
396
|
}
|
|
400
397
|
}
|
|
@@ -7,7 +7,6 @@ import {
|
|
|
7
7
|
ensureArray,
|
|
8
8
|
ensureObject,
|
|
9
9
|
exports,
|
|
10
|
-
formatFileSize,
|
|
11
10
|
formatListWithAnd,
|
|
12
11
|
getDefaultDtsOutputExtention,
|
|
13
12
|
getDefaultJsOutputExtension,
|
|
@@ -17,14 +16,13 @@ import {
|
|
|
17
16
|
injectStyles,
|
|
18
17
|
invalidEntryPointsError,
|
|
19
18
|
isJavascriptFile,
|
|
20
|
-
isTypeScriptFile,
|
|
21
19
|
logger,
|
|
22
20
|
noEntryPointsFoundError,
|
|
23
21
|
parseErrorMessage,
|
|
24
22
|
replaceExtension,
|
|
25
23
|
shims,
|
|
26
24
|
unused
|
|
27
|
-
} from "./bunup-
|
|
25
|
+
} from "./bunup-025ckbke.js";
|
|
28
26
|
|
|
29
27
|
// packages/bunup/src/loaders.ts
|
|
30
28
|
import path from "path";
|
|
@@ -49,6 +47,14 @@ function setOrSuffixField(objectOrArray, field, prefix) {
|
|
|
49
47
|
return Array.isArray(objectOrArray) ? objectOrArray.map(addPrefix) : addPrefix(objectOrArray);
|
|
50
48
|
}
|
|
51
49
|
async function loadPackageJson(cwd = process.cwd()) {
|
|
50
|
+
const packageJsonPath = path.join(cwd, "package.json");
|
|
51
|
+
try {
|
|
52
|
+
const data = await Bun.file(packageJsonPath).json();
|
|
53
|
+
return {
|
|
54
|
+
data,
|
|
55
|
+
path: packageJsonPath
|
|
56
|
+
};
|
|
57
|
+
} catch {}
|
|
52
58
|
const { config, filepath } = await loadConfig({
|
|
53
59
|
name: "package",
|
|
54
60
|
cwd,
|
|
@@ -320,123 +326,6 @@ async function runPluginBuildDoneHooks(bunupPlugins, options, output, meta) {
|
|
|
320
326
|
}
|
|
321
327
|
}
|
|
322
328
|
|
|
323
|
-
// packages/bunup/src/printer/print-build-report.ts
|
|
324
|
-
import { promisify } from "util";
|
|
325
|
-
import { brotliCompress } from "zlib";
|
|
326
|
-
import pc from "picocolors";
|
|
327
|
-
var brotliAsync = promisify(brotliCompress);
|
|
328
|
-
async function printBuildReport(buildOutput, options) {
|
|
329
|
-
const { gzip = true, brotli = false, maxBundleSize } = options.report ?? {};
|
|
330
|
-
const showCompression = gzip || brotli;
|
|
331
|
-
const files = await Promise.all(buildOutput.files.map(async (file) => {
|
|
332
|
-
const pathRelative = file.pathRelativeToOutdir;
|
|
333
|
-
const size = Bun.file(file.fullPath).size;
|
|
334
|
-
const isDts = file.dts && file.kind === "entry-point";
|
|
335
|
-
const isJs = isTypeScriptFile(file.fullPath) || isJavascriptFile(file.fullPath);
|
|
336
|
-
let gzipSize;
|
|
337
|
-
let brotliSize;
|
|
338
|
-
if (showCompression) {
|
|
339
|
-
const buffer = await Bun.file(file.fullPath).arrayBuffer();
|
|
340
|
-
const uint8 = new Uint8Array(buffer);
|
|
341
|
-
const [gzipResult, brotliResult] = await Promise.all([
|
|
342
|
-
gzip ? Promise.resolve(Bun.gzipSync(uint8)) : Promise.resolve(null),
|
|
343
|
-
brotli ? brotliAsync(uint8) : Promise.resolve(null)
|
|
344
|
-
]);
|
|
345
|
-
gzipSize = gzipResult?.length;
|
|
346
|
-
brotliSize = brotliResult?.length;
|
|
347
|
-
}
|
|
348
|
-
return {
|
|
349
|
-
path: pathRelative,
|
|
350
|
-
fullPath: `${options.outDir}/${pathRelative}`,
|
|
351
|
-
size,
|
|
352
|
-
gzipSize,
|
|
353
|
-
brotliSize,
|
|
354
|
-
format: file.format,
|
|
355
|
-
isDts,
|
|
356
|
-
isJs
|
|
357
|
-
};
|
|
358
|
-
}));
|
|
359
|
-
const totalSize = files.reduce((sum, file) => sum + file.size, 0);
|
|
360
|
-
const totalGzipSize = files.reduce((sum, file) => sum + (file.gzipSize || 0), 0);
|
|
361
|
-
const totalBrotliSize = files.reduce((sum, file) => sum + (file.brotliSize || 0), 0);
|
|
362
|
-
const formats = ensureArray(options.format);
|
|
363
|
-
const showFormat = formats.length > 1 || formats[0] === "cjs";
|
|
364
|
-
const formatLabelWidth = showFormat ? Math.max(...formats.map((f) => `[${f}] `.length)) : 0;
|
|
365
|
-
const pathWidth = Math.max(...files.map((f) => f.fullPath.length), "Output".length);
|
|
366
|
-
const sizeWidth = Math.max(formatFileSize(totalSize).length, "Raw".length);
|
|
367
|
-
const gzipWidth = gzip ? Math.max(formatFileSize(totalGzipSize).length, "Gzip".length) : 0;
|
|
368
|
-
const brotliWidth = brotli ? Math.max(formatFileSize(totalBrotliSize).length, "Brotli".length) : 0;
|
|
369
|
-
const pad = (str, width, align = "left") => {
|
|
370
|
-
const diff = width - str.length;
|
|
371
|
-
return align === "left" ? str + " ".repeat(Math.max(0, diff)) : " ".repeat(Math.max(0, diff)) + str;
|
|
372
|
-
};
|
|
373
|
-
console.log("");
|
|
374
|
-
if (options.name) {
|
|
375
|
-
console.log("");
|
|
376
|
-
console.log(` ${pc.bgBlueBright(` ${options.name} `)}`);
|
|
377
|
-
}
|
|
378
|
-
console.log("");
|
|
379
|
-
const headers = [
|
|
380
|
-
pad(" Output", pathWidth + formatLabelWidth + 2),
|
|
381
|
-
pad("Raw", sizeWidth, "right")
|
|
382
|
-
];
|
|
383
|
-
if (gzip)
|
|
384
|
-
headers.push(pad("Gzip", gzipWidth, "right"));
|
|
385
|
-
if (brotli)
|
|
386
|
-
headers.push(pad("Brotli", brotliWidth, "right"));
|
|
387
|
-
console.log(pc.dim(headers.join(" ")));
|
|
388
|
-
console.log("");
|
|
389
|
-
for (const file of files) {
|
|
390
|
-
let formatLabel = "";
|
|
391
|
-
if (showFormat) {
|
|
392
|
-
let plainFormatLabel = "";
|
|
393
|
-
if (file.isJs) {
|
|
394
|
-
plainFormatLabel = `[${file.format}] `;
|
|
395
|
-
}
|
|
396
|
-
formatLabel = pc.dim(pad(plainFormatLabel, formatLabelWidth));
|
|
397
|
-
}
|
|
398
|
-
const outDirWithSlash = `${options.outDir}/`;
|
|
399
|
-
const fileName = file.isDts ? pc.green(pc.bold(file.path)) : file.path;
|
|
400
|
-
const styledPath = `${pc.dim(outDirWithSlash)}${fileName}`;
|
|
401
|
-
const plainPath = `${outDirWithSlash}${file.path}`;
|
|
402
|
-
const filePathColumn = ` ${formatLabel}${styledPath}${" ".repeat(Math.max(0, pathWidth - plainPath.length))}`;
|
|
403
|
-
const fileRow = [
|
|
404
|
-
filePathColumn,
|
|
405
|
-
pad(formatFileSize(file.size), sizeWidth, "right")
|
|
406
|
-
];
|
|
407
|
-
if (gzip) {
|
|
408
|
-
const gzipStr = file.gzipSize ? formatFileSize(file.gzipSize) : pc.dim("-");
|
|
409
|
-
fileRow.push(pad(gzipStr, gzipWidth, "right"));
|
|
410
|
-
}
|
|
411
|
-
if (brotli) {
|
|
412
|
-
const brotliStr = file.brotliSize ? formatFileSize(file.brotliSize) : pc.dim("-");
|
|
413
|
-
fileRow.push(pad(brotliStr, brotliWidth, "right"));
|
|
414
|
-
}
|
|
415
|
-
console.log(fileRow.join(" "));
|
|
416
|
-
}
|
|
417
|
-
console.log("");
|
|
418
|
-
const summaryRow = [
|
|
419
|
-
` ${pc.bold(pad(`${files.length} files`, pathWidth + formatLabelWidth))}`,
|
|
420
|
-
pc.bold(pad(formatFileSize(totalSize), sizeWidth, "right"))
|
|
421
|
-
];
|
|
422
|
-
if (gzip && totalGzipSize > 0) {
|
|
423
|
-
summaryRow.push(pc.bold(pad(formatFileSize(totalGzipSize), gzipWidth, "right")));
|
|
424
|
-
} else if (gzip) {
|
|
425
|
-
summaryRow.push(pad("", gzipWidth));
|
|
426
|
-
}
|
|
427
|
-
if (brotli && totalBrotliSize > 0) {
|
|
428
|
-
summaryRow.push(pc.bold(pad(formatFileSize(totalBrotliSize), brotliWidth, "right")));
|
|
429
|
-
} else if (brotli) {
|
|
430
|
-
summaryRow.push(pad("", brotliWidth));
|
|
431
|
-
}
|
|
432
|
-
console.log(summaryRow.join(" "));
|
|
433
|
-
if (maxBundleSize && totalSize > maxBundleSize) {
|
|
434
|
-
console.log("");
|
|
435
|
-
console.warn(pc.yellow(` Bundle size ${pc.bold(formatFileSize(totalSize))} exceeds limit ${pc.bold(formatFileSize(maxBundleSize))}`));
|
|
436
|
-
}
|
|
437
|
-
console.log("");
|
|
438
|
-
}
|
|
439
|
-
|
|
440
329
|
// packages/bunup/src/build.ts
|
|
441
330
|
var ac = null;
|
|
442
331
|
async function build(userOptions, rootDir = process.cwd()) {
|
|
@@ -444,10 +333,11 @@ async function build(userOptions, rootDir = process.cwd()) {
|
|
|
444
333
|
ac.abort();
|
|
445
334
|
}
|
|
446
335
|
ac = new AbortController;
|
|
336
|
+
const options = resolveBuildOptions(userOptions);
|
|
447
337
|
const buildOutput = {
|
|
448
|
-
files: []
|
|
338
|
+
files: [],
|
|
339
|
+
options
|
|
449
340
|
};
|
|
450
|
-
const options = resolveBuildOptions(userOptions);
|
|
451
341
|
if (options.silent) {
|
|
452
342
|
logger.setSilent(options.silent);
|
|
453
343
|
}
|
|
@@ -468,7 +358,7 @@ async function build(userOptions, rootDir = process.cwd()) {
|
|
|
468
358
|
const bunPlugins = filterBunPlugins(allPlugins);
|
|
469
359
|
await runPluginBuildStartHooks(bunupPlugins, options);
|
|
470
360
|
const entryArray = ensureArray(options.entry);
|
|
471
|
-
const entrypoints =
|
|
361
|
+
const entrypoints = getFilesFromGlobs(entryArray, rootDir);
|
|
472
362
|
if (!entrypoints.length) {
|
|
473
363
|
if (!ensureArray(userOptions.entry).length) {
|
|
474
364
|
throw new BunupBuildError(noEntryPointsFoundError(DEFAULT_ENTYPOINTS));
|
|
@@ -480,25 +370,32 @@ async function build(userOptions, rootDir = process.cwd()) {
|
|
|
480
370
|
once: options.name,
|
|
481
371
|
muted: true
|
|
482
372
|
});
|
|
483
|
-
const
|
|
373
|
+
const absoluteEntrypoints = entrypoints.map((file) => `${rootDir}/${file}`);
|
|
374
|
+
const resolvedDefine = getResolvedDefine(options.define, options.env);
|
|
375
|
+
const resolvedMinify = getResolvedMinify(options);
|
|
376
|
+
const resolvedTarget = getResolvedTarget(options.target);
|
|
377
|
+
const resolvedSourcemap = getResolvedSourcemap(options.sourcemap);
|
|
378
|
+
const resolvedEnv = getResolvedEnv(options.env);
|
|
379
|
+
const chunkNaming = getDefaultChunkNaming(options.name);
|
|
380
|
+
const buildPromises = ensureArray(options.format).map(async (fmt) => {
|
|
484
381
|
const result = await Bun.build({
|
|
485
|
-
entrypoints:
|
|
382
|
+
entrypoints: absoluteEntrypoints,
|
|
486
383
|
format: fmt,
|
|
487
384
|
splitting: getResolvedSplitting(options.splitting, fmt),
|
|
488
|
-
define:
|
|
489
|
-
minify:
|
|
490
|
-
target:
|
|
491
|
-
sourcemap:
|
|
385
|
+
define: resolvedDefine,
|
|
386
|
+
minify: resolvedMinify,
|
|
387
|
+
target: resolvedTarget,
|
|
388
|
+
sourcemap: resolvedSourcemap,
|
|
492
389
|
loader: options.loader,
|
|
493
390
|
drop: options.drop,
|
|
494
391
|
naming: {
|
|
495
|
-
chunk:
|
|
392
|
+
chunk: chunkNaming
|
|
496
393
|
},
|
|
497
394
|
conditions: options.conditions,
|
|
498
395
|
banner: options.banner,
|
|
499
396
|
footer: options.footer,
|
|
500
397
|
publicPath: options.publicPath,
|
|
501
|
-
env:
|
|
398
|
+
env: resolvedEnv,
|
|
502
399
|
ignoreDCEAnnotations: options.ignoreDCEAnnotations,
|
|
503
400
|
emitDCEAnnotations: options.emitDCEAnnotations,
|
|
504
401
|
throw: false,
|
|
@@ -581,10 +478,7 @@ async function build(userOptions, rootDir = process.cwd()) {
|
|
|
581
478
|
if (options.onSuccess) {
|
|
582
479
|
await executeOnSuccess(options.onSuccess, options, ac.signal);
|
|
583
480
|
}
|
|
584
|
-
if (!options.watch && !logger.isSilent()) {
|
|
585
|
-
await printBuildReport(buildOutput, options);
|
|
586
|
-
}
|
|
587
481
|
return buildOutput;
|
|
588
482
|
}
|
|
589
483
|
|
|
590
|
-
export { processLoadedConfigs, resolveBuildOptions,
|
|
484
|
+
export { processLoadedConfigs, resolveBuildOptions, build };
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "bunup",
|
|
3
3
|
"description": "⚡ A blazing-fast build tool for your libraries built with Bun.",
|
|
4
|
-
"version": "0.14.
|
|
4
|
+
"version": "0.14.13",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
7
7
|
"dist"
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"bunup": "dist/cli/index.js"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@bunup/dts": "0.14.
|
|
50
|
+
"@bunup/dts": "0.14.13",
|
|
51
51
|
"chokidar": "^4.0.3",
|
|
52
52
|
"coffi": "^0.1.35",
|
|
53
53
|
"lightningcss": "^1.30.1",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"tinyexec": "^1.0.1",
|
|
56
56
|
"tree-kill": "^1.2.2",
|
|
57
57
|
"zlye": "^0.4.4",
|
|
58
|
-
"@bunup/shared": "0.14.
|
|
58
|
+
"@bunup/shared": "0.14.13"
|
|
59
59
|
},
|
|
60
60
|
"peerDependencies": {
|
|
61
61
|
"typescript": ">=4.5.0"
|