@vibes.diy/vibe-runtime 3.0.1 → 3.0.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.
@@ -0,0 +1,4 @@
1
+ import { type Executor, type VibeExecuteInput, type VibeExecuteResult } from "./vibe-executor.js";
2
+ export declare class NodeExecutor implements Executor {
3
+ render(input: VibeExecuteInput): Promise<VibeExecuteResult>;
4
+ }
@@ -0,0 +1,41 @@
1
+ import { exception2Result } from "@adviser/cement";
2
+ import { init as initLexer, parse as parseModule } from "es-module-lexer";
3
+ import { renderVibeToString } from "./render-vibes.js";
4
+ import { transformVibeSource } from "./transform-vibe-source.js";
5
+ const ALREADY_RESOLVED = /^(?:\.\.?\/|\/|[a-z][a-z0-9+.-]*:)/i;
6
+ async function resolveBareSpecifiers(code, resolve) {
7
+ await initLexer;
8
+ const [imports] = parseModule(code);
9
+ let out = "";
10
+ let last = 0;
11
+ for (const imp of imports) {
12
+ if (imp.d > -1)
13
+ continue;
14
+ if (imp.s < 0)
15
+ continue;
16
+ const spec = code.slice(imp.s, imp.e);
17
+ if (ALREADY_RESOLVED.test(spec))
18
+ continue;
19
+ const resolved = exception2Result(() => resolve(spec));
20
+ if (resolved.isErr())
21
+ continue;
22
+ out += code.slice(last, imp.s) + resolved.Ok();
23
+ last = imp.e;
24
+ }
25
+ out += code.slice(last);
26
+ return out;
27
+ }
28
+ export class NodeExecutor {
29
+ async render(input) {
30
+ const { module } = transformVibeSource(input.source);
31
+ const resolved = await resolveBareSpecifiers(module, (spec) => import.meta.resolve(spec));
32
+ const dataUrl = "data:text/javascript;base64," + Buffer.from(resolved, "utf8").toString("base64");
33
+ const mod = (await import(dataUrl));
34
+ const App = mod.default;
35
+ if (typeof App !== "function") {
36
+ throw new Error("vibe module has no default-exported component");
37
+ }
38
+ return { html: renderVibeToString([App], input.mountParams) };
39
+ }
40
+ }
41
+ //# sourceMappingURL=node-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node-executor.js","sourceRoot":"","sources":["../jsr/node-executor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,IAAI,IAAI,SAAS,EAAE,KAAK,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKjE,MAAM,gBAAgB,GAAG,qCAAqC,CAAC;AAwB/D,KAAK,UAAU,qBAAqB,CAAC,IAAY,EAAE,OAAiC;IAClF,MAAM,SAAS,CAAC;IAChB,MAAM,CAAC,OAAO,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,GAAG,GAAG,EAAE,CAAC;IACb,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,GAAG,IAAI,OAAO,EAAE,CAAC;QAC1B,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;YAAE,SAAS;QACzB,IAAI,GAAG,CAAC,CAAC,GAAG,CAAC;YAAE,SAAS;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACtC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,SAAS;QAC1C,MAAM,QAAQ,GAAG,gBAAgB,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QACvD,IAAI,QAAQ,CAAC,KAAK,EAAE;YAAE,SAAS;QAC/B,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,EAAE,EAAE,CAAC;QAC/C,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;IACf,CAAC;IACD,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACxB,OAAO,GAAG,CAAC;AACb,CAAC;AA4BD,MAAM,OAAO,YAAY;IACvB,KAAK,CAAC,MAAM,CAAC,KAAuB;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,QAAQ,GAAG,MAAM,qBAAqB,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,MAAM,OAAO,GAAG,8BAA8B,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAElG,MAAM,GAAG,GAAG,CAAC,MAAM,MAAM,CAAoB,OAAO,CAAC,CAA0B,CAAC;QAChF,MAAM,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,kBAAkB,CAAC,CAAC,GAAwB,CAAC,EAAE,KAAK,CAAC,WAAW,CAAC,EAAE,CAAC;IACrF,CAAC;CACF"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vibes.diy/vibe-runtime",
3
- "version": "3.0.1",
3
+ "version": "3.0.2",
4
4
  "type": "module",
5
5
  "main": "./index.js",
6
6
  "scripts": {
@@ -8,10 +8,11 @@
8
8
  },
