@wasmedia/wenblend 0.2.0 → 0.2.1

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.
@@ -1 +1 @@
1
- {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExC;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;AAEnE,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AACtF,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAgIrF,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAE1D;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GACvE,IAAI,CAEN;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAW7F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,aAAa,EACvB,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC,CAkBrB"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE5D,MAAM,MAAM,IAAI,GAAG,SAAS,GAAG,QAAQ,CAAC;AAExC;;;;;;;;;GASG;AACH,MAAM,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,CAAC,CAAC;AAEnE,gFAAgF;AAChF,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AACtF,KAAK,aAAa,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAyKrF,6CAA6C;AAC7C,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,aAAa,GAAG,IAAI,CAE1D;AAED,0DAA0D;AAC1D,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,KAAK,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC,GACvE,IAAI,CAEN;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,IAAI,IAAI,CAKxC;AAED;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,CAW7F;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,cAAc,CAClC,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,aAAa,EACvB,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAC7B,OAAO,CAAC,UAAU,CAAC,CAkBrB"}
package/dist/loader.js CHANGED
@@ -20,10 +20,6 @@
20
20
  * Without the hook, each factory call runs the glue's own createWasm,
21
21
  * which fetches and compiles the .wasm from scratch every time.
22
22
  */
23
- const MODULE_FILE = {
24
- enblend: "wenblend.js",
25
- enfuse: "wenfuse.js",
26
- };
27
23
  const WASM_FILE = {
28
24
  enblend: "wenblend.wasm",
29
25
  enfuse: "wenfuse.wasm",
@@ -34,10 +30,34 @@ const WASM_FILE = {
34
30
  // to the same key.
35
31
  const factories = new Map();
36
32
  const compiled = new Map();
33
+ /*
34
+ * The default URLs are spelled out, one `new URL()` with a string literal
35
+ * per file, never built from a template: bundlers (Vite, webpack, Parcel)
36
+ * recognise the literal form and emit exactly that file, with a hashed name,
37
+ * while Vite turns a template literal into a glob over the whole directory
38
+ * — every glue, wasm, source map and .d.ts in dist/ — and under its dev
39
+ * server's dependency pre-bundling into a lookup that yields `undefined`
40
+ * (#24). `../dist/` resolves to dist/ both from the compiled dist/loader.js
41
+ * and from src/loader.ts under the test runner.
42
+ *
43
+ * The wasm gets its own literal for the same reason: a bundler that emits
44
+ * the glue as `wenblend-<hash>.js` does not put a `wenblend.wasm` beside it,
45
+ * so with no `wasmPath` the wasm is not looked up beside the glue.
46
+ */
47
+ function defaultGlueUrl(tool) {
48
+ return tool === "enblend"
49
+ ? new URL("../dist/wenblend.js", import.meta.url).href
50
+ : new URL("../dist/wenfuse.js", import.meta.url).href;
51
+ }
52
+ function defaultWasmUrl(tool) {
53
+ return tool === "enblend"
54
+ ? new URL("../dist/wenblend.wasm", import.meta.url)
55
+ : new URL("../dist/wenfuse.wasm", import.meta.url);
56
+ }
37
57
  function glueUrl(tool, options) {
38
58
  const path = options?.wasmPath;
39
59
  if (path === undefined)
40
- return new URL(`../dist/${MODULE_FILE[tool]}`, import.meta.url).href;
60
+ return defaultGlueUrl(tool);
41
61
  return isBareSpecifier(path) ? resolveBareSpecifier(path) : path;
42
62
  }
43
63
  /**
@@ -74,22 +94,40 @@ function resolvedGlueUrl(tool, options) {
74
94
  function cacheKey(tool, options) {
75
95
  return `${tool} ${resolvedGlueUrl(tool, options).href}`;
76
96
  }
97
+ /**
98
+ * Import a tool's glue. When the default URL fails, the usual cause is a
99
+ * bundler that moved this module away from dist/ without rewriting the URL
100
+ * — Vite's dev server pre-bundles dependencies into node_modules/.vite/deps/,
101
+ * from where no relative URL reaches dist/ — so the error says what to do.
102
+ */
77
103
  async function importFactory(tool, options) {
78
- const mod = await import(/* webpackIgnore: true */ glueUrl(tool, options));
104
+ const url = glueUrl(tool, options);
105
+ let mod;
106
+ try {
107
+ mod = await import(/* webpackIgnore: true */ /* @vite-ignore */ url);
108
+ }
109
+ catch (err) {
110
+ if (options?.wasmPath !== undefined)
111
+ throw err;
112
+ throw new Error(`could not import the ${tool} glue from its default URL ${url}. If a bundler moved wenblend away from ` +
113
+ `its dist/ directory (Vite's dev server does when it pre-bundles dependencies), add "@wasmedia/wenblend" ` +
114
+ `to Vite's optimizeDeps.exclude, or pass wasmPath. Cause: ${err instanceof Error ? err.message : String(err)}`, { cause: err });
115
+ }
79
116
  return (mod.default ?? mod);
80
117
  }
81
118
  /**
82
119
  * Fetch and compile a tool's .wasm.
83
120
  *
84
- * The URL is the one the glue itself would use: its `locateFile` default
85
- * resolves the .wasm name against the glue's own directory. `file:` URLs
121
+ * With `wasmPath`, the URL is the one the glue itself would use: its
122
+ * `locateFile` default resolves the .wasm name against the glue's own
123
+ * directory. Without it, the default wasm URL (see `defaultWasmUrl`). `file:` URLs
86
124
  * (Node) are read from disk, because Node's fetch does not do `file:`;
87
125
  * everything else is fetched, streaming-compiled where the server's MIME
88
126
  * type allows and compiled from bytes where it does not — the same
89
127
  * fallback the glue performs.
90
128
  */
91
129
  async function compileWasm(tool, options) {
92
- const url = new URL(WASM_FILE[tool], resolvedGlueUrl(tool, options));
130
+ const url = options?.wasmPath === undefined ? defaultWasmUrl(tool) : new URL(WASM_FILE[tool], resolvedGlueUrl(tool, options));
93
131
  if (url.protocol === "file:") {
94
132
  // A variable specifier keeps bundlers from trying to resolve a Node
95
133
  // builtin into browser code; this branch only runs under Node.
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
Binary file
package/dist/wenfuse.wasm CHANGED
Binary file
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wasmedia/wenblend",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Enblend and Enfuse compiled to WebAssembly for browsers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -59,6 +59,7 @@
59
59
  "@playwright/test": "1.63.0",
60
60
  "@types/node": "^22.20.4",
61
61
  "typescript": "^5.7.0",
62
+ "vite": "7.3.6",
62
63
  "vitest": "^3.0.0"
63
64
  },
64
65
  "dependencies": {
package/src/loader.ts CHANGED
@@ -41,11 +41,6 @@ export type InstanceHooks = Pick<WasmModule, "print" | "printErr">;
41
41
  export type ModuleFactory = (config?: Record<string, unknown>) => Promise<WasmModule>;
42
42
  type FactoryLoader = (tool: Tool, options?: LoaderOptions) => Promise<ModuleFactory>;
43
43
 
44
- const MODULE_FILE: Record<Tool, string> = {
45
- enblend: "wenblend.js",
46
- enfuse: "wenfuse.js",
47
- };
48
-
49
44
  const WASM_FILE: Record<Tool, string> = {
50
45
  enblend: "wenblend.wasm",
51
46
  enfuse: "wenfuse.wasm",
@@ -58,9 +53,35 @@ const WASM_FILE: Record<Tool, string> = {
58
53
  const factories = new Map<string, Promise<ModuleFactory>>();
59
54
  const compiled = new Map<string, Promise<WebAssembly.Module>>();
60
55
 
56
+ /*
57
+ * The default URLs are spelled out, one `new URL()` with a string literal
58
+ * per file, never built from a template: bundlers (Vite, webpack, Parcel)
59
+ * recognise the literal form and emit exactly that file, with a hashed name,
60
+ * while Vite turns a template literal into a glob over the whole directory
61
+ * — every glue, wasm, source map and .d.ts in dist/ — and under its dev
62
+ * server's dependency pre-bundling into a lookup that yields `undefined`
63
+ * (#24). `../dist/` resolves to dist/ both from the compiled dist/loader.js
64
+ * and from src/loader.ts under the test runner.
65
+ *
66
+ * The wasm gets its own literal for the same reason: a bundler that emits
67
+ * the glue as `wenblend-<hash>.js` does not put a `wenblend.wasm` beside it,
68
+ * so with no `wasmPath` the wasm is not looked up beside the glue.
69
+ */
70
+ function defaultGlueUrl(tool: Tool): string {
71
+ return tool === "enblend"
72
+ ? new URL("../dist/wenblend.js", import.meta.url).href
73
+ : new URL("../dist/wenfuse.js", import.meta.url).href;
74
+ }
75
+
76
+ function defaultWasmUrl(tool: Tool): URL {
77
+ return tool === "enblend"
78
+ ? new URL("../dist/wenblend.wasm", import.meta.url)
79
+ : new URL("../dist/wenfuse.wasm", import.meta.url);
80
+ }
81
+
61
82
  function glueUrl(tool: Tool, options?: LoaderOptions): string {
62
83
  const path = options?.wasmPath;
63
- if (path === undefined) return new URL(`../dist/${MODULE_FILE[tool]}`, import.meta.url).href;
84
+ if (path === undefined) return defaultGlueUrl(tool);
64
85
  return isBareSpecifier(path) ? resolveBareSpecifier(path) : path;
65
86
  }
66
87
 
@@ -104,23 +125,43 @@ function cacheKey(tool: Tool, options?: LoaderOptions): string {
104
125
  return `${tool} ${resolvedGlueUrl(tool, options).href}`;
105
126
  }
106
127
 
128
+ /**
129
+ * Import a tool's glue. When the default URL fails, the usual cause is a
130
+ * bundler that moved this module away from dist/ without rewriting the URL
131
+ * — Vite's dev server pre-bundles dependencies into node_modules/.vite/deps/,
132
+ * from where no relative URL reaches dist/ — so the error says what to do.
133
+ */
107
134
  async function importFactory(tool: Tool, options?: LoaderOptions): Promise<ModuleFactory> {
108
- const mod = await import(/* webpackIgnore: true */ glueUrl(tool, options));
135
+ const url = glueUrl(tool, options);
136
+ let mod;
137
+ try {
138
+ mod = await import(/* webpackIgnore: true */ /* @vite-ignore */ url);
139
+ } catch (err) {
140
+ if (options?.wasmPath !== undefined) throw err;
141
+ throw new Error(
142
+ `could not import the ${tool} glue from its default URL ${url}. If a bundler moved wenblend away from ` +
143
+ `its dist/ directory (Vite's dev server does when it pre-bundles dependencies), add "@wasmedia/wenblend" ` +
144
+ `to Vite's optimizeDeps.exclude, or pass wasmPath. Cause: ${err instanceof Error ? err.message : String(err)}`,
145
+ { cause: err },
146
+ );
147
+ }
109
148
  return (mod.default ?? mod) as ModuleFactory;
110
149
  }
111
150
 
112
151
  /**
113
152
  * Fetch and compile a tool's .wasm.
114
153
  *
115
- * The URL is the one the glue itself would use: its `locateFile` default
116
- * resolves the .wasm name against the glue's own directory. `file:` URLs
154
+ * With `wasmPath`, the URL is the one the glue itself would use: its
155
+ * `locateFile` default resolves the .wasm name against the glue's own
156
+ * directory. Without it, the default wasm URL (see `defaultWasmUrl`). `file:` URLs
117
157
  * (Node) are read from disk, because Node's fetch does not do `file:`;
118
158
  * everything else is fetched, streaming-compiled where the server's MIME
119
159
  * type allows and compiled from bytes where it does not — the same
120
160
  * fallback the glue performs.
121
161
  */
122
162
  async function compileWasm(tool: Tool, options?: LoaderOptions): Promise<WebAssembly.Module> {
123
- const url = new URL(WASM_FILE[tool], resolvedGlueUrl(tool, options));
163
+ const url =
164
+ options?.wasmPath === undefined ? defaultWasmUrl(tool) : new URL(WASM_FILE[tool], resolvedGlueUrl(tool, options));
124
165
  if (url.protocol === "file:") {
125
166
  // A variable specifier keeps bundlers from trying to resolve a Node
126
167
  // builtin into browser code; this branch only runs under Node.