@fluxfast/next 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 (52) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +48 -0
  3. package/bin/fluxfast.js +14 -0
  4. package/dist/client.d.ts +8 -0
  5. package/dist/client.d.ts.map +1 -0
  6. package/dist/client.js +25 -0
  7. package/dist/client.js.map +1 -0
  8. package/dist/config.d.ts +23 -0
  9. package/dist/config.d.ts.map +1 -0
  10. package/dist/config.js +21 -0
  11. package/dist/config.js.map +1 -0
  12. package/dist/form.d.ts +24 -0
  13. package/dist/form.d.ts.map +1 -0
  14. package/dist/form.js +127 -0
  15. package/dist/form.js.map +1 -0
  16. package/dist/generate.d.ts +6 -0
  17. package/dist/generate.d.ts.map +1 -0
  18. package/dist/generate.js +51 -0
  19. package/dist/generate.js.map +1 -0
  20. package/dist/hooks.d.ts +6 -0
  21. package/dist/hooks.d.ts.map +1 -0
  22. package/dist/hooks.js +30 -0
  23. package/dist/hooks.js.map +1 -0
  24. package/dist/index.d.ts +11 -0
  25. package/dist/index.d.ts.map +1 -0
  26. package/dist/index.js +27 -0
  27. package/dist/index.js.map +1 -0
  28. package/dist/link.d.ts +10 -0
  29. package/dist/link.d.ts.map +1 -0
  30. package/dist/link.js +65 -0
  31. package/dist/link.js.map +1 -0
  32. package/dist/next-config.d.ts +14 -0
  33. package/dist/next-config.d.ts.map +1 -0
  34. package/dist/next-config.js +53 -0
  35. package/dist/next-config.js.map +1 -0
  36. package/dist/provider.d.ts +20 -0
  37. package/dist/provider.d.ts.map +1 -0
  38. package/dist/provider.js +41 -0
  39. package/dist/provider.js.map +1 -0
  40. package/dist/resolver.d.ts +13 -0
  41. package/dist/resolver.d.ts.map +1 -0
  42. package/dist/resolver.js +37 -0
  43. package/dist/resolver.js.map +1 -0
  44. package/dist/root.d.ts +13 -0
  45. package/dist/root.d.ts.map +1 -0
  46. package/dist/root.js +43 -0
  47. package/dist/root.js.map +1 -0
  48. package/dist/server.d.ts +22 -0
  49. package/dist/server.d.ts.map +1 -0
  50. package/dist/server.js +117 -0
  51. package/dist/server.js.map +1 -0
  52. package/package.json +87 -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,48 @@