9
9
  "dependencies": {
10
10
  "@adviser/cement": "~0.5.34",
11
- "@vibes.diy/base": "3.0.1",
12
- "@vibes.diy/vibe-types": "3.0.1",
11
+ "@vibes.diy/base": "3.0.2",
12
+ "@vibes.diy/vibe-types": "3.0.2",
13
13
  "arktype": "~2.2.1",
14
14
  "charwise": "~3.0.1",
15
+ "es-module-lexer": "~2.1.0",
15
16
  "react": "~19.2.7",
16
17
  "react-dom": "~19.2.7",
17
18
  "sucrase": "~3.35.1"
@@ -0,0 +1,4 @@
1
+ export interface TransformResult {
2
+ readonly module: string;
3
+ }
4
+ export declare function transformVibeSource(src: string): TransformResult;
@@ -0,0 +1,10 @@
1
+ import { transform } from "sucrase";
2
+ export function transformVibeSource(src) {
3
+ const { code } = transform(src, {
4
+ transforms: ["jsx", "typescript"],
5
+ production: true,
6
+ jsxRuntime: "automatic",
7
+ });
8
+ return { module: code };
9
+ }
10
+ //# sourceMappingURL=transform-vibe-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transform-vibe-source.js","sourceRoot":"","sources":["../jsr/transform-vibe-source.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAqBpC,MAAM,UAAU,mBAAmB,CAAC,GAAW;IAC7C,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,GAAG,EAAE;QAC9B,UAAU,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;QACjC,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,WAAW;KACxB,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,17 @@
1
+ import { type WorkerLoaderBinding } from "./worker-loader-executor.js";
2
+ export interface VibeExecuteInput {
3
+ readonly source: string;
4
+ readonly mountParams: unknown;
5
+ }
6
+ export interface VibeExecuteResult {
7
+ readonly html: string;
8
+ }
9
+ export interface Executor {
10
+ render(input: VibeExecuteInput): Promise<VibeExecuteResult>;
11
+ }
12
+ export type VibesSsrMode = "off" | "node" | "loader";
13
+ export declare function parseVibesSsrMode(raw: string | undefined): VibesSsrMode;
14
+ export interface SelectExecutorOptions {
15
+ readonly loader?: WorkerLoaderBinding;
16
+ }
17
+ export declare function selectExecutor(mode: VibesSsrMode, opts?: SelectExecutorOptions): Executor | undefined;
@@ -0,0 +1,26 @@
1
+ import { NodeExecutor } from "./node-executor.js";
2
+ import { WorkerLoaderExecutor } from "./worker-loader-executor.js";
3
+ export function parseVibesSsrMode(raw) {
4
+ switch ((raw ?? "").trim().toLowerCase()) {
5
+ case "node":
6
+ return "node";
7
+ case "loader":
8
+ return "loader";
9
+ default:
10
+ return "off";
11
+ }
12
+ }
13
+ export function selectExecutor(mode, opts = {}) {
14
+ switch (mode) {
15
+ case "off":
16
+ return undefined;
17
+ case "node":
18
+ return new NodeExecutor();
19
+ case "loader":
20
+ if (opts.loader === undefined) {
21
+ throw new Error("VIBES_SSR=loader requires a Worker Loader (env.LOADER) binding");
22
+ }
23
+ return new WorkerLoaderExecutor(opts.loader);
24
+ }
25
+ }
26
+ //# sourceMappingURL=vibe-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibe-executor.js","sourceRoot":"","sources":["../jsr/vibe-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAA4B,MAAM,6BAA6B,CAAC;AA2C7F,MAAM,UAAU,iBAAiB,CAAC,GAAuB;IACvD,QAAQ,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC;QACzC,KAAK,MAAM;YACT,OAAO,MAAM,CAAC;QAChB,KAAK,QAAQ;YACX,OAAO,QAAQ,CAAC;QAClB;YACE,OAAO,KAAK,CAAC;IACjB,CAAC;AACH,CAAC;AAYD,MAAM,UAAU,cAAc,CAAC,IAAkB,EAAE,IAAI,GAA0B,EAAE;IACjF,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,KAAK;YACR,OAAO,SAAS,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,EAAE,CAAC;QAC5B,KAAK,QAAQ;YACX,IAAI,IAAI,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAC;YACpF,CAAC;YACD,OAAO,IAAI,oBAAoB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import { type Executor, type VibeExecuteInput, type VibeExecuteResult } from "./vibe-executor.js";
2
+ export interface WorkerCode {
3
+ readonly compatibilityDate: string;
4
+ readonly mainModule: string;
5
+ readonly modules: Record<string, string>;
6
+ readonly globalOutbound: null;
7
+ }
8
+ export interface WorkerEntrypoint {
9
+ fetch(request: Request): Promise<Response>;
10
+ }
11
+ export interface WorkerStub {
12
+ getEntrypoint(): WorkerEntrypoint;
13
+ }
14
+ export interface WorkerLoaderBinding {
15
+ get(id: string, factory: () => WorkerCode | Promise<WorkerCode>): WorkerStub;
16
+ }
17
+ export declare function buildVibeWorkerCode(input: {
18
+ module: string;
19
+ mountParams: unknown;
20
+ }): WorkerCode;
21
+ export declare class WorkerLoaderExecutor implements Executor {
22
+ private readonly loader;
23
+ constructor(loader: WorkerLoaderBinding);
24
+ render(input: VibeExecuteInput): Promise<VibeExecuteResult>;
25
+ }
@@ -0,0 +1,52 @@
1
+ import { TxtEnDecoderSingleton } from "@adviser/cement";
2
+ import { transformVibeSource } from "./transform-vibe-source.js";
3
+ const MAIN_MODULE = "main.js";
4
+ const VIBE_MODULE = "vibe.js";
5
+ const COMPATIBILITY_DATE = "2025-05-01";
6
+ const SSR_REQUEST_URL = "https://vibe-ssr.internal/";
7
+ export function buildVibeWorkerCode(input) {
8
+ const mountParamsJson = JSON.stringify(input.mountParams ?? null);
9
+ const main = [
10
+ `import { renderVibeToString } from "@vibes.diy/vibe-runtime/render-vibes.js";`,
11
+ `import VibeApp from "./${VIBE_MODULE}";`,
12
+ `const MOUNT_PARAMS = ${mountParamsJson};`,
13
+ `export default {`,
14
+ ` async fetch() {`,
15
+ ` const html = renderVibeToString([VibeApp], MOUNT_PARAMS);`,
16
+ ` return new Response(html, { headers: { "content-type": "text/html; charset=utf-8" } });`,
17
+ ` },`,
18
+ `};`,
19
+ ``,
20
+ ].join("\n");
21
+ return {
22
+ compatibilityDate: COMPATIBILITY_DATE,
23
+ mainModule: MAIN_MODULE,
24
+ modules: {
25
+ [MAIN_MODULE]: main,
26
+ [VIBE_MODULE]: input.module,
27
+ },
28
+ globalOutbound: null,
29
+ };
30
+ }
31
+ async function hashWorkerCode(code) {
32
+ const payload = `${code.compatibilityDate}\n${code.mainModule}\n${JSON.stringify(code.modules)}`;
33
+ const digest = await crypto.subtle.digest("SHA-256", TxtEnDecoderSingleton().encode(payload));
34
+ return Array.from(new Uint8Array(digest))
35
+ .map((b) => b.toString(16).padStart(2, "0"))
36
+ .join("");
37
+ }
38
+ export class WorkerLoaderExecutor {
39
+ loader;
40
+ constructor(loader) {
41
+ this.loader = loader;
42
+ }
43
+ async render(input) {
44
+ const { module } = transformVibeSource(input.source);
45
+ const code = buildVibeWorkerCode({ module, mountParams: input.mountParams });
46
+ const id = await hashWorkerCode(code);
47
+ const stub = this.loader.get(id, () => code);
48
+ const response = await stub.getEntrypoint().fetch(new Request(SSR_REQUEST_URL));
49
+ return { html: await response.text() };
50
+ }
51
+ }
52
+ //# sourceMappingURL=worker-loader-executor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-loader-executor.js","sourceRoot":"","sources":["../jsr/worker-loader-executor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAyCjE,MAAM,WAAW,GAAG,SAAS,CAAC;AAC9B,MAAM,WAAW,GAAG,SAAS,CAAC;AAG9B,MAAM,kBAAkB,GAAG,YAAY,CAAC;AAExC,MAAM,eAAe,GAAG,4BAA4B,CAAC;AAsBrD,MAAM,UAAU,mBAAmB,CAAC,KAA+C;IACjF,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,CAAC;IAClE,MAAM,IAAI,GAAG;QACX,+EAA+E;QAC/E,0BAA0B,WAAW,IAAI;QACzC,wBAAwB,eAAe,GAAG;QAC1C,kBAAkB;QAClB,mBAAmB;QACnB,+DAA+D;QAC/D,6FAA6F;QAC7F,MAAM;QACN,IAAI;QACJ,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO;QACL,iBAAiB,EAAE,kBAAkB;QACrC,UAAU,EAAE,WAAW;QACvB,OAAO,EAAE;YACP,CAAC,WAAW,CAAC,EAAE,IAAI;YACnB,CAAC,WAAW,CAAC,EAAE,KAAK,CAAC,MAAM;SAC5B;QACD,cAAc,EAAE,IAAI;KACrB,CAAC;AACJ,CAAC;AAGD,KAAK,UAAU,cAAc,CAAC,IAAgB;IAC5C,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,iBAAiB,KAAK,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAGjG,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,qBAAqB,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9F,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SAC3C,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAUD,MAAM,OAAO,oBAAoB;IACF,MAAM;IAAnC,YAA6B,MAA2B;sBAA3B,MAAM;IAAwB,CAAC;IAE5D,KAAK,CAAC,MAAM,CAAC,KAAuB;QAClC,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC7E,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;QAC7C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,aAAa,EAAE,CAAC,KAAK,CAAC,IAAI,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;QAChF,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;IACzC,CAAC;CACF"}