@fluxfast/react 0.0.0-oidc-bootstrap.0

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.
Files changed (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +52 -0
  3. package/dist/client.d.ts +10 -0
  4. package/dist/client.d.ts.map +1 -0
  5. package/dist/client.js +41 -0
  6. package/dist/client.js.map +1 -0
  7. package/dist/config.d.ts +17 -0
  8. package/dist/config.d.ts.map +1 -0
  9. package/dist/config.js +3 -0
  10. package/dist/config.js.map +1 -0
  11. package/dist/document.d.ts +7 -0
  12. package/dist/document.d.ts.map +1 -0
  13. package/dist/document.js +10 -0
  14. package/dist/document.js.map +1 -0
  15. package/dist/esm/client.js +35 -0
  16. package/dist/esm/client.js.map +1 -0
  17. package/dist/esm/config.js +2 -0
  18. package/dist/esm/config.js.map +1 -0
  19. package/dist/esm/document.js +7 -0
  20. package/dist/esm/document.js.map +1 -0
  21. package/dist/esm/form.js +204 -0
  22. package/dist/esm/form.js.map +1 -0
  23. package/dist/esm/hooks.js +50 -0
  24. package/dist/esm/hooks.js.map +1 -0
  25. package/dist/esm/hydration.js +40 -0
  26. package/dist/esm/hydration.js.map +1 -0
  27. package/dist/esm/index.js +11 -0
  28. package/dist/esm/index.js.map +1 -0
  29. package/dist/esm/link.js +61 -0
  30. package/dist/esm/link.js.map +1 -0
  31. package/dist/esm/live.js +17 -0
  32. package/dist/esm/live.js.map +1 -0
  33. package/dist/esm/package.json +3 -0
  34. package/dist/esm/provider.js +77 -0
  35. package/dist/esm/provider.js.map +1 -0
  36. package/dist/esm/resolver.js +31 -0
  37. package/dist/esm/resolver.js.map +1 -0
  38. package/dist/esm/root.js +40 -0
  39. package/dist/esm/root.js.map +1 -0
  40. package/dist/esm/server/handler.js +115 -0
  41. package/dist/esm/server/handler.js.map +1 -0
  42. package/dist/esm/server/index.js +4 -0
  43. package/dist/esm/server/index.js.map +1 -0
  44. package/dist/esm/server/render.js +70 -0
  45. package/dist/esm/server/render.js.map +1 -0
  46. package/dist/form.d.ts +31 -0
  47. package/dist/form.d.ts.map +1 -0
  48. package/dist/form.js +207 -0
  49. package/dist/form.js.map +1 -0
  50. package/dist/hooks.d.ts +20 -0
  51. package/dist/hooks.d.ts.map +1 -0
  52. package/dist/hooks.js +58 -0
  53. package/dist/hooks.js.map +1 -0
  54. package/dist/hydration.d.ts +5 -0
  55. package/dist/hydration.d.ts.map +1 -0
  56. package/dist/hydration.js +44 -0
  57. package/dist/hydration.js.map +1 -0
  58. package/dist/index.d.ts +10 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +27 -0
  61. package/dist/index.js.map +1 -0
  62. package/dist/link.d.ts +10 -0
  63. package/dist/link.d.ts.map +1 -0
  64. package/dist/link.js +65 -0
  65. package/dist/link.js.map +1 -0
  66. package/dist/live.d.ts +5 -0
  67. package/dist/live.d.ts.map +1 -0
  68. package/dist/live.js +20 -0
  69. package/dist/live.js.map +1 -0
  70. package/dist/provider.d.ts +22 -0
  71. package/dist/provider.d.ts.map +1 -0
  72. package/dist/provider.js +82 -0
  73. package/dist/provider.js.map +1 -0
  74. package/dist/resolver.d.ts +13 -0
  75. package/dist/resolver.d.ts.map +1 -0
  76. package/dist/resolver.js +39 -0
  77. package/dist/resolver.js.map +1 -0
  78. package/dist/root.d.ts +15 -0
  79. package/dist/root.d.ts.map +1 -0
  80. package/dist/root.js +43 -0
  81. package/dist/root.js.map +1 -0
  82. package/dist/server/handler.d.ts +20 -0
  83. package/dist/server/handler.d.ts.map +1 -0
  84. package/dist/server/handler.js +118 -0
  85. package/dist/server/handler.js.map +1 -0
  86. package/dist/server/index.d.ts +6 -0
  87. package/dist/server/index.d.ts.map +1 -0
  88. package/dist/server/index.js +9 -0
  89. package/dist/server/index.js.map +1 -0
  90. package/dist/server/render.d.ts +11 -0
  91. package/dist/server/render.d.ts.map +1 -0
  92. package/dist/server/render.js +77 -0
  93. package/dist/server/render.js.map +1 -0
  94. package/package.json +72 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 FluxFast Contributors
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @fluxfast/react
2
+
3
+ Host-independent React bindings introduced in FluxFast 1.2. These bindings are
4
+ shared by the Next.js and React/Vite hosts, not a standalone HTTP server.
5
+ Existing Next.js applications continue importing `@fluxfast/next`;
6
+ that adapter re-exports the same context, components, hooks, and types.
7
+
8
+ FastAPI owns application URLs, authentication, resource loading, validation,
9
+ and mutations. These bindings subscribe to `@fluxfast/core`; they do not
10
+ introduce another router or resource cache. A host supplies SSR, the HTML
11
+ document, safe serialization, hydration, assets, and same-origin transport.
12
+
13
+ ## Render a server-selected page
14
+
15
+ ```tsx
16
+ import { FluxRoot, useResource, type FluxApplicationProps } from "@fluxfast/react";
17
+
18
+ function Rooms() {
19
+ const rooms = useResource<Array<{ id: number; name: string }>>("rooms");
20
+ return <ul>{rooms.map(room => <li key={room.id}>{room.name}</li>)}</ul>;
21
+ }
22
+
23
+ export function Application(props: FluxApplicationProps) {
24
+ return <FluxRoot {...props} registry={{ "rooms/index": Rooms }} />;
25
+ }
26
+ ```
27
+
28
+ Given an envelope selecting `rooms/index` with a ready `rooms` resource, SSR
29
+ renders its list. The host must hydrate from that same envelope. `FluxRoot`
30
+ starts history, deferred work, and live subscriptions only after hydration.
31
+ Unknown component identifiers fail against the explicit registry; they never
32
+ become arbitrary module paths. Use `Link` for eligible same-origin visits,
33
+ `useResourceState` for status/errors/staleness, `useDeferredResource` for deferred
34
+ values and retry, `useLiveStatus` for connection state, and `useForm` for mutations
35
+ and generated client validation. These retain the existing Next binding semantics.
36
+
37
+ For custom layouts, `FluxProvider` accepts the same envelope and registry and
38
+ wraps children that use these hooks. `FluxContext` and `useFluxContext` expose
39
+ the shared runtime to integration authors. Core owns navigation, caching,
40
+ deferred authority, mutation patches, and live synchronization.
41
+
42
+ See the [adapter contract](https://github.com/El37628/FluxFast/blob/main/docs/adapter-contract.md)
43
+ for the host lifecycle and [React API reference](https://github.com/El37628/FluxFast/blob/main/docs/react-api.md)
44
+ for the complete binding API. Application developers can use the
45
+ [React/Vite tutorial](https://github.com/El37628/FluxFast/blob/main/docs/react-getting-started.md).
46
+
47
+ Separate `@fluxfast/react/server` and `@fluxfast/react/client` entries
48
+ provide safe document SSR and exact-envelope hydration for host authors. They
49
+ do not export a Vite plugin, asset server, or process supervisor; those belong
50
+ to the complete `@fluxfast/vite` host and Python CLI.
51
+ See the [SSR integration reference](https://github.com/El37628/FluxFast/blob/main/docs/react-ssr.md); never import the
52
+ Node server entry into browser application code.
@@ -0,0 +1,10 @@
1
+ import React from "react";
2
+ import { type Root, type HydrationOptions } from "react-dom/client";
3
+ import type { FluxApplicationProps } from "./config.js";
4
+ export interface HydrateFluxApplicationOptions {
5
+ document?: Document;
6
+ onRecoverableError?: HydrationOptions["onRecoverableError"];
7
+ }
8
+ /** Hydrate the actual SSR markup from its exact envelope, without a fetch. */
9
+ export declare function hydrateFluxApplication(application: React.ComponentType<FluxApplicationProps>, options?: HydrateFluxApplicationOptions): Root;
10
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAe,KAAK,IAAI,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEjF,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAIxD,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kBAAkB,CAAC,EAAE,gBAAgB,CAAC,oBAAoB,CAAC,CAAC;CAC7D;AAED,8EAA8E;AAC9E,wBAAgB,sBAAsB,CACpC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,EACtD,OAAO,GAAE,6BAAkC,GAC1C,IAAI,CA0BN"}
package/dist/client.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ "use client";
3
+ var __importDefault = (this && this.__importDefault) || function (mod) {
4
+ return (mod && mod.__esModule) ? mod : { "default": mod };
5
+ };
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.hydrateFluxApplication = hydrateFluxApplication;
8
+ const react_1 = __importDefault(require("react"));
9
+ const client_1 = require("react-dom/client");
10
+ const core_1 = require("@fluxfast/core");
11
+ const document_js_1 = require("./document.js");
12
+ const hydration_js_1 = require("./hydration.js");
13
+ /** Hydrate the actual SSR markup from its exact envelope, without a fetch. */
14
+ function hydrateFluxApplication(application, options = {}) {
15
+ const document = options.document ?? globalThis.document;
16
+ const roots = document.querySelectorAll(`[id="${document_js_1.ROOT_ID}"]`);
17
+ const payloads = document.querySelectorAll(`[id="${document_js_1.PAYLOAD_ID}"]`);
18
+ if (roots.length !== 1 || payloads.length !== 1 || payloads[0].tagName !== "SCRIPT" || payloads[0].getAttribute("type") !== "application/json") {
19
+ throw new TypeError("FluxFast document requires one SSR root and one JSON payload");
20
+ }
21
+ const payload = JSON.parse(payloads[0].textContent ?? "");
22
+ if (!payload || typeof payload !== "object" || Array.isArray(payload) || !("initialEnvelope" in payload)) {
23
+ throw new TypeError("Invalid FluxFast hydration payload");
24
+ }
25
+ (0, core_1.assertPageEnvelope)(payload.initialEnvelope);
26
+ // Only server-owned application props cross this boundary; do not spread an
27
+ // arbitrary object into React or allow it to choose a private transport URL.
28
+ const props = { initialEnvelope: payload.initialEnvelope };
29
+ if ("cache" in payload && payload.cache !== undefined) {
30
+ props.cache = (0, hydration_js_1.readFluxCacheConfig)(payload.cache);
31
+ }
32
+ if ("development" in payload && payload.development !== undefined) {
33
+ if (typeof process === "undefined" || process.env?.NODE_ENV !== "production") {
34
+ props.development = (0, hydration_js_1.readFluxDevelopmentMetadata)(payload.development);
35
+ }
36
+ }
37
+ return (0, client_1.hydrateRoot)(roots[0], react_1.default.createElement(application, props), {
38
+ identifierPrefix: document_js_1.IDENTIFIER_PREFIX, onRecoverableError: options.onRecoverableError,
39
+ });
40
+ }
41
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;AAEb,kDAA0B;AAC1B,6CAAiF;AACjF,yCAAoD;AAEpD,+CAAuE;AACvE,iDAAkF;AAOlF,8EAA8E;AAC9E,gCACE,WAAsD,EACtD,OAAO,GAAkC,EAAE;IAE3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,qBAAO,IAAI,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,wBAAU,IAAI,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,kBAAkB,EAAE,CAAC;QAC/I,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB,IAAI,OAAO,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC5D,CAAC;IACD,IAAA,yBAAkB,EAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5C,4EAA4E;IAC5E,6EAA6E;IAC7E,MAAM,KAAK,GAAyB,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;IACjF,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,GAAG,IAAA,kCAAmB,EAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,aAAa,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAClE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC7E,KAAK,CAAC,WAAW,GAAG,IAAA,0CAA2B,EAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,IAAA,oBAAW,EAAC,KAAK,CAAC,CAAC,CAAC,EAAE,eAAK,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE;QACpE,gBAAgB,EAAE,+BAAiB,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KACpF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,17 @@
1
+ import type { FluxServerDiagnosticTrace, PageEnvelope } from "@fluxfast/core";
2
+ export interface FluxCacheConfig {
3
+ maxResources?: number;
4
+ maxPages?: number;
5
+ }
6
+ /** Safe, development-only metadata captured before browser hydration. */
7
+ export interface FluxDevelopmentMetadata {
8
+ initialPath: string;
9
+ initialServerTrace: FluxServerDiagnosticTrace;
10
+ }
11
+ export interface FluxApplicationProps {
12
+ initialEnvelope: PageEnvelope;
13
+ development?: FluxDevelopmentMetadata;
14
+ clientUrl?: string;
15
+ cache?: FluxCacheConfig;
16
+ }
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,yBAAyB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9E,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,yEAAyE;AACzE,MAAM,WAAW,uBAAuB;IACtC,WAAW,EAAE,MAAM,CAAC;IACpB,kBAAkB,EAAE,yBAAyB,CAAC;CAC/C;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,YAAY,CAAC;IAC9B,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB"}
package/dist/config.js ADDED
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /** Shared document identifiers, never a backend URL or application route table. */
2
+ export declare const ROOT_ID = "fluxfast-root";
3
+ export declare const PAYLOAD_ID = "fluxfast-page";
4
+ export declare const IDENTIFIER_PREFIX = "fluxfast-";
5
+ export declare const SSR_MARKER = "<!--fluxfast:ssr-->";
6
+ export declare const PAYLOAD_MARKER = "<!--fluxfast:payload-->";
7
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,eAAO,MAAM,OAAO,kBAAkB,CAAC;AACvC,eAAO,MAAM,UAAU,kBAAkB,CAAC;AAC1C,eAAO,MAAM,iBAAiB,cAAc,CAAC;AAC7C,eAAO,MAAM,UAAU,wBAAwB,CAAC;AAChD,eAAO,MAAM,cAAc,4BAA4B,CAAC"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PAYLOAD_MARKER = exports.SSR_MARKER = exports.IDENTIFIER_PREFIX = exports.PAYLOAD_ID = exports.ROOT_ID = void 0;
4
+ /** Shared document identifiers, never a backend URL or application route table. */
5
+ exports.ROOT_ID = "fluxfast-root";
6
+ exports.PAYLOAD_ID = "fluxfast-page";
7
+ exports.IDENTIFIER_PREFIX = "fluxfast-";
8
+ exports.SSR_MARKER = "<!--fluxfast:ssr-->";
9
+ exports.PAYLOAD_MARKER = "<!--fluxfast:payload-->";
10
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../src/document.ts"],"names":[],"mappings":";;;AAAA,mFAAmF;AACtE,QAAA,OAAO,GAAG,eAAe,CAAC;AAC1B,QAAA,UAAU,GAAG,eAAe,CAAC;AAC7B,QAAA,iBAAiB,GAAG,WAAW,CAAC;AAChC,QAAA,UAAU,GAAG,qBAAqB,CAAC;AACnC,QAAA,cAAc,GAAG,yBAAyB,CAAC"}
@@ -0,0 +1,35 @@
1
+ "use client";
2
+ import React from "react";
3
+ import { hydrateRoot } from "react-dom/client";
4
+ import { assertPageEnvelope } from "@fluxfast/core";
5
+ import { IDENTIFIER_PREFIX, PAYLOAD_ID, ROOT_ID } from "./document.js";
6
+ import { readFluxCacheConfig, readFluxDevelopmentMetadata } from "./hydration.js";
7
+ /** Hydrate the actual SSR markup from its exact envelope, without a fetch. */
8
+ export function hydrateFluxApplication(application, options = {}) {
9
+ const document = options.document ?? globalThis.document;
10
+ const roots = document.querySelectorAll(`[id="${ROOT_ID}"]`);
11
+ const payloads = document.querySelectorAll(`[id="${PAYLOAD_ID}"]`);
12
+ if (roots.length !== 1 || payloads.length !== 1 || payloads[0].tagName !== "SCRIPT" || payloads[0].getAttribute("type") !== "application/json") {
13
+ throw new TypeError("FluxFast document requires one SSR root and one JSON payload");
14
+ }
15
+ const payload = JSON.parse(payloads[0].textContent ?? "");
16
+ if (!payload || typeof payload !== "object" || Array.isArray(payload) || !("initialEnvelope" in payload)) {
17
+ throw new TypeError("Invalid FluxFast hydration payload");
18
+ }
19
+ assertPageEnvelope(payload.initialEnvelope);
20
+ // Only server-owned application props cross this boundary; do not spread an
21
+ // arbitrary object into React or allow it to choose a private transport URL.
22
+ const props = { initialEnvelope: payload.initialEnvelope };
23
+ if ("cache" in payload && payload.cache !== undefined) {
24
+ props.cache = readFluxCacheConfig(payload.cache);
25
+ }
26
+ if ("development" in payload && payload.development !== undefined) {
27
+ if (typeof process === "undefined" || process.env?.NODE_ENV !== "production") {
28
+ props.development = readFluxDevelopmentMetadata(payload.development);
29
+ }
30
+ }
31
+ return hydrateRoot(roots[0], React.createElement(application, props), {
32
+ identifierPrefix: IDENTIFIER_PREFIX, onRecoverableError: options.onRecoverableError,
33
+ });
34
+ }
35
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,WAAW,EAAoC,MAAM,kBAAkB,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAOlF,8EAA8E;AAC9E,MAAM,UAAU,sBAAsB,CACpC,WAAsD,EACtD,OAAO,GAAkC,EAAE;IAE3C,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,UAAU,CAAC,QAAQ,CAAC;IACzD,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,OAAO,IAAI,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,QAAQ,CAAC,gBAAgB,CAAC,QAAQ,UAAU,IAAI,CAAC,CAAC;IACnE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,kBAAkB,EAAE,CAAC;QAC/I,MAAM,IAAI,SAAS,CAAC,8DAA8D,CAAC,CAAC;IACtF,CAAC;IACD,MAAM,OAAO,GAAY,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;IACnE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,iBAAiB,IAAI,OAAO,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,SAAS,CAAC,oCAAoC,CAAC,CAAC;IAC5D,CAAC;IACD,kBAAkB,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC5C,4EAA4E;IAC5E,6EAA6E;IAC7E,MAAM,KAAK,GAAyB,EAAE,eAAe,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;IACjF,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QACtD,KAAK,CAAC,KAAK,GAAG,mBAAmB,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IACnD,CAAC;IACD,IAAI,aAAa,IAAI,OAAO,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QAClE,IAAI,OAAO,OAAO,KAAK,WAAW,IAAI,OAAO,CAAC,GAAG,EAAE,QAAQ,KAAK,YAAY,EAAE,CAAC;YAC7E,KAAK,CAAC,WAAW,GAAG,2BAA2B,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,WAAW,EAAE,KAAK,CAAC,EAAE;QACpE,gBAAgB,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,OAAO,CAAC,kBAAkB;KACpF,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ /** Shared document identifiers, never a backend URL or application route table. */
2
+ export const ROOT_ID = "fluxfast-root";
3
+ export const PAYLOAD_ID = "fluxfast-page";
4
+ export const IDENTIFIER_PREFIX = "fluxfast-";
5
+ export const SSR_MARKER = "<!--fluxfast:ssr-->";
6
+ export const PAYLOAD_MARKER = "<!--fluxfast:payload-->";
7
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../src/document.ts"],"names":[],"mappings":"AAAA,mFAAmF;AACnF,MAAM,CAAC,MAAM,OAAO,GAAG,eAAe,CAAC;AACvC,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC;AAC1C,MAAM,CAAC,MAAM,iBAAiB,GAAG,WAAW,CAAC;AAC7C,MAAM,CAAC,MAAM,UAAU,GAAG,qBAAqB,CAAC;AAChD,MAAM,CAAC,MAAM,cAAc,GAAG,yBAAyB,CAAC"}
@@ -0,0 +1,204 @@
1
+ "use client";
2
+ import { useState, useCallback, useEffect, useMemo, useRef } from "react";
3
+ import { ValidationError, formatValidationPath } from "@fluxfast/core";
4
+ import { useRouter } from "./hooks.js";
5
+ const EMPTY_ISSUES = Object.freeze([]);
6
+ const EMPTY_ERROR_MAP = Object.freeze(Object.create(null));
7
+ function issuesToTopLevelErrors(issues) {
8
+ const errors = Object.create(null);
9
+ for (const issue of issues) {
10
+ const key = issue.path[0];
11
+ if (typeof key === "string" &&
12
+ !Object.prototype.hasOwnProperty.call(errors, key)) {
13
+ errors[key] = issue.message;
14
+ }
15
+ }
16
+ return errors;
17
+ }
18
+ function issuesToErrorMap(issues) {
19
+ if (issues.length === 0)
20
+ return EMPTY_ERROR_MAP;
21
+ const errorMap = Object.create(null);
22
+ for (const issue of issues) {
23
+ const path = formatValidationPath(issue.path);
24
+ if (!Object.prototype.hasOwnProperty.call(errorMap, path)) {
25
+ errorMap[path] = issue.message;
26
+ }
27
+ }
28
+ return Object.freeze(errorMap);
29
+ }
30
+ export function useForm(initialValues, formOptions = {}) {
31
+ const router = useRouter();
32
+ const initialRef = useRef(initialValues);
33
+ const [data, setDataState] = useState(initialValues);
34
+ const dataRef = useRef(initialValues);
35
+ const [manualErrors, setManualErrors] = useState({});
36
+ const [issues, setIssues] = useState(EMPTY_ISSUES);
37
+ const [processing, setProcessing] = useState(false);
38
+ const [wasSuccessful, setWasSuccessful] = useState(false);
39
+ const [recentlySuccessful, setRecentlySuccessful] = useState(false);
40
+ const recentTimerRef = useRef(null);
41
+ const localErrors = useMemo(() => issuesToTopLevelErrors(issues), [issues]);
42
+ const errors = useMemo(() => ({ ...manualErrors, ...localErrors }), [manualErrors, localErrors]);
43
+ const localErrorMap = useMemo(() => issuesToErrorMap(issues), [issues]);
44
+ const errorMap = useMemo(() => {
45
+ const entries = Object.entries(manualErrors);
46
+ if (entries.length === 0)
47
+ return localErrorMap;
48
+ const combined = Object.create(null);
49
+ for (const [key, message] of entries) {
50
+ if (message !== undefined)
51
+ combined[key] = message;
52
+ }
53
+ for (const [path, message] of Object.entries(localErrorMap)) {
54
+ combined[path] = message;
55
+ }
56
+ return Object.freeze(combined);
57
+ }, [manualErrors, localErrorMap]);
58
+ useEffect(() => () => {
59
+ if (recentTimerRef.current)
60
+ clearTimeout(recentTimerRef.current);
61
+ }, []);
62
+ const setData = useCallback((keyOrValues, maybeValue) => {
63
+ if (typeof keyOrValues === "string") {
64
+ const next = { ...dataRef.current, [keyOrValues]: maybeValue };
65
+ dataRef.current = next;
66
+ setDataState(next);
67
+ }
68
+ else if (typeof keyOrValues === "function") {
69
+ const next = keyOrValues(dataRef.current);
70
+ dataRef.current = next;
71
+ setDataState(next);
72
+ }
73
+ else {
74
+ const next = { ...dataRef.current, ...keyOrValues };
75
+ dataRef.current = next;
76
+ setDataState(next);
77
+ }
78
+ }, []);
79
+ const setError = useCallback((key, message) => {
80
+ setManualErrors(prev => ({ ...prev, [key]: message }));
81
+ }, []);
82
+ const clearErrors = useCallback((...keys) => {
83
+ if (keys.length === 0) {
84
+ setManualErrors({});
85
+ setIssues(EMPTY_ISSUES);
86
+ }
87
+ else {
88
+ const selected = new Set(keys);
89
+ setManualErrors(prev => {
90
+ const next = { ...prev };
91
+ for (const k of keys) {
92
+ delete next[k];
93
+ }
94
+ return next;
95
+ });
96
+ setIssues(prev => {
97
+ const next = prev.filter(issue => {
98
+ const key = issue.path[0];
99
+ return typeof key !== "string" || !selected.has(key);
100
+ });
101
+ return next.length === prev.length ? prev : Object.freeze(next);
102
+ });
103
+ }
104
+ }, []);
105
+ const reset = useCallback((...keys) => {
106
+ if (keys.length === 0) {
107
+ dataRef.current = initialRef.current;
108
+ setDataState(initialRef.current);
109
+ }
110
+ else {
111
+ const next = { ...dataRef.current };
112
+ for (const k of keys)
113
+ next[k] = initialRef.current[k];
114
+ dataRef.current = next;
115
+ setDataState(next);
116
+ }
117
+ }, []);
118
+ const validateCurrent = useCallback(() => {
119
+ const validator = formOptions.validator;
120
+ return validator?.validate(dataRef.current);
121
+ }, [formOptions.validator]);
122
+ const validate = useCallback(() => {
123
+ const result = validateCurrent();
124
+ if (!result || result.valid) {
125
+ setIssues(EMPTY_ISSUES);
126
+ return true;
127
+ }
128
+ setIssues(result.issues);
129
+ return false;
130
+ }, [validateCurrent]);
131
+ const submit = useCallback((url, options) => {
132
+ return async (e) => {
133
+ if (e && typeof e.preventDefault === "function") {
134
+ e.preventDefault();
135
+ }
136
+ setWasSuccessful(false);
137
+ clearErrors();
138
+ const validationResult = validateCurrent();
139
+ if (validationResult && !validationResult.valid) {
140
+ setIssues(validationResult.issues);
141
+ if (options?.onError) {
142
+ options.onError({
143
+ ...issuesToTopLevelErrors(validationResult.issues)
144
+ });
145
+ }
146
+ return;
147
+ }
148
+ setIssues(EMPTY_ISSUES);
149
+ setProcessing(true);
150
+ try {
151
+ await router.mutate(url, dataRef.current, {
152
+ method: options?.method || "POST",
153
+ preserveScroll: options?.preserveScroll,
154
+ });
155
+ setWasSuccessful(true);
156
+ setRecentlySuccessful(true);
157
+ if (recentTimerRef.current) {
158
+ clearTimeout(recentTimerRef.current);
159
+ }
160
+ recentTimerRef.current = setTimeout(() => {
161
+ setRecentlySuccessful(false);
162
+ }, 2000);
163
+ if (options?.onSuccess) {
164
+ options.onSuccess();
165
+ }
166
+ }
167
+ catch (err) {
168
+ if (err instanceof ValidationError && err.details) {
169
+ const formattedErrors = Object.create(null);
170
+ for (const [k, v] of Object.entries(err.details)) {
171
+ formattedErrors[k] = Array.isArray(v) ? v[0] : String(v);
172
+ }
173
+ setManualErrors(formattedErrors);
174
+ setIssues(EMPTY_ISSUES);
175
+ if (options?.onError) {
176
+ options.onError({ ...formattedErrors });
177
+ }
178
+ }
179
+ else {
180
+ throw err;
181
+ }
182
+ }
183
+ finally {
184
+ setProcessing(false);
185
+ }
186
+ };
187
+ }, [router, clearErrors, validateCurrent]);
188
+ return {
189
+ data,
190
+ errors,
191
+ issues,
192
+ errorMap,
193
+ processing,
194
+ wasSuccessful,
195
+ recentlySuccessful,
196
+ setData,
197
+ setError,
198
+ clearErrors,
199
+ reset,
200
+ validate,
201
+ submit,
202
+ };
203
+ }
204
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sourceRoot":"","sources":["../../src/form.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ "use client";
2
+ import { useSyncExternalStore, useCallback, useMemo } from "react";
3
+ import { useFluxContext } from "./provider.js";
4
+ export function useRouter() {
5
+ return useFlux().router;
6
+ }
7
+ export function useFlux() {
8
+ return useFluxContext();
9
+ }
10
+ export function usePage() {
11
+ const router = useRouter();
12
+ const subscribe = useCallback((callback) => router.pageStore.subscribe(callback), [router]);
13
+ const getSnapshot = useCallback(() => router.pageStore.getSnapshot(), [router]);
14
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
15
+ }
16
+ export function useResource(key) {
17
+ const router = useRouter();
18
+ if (typeof process !== "undefined" &&
19
+ process.env?.NODE_ENV !== "production") {
20
+ const status = router.resourceStore.getStateSnapshot(key).status;
21
+ if (status === "pending") {
22
+ console.warn(`[fluxfast] Resource "${key}" is deferred and has not resolved yet.\n\nUse useDeferredResource("${key}") for deferred resources.`);
23
+ }
24
+ }
25
+ const subscribe = useCallback((callback) => router.resourceStore.subscribe(key, callback), [router, key]);
26
+ const getSnapshot = useCallback(() => router.resourceStore.getSnapshot(key), [router, key]);
27
+ const getServerSnapshot = useCallback(() => router.resourceStore.getServerSnapshot(key), [router, key]);
28
+ const val = useSyncExternalStore(subscribe, getSnapshot, getServerSnapshot);
29
+ return val;
30
+ }
31
+ export function useResourceState(key) {
32
+ const router = useRouter();
33
+ const subscribe = useCallback((callback) => router.resourceStore.subscribe(key, callback), [router, key]);
34
+ const getSnapshot = useCallback(() => router.resourceStore.getStateSnapshot(key), [router, key]);
35
+ return useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
36
+ }
37
+ export function useDeferredResource(key) {
38
+ const router = useRouter();
39
+ const state = useResourceState(key);
40
+ const retry = useCallback(() => router.loadResources([key], { reason: "retry" }), [router, key]);
41
+ return useMemo(() => ({
42
+ ...state,
43
+ retry,
44
+ isLoading: state.status === "loading",
45
+ isError: state.status === "error",
46
+ isReady: state.status === "ready",
47
+ isPending: state.status === "pending",
48
+ }), [state, retry]);
49
+ }
50
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../src/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ import { decodeServerDiagnosticTrace } from "@fluxfast/core";
2
+ /** Private payload validation shared by the host and browser entry. */
3
+ export function readFluxCacheConfig(value) {
4
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
5
+ throw new TypeError("Invalid FluxFast hydration cache configuration");
6
+ }
7
+ const source = value;
8
+ const cache = {};
9
+ for (const name of ["maxResources", "maxPages"]) {
10
+ if (Object.hasOwn(source, name)) {
11
+ const limit = source[name];
12
+ if (!Number.isSafeInteger(limit) || limit <= 0) {
13
+ throw new TypeError("Invalid FluxFast hydration cache configuration");
14
+ }
15
+ cache[name] = limit;
16
+ }
17
+ }
18
+ return cache;
19
+ }
20
+ export function readFluxDevelopmentMetadata(value) {
21
+ if (!value || typeof value !== "object" || Array.isArray(value)) {
22
+ throw new TypeError("Invalid FluxFast hydration development metadata");
23
+ }
24
+ const source = value;
25
+ if (typeof source.initialPath !== "string" || !source.initialPath.startsWith("/") || source.initialPath.length > 2_048) {
26
+ throw new TypeError("Invalid FluxFast hydration development metadata");
27
+ }
28
+ const json = JSON.stringify(source.initialServerTrace);
29
+ if (typeof json !== "string" || json.length > 16_384) {
30
+ throw new TypeError("Invalid FluxFast hydration development metadata");
31
+ }
32
+ const bytes = new TextEncoder().encode(json);
33
+ const encoded = btoa(Array.from(bytes, byte => String.fromCharCode(byte)).join(""))
34
+ .replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
35
+ const trace = decodeServerDiagnosticTrace(encoded);
36
+ if (!trace)
37
+ throw new TypeError("Invalid FluxFast hydration development metadata");
38
+ return { initialPath: source.initialPath, initialServerTrace: trace };
39
+ }
40
+ //# sourceMappingURL=hydration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hydration.js","sourceRoot":"","sources":["../../src/hydration.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAG7D,uEAAuE;AACvE,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;IACxE,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,MAAM,KAAK,GAAoB,EAAE,CAAC;IAClC,KAAK,MAAM,IAAI,IAAI,CAAC,cAAc,EAAE,UAAU,CAAU,EAAE,CAAC;QACzD,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAK,KAAgB,IAAI,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;YACxE,CAAC;YACD,KAAK,CAAC,IAAI,CAAC,GAAG,KAAe,CAAC;QAChC,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,KAAc;IACxD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,MAAM,GAAG,KAAgC,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,MAAM,CAAC,WAAW,CAAC,MAAM,GAAG,KAAK,EAAE,CAAC;QACvH,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;QACrD,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IACzE,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;SAChF,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,2BAA2B,CAAC,OAAO,CAAC,CAAC;IACnD,IAAI,CAAC,KAAK;QAAE,MAAM,IAAI,SAAS,CAAC,iDAAiD,CAAC,CAAC;IACnF,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,11 @@
1
+ "use client";
2
+ /** Host-independent React bindings over the public FluxFast Core runtime. */
3
+ export * from "./provider.js";
4
+ export * from "./root.js";
5
+ export * from "./hooks.js";
6
+ export * from "./live.js";
7
+ export * from "./link.js";
8
+ export * from "./form.js";
9
+ export * from "./resolver.js";
10
+ export * from "./config.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAEb,6EAA6E;AAC7E,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,eAAe,CAAC;AAC9B,cAAc,aAAa,CAAC"}