@vibes.diy/vibe-runtime 3.0.0 → 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.
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AACjC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAuB,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,eAAe,IAAI,QAAQ,GAO5B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,SAAS,EACT,aAAa,GAOd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAuD,MAAM,eAAe,CAAC;AAC7F,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,2BAA2B,GAE5B,MAAM,kBAAkB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../jsr/index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,WAAW,CAAC;AAC1B,cAAc,kBAAkB,CAAC;AAIjC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,qBAAqB,EACrB,yBAAyB,EACzB,kBAAkB,EAClB,YAAY,EACZ,iBAAiB,GAClB,MAAM,6BAA6B,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,WAAW,EAAuB,MAAM,kBAAkB,CAAC;AAC7F,OAAO,EAAE,SAAS,EAAwB,MAAM,iBAAiB,CAAC;AAClE,OAAO,EACL,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACL,eAAe,EACf,eAAe,IAAI,QAAQ,GAO5B,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EACL,aAAa,EACb,SAAS,EACT,aAAa,GAOd,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,OAAO,EAAuD,MAAM,eAAe,CAAC;AAC7F,OAAO,EACL,UAAU,EACV,kBAAkB,EAClB,oBAAoB,EACpB,wBAAwB,EACxB,qBAAqB,EACrB,2BAA2B,GAE5B,MAAM,kBAAkB,CAAC"}
package/mount-vibes.js CHANGED
@@ -1,14 +1,14 @@
1
- import React, { Fragment } from "react";
2
- import { createRoot } from "react-dom/client";
1
+ import { createRoot, hydrateRoot } from "react-dom/client";
3
2
  import { type } from "arktype";
4
3
  import { vibeMountParams } from "./vibe.js";
5
- import { VibeContextProvider } from "./VibeContext.js";
4
+ import { buildVibeTree } from "./vibe-tree.js";
6
5
  let activeRoot;
7
6
  let activeProps;
8
7
  export function unmountVibe() {
9
8
  if (activeRoot) {
10
- activeRoot.unmount();
9
+ const root = activeRoot;
11
10
  activeRoot = undefined;
11
+ root.unmount();
12
12
  }
13
13
  }
