@fluxfast/vite 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 (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +76 -0
  3. package/bin/fluxfast-vite.js +11 -0
  4. package/dist/agent-knowledge.d.ts +6 -0
  5. package/dist/agent-knowledge.d.ts.map +1 -0
  6. package/dist/agent-knowledge.js +157 -0
  7. package/dist/agent-knowledge.js.map +1 -0
  8. package/dist/assets.d.ts +9 -0
  9. package/dist/assets.d.ts.map +1 -0
  10. package/dist/assets.js +73 -0
  11. package/dist/assets.js.map +1 -0
  12. package/dist/bridge.d.ts +6 -0
  13. package/dist/bridge.d.ts.map +1 -0
  14. package/dist/bridge.js +66 -0
  15. package/dist/bridge.js.map +1 -0
  16. package/dist/build.d.ts +4 -0
  17. package/dist/build.d.ts.map +1 -0
  18. package/dist/build.js +68 -0
  19. package/dist/build.js.map +1 -0
  20. package/dist/cli.d.ts +7 -0
  21. package/dist/cli.d.ts.map +1 -0
  22. package/dist/cli.js +141 -0
  23. package/dist/cli.js.map +1 -0
  24. package/dist/esm/agent-knowledge.js +152 -0
  25. package/dist/esm/agent-knowledge.js.map +1 -0
  26. package/dist/esm/assets.js +65 -0
  27. package/dist/esm/assets.js.map +1 -0
  28. package/dist/esm/bridge.js +62 -0
  29. package/dist/esm/bridge.js.map +1 -0
  30. package/dist/esm/build.js +62 -0
  31. package/dist/esm/build.js.map +1 -0
  32. package/dist/esm/cli.js +135 -0
  33. package/dist/esm/cli.js.map +1 -0
  34. package/dist/esm/generation.js +30 -0
  35. package/dist/esm/generation.js.map +1 -0
  36. package/dist/esm/health.js +55 -0
  37. package/dist/esm/health.js.map +1 -0
  38. package/dist/esm/index.js +3 -0
  39. package/dist/esm/index.js.map +1 -0
  40. package/dist/esm/options.js +58 -0
  41. package/dist/esm/options.js.map +1 -0
  42. package/dist/esm/package.json +3 -0
  43. package/dist/esm/plugin.js +46 -0
  44. package/dist/esm/plugin.js.map +1 -0
  45. package/dist/esm/project.js +88 -0
  46. package/dist/esm/project.js.map +1 -0
  47. package/dist/esm/server.js +206 -0
  48. package/dist/esm/server.js.map +1 -0
  49. package/dist/esm/setup.js +223 -0
  50. package/dist/esm/setup.js.map +1 -0
  51. package/dist/generation.d.ts +14 -0
  52. package/dist/generation.d.ts.map +1 -0
  53. package/dist/generation.js +38 -0
  54. package/dist/generation.js.map +1 -0
  55. package/dist/health.d.ts +4 -0
  56. package/dist/health.d.ts.map +1 -0
  57. package/dist/health.js +59 -0
  58. package/dist/health.js.map +1 -0
  59. package/dist/index.d.ts +4 -0
  60. package/dist/index.d.ts.map +1 -0
  61. package/dist/index.js +8 -0
  62. package/dist/index.js.map +1 -0
  63. package/dist/options.d.ts +41 -0
  64. package/dist/options.d.ts.map +1 -0
  65. package/dist/options.js +67 -0
  66. package/dist/options.js.map +1 -0
  67. package/dist/plugin.d.ts +5 -0
  68. package/dist/plugin.d.ts.map +1 -0
  69. package/dist/plugin.js +49 -0
  70. package/dist/plugin.js.map +1 -0
  71. package/dist/project.d.ts +24 -0
  72. package/dist/project.d.ts.map +1 -0
  73. package/dist/project.js +99 -0
  74. package/dist/project.js.map +1 -0
  75. package/dist/server.d.ts +18 -0
  76. package/dist/server.d.ts.map +1 -0
  77. package/dist/server.js +212 -0
  78. package/dist/server.js.map +1 -0
  79. package/dist/setup.d.ts +18 -0
  80. package/dist/setup.d.ts.map +1 -0
  81. package/dist/setup.js +231 -0
  82. package/dist/setup.js.map +1 -0
  83. package/package.json +72 -0
@@ -0,0 +1,135 @@
1
+ import { buildFluxViteApp } from "./build.js";
2
+ import { createFluxViteServer } from "./server.js";
3
+ import path from "node:path";
4
+ const USAGE = `Usage:
5
+ fluxfast-vite init [--dry-run] [--yes] [--force]
6
+ fluxfast-vite init --check
7
+ fluxfast-vite generate [--check] [--schema-file PATH]
8
+ fluxfast-vite doctor
9
+ fluxfast-vite dev [--config PATH] [--hostname HOST] [--port PORT]
10
+ fluxfast-vite build [--config PATH]
11
+ fluxfast-vite start [--hostname HOST] [--port PORT]
12
+ Build and serve use the configured fluxfast() Vite plugin; start reads built artifacts only.`;
13
+ async function runSetup(command, args, io) {
14
+ const allowed = command === "init" ? ["--dry-run", "--yes", "--force", "--check"] : command === "generate" ? ["--check", "--schema-file"] : [];
15
+ const seen = new Set();
16
+ let schemaFile;
17
+ for (let index = 0; index < args.length; index++) {
18
+ const flag = args[index];
19
+ if (!allowed.includes(flag) || seen.has(flag)) {
20
+ io.stderr(USAGE);
21
+ return 2;
22
+ }
23
+ seen.add(flag);
24
+ if (flag === "--schema-file") {
25
+ schemaFile = args[++index];
26
+ if (!schemaFile || schemaFile.startsWith("--")) {
27
+ io.stderr(USAGE);
28
+ return 2;
29
+ }
30
+ }
31
+ }
32
+ if (command === "init" && seen.has("--check") && args.length !== 1) {
33
+ io.stderr(USAGE);
34
+ return 2;
35
+ }
36
+ try {
37
+ const { projectAt, relativeFile, validatePackages } = await import("./project.js");
38
+ const { planSetup, applySetup, checkSetup } = await import("./setup.js");
39
+ const { generateProject } = await import("./generation.js");
40
+ const project = projectAt(io.cwd);
41
+ validatePackages(project);
42
+ if (command === "generate") {
43
+ const result = generateProject(project, seen.has("--check"), schemaFile);
44
+ io.stdout(result.current ? (seen.has("--check") ? "Generated FluxFast files are current." : "Generated FluxFast registry/contracts.") : "Generated FluxFast files are missing or stale; rerun generation without --check.");
45
+ return result.current ? 0 : 1;
46
+ }
47
+ if (command === "doctor" || seen.has("--check")) {
48
+ const problems = [...checkSetup(project)];
49
+ if (!generateProject(project, true).current)
50
+ problems.push("Generated FluxFast files are missing or stale");
51
+ problems.forEach(problem => io.stderr(problem));
52
+ if (!problems.length)
53
+ io.stdout("FluxFast React/Vite setup and generated files are current. Production/runtime diagnostics remain separate.");
54
+ return problems.length ? 1 : 0;
55
+ }
56
+ const plan = planSetup(project, seen.has("--force"));
57
+ if (seen.has("--dry-run")) {
58
+ plan.changes.forEach(change => io.stdout("Would update " + relativeFile(project, change.file)));
59
+ io.stdout("Would generate the React registry/contracts. No files were changed.");
60
+ return 0;
61
+ }
62
+ applySetup(plan);
63
+ io.stdout("FluxFast React/Vite initialized. Existing SPA entries, configuration and scripts were preserved.");
64
+ io.stdout("Use npm run fluxfast:dev, fluxfast:build and fluxfast:start (or the project's package manager).");
65
+ return 0;
66
+ }
67
+ catch (error) {
68
+ io.stderr(error instanceof Error ? error.message : "FluxFast setup failed");
69
+ return 1;
70
+ }
71
+ }
72
+ export async function runViteCli(args, io = { cwd: process.cwd(), stdout: console.log, stderr: console.error }) {
73
+ if (!args.length || args.length === 1 && ["--help", "-h"].includes(args[0])) {
74
+ io.stdout(USAGE);
75
+ return 0;
76
+ }
77
+ const [command, ...flags] = args;
78
+ if (["init", "generate", "doctor"].includes(command))
79
+ return runSetup(command, flags, io);
80
+ if (!["dev", "build", "start"].includes(command)) {
81
+ io.stderr(USAGE);
82
+ return 2;
83
+ }
84
+ let host = "127.0.0.1";
85
+ let port = 3000;
86
+ let configFile;
87
+ const seen = new Set();
88
+ for (let index = 0; index < flags.length; index += 1) {
89
+ const flag = flags[index];
90
+ const value = flags[++index];
91
+ const allowed = command === "build" ? ["--config"] : command === "start" ? ["--hostname", "--port"] : ["--config", "--hostname", "--port"];
92
+ if (!allowed.includes(flag) || seen.has(flag) || !value || value.startsWith("--")) {
93
+ io.stderr(USAGE);
94
+ return 2;
95
+ }
96
+ seen.add(flag);
97
+ if (flag === "--config")
98
+ configFile = path.resolve(io.cwd, value);
99
+ else if (flag === "--hostname")
100
+ host = value;
101
+ else if (/^\d+$/.test(value) && Number(value) >= 1 && Number(value) <= 65535)
102
+ port = Number(value);
103
+ else {
104
+ io.stderr(USAGE);
105
+ return 2;
106
+ }
107
+ }
108
+ try {
109
+ if (command === "build") {
110
+ await buildFluxViteApp({ root: io.cwd, configFile });
111
+ return 0;
112
+ }
113
+ const server = await createFluxViteServer({ root: io.cwd, configFile, mode: command === "start" ? "production" : "development", host, port });
114
+ io.stdout(`FluxFast ${command === "start" ? "production" : "development"} host listening on ${server.url}`);
115
+ let stopping = false;
116
+ const stop = () => {
117
+ if (stopping)
118
+ return;
119
+ stopping = true;
120
+ void server.close().then(() => {
121
+ process.removeListener("SIGINT", stop);
122
+ process.removeListener("SIGTERM", stop);
123
+ process.exitCode = 0;
124
+ }, () => { process.exitCode = 1; });
125
+ };
126
+ process.on("SIGINT", stop);
127
+ process.on("SIGTERM", stop);
128
+ return 0;
129
+ }
130
+ catch {
131
+ io.stderr("FluxFast host failed. Check the application, fluxfast() configuration, built artifacts, and private backend configuration.");
132
+ return 1;
133
+ }
134
+ }
135
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import { checkFluxFastProject, createPagesRegistrySnapshot, generateFluxFastProject } from "@fluxfast/codegen";
4
+ import { assertSafePath, GENERATED_ARTIFACTS } from "./project.js";
5
+ export function generationOptions(project, schemaFile) {
6
+ assertSafePath(project.root, project.pages);
7
+ assertSafePath(project.root, project.registry);
8
+ // The existing schema is also an input; do not read it through a symlink.
9
+ for (const name of GENERATED_ARTIFACTS)
10
+ assertSafePath(project.root, path.join(project.generated, name));
11
+ return {
12
+ registry: createPagesRegistrySnapshot({ pagesDir: project.pages, outputFile: project.registry,
13
+ target: { runtimeImport: "@fluxfast/react", rootExport: "FluxRoot", applicationPropsExport: "FluxApplicationProps", clientDirective: false } }),
14
+ generatedDir: project.generated, log: false,
15
+ ...(schemaFile === undefined ? {} : { schemaContent: fs.readFileSync(path.resolve(project.root, schemaFile), "utf8") }),
16
+ };
17
+ }
18
+ export function generateProject(project, check, schemaFile) {
19
+ const options = generationOptions(project, schemaFile);
20
+ if (check) {
21
+ const result = checkFluxFastProject(options);
22
+ return { current: result.current, files: result.staleFiles };
23
+ }
24
+ return { current: true, files: generateFluxFastProject(options).generatedFiles };
25
+ }
26
+ /** Compile existing contracts before initialization can write any scaffold. */
27
+ export function validateGeneration(project) {
28
+ checkFluxFastProject(generationOptions(project));
29
+ }
30
+ //# sourceMappingURL=generation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generation.js","sourceRoot":"","sources":["../../src/generation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,oBAAoB,EAAE,2BAA2B,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC/G,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAwB,MAAM,cAAc,CAAC;AAEzF,MAAM,UAAU,iBAAiB,CAAC,OAAwB,EAAE,UAAmB;IAC7E,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,0EAA0E;IAC1E,KAAK,MAAM,IAAI,IAAI,mBAAmB;QAAE,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACzG,OAAO;QACL,QAAQ,EAAE,2BAA2B,CAAC,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,CAAC,QAAQ;YAC3F,MAAM,EAAE,EAAE,aAAa,EAAE,iBAAiB,EAAE,UAAU,EAAE,UAAU,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,eAAe,EAAE,KAAK,EAAE,EAAE,CAAC;QACjJ,YAAY,EAAE,OAAO,CAAC,SAAS,EAAE,GAAG,EAAE,KAAK;QAC3C,GAAG,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;KACxH,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAwB,EAAE,KAAc,EAAE,UAAmB;IAC3F,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,UAAU,CAAC,CAAC;IACvD,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,MAAM,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,UAAU,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,uBAAuB,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;AACnF,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,kBAAkB,CAAC,OAAwB;IACzD,oBAAoB,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC"}
@@ -0,0 +1,55 @@
1
+ /** Host-owned minimal probes. No authentication, ports, paths, or upstream text. */
2
+ export function healthProbe(request) {
3
+ const path = new URL(request.url).pathname.replace(/\/$/, "");
4
+ return /^\/(?:_?fluxfast)\/(healthz|readyz)$/.exec(path)?.[1];
5
+ }
6
+ function statusResponse(status, code, head) {
7
+ return new Response(head ? null : JSON.stringify({ status }), {
8
+ status: code, headers: { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" },
9
+ });
10
+ }
11
+ export async function serveHealth(request, backendUrl, stopping) {
12
+ const probe = healthProbe(request);
13
+ const head = request.method === "HEAD";
14
+ if (request.method !== "GET" && !head)
15
+ return new Response(null, { status: 405, headers: { allow: "GET, HEAD" } });
16
+ if (!probe || stopping)
17
+ return statusResponse("not_ready", 503, head);
18
+ const signal = AbortSignal.any([request.signal, AbortSignal.timeout(3_000)]);
19
+ try {
20
+ const target = backendUrl.replace(/\/$/, "") + "/_fluxfast/" + probe;
21
+ const upstream = await fetch(target, { headers: { accept: "application/json" }, redirect: "manual", cache: "no-store", signal });
22
+ const reader = upstream.body?.getReader();
23
+ if (!reader)
24
+ return statusResponse("not_ready", 503, head);
25
+ const chunks = [];
26
+ let bytes = 0;
27
+ try {
28
+ while (true) {
29
+ const { value, done } = await reader.read();
30
+ if (done)
31
+ break;
32
+ bytes += value.byteLength;
33
+ if (bytes > 4_096) {
34
+ void reader.cancel().catch(() => undefined);
35
+ return statusResponse("not_ready", 503, head);
36
+ }
37
+ chunks.push(value);
38
+ }
39
+ }
40
+ finally {
41
+ reader.releaseLock();
42
+ }
43
+ const payload = JSON.parse(Buffer.concat(chunks).toString("utf8"));
44
+ const status = payload && typeof payload === "object" && "status" in payload ? payload.status : undefined;
45
+ if (probe === "healthz" && upstream.status === 200 && status === "ok")
46
+ return statusResponse("ok", 200, head);
47
+ if (probe === "readyz" && upstream.status === 200 && status === "ready")
48
+ return statusResponse("ready", 200, head);
49
+ return statusResponse("not_ready", 503, head);
50
+ }
51
+ catch {
52
+ return statusResponse("not_ready", 503, head);
53
+ }
54
+ }
55
+ //# sourceMappingURL=health.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"health.js","sourceRoot":"","sources":["../../src/health.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { fluxfast } from "./plugin.js";
2
+ export { buildFluxViteApp } from "./build.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1,58 @@
1
+ import path from "node:path";
2
+ import { createFluxReactHandler } from "@fluxfast/react/server";
3
+ export const CLIENT_ENTRY = "/@fluxfast/client";
4
+ export const SERVER_ENTRY = "virtual:fluxfast/server";
5
+ export const CLIENT_ID = "\0fluxfast:client";
6
+ export const SERVER_ID = "\0fluxfast:server";
7
+ export const BUILD_DIRECTORY = "dist/fluxfast";
8
+ export function resolveOptions(root, options) {
9
+ const application = options.application ?? "src/.fluxfast/pages.generated.ts";
10
+ const applicationExport = options.applicationExport ?? "FluxApplication";
11
+ const template = options.template ?? "fluxfast.html";
12
+ if (typeof application !== "string" || !application || typeof template !== "string" || !template ||
13
+ !/^[A-Za-z_$][A-Za-z0-9_$]*$/.test(applicationExport)) {
14
+ throw new TypeError("FluxFast requires an application module, template, and valid export identifier");
15
+ }
16
+ if (options.diagnostics !== undefined && typeof options.diagnostics !== "boolean") {
17
+ throw new TypeError("FluxFast diagnostics must be boolean");
18
+ }
19
+ if (options.forwardHeaders !== undefined && (!Array.isArray(options.forwardHeaders) || options.forwardHeaders.some(name => typeof name !== "string"))) {
20
+ throw new TypeError("FluxFast forwardHeaders must be an array of header names");
21
+ }
22
+ // Reuse the SSR boundary's runtime validation without fetching or rendering.
23
+ // Configuration failure should precede build output replacement/listening.
24
+ createFluxReactHandler({ backendUrl: "http://fluxfast.invalid", render: async () => "", template: "",
25
+ ...(options.cache === undefined ? {} : { cache: options.cache }),
26
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
27
+ });
28
+ const templatePath = path.resolve(root, template);
29
+ const relativeTemplate = path.relative(root, templatePath);
30
+ if (!relativeTemplate || relativeTemplate.startsWith("..") || path.isAbsolute(relativeTemplate) || !/\.html?$/i.test(template)) {
31
+ throw new TypeError("FluxFast template must be an HTML file inside the frontend root");
32
+ }
33
+ return {
34
+ application: path.resolve(root, application).replace(/\\/g, "/"),
35
+ applicationExport,
36
+ template: templatePath,
37
+ diagnostics: options.diagnostics === true,
38
+ settings: {
39
+ ...(options.forwardHeaders === undefined ? {} : { forwardHeaders: options.forwardHeaders }),
40
+ ...(options.cache === undefined ? {} : { cache: options.cache }),
41
+ ...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs }),
42
+ },
43
+ };
44
+ }
45
+ /** Internal plugin metadata, not a separate consumer configuration API. */
46
+ export function configuredFluxOptions(config) {
47
+ const plugins = config.plugins.filter(plugin => plugin.name === "fluxfast");
48
+ const value = plugins.length === 1 ? plugins[0].api?.fluxfast : undefined;
49
+ if (!value)
50
+ throw new Error("Configure exactly one fluxfast() plugin in vite.config before building or serving");
51
+ return value;
52
+ }
53
+ export function safeAssetName(name) {
54
+ return !name.startsWith("/") && !/[\\\x00-\x1f\x7f%?#]/.test(name) &&
55
+ name.split("/").every(part => part.length > 0 && !part.startsWith(".")) &&
56
+ !/\.(?:html?|map)$/i.test(name);
57
+ }
58
+ //# sourceMappingURL=options.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/options.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ {
2
+ "type": "module"
3
+ }
@@ -0,0 +1,46 @@
1
+ import { CLIENT_ENTRY, CLIENT_ID, SERVER_ENTRY, SERVER_ID, resolveOptions } from "./options.js";
2
+ /** Vite module/build integration; application URLs continue to belong to FastAPI. */
3
+ export function fluxfast(options = {}) {
4
+ let configured;
5
+ const plugin = {
6
+ name: "fluxfast",
7
+ config(config) {
8
+ if (config.base !== undefined && config.base !== "/")
9
+ throw new Error("FluxFast Vite currently requires base '/' for same-origin application routing");
10
+ return {
11
+ appType: "custom", esbuild: { jsx: "automatic" }, resolve: { dedupe: ["react", "react-dom"] },
12
+ // The document uses a virtual client entry rather than a SPA script.
13
+ // Scan the real application (including lazy registry pages) up front so
14
+ // a first navigation cannot trigger dependency discovery and a reload.
15
+ optimizeDeps: {
16
+ entries: [options.application ?? "src/.fluxfast/pages.generated.ts"],
17
+ include: ["@fluxfast/react/client", "react", "react-dom", "react-dom/client", "react/jsx-runtime", "react/jsx-dev-runtime"],
18
+ },
19
+ };
20
+ },
21
+ configResolved(config) {
22
+ if (config.base !== "/")
23
+ throw new Error("FluxFast Vite currently requires base '/' for same-origin application routing");
24
+ configured = resolveOptions(config.root, options);
25
+ plugin.api = { fluxfast: configured };
26
+ },
27
+ resolveId(id) {
28
+ if (id === CLIENT_ENTRY || id === CLIENT_ID)
29
+ return CLIENT_ID;
30
+ if (id === SERVER_ENTRY || id === SERVER_ID)
31
+ return SERVER_ID;
32
+ },
33
+ load(id) {
34
+ if (id !== CLIENT_ID && id !== SERVER_ID)
35
+ return;
36
+ const application = JSON.stringify(configured.application);
37
+ const component = configured.applicationExport;
38
+ if (id === CLIENT_ID) {
39
+ return `import { ${component} as Application } from ${application};\nimport { hydrateFluxApplication } from "@fluxfast/react/client";\nhydrateFluxApplication(Application);\n`;
40
+ }
41
+ return `import { ${component} as Application } from ${application};\nimport { renderFluxApplication } from "@fluxfast/react/server";\nexport const settings = ${JSON.stringify(configured.settings)};\nexport function render(props, options) { return renderFluxApplication(Application, props, options); }\n`;
42
+ },
43
+ };
44
+ return plugin;
45
+ }
46
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/plugin.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,cAAc,EAAkD,MAAM,cAAc,CAAC;AAEhJ,qFAAqF;AACrF,MAAM,UAAU,QAAQ,CAAC,OAAO,GAAoB,EAAE;IACpD,IAAI,UAA+B,CAAC;IACpC,MAAM,MAAM,GAAW;QACrB,IAAI,EAAE,UAAU;QAChB,MAAM,CAAC,MAAM;YACX,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;YACvJ,OAAO;gBACL,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,CAAC,OAAO,EAAE,WAAW,CAAC,EAAE;gBAC7F,qEAAqE;gBACrE,wEAAwE;gBACxE,uEAAuE;gBACvE,YAAY,EAAE;oBACZ,OAAO,EAAE,CAAC,OAAO,CAAC,WAAW,IAAI,kCAAkC,CAAC;oBACpE,OAAO,EAAE,CAAC,wBAAwB,EAAE,OAAO,EAAE,WAAW,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,uBAAuB,CAAC;iBAC5H;aACF,CAAC;QACJ,CAAC;QACD,cAAc,CAAC,MAAM;YACnB,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG;gBAAE,MAAM,IAAI,KAAK,CAAC,+EAA+E,CAAC,CAAC;YAC1H,UAAU,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClD,MAAM,CAAC,GAAG,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,CAAC;QACxC,CAAC;QACD,SAAS,CAAC,EAAE;YACV,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;YAC9D,IAAI,EAAE,KAAK,YAAY,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO,SAAS,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,KAAK,SAAS,IAAI,EAAE,KAAK,SAAS;gBAAE,OAAO;YACjD,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC3D,MAAM,SAAS,GAAG,UAAU,CAAC,iBAAiB,CAAC;YAC/C,IAAI,EAAE,KAAK,SAAS,EAAE,CAAC;gBACrB,OAAO,YAAY,SAAS,0BAA0B,WAAW,6GAA6G,CAAC;YACjL,CAAC;YACD,OAAO,YAAY,SAAS,0BAA0B,WAAW,+FAA+F,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,4GAA4G,CAAC;QAClT,CAAC;KACF,CAAC;IACF,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,88 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ export const HOST_CONFIG = "fluxfast.vite.config.mjs";
4
+ export const HOST_TEMPLATE = "fluxfast.html";
5
+ export const GENERATED_ARTIFACTS = Object.freeze([
6
+ "pages.generated.ts", "schema.generated.json", "types.generated.ts",
7
+ "validators.generated.ts", "routes.generated.ts", "mutations.generated.ts",
8
+ ]);
9
+ export const HOST_SCRIPTS = Object.freeze({
10
+ "fluxfast:dev": `fluxfast-vite dev --config ${HOST_CONFIG}`,
11
+ "fluxfast:build": `fluxfast-vite build --config ${HOST_CONFIG}`,
12
+ "fluxfast:start": "fluxfast-vite start",
13
+ });
14
+ export function projectAt(start) {
15
+ let root = path.resolve(start);
16
+ while (!fs.existsSync(path.join(root, "package.json"))) {
17
+ const parent = path.dirname(root);
18
+ if (parent === root)
19
+ throw new Error("No frontend package.json found in this directory or its parents");
20
+ root = parent;
21
+ }
22
+ assertSafePath(root, path.join(root, "package.json"));
23
+ const manifestContent = fs.readFileSync(path.join(root, "package.json"), "utf8");
24
+ let manifest;
25
+ try {
26
+ manifest = JSON.parse(manifestContent);
27
+ }
28
+ catch {
29
+ throw new Error("Frontend package.json must contain valid JSON");
30
+ }
31
+ if (!manifest || typeof manifest !== "object" || Array.isArray(manifest))
32
+ throw new Error("Frontend package.json must contain an object");
33
+ const source = fs.existsSync(path.join(root, "src")) ? path.join(root, "src") : root;
34
+ assertSafePath(root, source);
35
+ if (!fs.statSync(source).isDirectory())
36
+ throw new Error("Frontend src must be a directory when present");
37
+ const generated = path.join(source, ".fluxfast");
38
+ return { root, source, pages: path.join(source, "flux-pages"), generated,
39
+ registry: path.join(generated, "pages.generated.ts"), manifest: manifest, manifestContent };
40
+ }
41
+ /** No scaffold or generated artifact may traverse a symlink, even an internal one. */
42
+ export function assertSafePath(root, target) {
43
+ const relative = path.relative(root, target);
44
+ if (relative === ".." || relative.startsWith(".." + path.sep) || path.isAbsolute(relative))
45
+ throw new Error("FluxFast output must stay inside the frontend root");
46
+ let current = root;
47
+ for (const segment of ["", ...relative.split(path.sep).filter(Boolean)]) {
48
+ current = path.join(current, segment);
49
+ try {
50
+ if (fs.lstatSync(current).isSymbolicLink())
51
+ throw new Error("FluxFast refuses to follow a scaffold or generated-output symlink");
52
+ }
53
+ catch (error) {
54
+ if (error.code === "ENOENT")
55
+ break;
56
+ throw error;
57
+ }
58
+ }
59
+ }
60
+ export function validatePackages(project) {
61
+ const declarations = {};
62
+ for (const section of ["dependencies", "devDependencies"]) {
63
+ const value = project.manifest[section] ?? {};
64
+ if (!value || typeof value !== "object" || Array.isArray(value) ||
65
+ Object.values(value).some(version => typeof version !== "string" || !version.trim()))
66
+ throw new Error("Package dependencies must be objects of non-empty version strings");
67
+ Object.assign(declarations, value);
68
+ }
69
+ if (declarations["@fluxfast/next"])
70
+ throw new Error("Initialize a separate React/Vite frontend rather than mixing Next and Vite adapters");
71
+ for (const name of ["@fluxfast/vite", "react", "react-dom", "vite"]) {
72
+ if (!declarations[name])
73
+ throw new Error(`Declare and install ${name} before initializing the React/Vite frontend; no packages are downloaded by this command`);
74
+ }
75
+ }
76
+ export function sourceViteConfig(project) {
77
+ const candidates = ["ts", "mts", "cts", "js", "mjs", "cjs"].map(extension => "vite.config." + extension)
78
+ .filter(name => fs.existsSync(path.join(project.root, name)));
79
+ if (candidates.length > 1)
80
+ throw new Error("Multiple source Vite configs found; keep one authoritative vite.config file before initializing");
81
+ if (candidates[0])
82
+ assertSafePath(project.root, path.join(project.root, candidates[0]));
83
+ return candidates[0];
84
+ }
85
+ export function relativeFile(project, target) {
86
+ return path.relative(project.root, target).replace(/\\/g, "/");
87
+ }
88
+ //# sourceMappingURL=project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"project.js","sourceRoot":"","sources":["../../src/project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAG,0BAA0B,CAAC;AACtD,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,CAAC;AAC7C,MAAM,CAAC,MAAM,mBAAmB,GAAG,MAAM,CAAC,MAAM,CAAC;IAC/C,oBAAoB,EAAE,uBAAuB,EAAE,oBAAoB;IACnE,yBAAyB,EAAE,qBAAqB,EAAE,wBAAwB;CAC3E,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC;IACxC,cAAc,EAAE,8BAA8B,WAAW,EAAE;IAC3D,gBAAgB,EAAE,gCAAgC,WAAW,EAAE;IAC/D,gBAAgB,EAAE,qBAAqB;CACxC,CAAC,CAAC;AAYH,MAAM,UAAU,SAAS,CAAC,KAAa;IACrC,IAAI,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC/B,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,EAAE,CAAC;QACvD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAClC,IAAI,MAAM,KAAK,IAAI;YAAE,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACxG,IAAI,GAAG,MAAM,CAAC;IAChB,CAAC;IACD,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC;IACtD,MAAM,eAAe,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAAC;IACjF,IAAI,QAAiB,CAAC;IACtB,IAAI,CAAC;QAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;IAAC,CAAC;IAC/C,MAAM,CAAC;QAAC,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IAAC,CAAC;IAC3E,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAC1I,MAAM,MAAM,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACrF,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE;QAAE,MAAM,IAAI,KAAK,CAAC,+CAA+C,CAAC,CAAC;IACzG,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IACjD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,EAAE,SAAS;QACtE,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,CAAC,EAAE,QAAQ,EAAE,QAAmC,EAAE,eAAe,EAAE,CAAC;AAC3H,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAc;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,QAAQ,KAAK,IAAI,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;IAClK,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,KAAK,MAAM,OAAO,IAAI,CAAC,EAAE,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;QACxE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,CAAC;YACH,IAAI,EAAE,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,cAAc,EAAE;gBAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QACnI,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM;YAAC,MAAM,KAAK,CAAC;QAAC,CAAC;IACjG,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAwB;IACvD,MAAM,YAAY,GAA4B,EAAE,CAAC;IACjD,KAAK,MAAM,OAAO,IAAI,CAAC,cAAc,EAAE,iBAAiB,CAAC,EAAE,CAAC;QAC1D,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;YAC3D,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mEAAmE,CAAC,CAAC;QAC/K,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,KAAK,CAAC,CAAC;IACrC,CAAC;IACD,IAAI,YAAY,CAAC,gBAAgB,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,qFAAqF,CAAC,CAAC;IAC3I,KAAK,MAAM,IAAI,IAAI,CAAC,gBAAgB,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,CAAC;QACpE,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,IAAI,0FAA0F,CAAC,CAAC;IAClK,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAAwB;IACvD,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,cAAc,GAAG,SAAS,CAAC;SACrG,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;IAChE,IAAI,UAAU,CAAC,MAAM,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,iGAAiG,CAAC,CAAC;IAC9I,IAAI,UAAU,CAAC,CAAC,CAAC;QAAE,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxF,OAAO,UAAU,CAAC,CAAC,CAAC,CAAC;AACvB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAwB,EAAE,MAAc;IACnE,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;AACjE,CAAC"}