1
+ # @fluxfast/next
2
+
3
+ Next.js App Router adapter for FluxFast. FastAPI owns application routing,
4
+ validation, authentication, and data loading; Next.js supplies the document,
5
+ bundling, React runtime, and code splitting.
6
+
7
+ ```bash
8
+ npm install @fluxfast/next
9
+ ```
10
+
11
+ Wrap the Next config to generate the component allowlist and proxy only
12
+ FluxFast protocol requests to the private FastAPI address:
13
+
14
+ ```ts
15
+ import { withFluxFast } from "@fluxfast/next/next-config";
16
+
17
+ export default withFluxFast({
18
+ reactStrictMode: true,
19
+ });
20
+ ```
21
+
22
+ Create the optional catch-all shell at
23
+ `app/(flux)/[[...flux]]/page.tsx`:
24
+
25
+ ```tsx
26
+ import { createFluxNextPage } from "@fluxfast/next/server";
27
+ import { fluxConfig } from "@/fluxfast.config";
28
+
29
+ export default createFluxNextPage(fluxConfig);
30
+ ```
31
+
32
+ During development, run the supervisor from the consuming application:
33
+
34
+ ```bash
35
+ .venv/bin/fluxfast dev backend.app.main:app
36
+ ```
37
+
38
+ The supervisor starts FastAPI on a private available port and Next.js on the
39
+ browser-facing port. Browser transport stays same-origin, so no public backend
40
+ port or development CORS configuration is required. The supervisor detects
41
+ npm, pnpm, Yarn, or Bun from the consuming frontend.
42
+
43
+ The package supports Next.js `>=16.3.0 <17.0.0`, React 19, and Node.js 22 and
44
+ 24. See the complete [Next.js adapter guide](https://github.com/El37628/FluxFast/blob/main/docs/nextjs-adapter.md),
45
+ [caching guide](https://github.com/El37628/FluxFast/blob/main/docs/caching.md),
46
+ and [mutation guide](https://github.com/El37628/FluxFast/blob/main/docs/mutations.md).
47
+
48
+ FluxFast is licensed under the [MIT License](https://github.com/El37628/FluxFast/blob/main/LICENSE).
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+
3
+ const { generatePagesRegistry } = require("../dist/generate.js");
4
+
5
+ const command = process.argv[2];
6
+
7
+ if (command === "generate" || !command) {
8
+ generatePagesRegistry();
9
+ } else {
10
+ console.log(`Unknown command: ${command}`);
11
+ console.log("Usage: fluxfast generate");
12
+ process.exit(1);
13
+ }
14
+
@@ -0,0 +1,8 @@
1
+ export * from "./provider";
2
+ export * from "./root";
3
+ export * from "./hooks";
4
+ export * from "./link";
5
+ export * from "./form";
6
+ export * from "./resolver";
7
+ export * from "./config";
8
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAEA,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC"}
package/dist/client.js ADDED
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ "use client";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
16
+ };
17
+ Object.defineProperty(exports, "__esModule", { value: true });
18
+ __exportStar(require("./provider"), exports);
19
+ __exportStar(require("./root"), exports);
20
+ __exportStar(require("./hooks"), exports);
21
+ __exportStar(require("./link"), exports);
22
+ __exportStar(require("./form"), exports);
23
+ __exportStar(require("./resolver"), exports);
24
+ __exportStar(require("./config"), exports);
25
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;;;;;;;;;;;AAEb,6CAA2B;AAC3B,yCAAuB;AACvB,0CAAwB;AACxB,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,2CAAyB"}
@@ -0,0 +1,23 @@
1
+ import type React from "react";
2
+ import type { PageEnvelope } from "@fluxfast/core";
3
+ export interface FluxCacheConfig {
4
+ maxResources?: number;
5
+ maxPages?: number;
6
+ }
7
+ export interface FluxApplicationProps {
8
+ initialEnvelope: PageEnvelope;
9
+ clientUrl?: string;
10
+ cache?: FluxCacheConfig;
11
+ }
12
+ export interface FluxNextConfig {
13
+ backendUrl?: string;
14
+ application: React.ComponentType<FluxApplicationProps>;
15
+ clientUrl?: string;
16
+ forwardHeaders?: string[];
17
+ cache?: FluxCacheConfig;
18
+ }
19
+ export declare function defineFluxConfig<T extends FluxNextConfig>(config: T): T;
20
+ export declare const DEFAULT_FLUXFAST_BACKEND_URL = "http://127.0.0.1:8000";
21
+ /** Resolve the server-only backend address injected by `fluxfast dev`. */
22
+ export declare function resolveFluxBackendUrl(configuredUrl?: string): string;
23
+ //# 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,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,eAAe;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACnC,eAAe,EAAE,YAAY,CAAC;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,KAAK,CAAC,aAAa,CAAC,oBAAoB,CAAC,CAAC;IACvD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,CAAC,EAAE,eAAe,CAAC;CACzB;AAED,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,cAAc,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,CAEvE;AAED,eAAO,MAAM,4BAA4B,0BAA0B,CAAC;AAEpE,0EAA0E;AAC1E,wBAAgB,qBAAqB,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,MAAM,CASpE"}
package/dist/config.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_FLUXFAST_BACKEND_URL = void 0;
4
+ exports.defineFluxConfig = defineFluxConfig;
5
+ exports.resolveFluxBackendUrl = resolveFluxBackendUrl;
6
+ function defineFluxConfig(config) {
7
+ return config;
8
+ }
9
+ exports.DEFAULT_FLUXFAST_BACKEND_URL = "http://127.0.0.1:8000";
10
+ /** Resolve the server-only backend address injected by `fluxfast dev`. */
11
+ function resolveFluxBackendUrl(configuredUrl) {
12
+ const value = configuredUrl ??
13
+ process.env.FLUXFAST_BACKEND_URL ??
14
+ exports.DEFAULT_FLUXFAST_BACKEND_URL;
15
+ const parsed = new URL(value);
16
+ if (!["http:", "https:"].includes(parsed.protocol)) {
17
+ throw new TypeError("FluxFast backendUrl must use http or https");
18
+ }
19
+ return value.replace(/\/$/, "");
20
+ }
21
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":";;;;;AAsBA,0BAA2D,MAAS;IAClE,OAAO,MAAM,CAAC;AAChB,CAAC;AAEY,QAAA,4BAA4B,GAAG,uBAAuB,CAAC;AAEpE,0EAA0E;AAC1E,+BAAsC,aAAsB;IAC1D,MAAM,KAAK,GAAG,aAAa;QACzB,OAAO,CAAC,GAAG,CAAC,oBAAoB;QAChC,QAAA,4BAA4B,CAAC;IAC/B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC;IAC9B,IAAI,CAAE,CAAC,OAAO,EAAE,QAAQ,CAAc,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjE,MAAM,IAAI,SAAS,CAAC,4CAA4C,CAAC,CAAC;IACpE,CAAC;IACD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AAClC,CAAC"}
package/dist/form.d.ts ADDED
@@ -0,0 +1,24 @@
1
+ import { FormEvent } from "react";
2
+ export interface FormOptions {
3
+ method?: string;
4
+ onSuccess?: () => void;
5
+ onError?: (errors: Record<string, string>) => void;
6
+ preserveScroll?: boolean;
7
+ }
8
+ export interface UseFormReturn<T extends Record<string, any>> {
9
+ data: T;
10
+ errors: Partial<Record<keyof T, string>>;
11
+ processing: boolean;
12
+ wasSuccessful: boolean;
13
+ recentlySuccessful: boolean;
14
+ setData: {
15
+ <K extends keyof T>(key: K, value: T[K]): void;
16
+ (values: Partial<T> | ((prev: T) => T)): void;
17
+ };
18
+ setError: (key: keyof T, message: string) => void;
19
+ clearErrors: (...keys: (keyof T)[]) => void;
20
+ reset: (...keys: (keyof T)[]) => void;
21
+ submit: (url: string, options?: FormOptions) => (e?: FormEvent<HTMLFormElement>) => Promise<void>;
22
+ }
23
+ export declare function useForm<T extends Record<string, any>>(initialValues: T): UseFormReturn<T>;
24
+ //# sourceMappingURL=form.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.d.ts","sourceRoot":"","sources":["../src/form.ts"],"names":[],"mappings":"AAEA,OAAO,EAA4C,SAAS,EAAE,MAAM,OAAO,CAAC;AAI5E,MAAM,WAAW,WAAW;IAC1B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,KAAK,IAAI,CAAC;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;IAC1D,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC;IACzC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,OAAO,EAAE;QACP,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;QAC/C,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC;KAC/C,CAAC;IACF,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAClD,WAAW,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;IAC5C,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC;IACtC,MAAM,EAAE,CACN,GAAG,EAAE,MAAM,EACX,OAAO,CAAC,EAAE,WAAW,KAClB,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACxD;AAED,wBAAgB,OAAO,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,aAAa,EAAE,CAAC,GAAG,aAAa,CAAC,CAAC,CAAC,CA2HzF"}
package/dist/form.js ADDED
@@ -0,0 +1,127 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useForm = useForm;
5
+ const react_1 = require("react");
6
+ const core_1 = require("@fluxfast/core");
7
+ const hooks_1 = require("./hooks");
8
+ function useForm(initialValues) {
9
+ const router = (0, hooks_1.useRouter)();
10
+ const initialRef = (0, react_1.useRef)(initialValues);
11
+ const [data, setDataState] = (0, react_1.useState)(initialValues);
12
+ const dataRef = (0, react_1.useRef)(initialValues);
13
+ const [errors, setErrors] = (0, react_1.useState)({});
14
+ const [processing, setProcessing] = (0, react_1.useState)(false);
15
+ const [wasSuccessful, setWasSuccessful] = (0, react_1.useState)(false);
16
+ const [recentlySuccessful, setRecentlySuccessful] = (0, react_1.useState)(false);
17
+ const recentTimerRef = (0, react_1.useRef)(null);
18
+ (0, react_1.useEffect)(() => () => {
19
+ if (recentTimerRef.current)
20
+ clearTimeout(recentTimerRef.current);
21
+ }, []);
22
+ const setData = (0, react_1.useCallback)((keyOrValues, maybeValue) => {
23
+ if (typeof keyOrValues === "string") {
24
+ const next = { ...dataRef.current, [keyOrValues]: maybeValue };
25
+ dataRef.current = next;
26
+ setDataState(next);
27
+ }
28
+ else if (typeof keyOrValues === "function") {
29
+ const next = keyOrValues(dataRef.current);
30
+ dataRef.current = next;
31
+ setDataState(next);
32
+ }
33
+ else {
34
+ const next = { ...dataRef.current, ...keyOrValues };
35
+ dataRef.current = next;
36
+ setDataState(next);
37
+ }
38
+ }, []);
39
+ const setError = (0, react_1.useCallback)((key, message) => {
40
+ setErrors(prev => ({ ...prev, [key]: message }));
41
+ }, []);
42
+ const clearErrors = (0, react_1.useCallback)((...keys) => {
43
+ if (keys.length === 0) {
44
+ setErrors({});
45
+ }
46
+ else {
47
+ setErrors(prev => {
48
+ const next = { ...prev };
49
+ for (const k of keys) {
50
+ delete next[k];
51
+ }
52
+ return next;
53
+ });
54
+ }
55
+ }, []);
56
+ const reset = (0, react_1.useCallback)((...keys) => {
57
+ if (keys.length === 0) {
58
+ dataRef.current = initialRef.current;
59
+ setDataState(initialRef.current);
60
+ }
61
+ else {
62
+ const next = { ...dataRef.current };
63
+ for (const k of keys)
64
+ next[k] = initialRef.current[k];
65
+ dataRef.current = next;
66
+ setDataState(next);
67
+ }
68
+ }, []);
69
+ const submit = (0, react_1.useCallback)((url, options) => {
70
+ return async (e) => {
71
+ if (e && typeof e.preventDefault === "function") {
72
+ e.preventDefault();
73
+ }
74
+ setProcessing(true);
75
+ setWasSuccessful(false);
76
+ clearErrors();
77
+ try {
78
+ await router.mutate(url, dataRef.current, {
79
+ method: options?.method || "POST",
80
+ preserveScroll: options?.preserveScroll,
81
+ });
82
+ setWasSuccessful(true);
83
+ setRecentlySuccessful(true);
84
+ if (recentTimerRef.current) {
85
+ clearTimeout(recentTimerRef.current);
86
+ }
87
+ recentTimerRef.current = setTimeout(() => {
88
+ setRecentlySuccessful(false);
89
+ }, 2000);
90
+ if (options?.onSuccess) {
91
+ options.onSuccess();
92
+ }
93
+ }
94
+ catch (err) {
95
+ if (err instanceof core_1.ValidationError && err.details) {
96
+ const formattedErrors = {};
97
+ for (const [k, v] of Object.entries(err.details)) {
98
+ formattedErrors[k] = Array.isArray(v) ? v[0] : String(v);
99
+ }
100
+ setErrors(formattedErrors);
101
+ if (options?.onError) {
102
+ options.onError(formattedErrors);
103
+ }
104
+ }
105
+ else {
106
+ throw err;
107
+ }
108
+ }
109
+ finally {
110
+ setProcessing(false);
111
+ }
112
+ };
113
+ }, [router, clearErrors]);
114
+ return {
115
+ data,
116
+ errors,
117
+ processing,
118
+ wasSuccessful,
119
+ recentlySuccessful,
120
+ setData,
121
+ setError,
122
+ clearErrors,
123
+ reset,
124
+ submit,
125
+ };
126
+ }
127
+ //# 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,6 @@
1
+ export interface GenerateOptions {
2
+ pagesDir?: string;
3
+ outputFile?: string;
4
+ }
5
+ export declare function generatePagesRegistry(options?: GenerateOptions): void;
6
+ //# sourceMappingURL=generate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.d.ts","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAKD,wBAAgB,qBAAqB,CAAC,OAAO,GAAE,eAAoB,GAAG,IAAI,CAmDzE"}
@@ -0,0 +1,51 @@
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.generatePagesRegistry = generatePagesRegistry;
7
+ const node_fs_1 = __importDefault(require("node:fs"));
8
+ const node_path_1 = __importDefault(require("node:path"));
9
+ const PAGE_EXTENSION = /\.(tsx|jsx)$/;
10
+ const IGNORED_PAGE = /\.(test|spec|stories)\.(tsx|jsx)$/;
11
+ function generatePagesRegistry(options = {}) {
12
+ const rootDir = process.cwd();
13
+ const pagesDir = node_path_1.default.resolve(rootDir, options.pagesDir ?? "src/flux-pages");
14
+ const outputFile = node_path_1.default.resolve(rootDir, options.outputFile ?? "src/.fluxfast/pages.generated.ts");
15
+ node_fs_1.default.mkdirSync(pagesDir, { recursive: true });
16
+ node_fs_1.default.mkdirSync(node_path_1.default.dirname(outputFile), { recursive: true });
17
+ const foundFiles = [];
18
+ const scanDir = (dir, base = "") => {
19
+ for (const entry of node_fs_1.default.readdirSync(dir, { withFileTypes: true })) {
20
+ const relative = base ? `${base}/${entry.name}` : entry.name;
21
+ const fullPath = node_path_1.default.join(dir, entry.name);
22
+ if (entry.isDirectory()) {
23
+ scanDir(fullPath, relative);
24
+ }
25
+ else if (entry.isFile() &&
26
+ PAGE_EXTENSION.test(entry.name) &&
27
+ !IGNORED_PAGE.test(entry.name) &&
28
+ !entry.name.startsWith("_")) {
29
+ foundFiles.push(relative);
30
+ }
31
+ }
32
+ };
33
+ scanDir(pagesDir);
34
+ foundFiles.sort();
35
+ const outputDir = node_path_1.default.dirname(outputFile);
36
+ const entries = foundFiles.map(file => {
37
+ const identifier = file.replace(PAGE_EXTENSION, "");
38
+ const relativeImport = node_path_1.default
39
+ .relative(outputDir, node_path_1.default.join(pagesDir, file))
40
+ .replace(PAGE_EXTENSION, "")
41
+ .replace(/\\/g, "/");
42
+ const importPath = relativeImport.startsWith(".")
43
+ ? relativeImport
44
+ : `./${relativeImport}`;
45
+ return ` ${JSON.stringify(identifier)}: { load: () => import(${JSON.stringify(importPath)}) },`;
46
+ });
47
+ const content = `// AUTO-GENERATED BY FLUXFAST.\n// DO NOT EDIT MANUALLY.\n"use client";\n\nimport React from "react";\nimport { FluxRoot } from "@fluxfast/next";\nimport type { ComponentRegistry, FluxApplicationProps } from "@fluxfast/next";\n\nexport const fluxPages: ComponentRegistry = {\n${entries.join("\n")}\n};\n\nexport function FluxApplication(props: FluxApplicationProps) {\n return React.createElement(FluxRoot, { ...props, registry: fluxPages });\n}\n\nexport default fluxPages;\n`;
48
+ node_fs_1.default.writeFileSync(outputFile, content, "utf8");
49
+ console.log(`[fluxfast] Generated component registry with ${foundFiles.length} pages at ${outputFile}`);
50
+ }
51
+ //# sourceMappingURL=generate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generate.js","sourceRoot":"","sources":["../src/generate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import { FluxRouter, PageState } from "@fluxfast/core";
2
+ export declare function useRouter(): FluxRouter;
3
+ export declare function useFlux(): import("./provider").FluxContextValue;
4
+ export declare function usePage(): PageState;
5
+ export declare function useResource<T = unknown>(key: string): T;
6
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAGvD,wBAAgB,SAAS,IAAI,UAAU,CAEtC;AAED,wBAAgB,OAAO,0CAEtB;AAED,wBAAgB,OAAO,IAAI,SAAS,CAkBnC;AAED,wBAAgB,WAAW,CAAC,CAAC,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,CAyBvD"}
package/dist/hooks.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.useRouter = useRouter;
5
+ exports.useFlux = useFlux;
6
+ exports.usePage = usePage;
7
+ exports.useResource = useResource;
8
+ const react_1 = require("react");
9
+ const provider_1 = require("./provider");
10
+ function useRouter() {
11
+ return useFlux().router;
12
+ }
13
+ function useFlux() {
14
+ return (0, provider_1.useFluxContext)();
15
+ }
16
+ function usePage() {
17
+ const router = useRouter();
18
+ const subscribe = (0, react_1.useCallback)((callback) => router.pageStore.subscribe(callback), [router]);
19
+ const getSnapshot = (0, react_1.useCallback)(() => router.pageStore.getSnapshot(), [router]);
20
+ return (0, react_1.useSyncExternalStore)(subscribe, getSnapshot, getSnapshot);
21
+ }
22
+ function useResource(key) {
23
+ const router = useRouter();
24
+ const subscribe = (0, react_1.useCallback)((callback) => router.resourceStore.subscribe(key, callback), [router, key]);
25
+ const getSnapshot = (0, react_1.useCallback)(() => router.resourceStore.getSnapshot(key), [router, key]);
26
+ const getServerSnapshot = (0, react_1.useCallback)(() => router.resourceStore.getServerSnapshot(key), [router, key]);
27
+ const val = (0, react_1.useSyncExternalStore)(subscribe, getSnapshot, getServerSnapshot);
28
+ return val;
29
+ }
30
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../src/hooks.ts"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;AAEb,iCAA0D;AAE1D,yCAA4C;AAE5C;IACE,OAAO,OAAO,EAAE,CAAC,MAAM,CAAC;AAC1B,CAAC;AAED;IACE,OAAO,IAAA,yBAAc,GAAE,CAAC;AAC1B,CAAC;AAED;IACE,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,SAAS,GAAG,IAAA,mBAAW,EAC3B,CAAC,QAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,EAC9D,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,MAAM,WAAW,GAAG,IAAA,mBAAW,EAC7B,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,EAAE,EACpC,CAAC,MAAM,CAAC,CACT,CAAC;IAEF,OAAO,IAAA,4BAAoB,EACzB,SAAS,EACT,WAAW,EACX,WAAW,CACZ,CAAC;AACJ,CAAC;AAED,qBAAyC,GAAW;IAClD,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAE3B,MAAM,SAAS,GAAG,IAAA,mBAAW,EAC3B,CAAC,QAAoB,EAAE,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,EAAE,QAAQ,CAAC,EACvE,CAAC,MAAM,EAAE,GAAG,CAAC,CACd,CAAC;IAEF,MAAM,WAAW,GAAG,IAAA,mBAAW,EAC7B,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,WAAW,CAAI,GAAG,CAAC,EAC9C,CAAC,MAAM,EAAE,GAAG,CAAC,CACd,CAAC;IAEF,MAAM,iBAAiB,GAAG,IAAA,mBAAW,EACnC,GAAG,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC,iBAAiB,CAAI,GAAG,CAAC,EACpD,CAAC,MAAM,EAAE,GAAG,CAAC,CACd,CAAC;IAEF,MAAM,GAAG,GAAG,IAAA,4BAAoB,EAC9B,SAAS,EACT,WAAW,EACX,iBAAiB,CAClB,CAAC;IAEF,OAAO,GAAQ,CAAC;AAClB,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fluxfast/next — Next.js App Router adapter for FluxFast.
3
+ */
4
+ export * from "./provider";
5
+ export * from "./root";
6
+ export * from "./hooks";
7
+ export * from "./link";
8
+ export * from "./form";
9
+ export * from "./resolver";
10
+ export * from "./config";
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,QAAQ,CAAC;AACvB,cAAc,SAAS,CAAC;AACxB,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ /**
3
+ * @fluxfast/next — Next.js App Router adapter for FluxFast.
4
+ */
5
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
6
+ if (k2 === undefined) k2 = k;
7
+ var desc = Object.getOwnPropertyDescriptor(m, k);
8
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9
+ desc = { enumerable: true, get: function() { return m[k]; } };
10
+ }
11
+ Object.defineProperty(o, k2, desc);
12
+ }) : (function(o, m, k, k2) {
13
+ if (k2 === undefined) k2 = k;
14
+ o[k2] = m[k];
15
+ }));
16
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
17
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
18
+ };
19
+ Object.defineProperty(exports, "__esModule", { value: true });
20
+ __exportStar(require("./provider"), exports);
21
+ __exportStar(require("./root"), exports);
22
+ __exportStar(require("./hooks"), exports);
23
+ __exportStar(require("./link"), exports);
24
+ __exportStar(require("./form"), exports);
25
+ __exportStar(require("./resolver"), exports);
26
+ __exportStar(require("./config"), exports);
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;AAEH,6CAA2B;AAC3B,yCAAuB;AACvB,0CAAwB;AACxB,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,2CAAyB"}
package/dist/link.d.ts ADDED
@@ -0,0 +1,10 @@
1
+ import React, { AnchorHTMLAttributes } from "react";
2
+ export interface LinkProps extends AnchorHTMLAttributes<HTMLAnchorElement> {
3
+ href: string;
4
+ prefetch?: "hover" | false;
5
+ replace?: boolean;
6
+ preserveScroll?: boolean;
7
+ }
8
+ export declare function resolveInternalDestination(href: string, currentUrl?: string): string | null;
9
+ export declare function Link({ href, prefetch, replace, preserveScroll, onClick, onMouseEnter, children, ...props }: LinkProps): React.JSX.Element;
10
+ //# sourceMappingURL=link.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.d.ts","sourceRoot":"","sources":["../src/link.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,EAAE,oBAAoB,EAAc,MAAM,OAAO,CAAC;AAGhE,MAAM,WAAW,SAAU,SAAQ,oBAAoB,CAAC,iBAAiB,CAAC;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;IAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B;AAED,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,MAAM,EACZ,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CAaf;AAED,wBAAgB,IAAI,CAAC,EACnB,IAAI,EACJ,QAAkB,EAClB,OAAe,EACf,cAAsB,EACtB,OAAO,EACP,YAAY,EACZ,QAAQ,EACR,GAAG,KAAK,EACT,EAAE,SAAS,qBA0DX"}
package/dist/link.js ADDED
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ "use client";
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.resolveInternalDestination = resolveInternalDestination;
5
+ exports.Link = Link;
6
+ const jsx_runtime_1 = require("react/jsx-runtime");
7
+ const hooks_1 = require("./hooks");
8
+ function resolveInternalDestination(href, currentUrl) {
9
+ if (href.startsWith("#"))
10
+ return null;
11
+ const base = currentUrl ?? (typeof window !== "undefined" ? window.location.href : undefined);
12
+ if (!base)
13
+ return href.startsWith("/") ? href : null;
14
+ try {
15
+ const destination = new URL(href, base);
16
+ if (destination.origin !== new URL(base).origin)
17
+ return null;
18
+ return `${destination.pathname}${destination.search}${destination.hash}`;
19
+ }
20
+ catch {
21
+ return null;
22
+ }
23
+ }
24
+ function Link({ href, prefetch = "hover", replace = false, preserveScroll = false, onClick, onMouseEnter, children, ...props }) {
25
+ const router = (0, hooks_1.useRouter)();
26
+ const getInternalDestination = () => {
27
+ return resolveInternalDestination(href);
28
+ };
29
+ const handleClick = (e) => {
30
+ if (onClick) {
31
+ onClick(e);
32
+ }
33
+ // Allow browser default for external links or modified clicks (ctrl/cmd/shift/middle click)
34
+ if (e.defaultPrevented ||
35
+ e.button !== 0 ||
36
+ e.metaKey ||
37
+ e.ctrlKey ||
38
+ e.altKey ||
39
+ e.shiftKey ||
40
+ props.download !== undefined ||
41
+ (props.target !== undefined && props.target !== "_self")) {
42
+ return;
43
+ }
44
+ const destination = getInternalDestination();
45
+ if (!destination)
46
+ return;
47
+ e.preventDefault();
48
+ router.visit(destination, { replace, preserveScroll }).catch(err => {
49
+ console.error("[fluxfast] Link navigation failed:", err);
50
+ });
51
+ };
52
+ const handleMouseEnter = (e) => {
53
+ if (onMouseEnter) {
54
+ onMouseEnter(e);
55
+ }
56
+ const destination = getInternalDestination();
57
+ if (prefetch === "hover" && destination) {
58
+ router.prefetch(destination).catch(err => {
59
+ console.debug("[fluxfast] Prefetch failed:", err);
60
+ });
61
+ }
62
+ };
63
+ return ((0, jsx_runtime_1.jsx)("a", { href: href, onClick: handleClick, onMouseEnter: handleMouseEnter, ...props, children: children }));
64
+ }
65
+ //# sourceMappingURL=link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"link.js","sourceRoot":"","sources":["../src/link.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /** Node-only Next.js configuration for same-origin FluxFast applications. */
2
+ import type { NextConfig } from "next";
3
+ import { GenerateOptions } from "./generate";
4
+ export interface FluxFastNextOptions extends GenerateOptions {
5
+ backendUrl?: string;
6
+ generate?: boolean;
7
+ }
8
+ /**
9
+ * Add registry generation and a header-gated backend proxy to a Next config.
10
+ * Normal document requests still resolve through the Next catch-all page;
11
+ * only requests marked by the FluxFast transport reach FastAPI.
12
+ */
13
+ export declare function withFluxFast(nextConfig?: NextConfig, options?: FluxFastNextOptions): NextConfig;
14
+ //# sourceMappingURL=next-config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-config.d.ts","sourceRoot":"","sources":["../src/next-config.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAEvC,OAAO,EAAE,eAAe,EAAyB,MAAM,YAAY,CAAC;AAEpE,MAAM,WAAW,mBAAoB,SAAQ,eAAe;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAC1B,UAAU,GAAE,UAAe,EAC3B,OAAO,GAAE,mBAAwB,GAChC,UAAU,CA2CZ"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ /** Node-only Next.js configuration for same-origin FluxFast applications. */
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.withFluxFast = withFluxFast;
5
+ const config_1 = require("./config");
6
+ const generate_1 = require("./generate");
7
+ /**
8
+ * Add registry generation and a header-gated backend proxy to a Next config.
9
+ * Normal document requests still resolve through the Next catch-all page;
10
+ * only requests marked by the FluxFast transport reach FastAPI.
11
+ */
12
+ function withFluxFast(nextConfig = {}, options = {}) {
13
+ if (options.generate !== false) {
14
+ (0, generate_1.generatePagesRegistry)({
15
+ pagesDir: options.pagesDir,
16
+ outputFile: options.outputFile,
17
+ });
18
+ }
19
+ const backendUrl = (0, config_1.resolveFluxBackendUrl)(options.backendUrl);
20
+ const configuredRewrites = nextConfig.rewrites;
21
+ return {
22
+ ...nextConfig,
23
+ async rewrites() {
24
+ const existing = configuredRewrites
25
+ ? await configuredRewrites.call(nextConfig)
26
+ : [];
27
+ const proxy = {
28
+ source: "/:path*",
29
+ has: [
30
+ {
31
+ type: "header",
32
+ key: "x-fluxfast",
33
+ value: "1",
34
+ },
35
+ ],
36
+ destination: `${backendUrl}/:path*`,
37
+ };
38
+ if (Array.isArray(existing)) {
39
+ return {
40
+ beforeFiles: [proxy],
41
+ afterFiles: existing,
42
+ fallback: [],
43
+ };
44
+ }
45
+ return {
46
+ beforeFiles: [proxy, ...(existing.beforeFiles ?? [])],
47
+ afterFiles: existing.afterFiles ?? [],
48
+ fallback: existing.fallback ?? [],
49
+ };
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=next-config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"next-config.js","sourceRoot":"","sources":["../src/next-config.ts"],"names":[],"mappings":";AAAA,6EAA6E;;;AAG7E,qCAAiD;AACjD,yCAAoE;AAOpE;;;;GAIG;AACH,sBACE,UAAU,GAAe,EAAE,EAC3B,OAAO,GAAwB,EAAE;IAEjC,IAAI,OAAO,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QAC/B,IAAA,gCAAqB,EAAC;YACpB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,UAAU,GAAG,IAAA,8BAAqB,EAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAC7D,MAAM,kBAAkB,GAAG,UAAU,CAAC,QAAQ,CAAC;IAE/C,OAAO;QACL,GAAG,UAAU;QACb,KAAK,CAAC,QAAQ;YACZ,MAAM,QAAQ,GAAG,kBAAkB;gBACjC,CAAC,CAAC,MAAM,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;gBAC3C,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,KAAK,GAAG;gBACZ,MAAM,EAAE,SAAS;gBACjB,GAAG,EAAE;oBACH;wBACE,IAAI,EAAE,QAAiB;wBACvB,GAAG,EAAE,YAAY;wBACjB,KAAK,EAAE,GAAG;qBACX;iBACF;gBACD,WAAW,EAAE,GAAG,UAAU,SAAS;aACpC,CAAC;YAEF,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,WAAW,EAAE,CAAC,KAAK,CAAC;oBACpB,UAAU,EAAE,QAAQ;oBACpB,QAAQ,EAAE,EAAE;iBACb,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,WAAW,EAAE,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC;gBACrD,UAAU,EAAE,QAAQ,CAAC,UAAU,IAAI,EAAE;gBACrC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,IAAI,EAAE;aAClC,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,20 @@
1
+ import React from "react";
2
+ import { FluxRouter, PageEnvelope } from "@fluxfast/core";
3
+ import { ComponentRegistry } from "./resolver";
4
+ import { FluxCacheConfig } from "./config";
5
+ export interface FluxContextValue {
6
+ router: FluxRouter;
7
+ registry: ComponentRegistry;
8
+ }
9
+ export declare const FluxContext: React.Context<FluxContextValue | null>;
10
+ export interface FluxProviderProps {
11
+ initialEnvelope?: PageEnvelope;
12
+ registry?: ComponentRegistry;
13
+ router?: FluxRouter;
14
+ clientUrl?: string;
15
+ cache?: FluxCacheConfig;
16
+ children: React.ReactNode;
17
+ }
18
+ export declare function FluxProvider({ initialEnvelope, registry, router: customRouter, clientUrl, cache, children, }: FluxProviderProps): React.JSX.Element;
19
+ export declare function useFluxContext(): FluxContextValue;
20
+ //# sourceMappingURL=provider.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.d.ts","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAwD,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAwB,UAAU,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,UAAU,CAAC;IACnB,QAAQ,EAAE,iBAAiB,CAAC;CAC7B;AAED,eAAO,MAAM,WAAW,wCAA+C,CAAC;AAExE,MAAM,WAAW,iBAAiB;IAChC,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAC;CAC3B;AAED,wBAAgB,YAAY,CAAC,EAC3B,eAAe,EACf,QAAQ,EACR,MAAM,EAAE,YAAY,EACpB,SAAS,EACT,KAAK,EACL,QAAQ,GACT,EAAE,iBAAiB,qBAgCnB;AAED,wBAAgB,cAAc,IAAI,gBAAgB,CAQjD"}
@@ -0,0 +1,41 @@
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, registry, router: customRouter, clientUrl, cache, children, }) {
12
+ const router = (0, react_1.useMemo)(() => {
13
+ if (customRouter) {
14
+ return customRouter;
15
+ }
16
+ return new core_1.FluxRouter({
17
+ initialPage: initialEnvelope?.page,
18
+ initialResources: initialEnvelope?.resources,
19
+ transport: (0, core_1.createFetchTransport)(clientUrl),
20
+ maxResources: cache?.maxResources,
21
+ maxPages: cache?.maxPages,
22
+ deferHistory: true,
23
+ });
24
+ }, [customRouter, clientUrl, cache?.maxPages, cache?.maxResources]);
25
+ const value = (0, react_1.useMemo)(() => ({ router, registry: registry ?? {} }), [router, registry]);
26
+ (0, react_1.useEffect)(() => {
27
+ if (customRouter)
28
+ return;
29
+ router.startHistory();
30
+ return () => router.stopHistory();
31
+ }, [customRouter, router]);
32
+ return ((0, jsx_runtime_1.jsx)(exports.FluxContext.Provider, { value: value, children: children }));
33
+ }
34
+ function useFluxContext() {
35
+ const ctx = (0, react_1.useContext)(exports.FluxContext);
36
+ if (!ctx) {
37
+ throw new Error("useFluxContext must be used within a <FluxProvider> or <FluxRoot>");
38
+ }
39
+ return ctx;
40
+ }
41
+ //# sourceMappingURL=provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"provider.js","sourceRoot":"","sources":["../src/provider.tsx"],"names":[],"mappings":";AAAA,YAAY,CAAC;;;;;;AAEb,iCAA6E;AAC7E,yCAAgF;AASnE,QAAA,WAAW,GAAG,IAAA,qBAAa,EAA0B,IAAI,CAAC,CAAC;AAWxE,sBAA6B,EAC3B,eAAe,EACf,QAAQ,EACR,MAAM,EAAE,YAAY,EACpB,SAAS,EACT,KAAK,EACL,QAAQ,GACU;IAClB,MAAM,MAAM,GAAG,IAAA,eAAO,EAAC,GAAG,EAAE;QAC1B,IAAI,YAAY,EAAE,CAAC;YACjB,OAAO,YAAY,CAAC;QACtB,CAAC;QAED,OAAO,IAAI,iBAAU,CAAC;YACpB,WAAW,EAAE,eAAe,EAAE,IAAI;YAClC,gBAAgB,EAAE,eAAe,EAAE,SAAS;YAC5C,SAAS,EAAE,IAAA,2BAAoB,EAAC,SAAS,CAAC;YAC1C,YAAY,EAAE,KAAK,EAAE,YAAY;YACjC,QAAQ,EAAE,KAAK,EAAE,QAAQ;YACzB,YAAY,EAAE,IAAI;SACnB,CAAC,CAAC;IACL,CAAC,EAAE,CAAC,YAAY,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,IAAA,eAAO,EACnB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,IAAI,EAAE,EAAE,CAAC,EAC5C,CAAC,MAAM,EAAE,QAAQ,CAAC,CACnB,CAAC;IAEF,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,YAAY;YAAE,OAAO;QACzB,MAAM,CAAC,YAAY,EAAE,CAAC;QACtB,OAAO,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;IACpC,CAAC,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAE3B,OAAO,CACL,uBAAC,QAAA,WAAW,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,YAC/B,QAAQ,GACY,CACxB,CAAC;AACJ,CAAC;AAED;IACE,MAAM,GAAG,GAAG,IAAA,kBAAU,EAAC,QAAA,WAAW,CAAC,CAAC;IACpC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CACb,mEAAmE,CACpE,CAAC;IACJ,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -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,CAgB1B"}
@@ -0,0 +1,37 @@
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 = registry[identifier];
24
+ if (!entry) {
25
+ const known = Object.keys(registry).sort().map(key => `- ${key}`).join("\n");
26
+ 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)"}`);
27
+ }
28
+ if (!isLazyEntry(entry))
29
+ return entry;
30
+ let component = lazyComponents.get(entry);
31
+ if (!component) {
32
+ component = react_1.default.lazy(entry.load);
33
+ lazyComponents.set(entry, component);
34
+ }
35
+ return component;
36
+ }
37
+ //# 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,QAAQ,CAAC,UAAU,CAAC,CAAC;IACnC,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,13 @@
1
+ import React, { ReactNode } from "react";
2
+ import { PageEnvelope } from "@fluxfast/core";
3
+ import { ComponentRegistry } from "./resolver";
4
+ import { FluxCacheConfig } from "./config";
5
+ export interface FluxRootProps {
6
+ initialEnvelope?: PageEnvelope;
7
+ registry: ComponentRegistry;
8
+ clientUrl?: string;
9
+ cache?: FluxCacheConfig;
10
+ errorFallback?: (error: Error) => ReactNode;
11
+ }
12
+ export declare function FluxRoot({ initialEnvelope, registry, clientUrl, cache, errorFallback, }: FluxRootProps): React.JSX.Element;
13
+ //# 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,YAAY,CAAC;AACjE,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AA0D3C,MAAM,WAAW,aAAa;IAC5B,eAAe,CAAC,EAAE,YAAY,CAAC;IAC/B,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,QAAQ,EACR,SAAS,EACT,KAAK,EACL,aAAa,GACd,EAAE,aAAa,qBAWf"}
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_1 = require("./provider");
8
+ const hooks_1 = require("./hooks");
9
+ const resolver_1 = require("./resolver");
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_1.useFluxContext)();
31
+ const PageComponent = (0, resolver_1.resolveComponent)(component, registry);
32
+ return (0, jsx_runtime_1.jsx)(PageComponent, {});
33
+ }
34
+ function PageRenderer({ fallback }) {
35
+ const page = (0, hooks_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, registry, clientUrl, cache, errorFallback, }) {
41
+ return ((0, jsx_runtime_1.jsx)(provider_1.FluxProvider, { initialEnvelope: initialEnvelope, 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,yCAA0D;AAC1D,mCAAkC;AAClC,yCAAiE;AAajE,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,yBAAc,GAAE,CAAC;IACtC,MAAM,aAAa,GAAG,IAAA,2BAAgB,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,eAAO,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;AAUD,kBAAyB,EACvB,eAAe,EACf,QAAQ,EACR,SAAS,EACT,KAAK,EACL,aAAa,GACC;IACd,OAAO,CACL,uBAAC,uBAAY,IACX,eAAe,EAAE,eAAe,EAChC,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,22 @@
1
+ /** Next.js server-side helpers for the initial document request. */
2
+ import React from "react";
3
+ import { PageEnvelope } from "@fluxfast/core";
4
+ import { FluxNextConfig } from "./config";
5
+ export interface FetchInitialEnvelopeOptions {
6
+ backendUrl: string;
7
+ path: string;
8
+ headers?: Record<string, string>;
9
+ }
10
+ export type FluxSearchParams = Record<string, string | string[] | undefined>;
11
+ export interface FluxNextPageProps {
12
+ params: Promise<{
13
+ flux?: string[];
14
+ }> | {
15
+ flux?: string[];
16
+ };
17
+ searchParams?: Promise<FluxSearchParams> | FluxSearchParams;
18
+ }
19
+ export declare function buildFluxPath(segments: string[] | undefined, searchParams?: FluxSearchParams): string;
20
+ export declare function fetchInitialEnvelope({ backendUrl, path, headers, }: FetchInitialEnvelopeOptions): Promise<PageEnvelope>;
21
+ export declare function createFluxNextPage(config: FluxNextConfig): ({ params, searchParams, }: FluxNextPageProps) => Promise<React.ReactElement<import("./config").FluxApplicationProps, string | React.JSXElementConstructor<any>>>;
22
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,oEAAoE;AAEpE,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,OAAO,EAEL,YAAY,EAGb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,cAAc,EAAyB,MAAM,UAAU,CAAC;AAEjE,MAAM,WAAW,2BAA2B;IAC1C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,CACnC,MAAM,EACN,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAC9B,CAAC;AAEF,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,OAAO,CAAC;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAC3D,YAAY,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;CAC7D;AAsBD,wBAAgB,aAAa,CAC3B,QAAQ,EAAE,MAAM,EAAE,GAAG,SAAS,EAC9B,YAAY,GAAE,gBAAqB,GAClC,MAAM,CAcR;AAED,wBAAsB,oBAAoB,CAAC,EACzC,UAAU,EACV,IAAI,EACJ,OAAY,GACb,EAAE,2BAA2B,GAAG,OAAO,CAAC,YAAY,CAAC,CAyCrD;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,cAAc,+BAIpD,iBAAiB,qHA6BrB"}
package/dist/server.js ADDED
@@ -0,0 +1,117 @@
1
+ "use strict";
2
+ /** Next.js server-side helpers for the initial document request. */
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.buildFluxPath = buildFluxPath;
8
+ exports.fetchInitialEnvelope = fetchInitialEnvelope;
9
+ exports.createFluxNextPage = createFluxNextPage;
10
+ const react_1 = __importDefault(require("react"));
11
+ const headers_1 = require("next/headers");
12
+ const navigation_1 = require("next/navigation");
13
+ const core_1 = require("@fluxfast/core");
14
+ const config_1 = require("./config");
15
+ const DEFAULT_FORWARDED_HEADERS = [
16
+ "cookie",
17
+ "authorization",
18
+ "accept-language",
19
+ "user-agent",
20
+ ];
21
+ const NEVER_FORWARD = new Set([
22
+ "connection",
23
+ "content-length",
24
+ "host",
25
+ "keep-alive",
26
+ "proxy-authenticate",
27
+ "proxy-authorization",
28
+ "te",
29
+ "trailer",
30
+ "transfer-encoding",
31
+ "upgrade",
32
+ ]);
33
+ function buildFluxPath(segments, searchParams = {}) {
34
+ const pathname = segments?.length
35
+ ? `/${segments.map(encodeURIComponent).join("/")}`
36
+ : "/";
37
+ const query = new URLSearchParams();
38
+ for (const [key, value] of Object.entries(searchParams)) {
39
+ if (Array.isArray(value)) {
40
+ for (const item of value)
41
+ query.append(key, item);
42
+ }
43
+ else if (value !== undefined) {
44
+ query.append(key, value);
45
+ }
46
+ }
47
+ const encoded = query.toString();
48
+ return encoded ? `${pathname}?${encoded}` : pathname;
49
+ }
50
+ async function fetchInitialEnvelope({ backendUrl, path, headers = {}, }) {
51
+ if (!path.startsWith("/") || path.startsWith("//")) {
52
+ throw new TypeError("FluxFast initial paths must be origin-relative");
53
+ }
54
+ const fullUrl = `${backendUrl.replace(/\/$/, "")}${path}`;
55
+ const response = await fetch(fullUrl, {
56
+ method: "GET",
57
+ headers: {
58
+ ...headers,
59
+ Accept: core_1.PROTOCOL_MEDIA_TYPE,
60
+ "X-FluxFast": "1",
61
+ "X-FluxFast-Protocol": "1",
62
+ "X-FluxFast-Visit": `ssr_${Date.now().toString(36)}`,
63
+ },
64
+ cache: "no-store",
65
+ });
66
+ let data;
67
+ try {
68
+ data = await response.json();
69
+ }
70
+ catch {
71
+ throw new core_1.TransportError(`Failed to parse initial FluxFast response from ${fullUrl} (HTTP ${response.status})`, response.status);
72
+ }
73
+ if (response.status === 404) {
74
+ (0, navigation_1.notFound)();
75
+ }
76
+ if (!response.ok) {
77
+ const detail = data;
78
+ throw new core_1.TransportError(detail.error?.message ??
79
+ detail.detail ??
80
+ `Failed to fetch initial FluxFast envelope from ${fullUrl} (HTTP ${response.status})`, response.status, data);
81
+ }
82
+ (0, core_1.assertPageEnvelope)(data);
83
+ return data;
84
+ }
85
+ function createFluxNextPage(config) {
86
+ return async function FluxNextPage({ params, searchParams = {}, }) {
87
+ const [resolvedParams, resolvedSearch, incomingHeaders] = await Promise.all([
88
+ params,
89
+ searchParams,
90
+ (0, headers_1.headers)(),
91
+ ]);
92
+ const path = buildFluxPath(resolvedParams.flux, resolvedSearch);
93
+ const allowed = new Set([
94
+ ...DEFAULT_FORWARDED_HEADERS,
95
+ ...(config.forwardHeaders ?? []).map(name => name.toLowerCase()),
96
+ ]);
97
+ const forwarded = {};
98
+ for (const name of allowed) {
99
+ if (NEVER_FORWARD.has(name) || !/^[!#$%&'*+.^_`|~0-9a-z-]+$/.test(name))
100
+ continue;
101
+ const value = incomingHeaders.get(name);
102
+ if (value !== null)
103
+ forwarded[name] = value;
104
+ }
105
+ const initialEnvelope = await fetchInitialEnvelope({
106
+ backendUrl: (0, config_1.resolveFluxBackendUrl)(config.backendUrl),
107
+ path,
108
+ headers: forwarded,
109
+ });
110
+ return react_1.default.createElement(config.application, {
111
+ initialEnvelope,
112
+ clientUrl: config.clientUrl,
113
+ cache: config.cache,
114
+ });
115
+ };
116
+ }
117
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,87 @@
1
+ {
2
+ "name": "@fluxfast/next",
3
+ "version": "0.0.0-oidc-bootstrap.0",
4
+ "license": "MIT",
5
+ "description": "Next.js App Router adapter for FluxFast",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/El37628/FluxFast.git",
9
+ "directory": "packages/next"
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/index.js",
24
+ "types": "./dist/index.d.ts",
25
+ "files": [
26
+ "bin",
27
+ "dist"
28
+ ],
29
+ "bin": {
30
+ "fluxfast": "bin/fluxfast.js"
31
+ },
32
+ "exports": {
33
+ ".": {
34
+ "types": "./dist/index.d.ts",
35
+ "import": "./dist/index.js",
36
+ "require": "./dist/index.js",
37
+ "default": "./dist/index.js"
38
+ },
39
+ "./server": {
40
+ "types": "./dist/server.d.ts",
41
+ "import": "./dist/server.js",
42
+ "require": "./dist/server.js",
43
+ "default": "./dist/server.js"
44
+ },
45
+ "./client": {
46
+ "types": "./dist/client.d.ts",
47
+ "import": "./dist/client.js",
48
+ "require": "./dist/client.js",
49
+ "default": "./dist/client.js"
50
+ },
51
+ "./generate": {
52
+ "types": "./dist/generate.d.ts",
53
+ "import": "./dist/generate.js",
54
+ "require": "./dist/generate.js",
55
+ "default": "./dist/generate.js"
56
+ },
57
+ "./next-config": {
58
+ "types": "./dist/next-config.d.ts",
59
+ "import": "./dist/next-config.js",
60
+ "require": "./dist/next-config.js",
61
+ "default": "./dist/next-config.js"
62
+ }
63
+ },
64
+ "scripts": {
65
+ "build": "tsc",
66
+ "typecheck": "tsc --noEmit",
67
+ "test": "vitest run"
68
+ },
69
+ "dependencies": {
70
+ "@fluxfast/core": "0.0.0-oidc-bootstrap.0"
71
+ },
72
+ "peerDependencies": {
73
+ "next": ">=16.3.0 <17.0.0",
74
+ "react": ">=19.0.0",
75
+ "react-dom": ">=19.0.0"
76
+ },
77
+ "devDependencies": {
78
+ "@types/node": "^22.0.0",
79
+ "@types/react": "^19.0.0",
80
+ "@types/react-dom": "^19.0.0",
81
+ "next": "^16.3.0",
82
+ "react": "^19.0.0",
83
+ "react-dom": "^19.0.0",
84
+ "typescript": "^7.0.2",
85
+ "vitest": "^4.1.11"
86
+ }
87
+ }