robuild 0.1.5 → 0.1.6
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 +10 -14
- package/dist/_chunks/build-CelwCERM.mjs +3 -0
- package/dist/_chunks/{build-xQVEbj8V.mjs → build-rD4AllYV.mjs} +77 -2
- package/dist/_chunks/config-BlC5U5aX.mjs +7 -0
- package/dist/_chunks/dist-fY5yKI94.mjs +247 -0
- package/dist/_chunks/{package-D_zFqFUx.mjs → package-TbcsjHHu.mjs} +16 -12
- package/dist/cli.mjs +1 -1
- package/dist/config.d.mts +85 -0
- package/dist/config.mjs +1 -5
- package/dist/index.mjs +2 -2
- package/package.json +16 -12
- package/dist/_chunks/build-DdGjMqZ-.mjs +0 -3
package/README.md
CHANGED
|
@@ -97,21 +97,17 @@ Visit our documentation site for detailed guides, API reference, and examples.
|
|
|
97
97
|
<!-- coverage-start -->
|
|
98
98
|
| File | Stmts | Branch | Funcs | Lines |
|
|
99
99
|
|------|-------|--------|-------|-------|
|
|
100
|
-
| **All files** | **
|
|
100
|
+
| **All files** | **86.44%** | **80.12%** | **92.94%** | **86.32%** |
|
|
101
101
|
| src/build.ts | 84.15% | 67.74% | 100.00% | 83.54% |
|
|
102
|
-
| src/builders |
|
|
103
|
-
| src/config |
|
|
104
|
-
| src/
|
|
105
|
-
| src/
|
|
106
|
-
| src/
|
|
107
|
-
| src/
|
|
108
|
-
| src/plugins | 7.50% | 8.33% | 18.42% | 7.63% |
|
|
109
|
-
| src/plugins/builtin | 16.46% | 18.03% | 23.08% | 16.51% |
|
|
110
|
-
| src/plugins/extras | 0.00% | 0.00% | 0.00% | 0.00% |
|
|
102
|
+
| src/builders | 89.89% | 82.80% | 96.43% | 89.89% |
|
|
103
|
+
| src/config | 85.38% | 67.96% | 100.00% | 84.92% |
|
|
104
|
+
| src/core | 74.19% | 57.14% | 68.42% | 74.19% |
|
|
105
|
+
| src/plugins | 97.50% | 95.37% | 97.37% | 97.46% |
|
|
106
|
+
| src/plugins/builtin | 88.15% | 84.92% | 95.59% | 88.12% |
|
|
107
|
+
| src/plugins/extras | 96.55% | 100.00% | 100.00% | 96.30% |
|
|
111
108
|
| src/transforms | 71.43% | 63.77% | 81.82% | 71.27% |
|
|
112
|
-
| src/
|
|
113
|
-
| src/
|
|
114
|
-
| src/watch.ts | 0.00% | 0.00% | 0.00% | 0.00% |
|
|
109
|
+
| src/utils | 88.29% | 85.44% | 100.00% | 88.29% |
|
|
110
|
+
| src/watch.ts | 81.48% | 81.82% | 57.14% | 81.48% |
|
|
115
111
|
<!-- coverage-end -->
|
|
116
112
|
|
|
117
113
|
Run coverage locally:
|
|
@@ -132,5 +128,5 @@ pnpm test:coverage
|
|
|
132
128
|
[bundle-href]: https://bundlephobia.com/result?p=robuild
|
|
133
129
|
[license-src]: https://img.shields.io/github/license/Sunny-117/robuild.svg?style=flat&colorA=080f12&colorB=1fa669
|
|
134
130
|
[license-href]: https://github.com/Sunny-117/robuild/blob/main/LICENSE
|
|
135
|
-
[coverage-src]: https://img.shields.io/badge/coverage-
|
|
131
|
+
[coverage-src]: https://img.shields.io/badge/coverage-86.4%25-brightgreen?style=flat&colorA=080f12
|
|
136
132
|
[coverage-href]: #test-coverage
|
|
@@ -3,7 +3,7 @@ import { builtinModules } from "node:module";
|
|
|
3
3
|
import { basename, dirname, extname, isAbsolute, join, relative, resolve } from "node:path";
|
|
4
4
|
import { colors } from "consola/utils";
|
|
5
5
|
import prettyBytes from "pretty-bytes";
|
|
6
|
-
import { cp, mkdir, readFile, readdir, rm, symlink, writeFile } from "node:fs/promises";
|
|
6
|
+
import { cp, mkdir, readFile, readdir, rm, symlink, unlink, writeFile } from "node:fs/promises";
|
|
7
7
|
import { resolveModulePath } from "exsolve";
|
|
8
8
|
import { parseSync } from "oxc-parser";
|
|
9
9
|
import { rolldown, watch } from "rolldown";
|
|
@@ -879,6 +879,54 @@ function createSkipNodeModulesPlugin(options) {
|
|
|
879
879
|
};
|
|
880
880
|
}
|
|
881
881
|
|
|
882
|
+
//#endregion
|
|
883
|
+
//#region src/plugins/builtin/wasm.ts
|
|
884
|
+
/**
|
|
885
|
+
* Default WASM configuration
|
|
886
|
+
*/
|
|
887
|
+
const DEFAULT_WASM_CONFIG = {
|
|
888
|
+
enabled: true,
|
|
889
|
+
maxFileSize: 14 * 1024,
|
|
890
|
+
fileName: "[hash][extname]",
|
|
891
|
+
publicPath: "",
|
|
892
|
+
targetEnv: "auto"
|
|
893
|
+
};
|
|
894
|
+
/**
|
|
895
|
+
* Normalize WASM configuration
|
|
896
|
+
*/
|
|
897
|
+
function normalizeWasmConfig(config) {
|
|
898
|
+
if (!config) return null;
|
|
899
|
+
if (config === true) return { ...DEFAULT_WASM_CONFIG };
|
|
900
|
+
if (!config.enabled) return null;
|
|
901
|
+
return {
|
|
902
|
+
...DEFAULT_WASM_CONFIG,
|
|
903
|
+
...config
|
|
904
|
+
};
|
|
905
|
+
}
|
|
906
|
+
/**
|
|
907
|
+
* Create WASM plugin for robuild
|
|
908
|
+
*
|
|
909
|
+
* This is a wrapper that dynamically imports rolldown-plugin-wasm
|
|
910
|
+
* to avoid making it a required dependency.
|
|
911
|
+
*
|
|
912
|
+
* @param config WASM configuration options
|
|
913
|
+
* @returns Rolldown plugin for WASM support
|
|
914
|
+
*/
|
|
915
|
+
async function createWasmPlugin(config) {
|
|
916
|
+
try {
|
|
917
|
+
const { wasm } = await import("./dist-fY5yKI94.mjs");
|
|
918
|
+
return wasm({
|
|
919
|
+
maxFileSize: config.maxFileSize,
|
|
920
|
+
fileName: config.fileName,
|
|
921
|
+
publicPath: config.publicPath,
|
|
922
|
+
targetEnv: config.targetEnv
|
|
923
|
+
});
|
|
924
|
+
} catch (error) {
|
|
925
|
+
if (error.code === "ERR_MODULE_NOT_FOUND") return null;
|
|
926
|
+
throw error;
|
|
927
|
+
}
|
|
928
|
+
}
|
|
929
|
+
|
|
882
930
|
//#endregion
|
|
883
931
|
//#region src/transforms/banner.ts
|
|
884
932
|
/**
|
|
@@ -995,6 +1043,8 @@ async function rolldownBuild(ctx, entry, hooks, config) {
|
|
|
995
1043
|
if (entry.dtsOnly) {
|
|
996
1044
|
logger.info("Running in dtsOnly mode - only generating declaration files");
|
|
997
1045
|
entry.dts = entry.dts === false ? true : entry.dts || true;
|
|
1046
|
+
formats.length = 0;
|
|
1047
|
+
formats.push("esm");
|
|
998
1048
|
}
|
|
999
1049
|
if (entry.stub) {
|
|
1000
1050
|
for (const [distName, srcPath] of Object.entries(inputs)) {
|
|
@@ -1046,6 +1096,15 @@ async function rolldownBuild(ctx, entry, hooks, config) {
|
|
|
1046
1096
|
resolveId: skipPlugin.resolveId
|
|
1047
1097
|
});
|
|
1048
1098
|
}
|
|
1099
|
+
const wasmConfig = normalizeWasmConfig(entry.wasm ?? config?.wasm);
|
|
1100
|
+
if (wasmConfig) {
|
|
1101
|
+
const wasmPlugin = await createWasmPlugin(wasmConfig);
|
|
1102
|
+
if (wasmPlugin) rolldownPlugins.push(wasmPlugin);
|
|
1103
|
+
else {
|
|
1104
|
+
logger.warn("WASM support is enabled but rolldown-plugin-wasm is not installed.");
|
|
1105
|
+
logger.warn("Install it with: pnpm add -D rolldown-plugin-wasm");
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1049
1108
|
rolldownPlugins.push(...pluginManager.getRolldownPlugins());
|
|
1050
1109
|
const moduleTypes = {};
|
|
1051
1110
|
if (entry.loaders) for (const [ext, config] of Object.entries(entry.loaders)) moduleTypes[ext] = config.loader;
|
|
@@ -1156,6 +1215,22 @@ async function rolldownBuild(ctx, entry, hooks, config) {
|
|
|
1156
1215
|
});
|
|
1157
1216
|
}
|
|
1158
1217
|
}
|
|
1218
|
+
if (entry.dtsOnly) {
|
|
1219
|
+
const jsFilesToDelete = [];
|
|
1220
|
+
for (const outputEntry of allOutputEntries) {
|
|
1221
|
+
const filePath = filePathMap.get(outputEntry.name);
|
|
1222
|
+
if (filePath && !filePath.endsWith(".d.ts") && !filePath.endsWith(".d.mts") && !filePath.endsWith(".d.cts")) jsFilesToDelete.push(filePath);
|
|
1223
|
+
}
|
|
1224
|
+
for (const filePath of jsFilesToDelete) try {
|
|
1225
|
+
await unlink(filePath);
|
|
1226
|
+
try {
|
|
1227
|
+
await unlink(`${filePath}.map`);
|
|
1228
|
+
} catch {}
|
|
1229
|
+
} catch {}
|
|
1230
|
+
const dtsEntries = allOutputEntries.filter((o) => o.name.endsWith(".d.ts") || o.name.endsWith(".d.mts") || o.name.endsWith(".d.cts"));
|
|
1231
|
+
allOutputEntries.length = 0;
|
|
1232
|
+
allOutputEntries.push(...dtsEntries);
|
|
1233
|
+
}
|
|
1159
1234
|
if (entry.copy) await copyFiles(ctx.pkgDir, fullOutDir, entry.copy);
|
|
1160
1235
|
await pluginManager.executeRobuildBuildEnd({ allOutputEntries });
|
|
1161
1236
|
logger.log(`\n${allOutputEntries.map((o) => [
|
|
@@ -1765,7 +1840,7 @@ function createBuildResult(entries, startTime) {
|
|
|
1765
1840
|
* Perform watch build using rolldown's built-in watch mode
|
|
1766
1841
|
*/
|
|
1767
1842
|
async function performWatchBuild(config, ctx, startTime) {
|
|
1768
|
-
const { performBuild } = await import("./build-
|
|
1843
|
+
const { performBuild } = await import("./build-CelwCERM.mjs");
|
|
1769
1844
|
await performBuild(config, ctx, startTime);
|
|
1770
1845
|
const bundleEntries = (config.entries || []).filter((entry) => {
|
|
1771
1846
|
if (typeof entry === "string") return !entry.endsWith("/");
|
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import path from "node:path";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { createHash } from "node:crypto";
|
|
4
|
+
import { Buffer } from "node:buffer";
|
|
5
|
+
import { exactRegex, id, include, or } from "rolldown/filter";
|
|
6
|
+
|
|
7
|
+
//#region node_modules/.pnpm/rolldown-plugin-wasm@0.2.1_rolldown@1.0.0-rc.5/node_modules/rolldown-plugin-wasm/dist/index.mjs
|
|
8
|
+
const HELPERS_ID = "\0wasm-helpers.js";
|
|
9
|
+
const nodeFilePath = `
|
|
10
|
+
const { readFile } = process.getBuiltinModule('fs/promises')
|
|
11
|
+
const path = process.getBuiltinModule('path')
|
|
12
|
+
|
|
13
|
+
return readFile(path.resolve(import.meta.dirname, filepath)).then(
|
|
14
|
+
(buffer) => instantiate(buffer, imports)
|
|
15
|
+
)
|
|
16
|
+
`;
|
|
17
|
+
const nodeDecode = `
|
|
18
|
+
const { Buffer } = process.getBuiltinModule('buffer')
|
|
19
|
+
buf = Buffer.from(src, 'base64')
|
|
20
|
+
`;
|
|
21
|
+
const browserFilePath = `
|
|
22
|
+
return instantiate(fetch(filepath), imports, true);
|
|
23
|
+
`;
|
|
24
|
+
const browserDecode = `
|
|
25
|
+
const raw = globalThis.atob(src)
|
|
26
|
+
const len = raw.length
|
|
27
|
+
buf = new Uint8Array(new ArrayBuffer(len))
|
|
28
|
+
for (let i = 0; i < len; i++) {
|
|
29
|
+
buf[i] = raw.charCodeAt(i)
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
const autoModule = `
|
|
33
|
+
let buf = null
|
|
34
|
+
const isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null
|
|
35
|
+
|
|
36
|
+
if (filepath && isNode) {
|
|
37
|
+
${nodeFilePath}
|
|
38
|
+
} else if (filepath) {
|
|
39
|
+
${browserFilePath}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
if (isNode) {
|
|
43
|
+
${nodeDecode}
|
|
44
|
+
} else {
|
|
45
|
+
${browserDecode}
|
|
46
|
+
}
|
|
47
|
+
`;
|
|
48
|
+
const nodeModule = `
|
|
49
|
+
let buf = null
|
|
50
|
+
if (filepath) {
|
|
51
|
+
${nodeFilePath}
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
${nodeDecode}
|
|
55
|
+
`;
|
|
56
|
+
const browserModule = `
|
|
57
|
+
let buf = null
|
|
58
|
+
if (filepath) {
|
|
59
|
+
${browserFilePath}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
${browserDecode}
|
|
63
|
+
`;
|
|
64
|
+
const autoInlineModule = `
|
|
65
|
+
let buf = null
|
|
66
|
+
const isNode = typeof process !== 'undefined' && process.versions != null && process.versions.node != null
|
|
67
|
+
if (isNode) {
|
|
68
|
+
${nodeDecode}
|
|
69
|
+
} else {
|
|
70
|
+
${browserDecode}
|
|
71
|
+
}
|
|
72
|
+
`;
|
|
73
|
+
function envModule(env) {
|
|
74
|
+
switch (env) {
|
|
75
|
+
case "auto": return autoModule;
|
|
76
|
+
case "auto-inline": return autoInlineModule;
|
|
77
|
+
case "browser": return browserModule;
|
|
78
|
+
case "node": return nodeModule;
|
|
79
|
+
default: return null;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
const getHelpersModule = (env) => `
|
|
83
|
+
export function loadWasmModule(sync, filepath, src, imports) {
|
|
84
|
+
function instantiate(source, imports, stream) {
|
|
85
|
+
const instantiate = stream ? WebAssembly.instantiateStreaming : WebAssembly.instantiate;
|
|
86
|
+
return instantiate(source, imports).then(({ instance }) => instance)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
${envModule(env)}
|
|
90
|
+
|
|
91
|
+
if (sync) {
|
|
92
|
+
const mod = new WebAssembly.Module(buf)
|
|
93
|
+
return new WebAssembly.Instance(mod, imports)
|
|
94
|
+
} else {
|
|
95
|
+
return instantiate(buf, imports)
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
`;
|
|
99
|
+
function codegenSimpleObject(obj) {
|
|
100
|
+
return `{ ${obj.map(({ key, value }) => {
|
|
101
|
+
return `${key}: ${typeof value === "string" ? value : codegenSimpleObject(value)}`;
|
|
102
|
+
}).join(",\n")} }`;
|
|
103
|
+
}
|
|
104
|
+
async function parseWasm(buffer) {
|
|
105
|
+
try {
|
|
106
|
+
const wasmModule = await WebAssembly.compile(buffer);
|
|
107
|
+
return {
|
|
108
|
+
imports: Object.entries(WebAssembly.Module.imports(wasmModule).reduce((result, item) => ({
|
|
109
|
+
...result,
|
|
110
|
+
[item.module]: [...result[item.module] || [], item.name]
|
|
111
|
+
}), {})),
|
|
112
|
+
exports: WebAssembly.Module.exports(wasmModule).map((item) => item.name)
|
|
113
|
+
};
|
|
114
|
+
} catch (error) {
|
|
115
|
+
throw new Error(`Failed to parse WASM file: ${error.message}`, { cause: error });
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
function parseId(url) {
|
|
119
|
+
const [file, query] = url.split("?");
|
|
120
|
+
return [
|
|
121
|
+
file,
|
|
122
|
+
query,
|
|
123
|
+
new URLSearchParams(query)
|
|
124
|
+
];
|
|
125
|
+
}
|
|
126
|
+
function wasm(options = {}) {
|
|
127
|
+
let { maxFileSize = 14 * 1024, publicPath = "", targetEnv, fileName = "[hash][extname]" } = options;
|
|
128
|
+
const copies = Object.create(null);
|
|
129
|
+
return {
|
|
130
|
+
name: "wasm",
|
|
131
|
+
buildStart(options$1) {
|
|
132
|
+
if (targetEnv == null) switch (options$1.platform) {
|
|
133
|
+
case "browser":
|
|
134
|
+
targetEnv = "browser";
|
|
135
|
+
break;
|
|
136
|
+
case "node":
|
|
137
|
+
targetEnv = "node";
|
|
138
|
+
break;
|
|
139
|
+
default: targetEnv = "auto";
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
resolveId: {
|
|
143
|
+
filter: [include(or(id(exactRegex(HELPERS_ID)), id(/\.wasm$/, { cleanUrl: true })))],
|
|
144
|
+
async handler(id$1, ...args) {
|
|
145
|
+
if (id$1 === HELPERS_ID) return id$1;
|
|
146
|
+
const [file, query] = parseId(id$1);
|
|
147
|
+
if (!query) return;
|
|
148
|
+
const resolved = await this.resolve(file, ...args);
|
|
149
|
+
if (resolved) resolved.id += `?${query}`;
|
|
150
|
+
return resolved;
|
|
151
|
+
}
|
|
152
|
+
},
|
|
153
|
+
load: {
|
|
154
|
+
filter: [include(or(id(exactRegex(HELPERS_ID)), id(/\.wasm$/, { cleanUrl: true })))],
|
|
155
|
+
async handler(id$1) {
|
|
156
|
+
if (id$1 === HELPERS_ID) return getHelpersModule(targetEnv || "auto");
|
|
157
|
+
const [file, , params] = parseId(id$1);
|
|
158
|
+
const buffer = await readFile(file);
|
|
159
|
+
const isInit = params.has("init");
|
|
160
|
+
const isSync = params.has("sync");
|
|
161
|
+
const isUrl = params.has("url");
|
|
162
|
+
if (isSync && isUrl) this.error("`sync` and `url` parameters cannot be used together.");
|
|
163
|
+
this.addWatchFile(file);
|
|
164
|
+
if (!isInit) this.getModuleInfo(id$1).meta.wasmInfo = await parseWasm(buffer);
|
|
165
|
+
function shouldInline() {
|
|
166
|
+
if (isUrl) return false;
|
|
167
|
+
if (isSync) return true;
|
|
168
|
+
if (targetEnv === "auto-inline") return true;
|
|
169
|
+
if (maxFileSize === 0) return false;
|
|
170
|
+
return buffer.length <= maxFileSize;
|
|
171
|
+
}
|
|
172
|
+
if (!shouldInline()) {
|
|
173
|
+
const hash = createHash("sha1").update(buffer).digest("hex").slice(0, 16);
|
|
174
|
+
const ext = path.extname(file);
|
|
175
|
+
const name = path.basename(file, ext);
|
|
176
|
+
const outputFileName = fileName.replaceAll("[hash]", hash).replaceAll("[extname]", ext).replaceAll("[name]", name);
|
|
177
|
+
copies[file] = {
|
|
178
|
+
filename: outputFileName,
|
|
179
|
+
publicFilepath: `${publicPath}${outputFileName}`,
|
|
180
|
+
buffer
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return buffer.toString("binary");
|
|
184
|
+
}
|
|
185
|
+
},
|
|
186
|
+
transform: {
|
|
187
|
+
filter: [include(id(/\.wasm$/, { cleanUrl: true }))],
|
|
188
|
+
handler(code, id$1) {
|
|
189
|
+
const [file, , params] = parseId(id$1);
|
|
190
|
+
const publicFilepath = copies[file] ? JSON.stringify(copies[file].publicFilepath) : null;
|
|
191
|
+
let src;
|
|
192
|
+
const isSync = params.has("sync");
|
|
193
|
+
if (params.has("url")) {
|
|
194
|
+
if (!publicFilepath) this.error("`url` parameter can only be used with non-inlined files.");
|
|
195
|
+
return `export default ${publicFilepath}`;
|
|
196
|
+
}
|
|
197
|
+
if (publicFilepath === null) src = `'${Buffer.from(code, "binary").toString("base64")}'`;
|
|
198
|
+
else {
|
|
199
|
+
if (isSync) this.error("non-inlined files can not be `sync`.");
|
|
200
|
+
src = null;
|
|
201
|
+
}
|
|
202
|
+
const isInit = params.has("init");
|
|
203
|
+
let codegen = `import { loadWasmModule } from ${JSON.stringify(HELPERS_ID)}
|
|
204
|
+
${isInit ? "export default " : ""}function __wasm_init(imports) {
|
|
205
|
+
return loadWasmModule(${isSync}, ${publicFilepath}, ${src}, imports)
|
|
206
|
+
}\n`;
|
|
207
|
+
const mod = this.getModuleInfo(id$1);
|
|
208
|
+
if (!isInit) {
|
|
209
|
+
const { imports, exports } = mod.meta.wasmInfo;
|
|
210
|
+
codegen += imports.map(([from], i) => {
|
|
211
|
+
return `import * as _wasmImport_${i} from ${JSON.stringify(from)}\n`;
|
|
212
|
+
});
|
|
213
|
+
const importObject = imports.map(([from, names], i) => {
|
|
214
|
+
return {
|
|
215
|
+
key: JSON.stringify(from),
|
|
216
|
+
value: names.map((name) => {
|
|
217
|
+
return {
|
|
218
|
+
key: JSON.stringify(name),
|
|
219
|
+
value: `_wasmImport_${i}[${JSON.stringify(name)}]`
|
|
220
|
+
};
|
|
221
|
+
})
|
|
222
|
+
};
|
|
223
|
+
});
|
|
224
|
+
codegen += `const instance = await __wasm_init(${codegenSimpleObject(importObject)})\n`;
|
|
225
|
+
codegen += exports.map((name) => {
|
|
226
|
+
return `export ${name === "default" ? "default" : `const ${name} =`} instance.exports.${name}`;
|
|
227
|
+
}).join("\n");
|
|
228
|
+
}
|
|
229
|
+
return {
|
|
230
|
+
map: { mappings: "" },
|
|
231
|
+
code: codegen
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
},
|
|
235
|
+
generateBundle() {
|
|
236
|
+
for (const copy of Object.values(copies)) this.emitFile({
|
|
237
|
+
type: "asset",
|
|
238
|
+
source: copy.buffer,
|
|
239
|
+
name: "Rolldown WASM Asset",
|
|
240
|
+
fileName: copy.filename
|
|
241
|
+
});
|
|
242
|
+
}
|
|
243
|
+
};
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
//#endregion
|
|
247
|
+
export { wasm };
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
var package_default = {
|
|
3
3
|
name: "robuild",
|
|
4
4
|
type: "module",
|
|
5
|
-
version: "0.1.
|
|
5
|
+
version: "0.1.6",
|
|
6
6
|
packageManager: "pnpm@10.11.1",
|
|
7
7
|
description: "Zero-config ESM/TS package builder. Powered by Rolldown and Oxc",
|
|
8
8
|
license: "MIT",
|
|
@@ -33,43 +33,47 @@ var package_default = {
|
|
|
33
33
|
"test:coverage:raw": "vitest run --coverage && node scripts/update-coverage.mjs",
|
|
34
34
|
"test:coverage:watch": "vitest --coverage",
|
|
35
35
|
"test:ui": "vitest --ui",
|
|
36
|
-
"test:types": "tsc --noEmit
|
|
36
|
+
"test:types": "tsc --noEmit",
|
|
37
37
|
"docs:dev": "vitepress dev docs",
|
|
38
38
|
"docs:build": "turbo docs:build:raw --filter=robuild",
|
|
39
39
|
"docs:build:raw": "vitepress build docs",
|
|
40
40
|
"docs:preview": "vitepress preview docs",
|
|
41
41
|
"commit": "git-cz",
|
|
42
|
-
"clean": "rm -rf .turbo dist coverage"
|
|
42
|
+
"clean": "rm -rf .turbo dist coverage",
|
|
43
|
+
"prepare": "husky"
|
|
43
44
|
},
|
|
44
45
|
dependencies: {
|
|
45
|
-
"c12": "4.0.0-beta.
|
|
46
|
+
"c12": "4.0.0-beta.3",
|
|
46
47
|
"cac": "^6.7.14",
|
|
47
48
|
"chokidar": "^5.0.0",
|
|
48
49
|
"consola": "^3.4.2",
|
|
49
50
|
"exsolve": "^1.0.8",
|
|
50
|
-
"glob": "^13.0.
|
|
51
|
+
"glob": "^13.0.6",
|
|
51
52
|
"js-yaml": "^4.1.1",
|
|
52
53
|
"magic-string": "^0.30.21",
|
|
53
|
-
"minimatch": "^10.2.
|
|
54
|
-
"oxc-minify": "^0.
|
|
55
|
-
"oxc-parser": "^0.
|
|
56
|
-
"oxc-transform": "^0.
|
|
54
|
+
"minimatch": "^10.2.2",
|
|
55
|
+
"oxc-minify": "^0.114.0",
|
|
56
|
+
"oxc-parser": "^0.114.0",
|
|
57
|
+
"oxc-transform": "^0.114.0",
|
|
57
58
|
"pretty-bytes": "^7.1.0",
|
|
58
|
-
"rolldown": "1.0.0-rc.
|
|
59
|
+
"rolldown": "1.0.0-rc.5",
|
|
59
60
|
"rolldown-plugin-dts": "^0.22.1",
|
|
60
61
|
"tinyglobby": "^0.2.15",
|
|
61
62
|
"typescript": "^5.9.3"
|
|
62
63
|
},
|
|
63
64
|
devDependencies: {
|
|
64
65
|
"@types/js-yaml": "^4.0.9",
|
|
65
|
-
"@types/node": "^25.
|
|
66
|
+
"@types/node": "^25.3.0",
|
|
66
67
|
"@vitest/coverage-v8": "^4.0.18",
|
|
67
68
|
"automd": "^0.4.3",
|
|
68
69
|
"changelogen": "^0.6.2",
|
|
69
70
|
"esno": "^4.8.0",
|
|
70
71
|
"git-cz": "^4.9.0",
|
|
72
|
+
"husky": "^9.1.7",
|
|
73
|
+
"lint-staged": "^16.2.7",
|
|
71
74
|
"oxlint": "^1.49.0",
|
|
72
|
-
"
|
|
75
|
+
"rolldown-plugin-wasm": "^0.2.1",
|
|
76
|
+
"turbo": "^2.8.10",
|
|
73
77
|
"vitepress": "^1.6.4",
|
|
74
78
|
"vitepress-plugin-group-icons": "^1.7.1",
|
|
75
79
|
"vitest": "^4.0.18"
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { g as logger, h as configureLogger, t as build } from "./_chunks/build-
|
|
2
|
+
import { g as logger, h as configureLogger, t as build } from "./_chunks/build-rD4AllYV.mjs";
|
|
3
3
|
import { colors } from "consola/utils";
|
|
4
4
|
import process from "node:process";
|
|
5
5
|
import { loadConfig } from "c12";
|
package/dist/config.d.mts
CHANGED
|
@@ -257,6 +257,15 @@ interface _BuildEntry {
|
|
|
257
257
|
* @default false
|
|
258
258
|
*/
|
|
259
259
|
unbundle?: boolean;
|
|
260
|
+
/**
|
|
261
|
+
* WASM support configuration for this entry.
|
|
262
|
+
*
|
|
263
|
+
* When enabled, you can import .wasm files directly.
|
|
264
|
+
* Overrides the global `wasm` config if set.
|
|
265
|
+
*
|
|
266
|
+
* @default false
|
|
267
|
+
*/
|
|
268
|
+
wasm?: boolean | WasmOptions;
|
|
260
269
|
}
|
|
261
270
|
type BundleEntry = _BuildEntry & {
|
|
262
271
|
type: 'bundle';
|
|
@@ -466,6 +475,60 @@ interface GlobImportOptions {
|
|
|
466
475
|
*/
|
|
467
476
|
eager?: boolean;
|
|
468
477
|
}
|
|
478
|
+
/**
|
|
479
|
+
* WASM support configuration options.
|
|
480
|
+
*
|
|
481
|
+
* When enabled, robuild will use rolldown-plugin-wasm to handle .wasm file imports.
|
|
482
|
+
*
|
|
483
|
+
* @see https://github.com/sxzz/rolldown-plugin-wasm
|
|
484
|
+
*/
|
|
485
|
+
interface WasmOptions {
|
|
486
|
+
/**
|
|
487
|
+
* Enable WASM support.
|
|
488
|
+
*
|
|
489
|
+
* @default false
|
|
490
|
+
*/
|
|
491
|
+
enabled?: boolean;
|
|
492
|
+
/**
|
|
493
|
+
* Maximum file size (in bytes) for inlining WASM modules.
|
|
494
|
+
*
|
|
495
|
+
* Files larger than this will be emitted as separate files.
|
|
496
|
+
* Set to 0 to always emit as separate files.
|
|
497
|
+
*
|
|
498
|
+
* @default 14336 (14KB)
|
|
499
|
+
*/
|
|
500
|
+
maxFileSize?: number;
|
|
501
|
+
/**
|
|
502
|
+
* Output filename pattern for WASM files.
|
|
503
|
+
*
|
|
504
|
+
* Supports placeholders:
|
|
505
|
+
* - `[hash]` - Content hash
|
|
506
|
+
* - `[name]` - Original filename without extension
|
|
507
|
+
* - `[extname]` - File extension (e.g., `.wasm`)
|
|
508
|
+
*
|
|
509
|
+
* @default '[hash][extname]'
|
|
510
|
+
*/
|
|
511
|
+
fileName?: string;
|
|
512
|
+
/**
|
|
513
|
+
* Public path prefix for WASM files.
|
|
514
|
+
*
|
|
515
|
+
* Used when WASM files need to be loaded from a specific URL path.
|
|
516
|
+
*
|
|
517
|
+
* @example '/assets/'
|
|
518
|
+
*/
|
|
519
|
+
publicPath?: string;
|
|
520
|
+
/**
|
|
521
|
+
* Target environment for WASM instantiation.
|
|
522
|
+
*
|
|
523
|
+
* - `'auto'` - Detect environment at runtime (works in both Node.js and browser)
|
|
524
|
+
* - `'auto-inline'` - Always inline, decode based on environment
|
|
525
|
+
* - `'browser'` - Browser-only (omits Node.js built-in modules)
|
|
526
|
+
* - `'node'` - Node.js-only (requires Node.js 20.16.0+)
|
|
527
|
+
*
|
|
528
|
+
* @default 'auto'
|
|
529
|
+
*/
|
|
530
|
+
targetEnv?: 'auto' | 'auto-inline' | 'browser' | 'node';
|
|
531
|
+
}
|
|
469
532
|
interface BuildHooks {
|
|
470
533
|
/**
|
|
471
534
|
* Called at the start of the build process
|
|
@@ -699,6 +762,28 @@ interface BuildConfig {
|
|
|
699
762
|
* Glob import configuration
|
|
700
763
|
*/
|
|
701
764
|
globImport?: GlobImportOptions;
|
|
765
|
+
/**
|
|
766
|
+
* WASM support configuration.
|
|
767
|
+
*
|
|
768
|
+
* When enabled, you can import .wasm files directly in your code.
|
|
769
|
+
*
|
|
770
|
+
* @example
|
|
771
|
+
* ```ts
|
|
772
|
+
* // Direct import (sync)
|
|
773
|
+
* import { add } from './math.wasm'
|
|
774
|
+
*
|
|
775
|
+
* // Async initialization
|
|
776
|
+
* import init from './math.wasm?init'
|
|
777
|
+
* const instance = await init()
|
|
778
|
+
*
|
|
779
|
+
* // Sync initialization
|
|
780
|
+
* import initSync from './math.wasm?init&sync'
|
|
781
|
+
* const instance = initSync()
|
|
782
|
+
* ```
|
|
783
|
+
*
|
|
784
|
+
* @default false
|
|
785
|
+
*/
|
|
786
|
+
wasm?: boolean | WasmOptions;
|
|
702
787
|
/**
|
|
703
788
|
* Log level for build output.
|
|
704
789
|
*
|
package/dist/config.mjs
CHANGED
package/dist/index.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { a as createBrowserShimsPlugin, c as SHEBANG_RE, d as shebangPlugin, f as nodeProtocolPlugin, g as logger, i as DEFAULT_SHIMS_CONFIG, l as hasShebang, m as hasGlobImports, o as createNodeShimsPlugin, p as createGlobImportPlugin, r as createSkipNodeModulesPlugin, s as createShimsPlugin, t as build, u as makeExecutable } from "./_chunks/build-
|
|
1
|
+
import { a as createBrowserShimsPlugin, c as SHEBANG_RE, d as shebangPlugin, f as nodeProtocolPlugin, g as logger, i as DEFAULT_SHIMS_CONFIG, l as hasShebang, m as hasGlobImports, o as createNodeShimsPlugin, p as createGlobImportPlugin, r as createSkipNodeModulesPlugin, s as createShimsPlugin, t as build, u as makeExecutable } from "./_chunks/build-rD4AllYV.mjs";
|
|
2
2
|
import { t as RobuildPluginManager } from "./_chunks/manager-uQxDLzY6.mjs";
|
|
3
|
-
import { defineConfig } from "./config.mjs";
|
|
3
|
+
import { t as defineConfig } from "./_chunks/config-BlC5U5aX.mjs";
|
|
4
4
|
import { extname } from "node:path";
|
|
5
5
|
import { readFile } from "node:fs/promises";
|
|
6
6
|
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "robuild",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.1.
|
|
4
|
+
"version": "0.1.6",
|
|
5
5
|
"packageManager": "pnpm@10.11.1",
|
|
6
6
|
"description": "Zero-config ESM/TS package builder. Powered by Rolldown and Oxc",
|
|
7
7
|
"license": "MIT",
|
|
@@ -34,43 +34,47 @@
|
|
|
34
34
|
"test:coverage:raw": "vitest run --coverage && node scripts/update-coverage.mjs",
|
|
35
35
|
"test:coverage:watch": "vitest --coverage",
|
|
36
36
|
"test:ui": "vitest --ui",
|
|
37
|
-
"test:types": "tsc --noEmit
|
|
37
|
+
"test:types": "tsc --noEmit",
|
|
38
38
|
"docs:dev": "vitepress dev docs",
|
|
39
39
|
"docs:build": "turbo docs:build:raw --filter=robuild",
|
|
40
40
|
"docs:build:raw": "vitepress build docs",
|
|
41
41
|
"docs:preview": "vitepress preview docs",
|
|
42
42
|
"commit": "git-cz",
|
|
43
|
-
"clean": "rm -rf .turbo dist coverage"
|
|
43
|
+
"clean": "rm -rf .turbo dist coverage",
|
|
44
|
+
"prepare": "husky"
|
|
44
45
|
},
|
|
45
46
|
"dependencies": {
|
|
46
|
-
"c12": "4.0.0-beta.
|
|
47
|
+
"c12": "4.0.0-beta.3",
|
|
47
48
|
"cac": "^6.7.14",
|
|
48
49
|
"chokidar": "^5.0.0",
|
|
49
50
|
"consola": "^3.4.2",
|
|
50
51
|
"exsolve": "^1.0.8",
|
|
51
|
-
"glob": "^13.0.
|
|
52
|
+
"glob": "^13.0.6",
|
|
52
53
|
"js-yaml": "^4.1.1",
|
|
53
54
|
"magic-string": "^0.30.21",
|
|
54
|
-
"minimatch": "^10.2.
|
|
55
|
-
"oxc-minify": "^0.
|
|
56
|
-
"oxc-parser": "^0.
|
|
57
|
-
"oxc-transform": "^0.
|
|
55
|
+
"minimatch": "^10.2.2",
|
|
56
|
+
"oxc-minify": "^0.114.0",
|
|
57
|
+
"oxc-parser": "^0.114.0",
|
|
58
|
+
"oxc-transform": "^0.114.0",
|
|
58
59
|
"pretty-bytes": "^7.1.0",
|
|
59
|
-
"rolldown": "1.0.0-rc.
|
|
60
|
+
"rolldown": "1.0.0-rc.5",
|
|
60
61
|
"rolldown-plugin-dts": "^0.22.1",
|
|
61
62
|
"tinyglobby": "^0.2.15",
|
|
62
63
|
"typescript": "^5.9.3"
|
|
63
64
|
},
|
|
64
65
|
"devDependencies": {
|
|
65
66
|
"@types/js-yaml": "^4.0.9",
|
|
66
|
-
"@types/node": "^25.
|
|
67
|
+
"@types/node": "^25.3.0",
|
|
67
68
|
"@vitest/coverage-v8": "^4.0.18",
|
|
68
69
|
"automd": "^0.4.3",
|
|
69
70
|
"changelogen": "^0.6.2",
|
|
70
71
|
"esno": "^4.8.0",
|
|
71
72
|
"git-cz": "^4.9.0",
|
|
73
|
+
"husky": "^9.1.7",
|
|
74
|
+
"lint-staged": "^16.2.7",
|
|
72
75
|
"oxlint": "^1.49.0",
|
|
73
|
-
"
|
|
76
|
+
"rolldown-plugin-wasm": "^0.2.1",
|
|
77
|
+
"turbo": "^2.8.10",
|
|
74
78
|
"vitepress": "^1.6.4",
|
|
75
79
|
"vitepress-plugin-group-icons": "^1.7.1",
|
|
76
80
|
"vitest": "^4.0.18"
|