14
14
  export function getActiveProps() {
@@ -23,15 +23,16 @@ export function mountVibe(comps, iprops) {
23
23
  if (!element || element.length !== 1) {
24
24
  throw new Error(`Can't find the dom element root`);
25
25
  }
26
+ activeProps = iprops;
27
+ const providerElement = buildVibeTree(comps, props);
26
28
  if (activeRoot === undefined) {
27
- activeRoot = createRoot(element[0]);
29
+ const container = element[0];
30
+ if (container.hasChildNodes()) {
31
+ activeRoot = hydrateRoot(container, providerElement);
32
+ return;
33
+ }
34
+ activeRoot = createRoot(container);
28
35
  }
29
- activeProps = iprops;
30
- const vibeElement = React.createElement(Fragment, null, ...comps.map((Comp, index) => React.createElement(Comp, { key: index })));
31
- const providerElement = React.createElement(VibeContextProvider, {
32
- mountParams: { ...props },
33
- children: vibeElement,
34
- });
35
36
  activeRoot.render(providerElement);
36
37
  }
37
38
  //# sourceMappingURL=mount-vibes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mount-vibes.js","sourceRoot":"","sources":["../jsr/mount-vibes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAqB,MAAM,OAAO,CAAC;AAC3D,OAAO,EAAa,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,IAAI,UAA4B,CAAC;AACjC,IAAI,WAAoB,CAAC;AAEzB,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,EAAE,CAAC;QACf,UAAU,CAAC,OAAO,EAAE,CAAC;QACrB,UAAU,GAAG,SAAS,CAAC;IACzB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAGD,MAAM,UAAU,SAAS,CACvB,KAA0B,EAC1B,MAAe;IAEf,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;IACtE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IAMD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;IACtC,CAAC;IACD,WAAW,GAAG,MAAM,CAAC;IAErB,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAClI,MAAM,eAAe,GAAG,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE;QAC/D,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE;QACzB,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAC;IACH,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"mount-vibes.js","sourceRoot":"","sources":["../jsr/mount-vibes.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,UAAU,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACtE,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAE/C,IAAI,UAA4B,CAAC;AACjC,IAAI,WAAoB,CAAC;AAEzB,MAAM,UAAU,WAAW;IACzB,IAAI,UAAU,EAAE,CAAC;QAKf,MAAM,IAAI,GAAG,UAAU,CAAC;QACxB,UAAU,GAAG,SAAS,CAAC;QACvB,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;AACH,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,OAAO,WAAW,CAAC;AACrB,CAAC;AAGD,MAAM,UAAU,SAAS,CACvB,KAA0B,EAC1B,MAAe;IAEf,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,CAAC;IACtE,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;IACD,WAAW,GAAG,MAAM,CAAC;IAIrB,MAAM,eAAe,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAEpD,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAM7B,IAAI,SAAS,CAAC,aAAa,EAAE,EAAE,CAAC;YAC9B,UAAU,GAAG,WAAW,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YACrD,OAAO;QACT,CAAC;QACD,UAAU,GAAG,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;IAMD,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;AACrC,CAAC"}
@@ -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.0",
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.0",
12
- "@vibes.diy/vibe-types": "3.0.0",
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,2 @@
1
+ import { type FunctionComponent } from "react";
2
+ export declare function renderVibeToString(comps: FunctionComponent[], iprops: unknown): string;
@@ -0,0 +1,12 @@
1
+ import { type } from "arktype";
2
+ import { renderToString } from "react-dom/server";
3
+ import { vibeMountParams } from "./vibe.js";
4
+ import { buildVibeTree } from "./vibe-tree.js";
5
+ export function renderVibeToString(comps, iprops) {
6
+ const props = vibeMountParams(iprops);
7
+ if (props instanceof type.errors) {
8
+ throw new Error(`Invalid mount params: ${props.summary}`);
9
+ }
10
+ return renderToString(buildVibeTree(comps, props));
11
+ }
12
+ //# sourceMappingURL=render-vibes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-vibes.js","sourceRoot":"","sources":["../jsr/render-vibes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAmB/C,MAAM,UAAU,kBAAkB,CAAC,KAA0B,EAAE,MAAe;IAC5E,MAAM,KAAK,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACtC,IAAI,KAAK,YAAY,IAAI,CAAC,MAAM,EAAE,CAAC;QACjC,MAAM,IAAI,KAAK,CAAC,yBAAyB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC5D,CAAC;IACD,OAAO,cAAc,CAAC,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;AACrD,CAAC"}
@@ -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"}
package/vibe-tree.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type FunctionComponent, type ReactElement } from "react";
2
+ import { type VibeMountParams } from "./vibe.js";
3
+ export declare function buildVibeTree(comps: FunctionComponent[], props: VibeMountParams): ReactElement;
package/vibe-tree.js ADDED
@@ -0,0 +1,10 @@
1
+ import React, { Fragment } from "react";
2
+ import { VibeContextProvider } from "./VibeContext.js";
3
+ export function buildVibeTree(comps, props) {
4
+ const vibeElement = React.createElement(Fragment, null, ...comps.map((Comp, index) => React.createElement(Comp, { key: index })));
5
+ return React.createElement(VibeContextProvider, {
6
+ mountParams: { ...props },
7
+ children: vibeElement,
8
+ });
9
+ }
10
+ //# sourceMappingURL=vibe-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vibe-tree.js","sourceRoot":"","sources":["../jsr/vibe-tree.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,QAAQ,EAA6C,MAAM,OAAO,CAAC;AAEnF,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAgBvD,MAAM,UAAU,aAAa,CAAC,KAA0B,EAAE,KAAsB;IAC9E,MAAM,WAAW,GAAG,KAAK,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC;IAClI,OAAO,KAAK,CAAC,aAAa,CAAC,mBAAmB,EAAE;QAC9C,WAAW,EAAE,EAAE,GAAG,KAAK,EAAE;QACzB,QAAQ,EAAE,WAAW;KACtB,CAAC,CAAC;AACL,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"}