fibrae 0.3.0 → 0.3.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/dist/atom-utils.d.ts +52 -0
- package/dist/atom-utils.js +64 -0
- package/dist/atom-utils.js.map +1 -0
- package/dist/cli/build.js +2 -2
- package/dist/cli/build.js.map +1 -1
- package/dist/cli/html.d.ts +6 -0
- package/dist/cli/html.js +20 -26
- package/dist/cli/html.js.map +1 -1
- package/dist/cli/vite-plugin.js +41 -2
- package/dist/cli/vite-plugin.js.map +1 -1
- package/dist/components.d.ts +3 -3
- package/dist/components.js +3 -1
- package/dist/components.js.map +1 -1
- package/dist/core.js +37 -10
- package/dist/core.js.map +1 -1
- package/dist/dom.d.ts +22 -3
- package/dist/dom.js +100 -5
- package/dist/dom.js.map +1 -1
- package/dist/fiber-commit.d.ts +2 -0
- package/dist/fiber-commit.js +179 -40
- package/dist/fiber-commit.js.map +1 -1
- package/dist/fiber-render.js +13 -27
- package/dist/fiber-render.js.map +1 -1
- package/dist/fiber-update.d.ts +1 -1
- package/dist/fiber-update.js +33 -12
- package/dist/fiber-update.js.map +1 -1
- package/dist/h.d.ts +65 -10
- package/dist/h.js +98 -22
- package/dist/h.js.map +1 -1
- package/dist/head.d.ts +64 -0
- package/dist/head.js +257 -0
- package/dist/head.js.map +1 -0
- package/dist/hydration-dev.d.ts +24 -0
- package/dist/hydration-dev.js +138 -0
- package/dist/hydration-dev.js.map +1 -0
- package/dist/index.d.ts +6 -2
- package/dist/index.js +5 -2
- package/dist/index.js.map +1 -1
- package/dist/jsx-runtime/index.d.ts +288 -8
- package/dist/jsx-runtime/index.js +2 -0
- package/dist/jsx-runtime/index.js.map +1 -1
- package/dist/live/client.js +4 -4
- package/dist/live/client.js.map +1 -1
- package/dist/live/server.js.map +1 -1
- package/dist/live/sse-stream.js +2 -2
- package/dist/live/sse-stream.js.map +1 -1
- package/dist/mdx/index.d.ts +125 -0
- package/dist/mdx/index.js +137 -0
- package/dist/mdx/index.js.map +1 -0
- package/dist/mdx/parse.d.ts +42 -0
- package/dist/mdx/parse.js +147 -0
- package/dist/mdx/parse.js.map +1 -0
- package/dist/mdx/render.d.ts +24 -0
- package/dist/mdx/render.js +261 -0
- package/dist/mdx/render.js.map +1 -0
- package/dist/router/Form.d.ts +90 -0
- package/dist/router/Form.js +166 -0
- package/dist/router/Form.js.map +1 -0
- package/dist/router/History.d.ts +2 -2
- package/dist/router/History.js.map +1 -1
- package/dist/router/Link.d.ts +27 -32
- package/dist/router/Link.js +56 -98
- package/dist/router/Link.js.map +1 -1
- package/dist/router/Navigator.d.ts +49 -44
- package/dist/router/Navigator.js +57 -104
- package/dist/router/Navigator.js.map +1 -1
- package/dist/router/Route.d.ts +8 -4
- package/dist/router/Route.js +10 -2
- package/dist/router/Route.js.map +1 -1
- package/dist/router/Router.d.ts +10 -10
- package/dist/router/Router.js +38 -23
- package/dist/router/Router.js.map +1 -1
- package/dist/router/RouterBuilder.d.ts +69 -6
- package/dist/router/RouterBuilder.js +23 -0
- package/dist/router/RouterBuilder.js.map +1 -1
- package/dist/router/RouterOutlet.js +63 -45
- package/dist/router/RouterOutlet.js.map +1 -1
- package/dist/router/index.d.ts +10 -3
- package/dist/router/index.js +5 -2
- package/dist/router/index.js.map +1 -1
- package/dist/router/register.d.ts +37 -0
- package/dist/router/register.js +18 -0
- package/dist/router/register.js.map +1 -0
- package/dist/router/utils.d.ts +2 -2
- package/dist/runtime.d.ts +1 -1
- package/dist/server.js +7 -3
- package/dist/server.js.map +1 -1
- package/dist/shared.d.ts +36 -6
- package/dist/shared.js +12 -2
- package/dist/shared.js.map +1 -1
- package/dist/tracking.d.ts +3 -2
- package/dist/tracking.js +4 -1
- package/dist/tracking.js.map +1 -1
- package/dist/transition.d.ts +51 -0
- package/dist/transition.js +46 -0
- package/dist/transition.js.map +1 -0
- package/package.json +16 -3
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component-scoped atom utilities.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrappers that tie atom subscriptions to the component lifecycle
|
|
5
|
+
* via ComponentScope, so cleanup happens automatically on unmount.
|
|
6
|
+
*/
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import * as Scope from "effect/Scope";
|
|
9
|
+
import { Atom, Registry as AtomRegistry } from "@effect-atom/atom";
|
|
10
|
+
import { ComponentScope } from "./shared.js";
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to an atom for the lifetime of the current component.
|
|
13
|
+
* The subscription is cleaned up automatically when the component unmounts.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const Counter = () =>
|
|
18
|
+
* Effect.gen(function* () {
|
|
19
|
+
* yield* subscribeAtom(countAtom, (value) => {
|
|
20
|
+
* console.log("count changed:", value);
|
|
21
|
+
* });
|
|
22
|
+
* const count = yield* Atom.get(countAtom);
|
|
23
|
+
* return <div>Count: {count}</div>;
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export declare const subscribeAtom: <A>(atom: Atom.Atom<A>, callback: (value: A) => void) => Effect.Effect<void, never, AtomRegistry.AtomRegistry | ComponentScope>;
|
|
28
|
+
/**
|
|
29
|
+
* Run an Effect after the component mounts, scoped to the component lifetime.
|
|
30
|
+
* The forked fiber is interrupted when the component unmounts.
|
|
31
|
+
*
|
|
32
|
+
* Useful for imperative setup (DOM manipulation, external library init)
|
|
33
|
+
* that needs to wait for the DOM to be ready.
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```tsx
|
|
37
|
+
* const Editor = () =>
|
|
38
|
+
* Effect.gen(function* () {
|
|
39
|
+
* const ref = { current: null as HTMLDivElement | null };
|
|
40
|
+
*
|
|
41
|
+
* yield* mountAtom(
|
|
42
|
+
* Effect.gen(function* () {
|
|
43
|
+
* const editor = monaco.create(ref.current!);
|
|
44
|
+
* yield* Effect.addFinalizer(() => Effect.sync(() => editor.dispose()));
|
|
45
|
+
* }),
|
|
46
|
+
* );
|
|
47
|
+
*
|
|
48
|
+
* return <div ref={el => ref.current = el} />;
|
|
49
|
+
* });
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
export declare const mountAtom: <A, E>(effect: Effect.Effect<A, E, Scope.Scope>) => Effect.Effect<void, never, ComponentScope>;
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Component-scoped atom utilities.
|
|
3
|
+
*
|
|
4
|
+
* Thin wrappers that tie atom subscriptions to the component lifecycle
|
|
5
|
+
* via ComponentScope, so cleanup happens automatically on unmount.
|
|
6
|
+
*/
|
|
7
|
+
import * as Effect from "effect/Effect";
|
|
8
|
+
import * as Scope from "effect/Scope";
|
|
9
|
+
import { Atom, Registry as AtomRegistry } from "@effect-atom/atom";
|
|
10
|
+
import { ComponentScope } from "./shared.js";
|
|
11
|
+
/**
|
|
12
|
+
* Subscribe to an atom for the lifetime of the current component.
|
|
13
|
+
* The subscription is cleaned up automatically when the component unmounts.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```tsx
|
|
17
|
+
* const Counter = () =>
|
|
18
|
+
* Effect.gen(function* () {
|
|
19
|
+
* yield* subscribeAtom(countAtom, (value) => {
|
|
20
|
+
* console.log("count changed:", value);
|
|
21
|
+
* });
|
|
22
|
+
* const count = yield* Atom.get(countAtom);
|
|
23
|
+
* return <div>Count: {count}</div>;
|
|
24
|
+
* });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
export const subscribeAtom = (atom, callback) => Effect.gen(function* () {
|
|
28
|
+
const { scope } = yield* ComponentScope;
|
|
29
|
+
const registry = yield* AtomRegistry.AtomRegistry;
|
|
30
|
+
const unsubscribe = registry.subscribe(atom, callback);
|
|
31
|
+
yield* Scope.addFinalizer(scope, Effect.sync(unsubscribe));
|
|
32
|
+
});
|
|
33
|
+
/**
|
|
34
|
+
* Run an Effect after the component mounts, scoped to the component lifetime.
|
|
35
|
+
* The forked fiber is interrupted when the component unmounts.
|
|
36
|
+
*
|
|
37
|
+
* Useful for imperative setup (DOM manipulation, external library init)
|
|
38
|
+
* that needs to wait for the DOM to be ready.
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```tsx
|
|
42
|
+
* const Editor = () =>
|
|
43
|
+
* Effect.gen(function* () {
|
|
44
|
+
* const ref = { current: null as HTMLDivElement | null };
|
|
45
|
+
*
|
|
46
|
+
* yield* mountAtom(
|
|
47
|
+
* Effect.gen(function* () {
|
|
48
|
+
* const editor = monaco.create(ref.current!);
|
|
49
|
+
* yield* Effect.addFinalizer(() => Effect.sync(() => editor.dispose()));
|
|
50
|
+
* }),
|
|
51
|
+
* );
|
|
52
|
+
*
|
|
53
|
+
* return <div ref={el => ref.current = el} />;
|
|
54
|
+
* });
|
|
55
|
+
* ```
|
|
56
|
+
*/
|
|
57
|
+
export const mountAtom = (effect) => Effect.gen(function* () {
|
|
58
|
+
const { scope, mounted } = yield* ComponentScope;
|
|
59
|
+
yield* Effect.gen(function* () {
|
|
60
|
+
yield* mounted;
|
|
61
|
+
yield* effect;
|
|
62
|
+
}).pipe(Effect.forkScoped, Scope.extend(scope));
|
|
63
|
+
});
|
|
64
|
+
//# sourceMappingURL=atom-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"atom-utils.js","sourceRoot":"","sources":["../src/atom-utils.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,QAAQ,IAAI,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAC3B,IAAkB,EAClB,QAA4B,EAC4C,EAAE,CAC1E,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACxC,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,YAAY,CAAC,YAAY,CAAC;IAClD,MAAM,WAAW,GAAG,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACvD,KAAK,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7D,CAAC,CAAC,CAAC;AAEL;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,MAAwC,EACI,EAAE,CAC9C,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,KAAK,CAAC,CAAC,cAAc,CAAC;IACjD,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACzB,KAAK,CAAC,CAAC,OAAO,CAAC;QACf,KAAK,CAAC,CAAC,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;AAClD,CAAC,CAAC,CAAC"}
|
package/dist/cli/build.js
CHANGED
|
@@ -22,9 +22,9 @@ const renderRoute = (config) => Effect.gen(function* () {
|
|
|
22
22
|
});
|
|
23
23
|
const fullLayer = Layer.provideMerge(serverLayer, Layer.merge(config.handlersLayer, SSRAtomRegistryLayer));
|
|
24
24
|
const { html, dehydratedState, head } = yield* Effect.gen(function* () {
|
|
25
|
-
const { element, head } = yield* Router.CurrentRouteElement;
|
|
25
|
+
const { element, head: routeHead } = yield* Router.CurrentRouteElement;
|
|
26
26
|
const renderResult = yield* renderToStringWith(config.appShell(element));
|
|
27
|
-
return { ...renderResult, head };
|
|
27
|
+
return { ...renderResult, head: routeHead };
|
|
28
28
|
}).pipe(Effect.provide(fullLayer));
|
|
29
29
|
return yield* buildPage({
|
|
30
30
|
html,
|
package/dist/cli/build.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxC,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAGhF,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC;;GAEG;AACH,MAAM,WAAW,GAAG,CAAC,MASpB,EAAkC,EAAE,CACnC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACrC,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,MAAM,CAAC,QAAQ;KAC1B,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAClC,WAAW,EACX,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,aAAa,EAAE,oBAAoB,CAAC,CACxD,CAAC;IAEF,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACjE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/cli/build.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/html.d.ts
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTML page template for static site generation.
|
|
3
|
+
*
|
|
4
|
+
* Uses fibrae JSX to generate full HTML documents wrapping
|
|
5
|
+
* pre-rendered content with dehydrated state and client scripts.
|
|
6
|
+
*/
|
|
1
7
|
import type { HeadData } from "../router/RouterBuilder.js";
|
|
2
8
|
import * as Effect from "effect/Effect";
|
|
3
9
|
import * as Option from "effect/Option";
|
package/dist/cli/html.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
* Uses fibrae JSX to generate full HTML documents wrapping
|
|
5
5
|
* pre-rendered content with dehydrated state and client scripts.
|
|
6
6
|
*/
|
|
7
|
+
// eslint-disable-next-line no-unused-vars -- jsx is used by the JSX transform (jsxFactory)
|
|
8
|
+
import { jsx } from "../jsx-runtime/index.js";
|
|
7
9
|
import { h } from "../h.js";
|
|
8
10
|
import { renderToString } from "../server.js";
|
|
9
11
|
import * as Effect from "effect/Effect";
|
|
@@ -13,20 +15,18 @@ const metaToElement = (meta) => {
|
|
|
13
15
|
if ("title" in meta)
|
|
14
16
|
return Option.none();
|
|
15
17
|
if ("charset" in meta)
|
|
16
|
-
return Option.some(
|
|
18
|
+
return Option.some(jsx("meta", { charset: meta.charset }));
|
|
17
19
|
if ("script:ld+json" in meta)
|
|
18
|
-
return Option.some(
|
|
19
|
-
type: "application/ld+json",
|
|
20
|
-
dangerouslySetInnerHTML: JSON.stringify(meta["script:ld+json"]),
|
|
21
|
-
}));
|
|
20
|
+
return Option.some(jsx("script", { type: "application/ld+json", dangerouslySetInnerHTML: JSON.stringify(meta["script:ld+json"]) }));
|
|
22
21
|
if ("name" in meta)
|
|
23
|
-
return Option.some(
|
|
22
|
+
return Option.some(jsx("meta", { name: meta.name, content: meta.content }));
|
|
24
23
|
if ("property" in meta)
|
|
25
|
-
return Option.some(
|
|
24
|
+
return Option.some(jsx("meta", { property: meta.property, content: meta.content }));
|
|
26
25
|
if ("httpEquiv" in meta)
|
|
27
|
-
return Option.some(
|
|
26
|
+
return Option.some(jsx("meta", { "http-equiv": meta.httpEquiv, content: meta.content }));
|
|
28
27
|
if ("tagName" in meta) {
|
|
29
28
|
const { tagName, ...attrs } = meta;
|
|
29
|
+
// Dynamic tag name -- JSX requires literal tags, so use h() directly
|
|
30
30
|
return Option.some(h(tagName, attrs));
|
|
31
31
|
}
|
|
32
32
|
return Option.none();
|
|
@@ -70,32 +70,26 @@ const buildHeadChildren = (title, head, headTags) => {
|
|
|
70
70
|
const allLinks = [...(headTags?.links ?? []), ...(headData?.links ?? [])];
|
|
71
71
|
const allScripts = [...(headTags?.scripts ?? []), ...(headData?.scripts ?? [])];
|
|
72
72
|
return [
|
|
73
|
-
|
|
74
|
-
|
|
73
|
+
jsx("meta", { charset: "UTF-8" }),
|
|
74
|
+
jsx("meta", { name: "viewport", content: "width=device-width, initial-scale=1.0" }),
|
|
75
75
|
...Option.match(Option.fromNullable(pageTitle), {
|
|
76
76
|
onNone: () => [],
|
|
77
|
-
onSome: (t) => [
|
|
77
|
+
onSome: (t) => [jsx("title", null, t)],
|
|
78
78
|
}),
|
|
79
79
|
...Array.filterMap(allMeta, metaToElement),
|
|
80
|
-
...allLinks.map((attrs) =>
|
|
80
|
+
...allLinks.map((attrs) => jsx("link", { ...attrs })),
|
|
81
81
|
...allScripts.flatMap((script) => script.src
|
|
82
|
-
? [
|
|
82
|
+
? [jsx("script", { type: script.type, src: script.src })]
|
|
83
83
|
: script.content
|
|
84
|
-
? [
|
|
84
|
+
? [jsx("script", { type: script.type, dangerouslySetInnerHTML: script.content })]
|
|
85
85
|
: []),
|
|
86
86
|
];
|
|
87
87
|
};
|
|
88
|
-
const PageShell = (props) =>
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
id: "__fibrae-state__",
|
|
95
|
-
dangerouslySetInnerHTML: JSON.stringify(props.dehydratedState),
|
|
96
|
-
}),
|
|
97
|
-
...(props.clientScript ? [h("script", { type: "module", src: props.clientScript })] : []),
|
|
98
|
-
]),
|
|
99
|
-
]);
|
|
88
|
+
const PageShell = (props) => (jsx("html", { lang: "en" },
|
|
89
|
+
jsx("head", null, buildHeadChildren(props.title, props.head, props.headTags)),
|
|
90
|
+
jsx("body", null,
|
|
91
|
+
jsx("div", { id: "root", dangerouslySetInnerHTML: props.html }),
|
|
92
|
+
jsx("script", { type: "application/json", id: "__fibrae-state__", dangerouslySetInnerHTML: JSON.stringify(props.dehydratedState) }),
|
|
93
|
+
props.clientScript ? jsx("script", { type: "module", src: props.clientScript }) : null)));
|
|
100
94
|
export const buildPage = (options) => renderToString(PageShell(options)).pipe(Effect.map(({ html }) => `<!DOCTYPE html>\n${html}`));
|
|
101
95
|
//# sourceMappingURL=html.js.map
|
package/dist/cli/html.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/cli/html.
|
|
1
|
+
{"version":3,"file":"html.js","sourceRoot":"","sources":["../../src/cli/html.tsx"],"names":[],"mappings":"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"}
|
package/dist/cli/vite-plugin.js
CHANGED
|
@@ -17,7 +17,7 @@ const renderDevPage = (opts) => Effect.gen(function* () {
|
|
|
17
17
|
});
|
|
18
18
|
const fullLayer = Layer.provideMerge(serverLayer, Layer.merge(opts.handlersLayer, SSRAtomRegistryLayer));
|
|
19
19
|
const { html, dehydratedState, head } = yield* Effect.gen(function* () {
|
|
20
|
-
const { head } = yield* Router.CurrentRouteElement;
|
|
20
|
+
const { head: routeHead } = yield* Router.CurrentRouteElement;
|
|
21
21
|
const renderResult = opts.App
|
|
22
22
|
? yield* renderToStringWith(opts.App())
|
|
23
23
|
: yield* Effect.gen(function* () {
|
|
@@ -25,7 +25,7 @@ const renderDevPage = (opts) => Effect.gen(function* () {
|
|
|
25
25
|
const app = opts.appShell ? opts.appShell(element) : element;
|
|
26
26
|
return yield* renderToStringWith(app);
|
|
27
27
|
});
|
|
28
|
-
return { ...renderResult, head };
|
|
28
|
+
return { ...renderResult, head: routeHead };
|
|
29
29
|
}).pipe(Effect.provide(fullLayer));
|
|
30
30
|
return yield* buildPage({
|
|
31
31
|
html,
|
|
@@ -61,11 +61,50 @@ const collectCss = async (server, entryUrl) => {
|
|
|
61
61
|
};
|
|
62
62
|
export const fibrae = (config) => {
|
|
63
63
|
let _resolvedConfig;
|
|
64
|
+
let clientEntryId;
|
|
64
65
|
return {
|
|
65
66
|
name: "fibrae-ssg",
|
|
67
|
+
config() {
|
|
68
|
+
return {
|
|
69
|
+
optimizeDeps: {
|
|
70
|
+
exclude: ["fibrae"],
|
|
71
|
+
},
|
|
72
|
+
ssr: {
|
|
73
|
+
noExternal: ["fibrae"],
|
|
74
|
+
},
|
|
75
|
+
server: {
|
|
76
|
+
watch: {
|
|
77
|
+
// Watch linked fibrae in node_modules so file changes trigger HMR
|
|
78
|
+
ignored: ["!**/node_modules/fibrae/**"],
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
},
|
|
66
83
|
configResolved(resolved) {
|
|
67
84
|
_resolvedConfig = resolved;
|
|
68
85
|
},
|
|
86
|
+
// Resolve the client entry path so we can match it in transform
|
|
87
|
+
async resolveId(source) {
|
|
88
|
+
if (source === config.client) {
|
|
89
|
+
const resolved = await this.resolve(source);
|
|
90
|
+
if (resolved)
|
|
91
|
+
clientEntryId = resolved.id;
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
},
|
|
95
|
+
// Inject HMR accept into the client entry so Vite re-executes it on changes.
|
|
96
|
+
// render() detects the previous render via WeakMap and does a clean re-render
|
|
97
|
+
// with preserved atom state.
|
|
98
|
+
transform(code, id) {
|
|
99
|
+
if (_resolvedConfig.command !== "serve")
|
|
100
|
+
return null;
|
|
101
|
+
if (!clientEntryId || id !== clientEntryId)
|
|
102
|
+
return null;
|
|
103
|
+
return {
|
|
104
|
+
code: code + "\n\nif (import.meta.hot) { import.meta.hot.accept(); }\n",
|
|
105
|
+
map: null,
|
|
106
|
+
};
|
|
107
|
+
},
|
|
69
108
|
configureServer(server) {
|
|
70
109
|
server.middlewares.use(async (req, res, next) => {
|
|
71
110
|
const url = req.url;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/cli/vite-plugin.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAExE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAGtC;;GAEG;AACH,MAAM,aAAa,GAAG,CAAC,IAUtB,EAAkC,EAAE,CACnC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC;QACrC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,MAAM,EAAE,EAAE;QACV,QAAQ,EAAE,IAAI,CAAC,QAAQ;KACxB,CAAC,CAAC;IAEH,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAClC,WAAW,EACX,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,aAAa,EAAE,oBAAoB,CAAC,CACtD,CAAC;IAEF,MAAM,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACjE,MAAM,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,CAAC,MAAM,CAAC,mBAAmB,CAAC;
|
|
1
|
+
{"version":3,"file":"vite-plugin.js","sourceRoot":"","sources":["../../src/cli/vite-plugin.ts"],"names":[],"mappings":"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"}
|
package/dist/components.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as Context from "effect/Context";
|
|
2
2
|
import * as Effect from "effect/Effect";
|
|
3
|
-
import { type ComponentError, type VElement } from "./shared.js";
|
|
3
|
+
import { type ComponentError, type VChild, type VElement } from "./shared.js";
|
|
4
4
|
declare const ErrorBoundaryChannel_base: Context.TagClass<ErrorBoundaryChannel, "ErrorBoundaryChannel", {
|
|
5
5
|
/** Report an error to this boundary. Used by event handlers and stream subscriptions. */
|
|
6
6
|
readonly reportError: (error: unknown) => Effect.Effect<void, never, never>;
|
|
@@ -33,7 +33,7 @@ export declare class ErrorBoundaryChannel extends ErrorBoundaryChannel_base {
|
|
|
33
33
|
export declare const Suspense: (props: {
|
|
34
34
|
fallback: VElement;
|
|
35
35
|
threshold?: number | undefined;
|
|
36
|
-
children?:
|
|
36
|
+
children?: VChild[] | VChild;
|
|
37
37
|
}) => VElement;
|
|
38
38
|
/**
|
|
39
39
|
* Error boundary component — catches errors in its subtree and shows a fallback.
|
|
@@ -67,6 +67,6 @@ export declare const Suspense: (props: {
|
|
|
67
67
|
*/
|
|
68
68
|
export declare const ErrorBoundary: (props: {
|
|
69
69
|
fallback: (error: ComponentError) => VElement;
|
|
70
|
-
children?:
|
|
70
|
+
children?: VChild[] | VChild;
|
|
71
71
|
}) => VElement;
|
|
72
72
|
export {};
|
package/dist/components.js
CHANGED
|
@@ -40,6 +40,8 @@ export const Suspense = (props) => {
|
|
|
40
40
|
throw new Error("Suspense requires at least one child");
|
|
41
41
|
}
|
|
42
42
|
// Return a special marker element that renderVElementToDOM will handle
|
|
43
|
+
// Cast: VChild[] → VElement[] at the type-erasure boundary;
|
|
44
|
+
// the fiber renderer resolves Effects/Streams during reconciliation.
|
|
43
45
|
return {
|
|
44
46
|
type: "SUSPENSE",
|
|
45
47
|
props: {
|
|
@@ -57,7 +59,7 @@ let boundaryIdCounter = 0;
|
|
|
57
59
|
/**
|
|
58
60
|
* Normalize children to an array of VElements.
|
|
59
61
|
*/
|
|
60
|
-
const normalizeChildren = (children) => Array.isArray(children) ? children : [children];
|
|
62
|
+
const normalizeChildren = (children) => (Array.isArray(children) ? children : [children]);
|
|
61
63
|
/**
|
|
62
64
|
* Error boundary component — catches errors in its subtree and shows a fallback.
|
|
63
65
|
*
|
package/dist/components.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,
|
|
1
|
+
{"version":3,"file":"components.js","sourceRoot":"","sources":["../src/components.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,gBAAgB,CAAC;AAC1C,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AAExC,OAAO,EAAmD,MAAM,aAAa,CAAC;AAE9E,gFAAgF;AAChF,yBAAyB;AACzB,gFAAgF;AAEhF;;;;;;;;GAQG;AACH,MAAM,OAAO,oBAAqB,SAAQ,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAQ1E;CAAG;AAEN,gFAAgF;AAChF,sBAAsB;AACtB,gFAAgF;AAEhF;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAIxB,EAAY,EAAE;IACb,MAAM,aAAa,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjD,CAAC,CAAC,KAAK,CAAC,QAAQ;QAChB,CAAC,CAAC,KAAK,CAAC,QAAQ;YACd,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAClB,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IAED,uEAAuE;IACvE,4DAA4D;IAC5D,qEAAqE;IACrE,OAAO;QACL,IAAI,EAAE,UAAmB;QACzB,KAAK,EAAE;YACL,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,GAAG;YACjC,QAAQ,EAAE,aAA2B;SACtC;KACF,CAAC;AACJ,CAAC,CAAC;AAEF,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,6CAA6C;AAC7C,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAE1B;;GAEG;AACH,MAAM,iBAAiB,GAAG,CAAC,QAA2B,EAAc,EAAE,CACpE,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAe,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,KAG7B,EAAY,EAAE;IACb,MAAM,aAAa,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9E,IAAI,aAAa,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAmB;QACzB,KAAK,EAAE;YACL,QAAQ,EAAE,aAAa;YACvB,UAAU,EAAE,YAAY,EAAE,iBAAiB,EAAE;YAC7C,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB;KACF,CAAC;AACJ,CAAC,CAAC"}
|
package/dist/core.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as Effect from "effect/Effect";
|
|
2
|
+
import * as Fiber from "effect/Fiber";
|
|
2
3
|
import * as Layer from "effect/Layer";
|
|
3
4
|
import * as Option from "effect/Option";
|
|
4
5
|
import * as Ref from "effect/Ref";
|
|
@@ -8,6 +9,11 @@ import {} from "./shared.js";
|
|
|
8
9
|
import { FibraeRuntime, CustomAtomRegistryLayer } from "./runtime.js";
|
|
9
10
|
import { renderFiber, hydrateFiber } from "./fiber-render.js";
|
|
10
11
|
import { HydrationState, HydrationStateLive } from "./hydration-state.js";
|
|
12
|
+
const DEV = typeof import.meta !== "undefined" && !!import.meta.hot;
|
|
13
|
+
/** Track running renders per container for HMR re-render support. */
|
|
14
|
+
const containerStates = DEV
|
|
15
|
+
? new WeakMap()
|
|
16
|
+
: undefined;
|
|
11
17
|
// =============================================================================
|
|
12
18
|
// Internal render logic (requires all services)
|
|
13
19
|
// =============================================================================
|
|
@@ -36,25 +42,46 @@ const renderCore = (element, container) => Effect.gen(function* () {
|
|
|
36
42
|
});
|
|
37
43
|
export function render(element, container, options) {
|
|
38
44
|
const program = (cont) => Effect.gen(function* () {
|
|
45
|
+
// HMR: if a previous render is running on this container, interrupt it
|
|
46
|
+
// and reuse its AtomRegistry so atom state is preserved across hot updates
|
|
47
|
+
const previousState = containerStates?.get(cont);
|
|
48
|
+
if (previousState) {
|
|
49
|
+
yield* Fiber.interrupt(previousState.fiber);
|
|
50
|
+
cont.innerHTML = "";
|
|
51
|
+
}
|
|
39
52
|
// Auto-detect services from the current context
|
|
40
53
|
const existingRegistry = yield* Effect.serviceOption(AtomRegistry.AtomRegistry);
|
|
41
54
|
const existingHydration = yield* Effect.serviceOption(HydrationState);
|
|
42
|
-
//
|
|
43
|
-
const registryLayer =
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
55
|
+
// Reuse AtomRegistry from previous render (HMR), or use provided, or create fresh
|
|
56
|
+
const registryLayer = previousState
|
|
57
|
+
? Layer.succeed(AtomRegistry.AtomRegistry, previousState.registry)
|
|
58
|
+
: Option.match(existingRegistry, {
|
|
59
|
+
onNone: () => CustomAtomRegistryLayer,
|
|
60
|
+
onSome: (reg) => Layer.succeed(AtomRegistry.AtomRegistry, reg),
|
|
61
|
+
});
|
|
62
|
+
// Skip hydration state on HMR re-render (atoms already loaded)
|
|
63
|
+
const hydrationLayer = previousState
|
|
64
|
+
? Layer.succeed(HydrationState, [])
|
|
65
|
+
: Option.match(existingHydration, {
|
|
66
|
+
onNone: () => HydrationStateLive,
|
|
67
|
+
onSome: (state) => Layer.succeed(HydrationState, state),
|
|
68
|
+
});
|
|
52
69
|
// Always create a fresh FibraeRuntime (each render tree has its own fiber state),
|
|
53
70
|
// wired to the chosen AtomRegistry
|
|
54
71
|
const runtimeLayer = Layer.provide(FibraeRuntime.Default, registryLayer);
|
|
55
72
|
// Compose: user layer (if any) feeds from registryLayer, all merge together
|
|
56
73
|
const baseLayer = Layer.mergeAll(runtimeLayer, registryLayer, hydrationLayer);
|
|
57
74
|
const fullLayer = options?.layer ? Layer.provideMerge(options.layer, baseLayer) : baseLayer;
|
|
75
|
+
if (containerStates) {
|
|
76
|
+
// Dev: fork render and capture fiber handle for HMR re-render
|
|
77
|
+
const renderWithCapture = Effect.gen(function* () {
|
|
78
|
+
const registry = yield* AtomRegistry.AtomRegistry;
|
|
79
|
+
const fiber = yield* Effect.fork(renderCore(element, cont));
|
|
80
|
+
containerStates.set(cont, { fiber, registry });
|
|
81
|
+
return yield* Fiber.join(fiber);
|
|
82
|
+
}).pipe(Effect.provide(fullLayer));
|
|
83
|
+
return yield* renderWithCapture;
|
|
84
|
+
}
|
|
58
85
|
return yield* renderCore(element, cont).pipe(Effect.provide(fullLayer));
|
|
59
86
|
});
|
|
60
87
|
if (container === undefined) {
|
package/dist/core.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AACtC,OAAO,KAAK,MAAM,MAAM,eAAe,CAAC;AACxC,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAClC,OAAO,KAAK,QAAQ,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,QAAQ,IAAI,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACxE,OAAO,EAAiB,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACtE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC9D,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"core.js","sourceRoot":"","sources":["../src/core.ts"],"names":[],"mappings":"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"}
|
package/dist/dom.d.ts
CHANGED
|
@@ -8,9 +8,28 @@ export declare const propertyUpdateMap: Record<string, "attribute" | "property"
|
|
|
8
8
|
export declare const isEvent: (key: string) => boolean;
|
|
9
9
|
export declare const isProperty: (key: string) => boolean;
|
|
10
10
|
/**
|
|
11
|
-
*
|
|
11
|
+
* Deduplicate event props that map to the same DOM event type.
|
|
12
|
+
*
|
|
13
|
+
* Both `onclick` and `onClick` lower-case to event type `click`. If both
|
|
14
|
+
* are present, the camelCase variant wins (more idiomatic in JSX).
|
|
15
|
+
* Returns an array of [propName, handler] pairs with at most one entry per
|
|
16
|
+
* event type.
|
|
17
|
+
*/
|
|
18
|
+
export declare const normalizeEventProps: (props: Record<string, unknown>) => [string, unknown][];
|
|
19
|
+
/**
|
|
20
|
+
* SVG namespace URI for createElementNS
|
|
21
|
+
*/
|
|
22
|
+
export declare const SVG_NAMESPACE = "http://www.w3.org/2000/svg";
|
|
23
|
+
/**
|
|
24
|
+
* Tags that must be created with SVG namespace.
|
|
25
|
+
* Derived from SVGElementTagNameMap minus tags that overlap with HTMLElementTagNameMap.
|
|
26
|
+
*/
|
|
27
|
+
export declare const SVG_TAGS: Set<string>;
|
|
28
|
+
/**
|
|
29
|
+
* Set a DOM property using the appropriate method.
|
|
30
|
+
* Works for both HTML and SVG elements.
|
|
12
31
|
*/
|
|
13
|
-
export declare const setDomProperty: (el: HTMLElement, name: string, value: unknown) => void;
|
|
32
|
+
export declare const setDomProperty: (el: HTMLElement | SVGElement, name: string, value: unknown) => void;
|
|
14
33
|
/**
|
|
15
34
|
* Create a DOM event wrapper that handles Effect return values.
|
|
16
35
|
*
|
|
@@ -25,4 +44,4 @@ export declare const createEventWrapper: (handler: (event: Event) => unknown, ev
|
|
|
25
44
|
* Uses createEventWrapper for Effect error handling and stores wrappers
|
|
26
45
|
* in listenerStore so updateDom can remove them on re-render.
|
|
27
46
|
*/
|
|
28
|
-
export declare const attachEventListeners: (el: HTMLElement, props: Record<string, unknown>, runtime: FibraeRuntime, onError?: ((error: EventHandlerError) => Effect.Effect<unknown, never, unknown>) | undefined, listenerStore?: WeakMap<HTMLElement, Record<string, EventListener>> | undefined) => void;
|
|
47
|
+
export declare const attachEventListeners: (el: HTMLElement | SVGElement, props: Record<string, unknown>, runtime: FibraeRuntime, onError?: ((error: EventHandlerError) => Effect.Effect<unknown, never, unknown>) | undefined, listenerStore?: WeakMap<HTMLElement | SVGElement, Record<string, EventListener>> | undefined) => void;
|