@backtickjs/bundler 0.2.1 → 0.2.2
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 +16 -2
- package/dist/bundle/buildBundle.js +7 -6
- package/dist/bundle/buildBundle.js.map +1 -1
- package/dist/bundle/expandServerComponents.js +2 -1
- package/dist/bundle/expandServerComponents.js.map +1 -1
- package/dist/bundler.js +4 -2
- package/dist/bundler.js.map +1 -1
- package/dist/errors.d.ts +24 -0
- package/dist/errors.js +44 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/modules.d.ts +0 -6
- package/dist/modules.js +0 -10
- package/dist/modules.js.map +1 -1
- package/dist/print/code.d.ts +1 -1
- package/dist/print/code.js +6 -11
- package/dist/print/code.js.map +1 -1
- package/dist/supports.d.ts +12 -0
- package/dist/supports.js +26 -0
- package/dist/supports.js.map +1 -0
- package/package.json +2 -2
- package/src/bundle/buildBundle.ts +7 -6
- package/src/bundle/expandServerComponents.ts +2 -1
- package/src/bundler.ts +4 -2
- package/src/errors.ts +49 -0
- package/src/index.ts +3 -1
- package/src/modules.ts +0 -16
- package/src/print/code.ts +7 -17
- package/src/supports.ts +31 -0
package/README.md
CHANGED
|
@@ -53,7 +53,18 @@ const { code } = build.generate({ format: "es", sourcemap: "inline" });
|
|
|
53
53
|
|
|
54
54
|
The modules the client provides, by specifier, each at the exact version of the package it comes from: `"react-dom/client": "19.2.3"`. The server decides which to bundle for: one app version, or the ones each build sends, as [`@backtickjs/core`](https://github.com/backtickjs/backtick/tree/main/packages/core#every-build-in-users-hands) puts them together. Those modules are left out of the bundle, which imports (`es`) or requires (`cjs`) them. `build` rejects a script that imports from any other module, or whose import is typed against a version the one given isn't compatible with: an earlier one, or another major. `19.2.3` for `react` takes any later 19.x.
|
|
55
55
|
|
|
56
|
-
`supports(
|
|
56
|
+
`supports(specifier, range)` makes the same check, for a server component choosing what to draw for the client the bundler is drawing for: `supports("expo-haptics", "^15")`. It asks about the modules of the build in progress, so it's called in a server component, while `build` runs it; outside one, it throws.
|
|
57
|
+
|
|
58
|
+
A refused import throws `ClientVersionMismatch`, carrying the module (`from`), the export (`imported`), the version it's typed against (`version`) and the one the client provides (`provided`, or `undefined` for none). The client can't change, so a server catches it to answer that client differently, such as with a 426 its app answers with a screen asking to update:
|
|
59
|
+
|
|
60
|
+
```ts
|
|
61
|
+
try {
|
|
62
|
+
bundle = await bundler.build({ input, modules });
|
|
63
|
+
} catch (error) {
|
|
64
|
+
if (!(error instanceof ClientVersionMismatch)) throw error;
|
|
65
|
+
return context.body(null, 426);
|
|
66
|
+
}
|
|
67
|
+
```
|
|
57
68
|
|
|
58
69
|
### What crosses into a script
|
|
59
70
|
|
|
@@ -72,7 +83,10 @@ Spliced values are written into the bundle as data, never as code. What can't cr
|
|
|
72
83
|
|
|
73
84
|
- `bundler.build({ input, modules })`: runs the server components in `input` and returns a `Build`. Async.
|
|
74
85
|
- `Build.generate({ format, sourcemap })`: writes the bundle; returns `{ code, map }`, where `code` is a `Bundle<T>` (from `@backtickjs/core`), typed by what `input` is on the client, and `map` is `null` without a source map.
|
|
75
|
-
-
|
|
86
|
+
- `supports(specifier, range)`: in a server component, whether the client being drawn for provides `specifier` at a version in `range`.
|
|
87
|
+
- `BundlerError`: what `build` throws when it refuses its input, such as a value it can't splice. An error a server component throws passes through as it is.
|
|
88
|
+
- `ClientVersionMismatch`, a `BundlerError`: what `build` throws for a script's import the client can't run.
|
|
89
|
+
- Types: `BuildOptions`, `OutputOptions`, `OutputChunk`, `Build`, `Modules`.
|
|
76
90
|
|
|
77
91
|
## Related
|
|
78
92
|
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isClientExec, isClientImport, isClientScript, isJsxElement, } from "@backtickjs/core";
|
|
2
|
+
import { BundlerError } from "../errors.js";
|
|
2
3
|
import { expandServerComponents } from "./expandServerComponents.js";
|
|
3
4
|
import { bindingsOf, capturesOf, isValue } from "./params.js";
|
|
4
5
|
import { sourceName } from "./bindingKey.js";
|
|
@@ -188,7 +189,7 @@ export async function buildBundle(spliceable, provided) {
|
|
|
188
189
|
// A server component among them, written as a tag: `<$Rule />`.
|
|
189
190
|
if (typeof spliceable === "function") {
|
|
190
191
|
const { name } = spliceable;
|
|
191
|
-
throw new
|
|
192
|
+
throw new BundlerError((name === ""
|
|
192
193
|
? "Can't splice a host function"
|
|
193
194
|
: `Can't splice the host function \`${name}\``) +
|
|
194
195
|
": it's host code, and only runs on the host. Write a client " +
|
|
@@ -197,7 +198,7 @@ export async function buildBundle(spliceable, provided) {
|
|
|
197
198
|
`\`{\${<${/^[A-Z]/.test(name) ? name : "Name"} />}}\`.`);
|
|
198
199
|
}
|
|
199
200
|
if (typeof spliceable !== "object") {
|
|
200
|
-
throw new
|
|
201
|
+
throw new BundlerError("Can't splice a symbol: a bundle can't write one that is the same " +
|
|
201
202
|
"symbol on the client. Splice a string, and make the symbol from it " +
|
|
202
203
|
"in a script: cs`Symbol.for($key)`.");
|
|
203
204
|
}
|
|
@@ -209,7 +210,7 @@ export async function buildBundle(spliceable, provided) {
|
|
|
209
210
|
const prototype = Object.getPrototypeOf(spliceable);
|
|
210
211
|
if (prototype !== Object.prototype && prototype !== null) {
|
|
211
212
|
const name = spliceable.constructor?.name ?? "an unknown class";
|
|
212
|
-
throw new
|
|
213
|
+
throw new BundlerError(`Can't splice this \`${name}\` instance: only plain objects cross into ` +
|
|
213
214
|
"a client script. Build one with a client function instead.");
|
|
214
215
|
}
|
|
215
216
|
const entries = [];
|
|
@@ -226,7 +227,7 @@ export async function buildBundle(spliceable, provided) {
|
|
|
226
227
|
scope.read.add(key);
|
|
227
228
|
return displayName(key);
|
|
228
229
|
}
|
|
229
|
-
throw new
|
|
230
|
+
throw new BundlerError(`Can't thread the capture \`${sourceName(key)}\`: nothing encloses ` +
|
|
230
231
|
"this reference to supply it. A fragment carries the bindings it was " +
|
|
231
232
|
"written under, so this is also what happens when one is spliced " +
|
|
232
233
|
"somewhere another `" +
|
|
@@ -264,11 +265,11 @@ export async function buildBundle(spliceable, provided) {
|
|
|
264
265
|
// one) are client code, so on the host they can't be tags: they are tags
|
|
265
266
|
// in a script.
|
|
266
267
|
if (typeof type === "string") {
|
|
267
|
-
throw new
|
|
268
|
+
throw new BundlerError(`\`<${type}>\` is drawn by the client, so it belongs in a script: ` +
|
|
268
269
|
`cs\`<${type}>…</${type}>\`.`);
|
|
269
270
|
}
|
|
270
271
|
const tag = isClientImport(type) ? `\`<${type.name}>\`` : "A script";
|
|
271
|
-
throw new
|
|
272
|
+
throw new BundlerError(`${tag} is a client component, so it can't be a tag on the host. ` +
|
|
272
273
|
"Use it as a tag in a script.");
|
|
273
274
|
};
|
|
274
275
|
// Every server component first, so siblings run at once; then the drawing,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buildBundle.js","sourceRoot":"","sources":["../../src/bundle/buildBundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,YAAY,EACZ,cAAc,EACd,cAAc,EACd,YAAY,GAEb,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EACL,KAAK,EACL,KAAK,EACL,IAAI,EACJ,WAAW,EACX,QAAQ,EACR,OAAO,EACP,MAAM,GACP,MAAM,kBAAkB,CAAC;AAkB1B,6EAA6E;AAC7E,4EAA4E;AAC5E,4BAA4B;AAC5B,MAAM,QAAQ,GAAG,CAAC,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAUzD,MAAM,SAAS,GAAG,GAAU,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAE1E,+DAA+D;AAC/D,EAAE;AACF,6EAA6E;AAC7E,4EAA4E;AAC5E,wEAAwE;AACxE,wEAAwE;AACxE,8EAA8E;AAC9E,WAAW;AACX,EAAE;AACF,8EAA8E;AAC9E,gFAAgF;AAChF,4EAA4E;AAC5E,0EAA0E;AAC1E,8EAA8E;AAC9E,0EAA0E;AAC1E,yEAAyE;AACzE,0EAA0E;AAC1E,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,UAAmB,EACnB,QAAiB;IAEjB,MAAM,KAAK,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC;IACpC,qEAAqE;IACrE,2EAA2E;IAC3E,wEAAwE;IACxE,4EAA4E;IAC5E,yEAAyE;IACzE,mCAAmC;IACnC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAChD,MAAM,UAAU,GAAG,IAAI,GAAG,EAAwB,CAAC;IACnD,MAAM,SAAS,GAAG,CAAC,MAAoB,EAAgB,EAAE;QACvD,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAClD,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IACF,8EAA8E;IAC9E,oDAAoD;IACpD,EAAE;IACF,+EAA+E;IAC/E,6EAA6E;IAC7E,2EAA2E;IAC3E,6EAA6E;IAC7E,uEAAuE;IACvE,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,MAAM,IAAI,GAAG,IAAI,GAAG,CAAS,QAAQ,CAAC,CAAC;IACvC,MAAM,WAAW,GAAG,CAAC,GAAW,EAAU,EAAE;QAC1C,MAAM,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACpC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC;QAClB,CAAC;QACD,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,IAAI,GAAG,IAAI,CAAC;QAChB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,IAAI,GAAG,GAAG,IAAI,GAAG,CAAC,EAAE,CAAC;QACvB,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IAEF,6EAA6E;IAC7E,6EAA6E;IAC7E,4EAA4E;IAC5E,oCAAoC;IACpC,EAAE;IACF,yEAAyE;IACzE,yEAAyE;IACzE,2EAA2E;IAC3E,2EAA2E;IAC3E,yBAAyB;IACzB,EAAE;IACF,6EAA6E;IAC7E,qEAAqE;IACrE,4EAA4E;IAC5E,wDAAwD;IACxD,MAAM,QAAQ,GAAG,CAAC,MAAoB,EAAE,IAAY,EAAqB,EAAE,CACzE,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAEzC,0CAA0C;IAC1C,MAAM,OAAO,GAAG,CAAC,MAAoB,EAAU,EAAE,CAC/C,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAE,EAAE,CAAC;IAE/B,4EAA4E;IAC5E,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,4EAA4E;IAC5E,wEAAwE;IACxE,4DAA4D;IAC5D,MAAM,SAAS,GAAkC,EAAE,CAAC;IACpD,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,0EAA0E;IAC1E,mEAAmE;IACnE,yDAAyD;IACzD,MAAM,KAAK,GAAG,CACZ,KAAY,EACZ,GAAsB,EACtB,KAA+B,EACvB,EAAE;QACV,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,IAAI,GAAG,KAAK,CAAC;YACjB,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,CAAC;YAC9C,IAAI;SACL,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,MAAM,CAC9B,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CACvD,CAAC;QACF,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC7B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,KAAK,GAAG,SAAS,SAAS,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YACxB,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAChC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,kEAAkE;IAClE,4EAA4E;IAC5E,yEAAyE;IACzE,2EAA2E;IAC3E,qEAAqE;IACrE,EAAE;IACF,yEAAyE;IACzE,oEAAoE;IACpE,mEAAmE;IACnE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,MAAoB,EAAE,KAAY,EAAU,EAAE;QAC7D,IAAI,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAC/B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,MAAM,EAAE,GAAU,MAAM,CAAC,IAAI;YAC3B,CAAC,CAAC,SAAS,EAAE;YACb,CAAC,CAAC,EAAE,QAAQ,EAAE,KAAK,CAAC,QAAQ,EAAE,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;QAClD,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,YAAY,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;YAC9C,OAAO,IAAI,CAAC;QACd,CAAC;QACD,KAAK,GAAG,SAAS,SAAS,CAAC,MAAM,EAAE,CAAC;QACpC,MAAM,CAAC,GAAG,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;QAC1B,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;IAEF,4EAA4E;IAC5E,oEAAoE;IACpE,2EAA2E;IAC3E,4EAA4E;IAC5E,iEAAiE;IACjE,MAAM,MAAM,GAAG,CAAC,UAAmB,EAAE,QAAe,SAAS,EAAE,EAAU,EAAE;QACzE,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,IAAI,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;gBACxB,OAAO,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YACpC,CAAC;YACD,OAAO,IAAI,CACT,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,EAC9B,YAAY,CAAC,UAAU,EAAE,KAAK,CAAC,CAChC,CAAC;QACJ,CAAC;QACD,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,OAAO,SAAS,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,cAAc,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,YAAY,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7B,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;YAClB,OAAO,OAAO,CAAC;QACjB,CAAC;QACD,IACE,UAAU,KAAK,IAAI;YACnB,UAAU,KAAK,SAAS;YACxB,OAAO,UAAU,KAAK,QAAQ;YAC9B,OAAO,UAAU,KAAK,QAAQ;YAC9B,OAAO,UAAU,KAAK,QAAQ;YAC9B,OAAO,UAAU,KAAK,SAAS,EAC/B,CAAC;YACD,OAAO,OAAO,CAAC,UAAU,CAAC,CAAC;QAC7B,CAAC;QACD,IAAI,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,QAAQ,GAAa,EAAE,CAAC;YAC9B,KAAK,MAAM,OAAO,IAAI,UAAU,EAAE,CAAC;gBACjC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;YACxC,CAAC;YACD,OAAO,KAAK,CAAC,QAAQ,CAAC,CAAC;QACzB,CAAC;QACD,uEAAuE;QACvE,2DAA2D;QAC3D,gEAAgE;QAChE,IAAI,OAAO,UAAU,KAAK,UAAU,EAAE,CAAC;YACrC,MAAM,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;YAC5B,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"buildBundle.js","sourceRoot":"","sources":["../../src/bundle/buildBundle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { isClientImport, isClientScript, isJsxElement, } from "@backtickjs/core";
|
|
2
|
+
import { BundlerError } from "../errors.js";
|
|
2
3
|
import { isValue } from "./params.js";
|
|
3
4
|
const CYCLE_ERROR = "Can't splice a value that contains itself: a bundle writes each value " +
|
|
4
5
|
"out in full, so a cycle never ends. Break the cycle before splicing it.";
|
|
@@ -28,7 +29,7 @@ export async function expandServerComponents(spliceable, ancestors = null, value
|
|
|
28
29
|
return spliceable;
|
|
29
30
|
}
|
|
30
31
|
if (contains(ancestors, spliceable)) {
|
|
31
|
-
throw new
|
|
32
|
+
throw new BundlerError(CYCLE_ERROR);
|
|
32
33
|
}
|
|
33
34
|
const inside = { value: spliceable, parent: ancestors };
|
|
34
35
|
const all = (entries) => Promise.all(entries.map((entry) => expandServerComponents(entry, inside, values)));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expandServerComponents.js","sourceRoot":"","sources":["../../src/bundle/expandServerComponents.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,cAAc,EACd,cAAc,EACd,YAAY,GACb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AAEtC,MAAM,WAAW,GACf,wEAAwE;IACxE,yEAAyE,CAAC;AAS5E,MAAM,QAAQ,GAAG,CAAC,SAA2B,EAAE,KAAa,EAAW,EAAE;IACvE,KAAK,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,KAAK,IAAI,EAAE,EAAE,GAAG,EAAE,CAAC,MAAM,EAAE,CAAC;QACrD,IAAI,EAAE,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF,8EAA8E;AAC9E,6EAA6E;AAC7E,0EAA0E;AAC1E,EAAE;AACF,+EAA+E;AAC/E,6EAA6E;AAC7E,2EAA2E;AAC3E,kDAAkD;AAClD,EAAE;AACF,8EAA8E;AAC9E,8EAA8E;AAC9E,gDAAgD;AAChD,qCAAqC;AACrC,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAC1C,UAAmB,EACnB,YAA8B,IAAI,EAClC,SAAS,IAAI,GAAG,EAAkC;IAElD,IAAI,OAAO,UAAU,KAAK,QAAQ,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC1D,OAAO,UAAU,CAAC;IACpB,CAAC;IACD,IAAI,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"expandServerComponents.js","sourceRoot":"","sources":["../../src/bundle/expandServerComponents.ts"],"names":[],"mappings":"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"}
|
package/dist/bundler.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import { buildBundle } from "./bundle/buildBundle.js";
|
|
2
|
+
import { BundlerError } from "./errors.js";
|
|
3
|
+
import { buildingFor } from "./supports.js";
|
|
2
4
|
import { isModules } from "./modules.js";
|
|
3
5
|
import { printBundle } from "./print/printBundle.js";
|
|
4
6
|
/**
|
|
@@ -15,11 +17,11 @@ import { printBundle } from "./print/printBundle.js";
|
|
|
15
17
|
export const bundler = {
|
|
16
18
|
async build({ input, modules, }) {
|
|
17
19
|
if (!isModules(modules)) {
|
|
18
|
-
throw new
|
|
20
|
+
throw new BundlerError(`The modules aren't { specifier: version }: ${JSON.stringify(modules)?.slice(0, 80)}`);
|
|
19
21
|
}
|
|
20
22
|
// Scripts come compiled for their framework when their host was built, so
|
|
21
23
|
// the bundle is only put together: nothing is compiled or parsed here.
|
|
22
|
-
const tree = await buildBundle(input, modules);
|
|
24
|
+
const tree = await buildingFor(modules, () => buildBundle(input, modules));
|
|
23
25
|
return {
|
|
24
26
|
generate: ({ format, sourcemap = false }) => {
|
|
25
27
|
const printed = printBundle(tree, format);
|
package/dist/bundler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAqCrD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,KAAK,CAAC,KAAK,CAA8D,EACvE,KAAK,EACL,OAAO,GACS;QAChB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,
|
|
1
|
+
{"version":3,"file":"bundler.js","sourceRoot":"","sources":["../src/bundler.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAgB,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAqCrD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG;IACrB,KAAK,CAAC,KAAK,CAA8D,EACvE,KAAK,EACL,OAAO,GACS;QAChB,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,YAAY,CACpB,8CAA8C,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CACtF,CAAC;QACJ,CAAC;QACD,0EAA0E;QAC1E,uEAAuE;QACvE,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;QAC3E,OAAO;YACL,QAAQ,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,GAAG,KAAK,EAAE,EAAE,EAAE;gBAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;gBAC1C,MAAM,IAAI,GAAG,OAAO,CAAC,IAA0B,CAAC;gBAChD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;gBACxB,IAAI,SAAS,KAAK,KAAK,EAAE,CAAC;oBACxB,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC;gBAC7B,CAAC;gBACD,IAAI,SAAS,KAAK,QAAQ,EAAE,CAAC;oBAC3B,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC;gBACvB,CAAC;gBACD,MAAM,GAAG,GAAG,uCAAuC,kBAAkB,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC7E,OAAO;oBACL,IAAI,EAAE,GAAG,IAAI,0BAA0B,GAAG,EAAwB;oBAClE,GAAG;iBACJ,CAAC;YACJ,CAAC;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { Modules } from "./modules.js";
|
|
2
|
+
/**
|
|
3
|
+
* What the bundler throws when it refuses its input: a value it can't
|
|
4
|
+
* splice, a tag it can't draw, an import the client can't run. An error a
|
|
5
|
+
* server component throws while the bundler runs it passes through as it is.
|
|
6
|
+
*/
|
|
7
|
+
export declare class BundlerError extends Error {
|
|
8
|
+
constructor(message: string);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A script's import the client can't run: `imported` from the module `from`,
|
|
12
|
+
* typed against `version`, where the client provides the module at
|
|
13
|
+
* `provided`, a version the import isn't typed for (an earlier one, or
|
|
14
|
+
* another major), or doesn't provide it at all. The client can't change, so
|
|
15
|
+
* the server draws it something else: it catches this to answer differently,
|
|
16
|
+
* or branches with `supports` before drawing.
|
|
17
|
+
*/
|
|
18
|
+
export declare class ClientVersionMismatch extends BundlerError {
|
|
19
|
+
readonly from: string;
|
|
20
|
+
readonly imported: string;
|
|
21
|
+
readonly version: string;
|
|
22
|
+
constructor(from: string, imported: string, version: string, modules: Modules);
|
|
23
|
+
readonly provided: string | undefined;
|
|
24
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the bundler throws when it refuses its input: a value it can't
|
|
3
|
+
* splice, a tag it can't draw, an import the client can't run. An error a
|
|
4
|
+
* server component throws while the bundler runs it passes through as it is.
|
|
5
|
+
*/
|
|
6
|
+
export class BundlerError extends Error {
|
|
7
|
+
constructor(message) {
|
|
8
|
+
super(message);
|
|
9
|
+
// as the class it is, in logs: `ClientVersionMismatch: Can't import …`
|
|
10
|
+
this.name = new.target.name;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* A script's import the client can't run: `imported` from the module `from`,
|
|
15
|
+
* typed against `version`, where the client provides the module at
|
|
16
|
+
* `provided`, a version the import isn't typed for (an earlier one, or
|
|
17
|
+
* another major), or doesn't provide it at all. The client can't change, so
|
|
18
|
+
* the server draws it something else: it catches this to answer differently,
|
|
19
|
+
* or branches with `supports` before drawing.
|
|
20
|
+
*/
|
|
21
|
+
export class ClientVersionMismatch extends BundlerError {
|
|
22
|
+
from;
|
|
23
|
+
imported;
|
|
24
|
+
version;
|
|
25
|
+
constructor(from, imported, version, modules) {
|
|
26
|
+
const provided = modules[from];
|
|
27
|
+
const listed = Object.entries(modules)
|
|
28
|
+
.map(([specifier, at]) => `${specifier}@${at}`)
|
|
29
|
+
.join(", ");
|
|
30
|
+
const problem = provided === undefined
|
|
31
|
+
? `the client provides ${listed || "no modules"}`
|
|
32
|
+
: `it's typed against ${version}, and the client provides ${from}@${provided}`;
|
|
33
|
+
const fix = `supports("${from}", "^${version}")`;
|
|
34
|
+
super(`Can't import \`${imported}\` from "${from}": ${problem}. ` +
|
|
35
|
+
`Check \`${fix}\` first.`);
|
|
36
|
+
this.from = from;
|
|
37
|
+
this.imported = imported;
|
|
38
|
+
this.version = version;
|
|
39
|
+
this.provided = provided;
|
|
40
|
+
}
|
|
41
|
+
// the version the client provides, or none
|
|
42
|
+
provided;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AACH,MAAM,OAAO,YAAa,SAAQ,KAAK;IACrC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,uEAAuE;QACvE,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC;IAC9B,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,OAAO,qBAAsB,SAAQ,YAAY;IAE1C;IACA;IACA;IAHX,YACW,IAAY,EACZ,QAAgB,EAChB,OAAe,EACxB,OAAgB;QAEhB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,SAAS,IAAI,EAAE,EAAE,CAAC;aAC9C,IAAI,CAAC,IAAI,CAAC,CAAC;QACd,MAAM,OAAO,GACX,QAAQ,KAAK,SAAS;YACpB,CAAC,CAAC,uBAAuB,MAAM,IAAI,YAAY,EAAE;YACjD,CAAC,CAAC,sBAAsB,OAAO,6BAA6B,IAAI,IAAI,QAAQ,EAAE,CAAC;QACnF,MAAM,GAAG,GAAG,aAAa,IAAI,QAAQ,OAAO,IAAI,CAAC;QACjD,KAAK,CACH,kBAAkB,QAAQ,YAAY,IAAI,MAAM,OAAO,IAAI;YACzD,WAAW,GAAG,WAAW,CAC5B,CAAC;QAjBO,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAQ;QAChB,YAAO,GAAP,OAAO,CAAQ;QAgBxB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,CAAC;IAED,2CAA2C;IAClC,QAAQ,CAAqB;CACvC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,2 +1,4 @@
|
|
|
1
1
|
export { type Build, type BuildOptions, bundler, type OutputChunk, type OutputOptions, } from "./bundler.js";
|
|
2
|
-
export {
|
|
2
|
+
export { BundlerError, ClientVersionMismatch } from "./errors.js";
|
|
3
|
+
export type { Modules } from "./modules.js";
|
|
4
|
+
export { supports } from "./supports.js";
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,GAGR,MAAM,cAAc,CAAC;AACtB,OAAO,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,OAAO,GAGR,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/modules.d.ts
CHANGED
|
@@ -7,9 +7,3 @@ export type Modules = Readonly<Record<string, string>>;
|
|
|
7
7
|
* Whether `value` is `Modules`: often what a client sent, parsed as it came.
|
|
8
8
|
*/
|
|
9
9
|
export declare function isModules(value: unknown): value is Modules;
|
|
10
|
-
/**
|
|
11
|
-
* Whether a client with `modules` provides `specifier` at a version in
|
|
12
|
-
* `range`: the check a bundle's every import passes, so a server choosing
|
|
13
|
-
* what to draw for a client can ask it first.
|
|
14
|
-
*/
|
|
15
|
-
export declare function supports(modules: Modules, specifier: string, range: string): boolean;
|
package/dist/modules.js
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import semver from "semver";
|
|
2
1
|
/**
|
|
3
2
|
* Whether `value` is `Modules`: often what a client sent, parsed as it came.
|
|
4
3
|
*/
|
|
@@ -8,13 +7,4 @@ export function isModules(value) {
|
|
|
8
7
|
!Array.isArray(value) &&
|
|
9
8
|
Object.values(value).every((version) => typeof version === "string"));
|
|
10
9
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Whether a client with `modules` provides `specifier` at a version in
|
|
13
|
-
* `range`: the check a bundle's every import passes, so a server choosing
|
|
14
|
-
* what to draw for a client can ask it first.
|
|
15
|
-
*/
|
|
16
|
-
export function supports(modules, specifier, range) {
|
|
17
|
-
const provided = modules[specifier];
|
|
18
|
-
return provided !== undefined && semver.satisfies(provided, range);
|
|
19
|
-
}
|
|
20
10
|
//# sourceMappingURL=modules.js.map
|
package/dist/modules.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"modules.js","sourceRoot":"","sources":["../src/modules.ts"],"names":[],"mappings":"AAMA;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAc;IACtC,OAAO,CACL,OAAO,KAAK,KAAK,QAAQ;QACzB,KAAK,KAAK,IAAI;QACd,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACrB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,OAAO,KAAK,QAAQ,CAAC,CACrE,CAAC;AACJ,CAAC"}
|
package/dist/print/code.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ClientImport } from "@backtickjs/core";
|
|
2
|
-
import {
|
|
2
|
+
import type { Modules } from "../modules.js";
|
|
3
3
|
/**
|
|
4
4
|
* What a bundle imports, keyed by specifier and export, each bound once; and
|
|
5
5
|
* the modules it may import them from, which the client provides, by version.
|
package/dist/print/code.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ClientVersionMismatch } from "../errors.js";
|
|
2
|
+
import semver from "semver";
|
|
2
3
|
// What a bundle is written as, and the one place its conventions live: how a
|
|
3
4
|
// name is written, how a literal escapes, and how an element is written as JSX
|
|
4
5
|
// for the framework's compiler. Everything is code, as a string.
|
|
@@ -53,17 +54,11 @@ function member(key) {
|
|
|
53
54
|
/** An export of a module the client provides, imported by the bundle. */
|
|
54
55
|
export function imported(names, { from, name, version }) {
|
|
55
56
|
// Where a script's import is written: a plugin's own (a framework's compile
|
|
56
|
-
// step) are the plugin's, trusted as it is.
|
|
57
|
+
// step) are the plugin's, trusted as it is. Typed against one version, it
|
|
58
|
+
// works with a later one of the same major.
|
|
57
59
|
const provided = names.modules[from];
|
|
58
|
-
if (provided === undefined) {
|
|
59
|
-
|
|
60
|
-
throw new Error(`Can't import \`${name}\` from "${from}": the client provides ` +
|
|
61
|
-
`${listed.join(", ") || "no modules"}.`);
|
|
62
|
-
}
|
|
63
|
-
// Typed against one version, it works with a later one of the same major.
|
|
64
|
-
if (!supports(names.modules, from, `^${version}`)) {
|
|
65
|
-
throw new Error(`Can't import \`${name}\` from "${from}": it's typed against ` +
|
|
66
|
-
`${version}, and the client provides ${from}@${provided}.`);
|
|
60
|
+
if (provided === undefined || !semver.satisfies(provided, `^${version}`)) {
|
|
61
|
+
throw new ClientVersionMismatch(from, name, version, names.modules);
|
|
67
62
|
}
|
|
68
63
|
const key = `${from}\0${name}`;
|
|
69
64
|
let entry = names.imports.get(key);
|
package/dist/print/code.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/print/code.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"code.js","sourceRoot":"","sources":["../../src/print/code.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Modules } from "./modules.js";
|
|
2
|
+
/** Runs `build` with `modules` as the client's, for `supports`. */
|
|
3
|
+
export declare function buildingFor<T>(modules: Modules, build: () => T): T;
|
|
4
|
+
/**
|
|
5
|
+
* Whether the client the bundler is drawing for provides `specifier` at a
|
|
6
|
+
* version in `range`: the check every import passes, for a server component
|
|
7
|
+
* choosing what to draw for that client. Called while `bundler.build` runs
|
|
8
|
+
* server components; outside one, there's no client to ask about.
|
|
9
|
+
*
|
|
10
|
+
* supports("expo-haptics", "^15") ? cs`…` : cs`…`;
|
|
11
|
+
*/
|
|
12
|
+
export declare function supports(specifier: string, range: string): boolean;
|
package/dist/supports.js
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { BundlerError } from "./errors.js";
|
|
3
|
+
import semver from "semver";
|
|
4
|
+
// The modules of the client a build is for, while it runs server components.
|
|
5
|
+
const building = new AsyncLocalStorage();
|
|
6
|
+
/** Runs `build` with `modules` as the client's, for `supports`. */
|
|
7
|
+
export function buildingFor(modules, build) {
|
|
8
|
+
return building.run(modules, build);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Whether the client the bundler is drawing for provides `specifier` at a
|
|
12
|
+
* version in `range`: the check every import passes, for a server component
|
|
13
|
+
* choosing what to draw for that client. Called while `bundler.build` runs
|
|
14
|
+
* server components; outside one, there's no client to ask about.
|
|
15
|
+
*
|
|
16
|
+
* supports("expo-haptics", "^15") ? cs`…` : cs`…`;
|
|
17
|
+
*/
|
|
18
|
+
export function supports(specifier, range) {
|
|
19
|
+
const modules = building.getStore();
|
|
20
|
+
if (modules === undefined) {
|
|
21
|
+
throw new BundlerError(`supports("${specifier}", "${range}") asks about the client a build is for: call it in a server component, while bundler.build runs it.`);
|
|
22
|
+
}
|
|
23
|
+
const provided = modules[specifier];
|
|
24
|
+
return provided !== undefined && semver.satisfies(provided, range);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=supports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"supports.js","sourceRoot":"","sources":["../src/supports.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,MAAM,MAAM,QAAQ,CAAC;AAG5B,6EAA6E;AAC7E,MAAM,QAAQ,GAAG,IAAI,iBAAiB,EAAW,CAAC;AAElD,mEAAmE;AACnE,MAAM,UAAU,WAAW,CAAI,OAAgB,EAAE,KAAc;IAC7D,OAAO,QAAQ,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACtC,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,QAAQ,CAAC,SAAiB,EAAE,KAAa;IACvD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,EAAE,CAAC;IACpC,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,IAAI,YAAY,CACpB,aAAa,SAAS,OAAO,KAAK,sGAAsG,CACzI,CAAC;IACJ,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IACpC,OAAO,QAAQ,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;AACrE,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@backtickjs/bundler",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.2",
|
|
4
4
|
"description": "Runs Backtick server components and bundles a screen per request: one JavaScript file for the client",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"backtick",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
"access": "public"
|
|
40
40
|
},
|
|
41
41
|
"dependencies": {
|
|
42
|
-
"@backtickjs/core": "^0.2.
|
|
42
|
+
"@backtickjs/core": "^0.2.2",
|
|
43
43
|
"semver": "^7.8.1"
|
|
44
44
|
},
|
|
45
45
|
"devDependencies": {
|
|
@@ -8,6 +8,7 @@ import {
|
|
|
8
8
|
type JsxElement,
|
|
9
9
|
} from "@backtickjs/core";
|
|
10
10
|
|
|
11
|
+
import { BundlerError } from "../errors.js";
|
|
11
12
|
import { expandServerComponents } from "./expandServerComponents.js";
|
|
12
13
|
import { bindingsOf, capturesOf, isValue } from "./params.js";
|
|
13
14
|
import { sourceName } from "./bindingKey.js";
|
|
@@ -253,7 +254,7 @@ export async function buildBundle(
|
|
|
253
254
|
// A server component among them, written as a tag: `<$Rule />`.
|
|
254
255
|
if (typeof spliceable === "function") {
|
|
255
256
|
const { name } = spliceable;
|
|
256
|
-
throw new
|
|
257
|
+
throw new BundlerError(
|
|
257
258
|
(name === ""
|
|
258
259
|
? "Can't splice a host function"
|
|
259
260
|
: `Can't splice the host function \`${name}\``) +
|
|
@@ -264,7 +265,7 @@ export async function buildBundle(
|
|
|
264
265
|
);
|
|
265
266
|
}
|
|
266
267
|
if (typeof spliceable !== "object") {
|
|
267
|
-
throw new
|
|
268
|
+
throw new BundlerError(
|
|
268
269
|
"Can't splice a symbol: a bundle can't write one that is the same " +
|
|
269
270
|
"symbol on the client. Splice a string, and make the symbol from it " +
|
|
270
271
|
"in a script: cs`Symbol.for($key)`.",
|
|
@@ -278,7 +279,7 @@ export async function buildBundle(
|
|
|
278
279
|
const prototype = Object.getPrototypeOf(spliceable);
|
|
279
280
|
if (prototype !== Object.prototype && prototype !== null) {
|
|
280
281
|
const name = spliceable.constructor?.name ?? "an unknown class";
|
|
281
|
-
throw new
|
|
282
|
+
throw new BundlerError(
|
|
282
283
|
`Can't splice this \`${name}\` instance: only plain objects cross into ` +
|
|
283
284
|
"a client script. Build one with a client function instead.",
|
|
284
285
|
);
|
|
@@ -298,7 +299,7 @@ export async function buildBundle(
|
|
|
298
299
|
scope.read.add(key);
|
|
299
300
|
return displayName(key);
|
|
300
301
|
}
|
|
301
|
-
throw new
|
|
302
|
+
throw new BundlerError(
|
|
302
303
|
`Can't thread the capture \`${sourceName(key)}\`: nothing encloses ` +
|
|
303
304
|
"this reference to supply it. A fragment carries the bindings it was " +
|
|
304
305
|
"written under, so this is also what happens when one is spliced " +
|
|
@@ -344,13 +345,13 @@ export async function buildBundle(
|
|
|
344
345
|
// one) are client code, so on the host they can't be tags: they are tags
|
|
345
346
|
// in a script.
|
|
346
347
|
if (typeof type === "string") {
|
|
347
|
-
throw new
|
|
348
|
+
throw new BundlerError(
|
|
348
349
|
`\`<${type}>\` is drawn by the client, so it belongs in a script: ` +
|
|
349
350
|
`cs\`<${type}>…</${type}>\`.`,
|
|
350
351
|
);
|
|
351
352
|
}
|
|
352
353
|
const tag = isClientImport(type) ? `\`<${type.name}>\`` : "A script";
|
|
353
|
-
throw new
|
|
354
|
+
throw new BundlerError(
|
|
354
355
|
`${tag} is a client component, so it can't be a tag on the host. ` +
|
|
355
356
|
"Use it as a tag in a script.",
|
|
356
357
|
);
|
|
@@ -4,6 +4,7 @@ import {
|
|
|
4
4
|
isClientScript,
|
|
5
5
|
isJsxElement,
|
|
6
6
|
} from "@backtickjs/core";
|
|
7
|
+
import { BundlerError } from "../errors.js";
|
|
7
8
|
import { isValue } from "./params.js";
|
|
8
9
|
|
|
9
10
|
const CYCLE_ERROR =
|
|
@@ -48,7 +49,7 @@ export async function expandServerComponents(
|
|
|
48
49
|
return spliceable;
|
|
49
50
|
}
|
|
50
51
|
if (contains(ancestors, spliceable)) {
|
|
51
|
-
throw new
|
|
52
|
+
throw new BundlerError(CYCLE_ERROR);
|
|
52
53
|
}
|
|
53
54
|
const inside: Ancestors = { value: spliceable, parent: ancestors };
|
|
54
55
|
const all = (entries: readonly unknown[]) =>
|
package/src/bundler.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { Bundle, Spliceable, Spliced, SplicesAs } from "@backtickjs/core";
|
|
2
2
|
import { buildBundle } from "./bundle/buildBundle.js";
|
|
3
|
+
import { BundlerError } from "./errors.js";
|
|
4
|
+
import { buildingFor } from "./supports.js";
|
|
3
5
|
import { isModules, type Modules } from "./modules.js";
|
|
4
6
|
import { printBundle } from "./print/printBundle.js";
|
|
5
7
|
|
|
@@ -55,13 +57,13 @@ export const bundler = {
|
|
|
55
57
|
modules,
|
|
56
58
|
}: BuildOptions<T>): Promise<Build<Spliced<T>>> {
|
|
57
59
|
if (!isModules(modules)) {
|
|
58
|
-
throw new
|
|
60
|
+
throw new BundlerError(
|
|
59
61
|
`The modules aren't { specifier: version }: ${JSON.stringify(modules)?.slice(0, 80)}`,
|
|
60
62
|
);
|
|
61
63
|
}
|
|
62
64
|
// Scripts come compiled for their framework when their host was built, so
|
|
63
65
|
// the bundle is only put together: nothing is compiled or parsed here.
|
|
64
|
-
const tree = await buildBundle(input, modules);
|
|
66
|
+
const tree = await buildingFor(modules, () => buildBundle(input, modules));
|
|
65
67
|
return {
|
|
66
68
|
generate: ({ format, sourcemap = false }) => {
|
|
67
69
|
const printed = printBundle(tree, format);
|
package/src/errors.ts
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type { Modules } from "./modules.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* What the bundler throws when it refuses its input: a value it can't
|
|
5
|
+
* splice, a tag it can't draw, an import the client can't run. An error a
|
|
6
|
+
* server component throws while the bundler runs it passes through as it is.
|
|
7
|
+
*/
|
|
8
|
+
export class BundlerError extends Error {
|
|
9
|
+
constructor(message: string) {
|
|
10
|
+
super(message);
|
|
11
|
+
// as the class it is, in logs: `ClientVersionMismatch: Can't import …`
|
|
12
|
+
this.name = new.target.name;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* A script's import the client can't run: `imported` from the module `from`,
|
|
18
|
+
* typed against `version`, where the client provides the module at
|
|
19
|
+
* `provided`, a version the import isn't typed for (an earlier one, or
|
|
20
|
+
* another major), or doesn't provide it at all. The client can't change, so
|
|
21
|
+
* the server draws it something else: it catches this to answer differently,
|
|
22
|
+
* or branches with `supports` before drawing.
|
|
23
|
+
*/
|
|
24
|
+
export class ClientVersionMismatch extends BundlerError {
|
|
25
|
+
constructor(
|
|
26
|
+
readonly from: string,
|
|
27
|
+
readonly imported: string,
|
|
28
|
+
readonly version: string,
|
|
29
|
+
modules: Modules,
|
|
30
|
+
) {
|
|
31
|
+
const provided = modules[from];
|
|
32
|
+
const listed = Object.entries(modules)
|
|
33
|
+
.map(([specifier, at]) => `${specifier}@${at}`)
|
|
34
|
+
.join(", ");
|
|
35
|
+
const problem =
|
|
36
|
+
provided === undefined
|
|
37
|
+
? `the client provides ${listed || "no modules"}`
|
|
38
|
+
: `it's typed against ${version}, and the client provides ${from}@${provided}`;
|
|
39
|
+
const fix = `supports("${from}", "^${version}")`;
|
|
40
|
+
super(
|
|
41
|
+
`Can't import \`${imported}\` from "${from}": ${problem}. ` +
|
|
42
|
+
`Check \`${fix}\` first.`,
|
|
43
|
+
);
|
|
44
|
+
this.provided = provided;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// the version the client provides, or none
|
|
48
|
+
readonly provided: string | undefined;
|
|
49
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -5,4 +5,6 @@ export {
|
|
|
5
5
|
type OutputChunk,
|
|
6
6
|
type OutputOptions,
|
|
7
7
|
} from "./bundler.js";
|
|
8
|
-
export {
|
|
8
|
+
export { BundlerError, ClientVersionMismatch } from "./errors.js";
|
|
9
|
+
export type { Modules } from "./modules.js";
|
|
10
|
+
export { supports } from "./supports.js";
|
package/src/modules.ts
CHANGED
|
@@ -1,5 +1,3 @@
|
|
|
1
|
-
import semver from "semver";
|
|
2
|
-
|
|
3
1
|
/**
|
|
4
2
|
* The modules a client provides, by specifier, each at the exact version of
|
|
5
3
|
* the package it comes from: `{ "react/jsx-runtime": "19.2.3" }`.
|
|
@@ -17,17 +15,3 @@ export function isModules(value: unknown): value is Modules {
|
|
|
17
15
|
Object.values(value).every((version) => typeof version === "string")
|
|
18
16
|
);
|
|
19
17
|
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Whether a client with `modules` provides `specifier` at a version in
|
|
23
|
-
* `range`: the check a bundle's every import passes, so a server choosing
|
|
24
|
-
* what to draw for a client can ask it first.
|
|
25
|
-
*/
|
|
26
|
-
export function supports(
|
|
27
|
-
modules: Modules,
|
|
28
|
-
specifier: string,
|
|
29
|
-
range: string,
|
|
30
|
-
): boolean {
|
|
31
|
-
const provided = modules[specifier];
|
|
32
|
-
return provided !== undefined && semver.satisfies(provided, range);
|
|
33
|
-
}
|
package/src/print/code.ts
CHANGED
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import type { ClientImport } from "@backtickjs/core";
|
|
2
|
-
import {
|
|
2
|
+
import { ClientVersionMismatch } from "../errors.js";
|
|
3
|
+
import semver from "semver";
|
|
4
|
+
import type { Modules } from "../modules.js";
|
|
3
5
|
|
|
4
6
|
// What a bundle is written as, and the one place its conventions live: how a
|
|
5
7
|
// name is written, how a literal escapes, and how an element is written as JSX
|
|
@@ -86,23 +88,11 @@ export function imported(
|
|
|
86
88
|
{ from, name, version }: ClientImport<unknown>,
|
|
87
89
|
): string {
|
|
88
90
|
// Where a script's import is written: a plugin's own (a framework's compile
|
|
89
|
-
// step) are the plugin's, trusted as it is.
|
|
91
|
+
// step) are the plugin's, trusted as it is. Typed against one version, it
|
|
92
|
+
// works with a later one of the same major.
|
|
90
93
|
const provided = names.modules[from];
|
|
91
|
-
if (provided === undefined) {
|
|
92
|
-
|
|
93
|
-
([specifier, at]) => `${specifier}@${at}`,
|
|
94
|
-
);
|
|
95
|
-
throw new Error(
|
|
96
|
-
`Can't import \`${name}\` from "${from}": the client provides ` +
|
|
97
|
-
`${listed.join(", ") || "no modules"}.`,
|
|
98
|
-
);
|
|
99
|
-
}
|
|
100
|
-
// Typed against one version, it works with a later one of the same major.
|
|
101
|
-
if (!supports(names.modules, from, `^${version}`)) {
|
|
102
|
-
throw new Error(
|
|
103
|
-
`Can't import \`${name}\` from "${from}": it's typed against ` +
|
|
104
|
-
`${version}, and the client provides ${from}@${provided}.`,
|
|
105
|
-
);
|
|
94
|
+
if (provided === undefined || !semver.satisfies(provided, `^${version}`)) {
|
|
95
|
+
throw new ClientVersionMismatch(from, name, version, names.modules);
|
|
106
96
|
}
|
|
107
97
|
const key = `${from}\0${name}`;
|
|
108
98
|
let entry = names.imports.get(key);
|
package/src/supports.ts
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
2
|
+
import { BundlerError } from "./errors.js";
|
|
3
|
+
import semver from "semver";
|
|
4
|
+
import type { Modules } from "./modules.js";
|
|
5
|
+
|
|
6
|
+
// The modules of the client a build is for, while it runs server components.
|
|
7
|
+
const building = new AsyncLocalStorage<Modules>();
|
|
8
|
+
|
|
9
|
+
/** Runs `build` with `modules` as the client's, for `supports`. */
|
|
10
|
+
export function buildingFor<T>(modules: Modules, build: () => T): T {
|
|
11
|
+
return building.run(modules, build);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Whether the client the bundler is drawing for provides `specifier` at a
|
|
16
|
+
* version in `range`: the check every import passes, for a server component
|
|
17
|
+
* choosing what to draw for that client. Called while `bundler.build` runs
|
|
18
|
+
* server components; outside one, there's no client to ask about.
|
|
19
|
+
*
|
|
20
|
+
* supports("expo-haptics", "^15") ? cs`…` : cs`…`;
|
|
21
|
+
*/
|
|
22
|
+
export function supports(specifier: string, range: string): boolean {
|
|
23
|
+
const modules = building.getStore();
|
|
24
|
+
if (modules === undefined) {
|
|
25
|
+
throw new BundlerError(
|
|
26
|
+
`supports("${specifier}", "${range}") asks about the client a build is for: call it in a server component, while bundler.build runs it.`,
|
|
27
|
+
);
|
|
28
|
+
}
|
|
29
|
+
const provided = modules[specifier];
|
|
30
|
+
return provided !== undefined && semver.satisfies(provided, range);
|
|
31
|
+
}
|