@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
@@ -0,0 +1,82 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.FluxContext = void 0;
5
+ exports.FluxProvider = FluxProvider;
6
+ exports.useFluxContext = useFluxContext;
7
+ const jsx_runtime_1 = require("react/jsx-runtime");
8
+ const react_1 = require("react");
9
+ const core_1 = require("@fluxfast/core");
10
+ exports.FluxContext = (0, react_1.createContext)(null);
11
+ function FluxProvider({ initialEnvelope, development, registry, router: customRouter, clientUrl, cache, children, }) {
12
+ const didBootstrapDiagnostics = (0, react_1.useRef)(false);
13
+ const router = (0, react_1.useMemo)(() => {
14
+ if (customRouter) {
15
+ return customRouter;
16
+ }
17
+ return new core_1.FluxRouter({
18
+ initialEnvelope,
19
+ transport: (0, core_1.createFetchTransport)(clientUrl),
20
+ maxResources: cache?.maxResources,
21
+ maxPages: cache?.maxPages,
22
+ deferHistory: true,
23
+ });
24
+ }, [customRouter, initialEnvelope, clientUrl, cache?.maxPages, cache?.maxResources]);
25
+ const value = (0, react_1.useMemo)(() => ({ router, registry: registry ?? {} }), [router, registry]);
26
+ (0, react_1.useEffect)(() => {
27
+ if ((typeof process !== "undefined" && process.env?.NODE_ENV === "production") ||
28
+ development === undefined ||
29
+ didBootstrapDiagnostics.current) {
30
+ return;
31
+ }
32
+ didBootstrapDiagnostics.current = true;
33
+ const requestId = typeof development.initialServerTrace.requestId === "string"
34
+ ? development.initialServerTrace.requestId
35
+ : "ssr";
36
+ const hydratedAt = Date.now();
37
+ const durationMs = typeof development.initialServerTrace.durationMs === "number"
38
+ ? development.initialServerTrace.durationMs
39
+ : 0;
40
+ router.diagnostics.bootstrap([
41
+ {
42
+ id: `ssr_server_trace_${requestId}`,
43
+ timestamp: Math.max(0, hydratedAt - durationMs),
44
+ type: "server-trace",
45
+ correlationId: requestId,
46
+ data: {
47
+ ...development.initialServerTrace,
48
+ path: development.initialPath,
49
+ source: "ssr",
50
+ },
51
+ },
52
+ {
53
+ id: `ssr_hydrated_${requestId}`,
54
+ timestamp: hydratedAt,
55
+ type: "lifecycle",
56
+ correlationId: requestId,
57
+ data: { phase: "hydrated", path: development.initialPath },
58
+ },
59
+ ]);
60
+ }, [development, router]);
61
+ (0, react_1.useEffect)(() => {
62
+ if (!customRouter) {
63
+ router.startHistory();
64
+ void router.startInitialDeferred().catch(() => undefined);
65
+ }
66
+ router.startLive();
67
+ return () => {
68
+ router.stopLive();
69
+ if (!customRouter)
70
+ router.stopHistory();
71
+ };
72
+ }, [customRouter, router]);
73
+ return ((0, jsx_runtime_1.jsx)(exports.FluxContext.Provider, { value: value, children: children }));
74
+ }
75
+ function useFluxContext() {
76
+ const ctx = (0, react_1.useContext)(exports.FluxContext);
77
+ if (!ctx) {
78
+ throw new Error("useFluxContext must be used within a <FluxProvider> or <FluxRoot>");
79
+ }
80
+ return ctx;
81
+ }
82
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import React from "react";
2
+ export type ComponentModule = {
3
+ default: React.ComponentType<any>;
4
+ };
5
+ export interface LazyComponentEntry {
6
+ load: () => Promise<ComponentModule>;
7
+ }
8
+ export type ComponentRegistryEntry = React.ComponentType<any> | LazyComponentEntry;
9
+ export type ComponentRegistry = Record<string, ComponentRegistryEntry>;
10
+ export declare function setComponentRegistry(registry: ComponentRegistry): void;
11
+ export declare function getComponentRegistry(): ComponentRegistry;
12
+ export declare function resolveComponent(identifier: string, registry?: ComponentRegistry): React.ComponentType<any>;
13
+ //# sourceMappingURL=resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,eAAe,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAAA;CAAE,CAAC;AACpE,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,OAAO,CAAC,eAAe,CAAC,CAAC;CACtC;AACD,MAAM,MAAM,sBAAsB,GAAG,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,kBAAkB,CAAC;AACnF,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;AAKvE,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAEtE;AAED,wBAAgB,oBAAoB,IAAI,iBAAiB,CAExD;AAMD,wBAAgB,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,GAAE,iBAAkC,GAC3C,KAAK,CAAC,aAAa,CAAC,GAAG,CAAC,CAkB1B"}
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.setComponentRegistry = setComponentRegistry;
7
+ exports.getComponentRegistry = getComponentRegistry;
8
+ exports.resolveComponent = resolveComponent;
9
+ const react_1 = __importDefault(require("react"));
10
+ const core_1 = require("@fluxfast/core");
11
+ let globalRegistry = {};
12
+ const lazyComponents = new WeakMap();
13
+ function setComponentRegistry(registry) {
14
+ globalRegistry = registry;
15
+ }
16
+ function getComponentRegistry() {
17
+ return globalRegistry;
18
+ }
19
+ function isLazyEntry(entry) {
20
+ return typeof entry === "object" && entry !== null && "load" in entry;
21
+ }
22
+ function resolveComponent(identifier, registry = globalRegistry) {
23
+ const entry = Object.prototype.hasOwnProperty.call(registry, identifier)
24
+ ? registry[identifier]
25
+ : undefined;
26
+ if (!entry) {
27
+ const known = Object.keys(registry).sort().map(key => `- ${key}`).join("\n");
28
+ throw new core_1.ComponentResolutionError(`FluxFast Component Resolution Error:\n\nComponent "${identifier}" was requested by the backend, but was not found in the component registry.\n\nRegistered components:\n${known || "(none)"}`);
29
+ }
30
+ if (!isLazyEntry(entry))
31
+ return entry;
32
+ let component = lazyComponents.get(entry);
33
+ if (!component) {
34
+ component = react_1.default.lazy(entry.load);
35
+ lazyComponents.set(entry, component);
36
+ }
37
+ return component;
38
+ }
39
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../src/resolver.ts"],"names":[],"mappings":";;;;;;;;AAAA,kDAA0B;AAC1B,yCAA0D;AAS1D,IAAI,cAAc,GAAsB,EAAE,CAAC;AAC3C,MAAM,cAAc,GAAG,IAAI,OAAO,EAA2E,CAAC;AAE9G,8BAAqC,QAA2B;IAC9D,cAAc,GAAG,QAAQ,CAAC;AAC5B,CAAC;AAED;IACE,OAAO,cAAc,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,KAA6B;IAChD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,KAAK,CAAC;AACxE,CAAC;AAED,0BACE,UAAkB,EAClB,QAAQ,GAAsB,cAAc;IAE5C,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QACtE,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC;QACtB,CAAC,CAAC,SAAS,CAAC;IACd,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7E,MAAM,IAAI,+BAAwB,CAChC,sDAAsD,UAAU,2GAA2G,KAAK,IAAI,QAAQ,EAAE,CAC/L,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACtC,IAAI,SAAS,GAAG,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,SAAS,GAAG,eAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACnC,cAAc,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACvC,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
package/dist/root.d.ts ADDED
@@ -0,0 +1,15 @@
1
+ import React, { ReactNode } from "react";
2
+ import { PageEnvelope } from "@fluxfast/core";
3
+ import { ComponentRegistry } from "./resolver.js";
4
+ import { FluxCacheConfig } from "./config.js";
5
+ import type { FluxDevelopmentMetadata } from "./config.js";
6
+ export interface FluxRootProps {
7
+ initialEnvelope?: PageEnvelope;
8
+ development?: FluxDevelopmentMetadata;
9
+ registry: ComponentRegistry;
10
+ clientUrl?: string;
11
+ cache?: FluxCacheConfig;
12
+ errorFallback?: (error: Error) => ReactNode;
13
+ }
14
+ export declare function FluxRoot({ initialEnvelope, development, registry, clientUrl, cache, errorFallback, }: FluxRootProps): React.JSX.Element;
15
+ //# sourceMappingURL=root.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.d.ts","sourceRoot":"","sources":["../src/root.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAa,SAAS,EAAY,MAAM,OAAO,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAG9C,OAAO,EAAE,iBAAiB,EAAoB,MAAM,eAAe,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AA0D3D,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,SAAS,CAAC;CAC7C;AAED,wBAAgB,QAAQ,CAAC,EACvB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,SAAS,EACT,KAAK,EACL,aAAa,GACd,EAAE,aAAa,qBAYf"}
package/dist/root.js ADDED
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.FluxRoot = FluxRoot;
5
+ const jsx_runtime_1 = require("react/jsx-runtime");
6
+ const react_1 = require("react");
7
+ const provider_js_1 = require("./provider.js");
8
+ const hooks_js_1 = require("./hooks.js");
9
+ const resolver_js_1 = require("./resolver.js");
10
+ class ErrorBoundary extends react_1.Component {
11
+ state = { error: null };
12
+ static getDerivedStateFromError(error) {
13
+ return { error };
14
+ }
15
+ componentDidUpdate(previous) {
16
+ if (previous.resetKey !== this.props.resetKey && this.state.error) {
17
+ this.setState({ error: null });
18
+ }
19
+ }
20
+ render() {
21
+ if (this.state.error) {
22
+ if (this.props.fallback)
23
+ return this.props.fallback(this.state.error);
24
+ return ((0, jsx_runtime_1.jsxs)("div", { role: "alert", style: { padding: "2rem", fontFamily: "monospace", color: "#b91c1c" }, children: [(0, jsx_runtime_1.jsx)("h2", { children: "FluxFast Error" }), (0, jsx_runtime_1.jsx)("pre", { style: { whiteSpace: "pre-wrap" }, children: this.state.error.message })] }));
25
+ }
26
+ return this.props.children;
27
+ }
28
+ }
29
+ function ResolvedPage({ component }) {
30
+ const { registry } = (0, provider_js_1.useFluxContext)();
31
+ const PageComponent = (0, resolver_js_1.resolveComponent)(component, registry);
32
+ return (0, jsx_runtime_1.jsx)(PageComponent, {});
33
+ }
34
+ function PageRenderer({ fallback }) {
35
+ const page = (0, hooks_js_1.usePage)();
36
+ if (!page.component)
37
+ return null;
38
+ return ((0, jsx_runtime_1.jsx)(ErrorBoundary, { resetKey: page.component, fallback: fallback, children: (0, jsx_runtime_1.jsx)(react_1.Suspense, { fallback: null, children: (0, jsx_runtime_1.jsx)(ResolvedPage, { component: page.component }) }) }));
39
+ }
40
+ function FluxRoot({ initialEnvelope, development, registry, clientUrl, cache, errorFallback, }) {
41
+ return ((0, jsx_runtime_1.jsx)(provider_js_1.FluxProvider, { initialEnvelope: initialEnvelope, development: development, registry: registry, clientUrl: clientUrl, cache: cache, children: (0, jsx_runtime_1.jsx)(PageRenderer, { fallback: errorFallback }) }));
42
+ }
43
+ //# sourceMappingURL=root.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"root.js","sourceRoot":"","sources":["../src/root.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;AAEb,iCAA8D;AAE9D,+CAA6D;AAC7D,yCAAqC;AACrC,+CAAoE;AAcpE,MAAM,aAAc,SAAQ,iBAAiD;IAClE,KAAK,GAAuB,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;IAErD,MAAM,CAAC,wBAAwB,CAAC,KAAY;QAC1C,OAAO,EAAE,KAAK,EAAE,CAAC;IACnB,CAAC;IAEQ,kBAAkB,CAAC,QAA4B;QACtD,IAAI,QAAQ,CAAC,QAAQ,KAAK,IAAI,CAAC,KAAK,CAAC,QAAQ,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAEQ,MAAM;QACb,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACrB,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ;gBAAE,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtE,OAAO,CACL,iCAAK,IAAI,EAAC,OAAO,EAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,aACrF,4DAAuB,EACvB,gCAAK,KAAK,EAAE,EAAE,UAAU,EAAE,UAAU,EAAE,YAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,GAAO,IACpE,CACP,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC;IAC7B,CAAC;CACF;AAED,SAAS,YAAY,CAAC,EAAE,SAAS,EAAyB;IACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,IAAA,4BAAc,GAAE,CAAC;IACtC,MAAM,aAAa,GAAG,IAAA,8BAAgB,EAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAC5D,OAAO,uBAAC,aAAa,KAAG,CAAC;AAC3B,CAAC;AAED,SAAS,YAAY,CAAC,EAAE,QAAQ,EAA8C;IAC5E,MAAM,IAAI,GAAG,IAAA,kBAAO,GAAE,CAAC;IACvB,IAAI,CAAC,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAEjC,OAAO,CACL,uBAAC,aAAa,IAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,EAAE,QAAQ,YACzD,uBAAC,gBAAQ,IAAC,QAAQ,EAAE,IAAI,YACtB,uBAAC,YAAY,IAAC,SAAS,EAAE,IAAI,CAAC,SAAS,GAAI,GAClC,GACG,CACjB,CAAC;AACJ,CAAC;AAWD,kBAAyB,EACvB,eAAe,EACf,WAAW,EACX,QAAQ,EACR,SAAS,EACT,KAAK,EACL,aAAa,GACC;IACd,OAAO,CACL,uBAAC,0BAAY,IACX,eAAe,EAAE,eAAe,EAChC,WAAW,EAAE,WAAW,EACxB,QAAQ,EAAE,QAAQ,EAClB,SAAS,EAAE,SAAS,EACpB,KAAK,EAAE,KAAK,YAEZ,uBAAC,YAAY,IAAC,QAAQ,EAAE,aAAa,GAAI,GAC5B,CAChB,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { FluxApplicationProps, FluxCacheConfig } from "../config.js";
2
+ import { type RenderFluxApplicationOptions } from "./render.js";
3
+ export type FluxReactRender = (props: FluxApplicationProps, options: RenderFluxApplicationOptions) => Promise<string>;
4
+ export interface FluxReactHandlerOptions {
5
+ /** Trusted private backend address; never obtained from incoming HTTP data. */
6
+ backendUrl: string;
7
+ render: FluxReactRender;
8
+ /** Trusted host template containing exactly one SSR and payload marker. */
9
+ template: string | ((request: Request) => string | Promise<string>);
10
+ forwardHeaders?: readonly string[];
11
+ cache?: FluxCacheConfig;
12
+ /** Opt-in only; suppressed when NODE_ENV is production. */
13
+ development?: boolean;
14
+ /** Initial HTTP and render deadline; live proxy streams are not timed out. */
15
+ timeoutMs?: number;
16
+ fetch?: typeof fetch;
17
+ }
18
+ /** Web Request/Response boundary reused by SSR hosts; no socket or asset server. */
19
+ export declare function createFluxReactHandler(options: FluxReactHandlerOptions): (request: Request) => Promise<Response>;
20
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,oBAAoB,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE1E,OAAO,EAAyB,KAAK,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAGvF,MAAM,MAAM,eAAe,GAAG,CAC5B,KAAK,EAAE,oBAAoB,EAC3B,OAAO,EAAE,4BAA4B,KAClC,OAAO,CAAC,MAAM,CAAC,CAAC;AAErB,MAAM,WAAW,uBAAuB;IACtC,+EAA+E;IAC/E,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,eAAe,CAAC;IACxB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IACpE,cAAc,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACnC,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,2DAA2D;IAC3D,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB;AA2CD,oFAAoF;AACpF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CA8DhH"}
@@ -0,0 +1,118 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFluxReactHandler = createFluxReactHandler;
4
+ const core_1 = require("@fluxfast/core");
5
+ const server_1 = require("@fluxfast/core/server");
6
+ const document_js_1 = require("../document.js");
7
+ const render_js_1 = require("./render.js");
8
+ const hydration_js_1 = require("../hydration.js");
9
+ function htmlResponse(body, status) {
10
+ return new Response(body, { status, headers: {
11
+ "content-type": "text/html; charset=utf-8", "cache-control": "no-store",
12
+ } });
13
+ }
14
+ function failureDocument(status) {
15
+ const title = status === 404 ? "Page not found" : status === 401 || status === 403
16
+ ? "Access denied" : "Page unavailable";
17
+ return `<!doctype html><html><head><meta charset="utf-8"><title>${title}</title></head><body><h1>${title}</h1></body></html>`;
18
+ }
19
+ function safePayload(props) {
20
+ // Even non-executable JSON script text must not contain an HTML closing tag.
21
+ return JSON.stringify(props).replace(/[<>&\u2028\u2029]/g, character => `\\u${character.charCodeAt(0).toString(16).padStart(4, "0")}`);
22
+ }
23
+ function renderDocument(template, markup, props) {
24
+ for (const marker of [document_js_1.SSR_MARKER, document_js_1.PAYLOAD_MARKER]) {
25
+ if (template.split(marker).length !== 2) {
26
+ throw new TypeError("FluxFast template requires exactly one SSR and payload marker");
27
+ }
28
+ }
29
+ // Do not run a second replace over inserted application markup: user text
30
+ // can legitimately contain the other marker. Split the template first.
31
+ const payload = `<script id="${document_js_1.PAYLOAD_ID}" type="application/json">${safePayload(props)}</script>`;
32
+ return template.split(/(<!--fluxfast:ssr-->|<!--fluxfast:payload-->)/g)
33
+ .map(part => part === document_js_1.SSR_MARKER ? markup : part === document_js_1.PAYLOAD_MARKER ? payload : part).join("");
34
+ }
35
+ function untilAbort(operation, signal) {
36
+ return new Promise((resolve, reject) => {
37
+ const abort = () => reject(new Error("FluxFast initial request aborted"));
38
+ if (signal.aborted)
39
+ abort();
40
+ else
41
+ signal.addEventListener("abort", abort, { once: true });
42
+ operation.then(resolve, reject).finally(() => signal.removeEventListener("abort", abort));
43
+ });
44
+ }
45
+ /** Web Request/Response boundary reused by SSR hosts; no socket or asset server. */
46
+ function createFluxReactHandler(options) {
47
+ const timeoutMs = options.timeoutMs ?? 30_000;
48
+ (0, render_js_1.validateRenderTimeout)(timeoutMs);
49
+ const cache = options.cache === undefined ? undefined : (0, hydration_js_1.readFluxCacheConfig)(options.cache);
50
+ let backend;
51
+ try {
52
+ backend = new URL(options.backendUrl);
53
+ }
54
+ catch {
55
+ throw new TypeError("FluxFast backendUrl must be a trusted HTTP(S) URL");
56
+ }
57
+ if (!["http:", "https:"].includes(backend.protocol) || backend.username || backend.password || backend.search || backend.hash) {
58
+ throw new TypeError("FluxFast backendUrl must be a trusted HTTP(S) URL without credentials, query, or fragment");
59
+ }
60
+ const fetchImplementation = options.fetch ?? globalThis.fetch;
61
+ return async (request) => {
62
+ const development = options.development === true && process.env.NODE_ENV !== "production";
63
+ const url = new URL(request.url);
64
+ if (request.headers.get("x-fluxfast") === "1") {
65
+ const headers = new Headers(request.headers);
66
+ if (!development)
67
+ headers.delete("x-fluxfast-devtools");
68
+ const proxy = (0, server_1.createFluxTransportProxy)({ backendUrl: options.backendUrl, fetch: fetchImplementation });
69
+ const result = await proxy(new Request(request, { headers }), url.pathname);
70
+ if (development)
71
+ return result;
72
+ const responseHeaders = new Headers(result.headers);
73
+ responseHeaders.delete("x-fluxfast-devtools-trace");
74
+ return new Response(result.body, { status: result.status, statusText: result.statusText, headers: responseHeaders });
75
+ }
76
+ if (request.method !== "GET" && request.method !== "HEAD") {
77
+ return new Response(null, { status: 405, headers: { allow: "GET, HEAD", "cache-control": "no-store" } });
78
+ }
79
+ const controller = new AbortController();
80
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
81
+ const signal = AbortSignal.any([request.signal, controller.signal]);
82
+ try {
83
+ if (signal.aborted)
84
+ throw new Error("FluxFast initial request aborted");
85
+ const initial = await untilAbort((0, server_1.fetchFluxInitialPage)({
86
+ backendUrl: options.backendUrl, path: url.pathname + url.search,
87
+ headers: (0, server_1.selectFluxForwardHeaders)(request.headers, options.forwardHeaders),
88
+ diagnostics: development,
89
+ fetch: (input, init) => fetchImplementation(input, { ...init, signal }),
90
+ }), signal);
91
+ if (initial.type === "not-found") {
92
+ return htmlResponse(request.method === "HEAD" ? null : failureDocument(404), 404);
93
+ }
94
+ const props = {
95
+ initialEnvelope: initial.envelope,
96
+ ...(cache === undefined ? {} : { cache }),
97
+ ...(initial.development === undefined ? {} : { development: initial.development }),
98
+ };
99
+ const template = typeof options.template === "string" ? options.template : await untilAbort(Promise.resolve(options.template(request)), signal);
100
+ const markup = await untilAbort(options.render(props, { signal, timeoutMs }), signal);
101
+ if (signal.aborted)
102
+ throw new Error("FluxFast initial request aborted");
103
+ const html = renderDocument(template, markup, props);
104
+ return htmlResponse(request.method === "HEAD" ? null : html, 200);
105
+ }
106
+ catch (error) {
107
+ const status = error instanceof core_1.TransportError && (error.status === 401 || error.status === 403)
108
+ ? error.status : signal.aborted ? 503 : 500;
109
+ // No native exception, backend address, response body or credentials cross
110
+ // into this public error document. Never invent a valid page envelope.
111
+ return htmlResponse(request.method === "HEAD" ? null : failureDocument(status), status);
112
+ }
113
+ finally {
114
+ clearTimeout(timer);
115
+ }
116
+ };
117
+ }
118
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/server/handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /** Node-only React SSR boundary. Never import this entry into a browser graph. */
2
+ export { renderFluxApplication } from "./render.js";
3
+ export type { RenderFluxApplicationOptions } from "./render.js";
4
+ export { createFluxReactHandler } from "./handler.js";
5
+ export type { FluxReactRender, FluxReactHandlerOptions } from "./handler.js";
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,OAAO,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AACpD,YAAY,EAAE,4BAA4B,EAAE,MAAM,aAAa,CAAC;AAChE,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AACtD,YAAY,EAAE,eAAe,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createFluxReactHandler = exports.renderFluxApplication = void 0;
4
+ /** Node-only React SSR boundary. Never import this entry into a browser graph. */
5
+ var render_js_1 = require("./render.js");
6
+ Object.defineProperty(exports, "renderFluxApplication", { enumerable: true, get: function () { return render_js_1.renderFluxApplication; } });
7
+ var handler_js_1 = require("./handler.js");
8
+ Object.defineProperty(exports, "createFluxReactHandler", { enumerable: true, get: function () { return handler_js_1.createFluxReactHandler; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/server/index.ts"],"names":[],"mappings":";;;AAAA,kFAAkF;AAClF,yCAAoD;AAA3C,kHAAA,qBAAqB,OAAA;AAE9B,2CAAsD;AAA7C,oHAAA,sBAAsB,OAAA"}
@@ -0,0 +1,11 @@
1
+ import React from "react";
2
+ import type { FluxApplicationProps } from "../config.js";
3
+ export interface RenderFluxApplicationOptions {
4
+ signal?: AbortSignal;
5
+ /** Maximum time to resolve lazy modules and finish rendering; default 30s. */
6
+ timeoutMs?: number;
7
+ }
8
+ export declare function validateRenderTimeout(value: number): void;
9
+ /** Render meaningful HTML, including lazy pages, without a client-only bailout. */
10
+ export declare function renderFluxApplication(application: React.ComponentType<FluxApplicationProps>, props: FluxApplicationProps, options?: RenderFluxApplicationOptions): Promise<string>;
11
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/server/render.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAGzD,MAAM,WAAW,4BAA4B;IAC3C,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,8EAA8E;IAC9E,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAIzD;AAED,mFAAmF;AACnF,wBAAgB,qBAAqB,CACnC,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,EACtD,KAAK,EAAE,oBAAoB,EAC3B,OAAO,GAAE,4BAAiC,GACzC,OAAO,CAAC,MAAM,CAAC,CAsDjB"}
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.validateRenderTimeout = validateRenderTimeout;
7
+ exports.renderFluxApplication = renderFluxApplication;
8
+ const react_1 = __importDefault(require("react"));
9
+ const server_1 = require("react-dom/server");
10
+ const node_stream_1 = require("node:stream");
11
+ const document_js_1 = require("../document.js");
12
+ function validateRenderTimeout(value) {
13
+ if (!Number.isSafeInteger(value) || value <= 0 || value > 2_147_483_647) {
14
+ throw new TypeError("FluxFast render timeoutMs must be a positive bounded integer");
15
+ }
16
+ }
17
+ /** Render meaningful HTML, including lazy pages, without a client-only bailout. */
18
+ function renderFluxApplication(application, props, options = {}) {
19
+ const timeoutMs = options.timeoutMs ?? 30_000;
20
+ validateRenderTimeout(timeoutMs);
21
+ if (options.signal !== undefined && (typeof options.signal?.aborted !== "boolean" ||
22
+ typeof options.signal.addEventListener !== "function" || typeof options.signal.removeEventListener !== "function")) {
23
+ throw new TypeError("FluxFast render signal must be an AbortSignal");
24
+ }
25
+ if (options.signal?.aborted)
26
+ return Promise.reject(new Error("FluxFast rendering aborted"));
27
+ return new Promise((resolve, reject) => {
28
+ let settled = false;
29
+ let stream;
30
+ const chunks = [];
31
+ const destination = new node_stream_1.Writable({
32
+ write(chunk, _encoding, callback) {
33
+ chunks.push(Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk));
34
+ callback();
35
+ },
36
+ });
37
+ const cleanup = () => {
38
+ clearTimeout(timer);
39
+ options.signal?.removeEventListener("abort", abort);
40
+ };
41
+ const fail = (error) => {
42
+ if (settled)
43
+ return;
44
+ settled = true;
45
+ cleanup();
46
+ reject(error);
47
+ stream?.abort();
48
+ destination.destroy();
49
+ };
50
+ const abort = () => fail(new Error("FluxFast rendering aborted"));
51
+ const timer = setTimeout(() => fail(new Error("FluxFast rendering timed out")), timeoutMs);
52
+ options.signal?.addEventListener("abort", abort, { once: true });
53
+ destination.on("error", fail);
54
+ destination.on("finish", () => {
55
+ if (settled)
56
+ return;
57
+ settled = true;
58
+ cleanup();
59
+ resolve(Buffer.concat(chunks).toString("utf8"));
60
+ });
61
+ try {
62
+ stream = (0, server_1.renderToPipeableStream)(react_1.default.createElement(application, props), {
63
+ identifierPrefix: document_js_1.IDENTIFIER_PREFIX,
64
+ // Lazy registry modules are part of the blocking page, not a deferred
65
+ // resource. Waiting here avoids an empty fallback in the initial HTML.
66
+ onAllReady() { if (!settled)
67
+ stream.pipe(destination); },
68
+ onShellError: fail,
69
+ onError: fail,
70
+ });
71
+ }
72
+ catch (error) {
73
+ fail(error);
74
+ }
75
+ });
76
+ }
77
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../src/server/render.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,72 @@
1
+ {
2
+ "name": "@fluxfast/react",
3
+ "version": "0.0.0-oidc-bootstrap.0",
4
+ "license": "MIT",
5
+ "description": "Host-independent React bindings for FluxFast",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/El37628/FluxFast.git",
9
+ "directory": "packages/react"
10
+ },
11
+ "homepage": "https://github.com/El37628/FluxFast#readme",
12
+ "bugs": {
13
+ "url": "https://github.com/El37628/FluxFast/issues"
14
+ },
15
+ "engines": {
16
+ "node": "^22.0.0 || ^24.0.0"
17
+ },
18
+ "publishConfig": {
19
+ "access": "public",
20
+ "registry": "https://registry.npmjs.org/"
21
+ },
22
+ "main": "./dist/index.js",
23
+ "module": "./dist/esm/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "sideEffects": false,
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "exports": {
30
+ ".": {
31
+ "types": "./dist/index.d.ts",
32
+ "import": "./dist/esm/index.js",
33
+ "require": "./dist/index.js",
34
+ "default": "./dist/index.js"
35
+ },
36
+ "./client": {
37
+ "types": "./dist/client.d.ts",
38
+ "import": "./dist/esm/client.js",
39
+ "require": "./dist/client.js",
40
+ "default": "./dist/client.js"
41
+ },
42
+ "./server": {
43
+ "types": "./dist/server/index.d.ts",
44
+ "import": "./dist/esm/server/index.js",
45
+ "require": "./dist/server/index.js",
46
+ "default": "./dist/server/index.js"
47
+ }
48
+ },
49
+ "scripts": {
50
+ "build": "tsc && tsc -p tsconfig.esm.json && node ../../scripts/write-esm-package.mjs dist/esm",
51
+ "typecheck": "tsc --noEmit",
52
+ "test": "vitest run"
53
+ },
54
+ "dependencies": {
55
+ "@fluxfast/core": "^1.2.0"
56
+ },
57
+ "peerDependencies": {
58
+ "react": ">=19.0.0",
59
+ "react-dom": ">=19.0.0"
60
+ },
61
+ "devDependencies": {
62
+ "@fluxfast/codegen": "workspace:*",
63
+ "@types/node": "^22.20.4",
64
+ "@types/react": "^19.3.0",
65
+ "@types/react-dom": "^19.3.0",
66
+ "happy-dom": "^20.14.5",
67
+ "react": "^19.3.0",
68
+ "react-dom": "^19.3.0",
69
+ "typescript": "^7.0.2",
70
+ "vitest": "^4.1.11"
71
+ }
72
+ }