@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.
- package/LICENSE +21 -0
- package/README.md +76 -0
- package/bin/fluxfast-vite.js +11 -0
- package/dist/agent-knowledge.d.ts +6 -0
- package/dist/agent-knowledge.d.ts.map +1 -0
- package/dist/agent-knowledge.js +157 -0
- package/dist/agent-knowledge.js.map +1 -0
- package/dist/assets.d.ts +9 -0
- package/dist/assets.d.ts.map +1 -0
- package/dist/assets.js +73 -0
- package/dist/assets.js.map +1 -0
- package/dist/bridge.d.ts +6 -0
- package/dist/bridge.d.ts.map +1 -0
- package/dist/bridge.js +66 -0
- package/dist/bridge.js.map +1 -0
- package/dist/build.d.ts +4 -0
- package/dist/build.d.ts.map +1 -0
- package/dist/build.js +68 -0
- package/dist/build.js.map +1 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +141 -0
- package/dist/cli.js.map +1 -0
- package/dist/esm/agent-knowledge.js +152 -0
- package/dist/esm/agent-knowledge.js.map +1 -0
- package/dist/esm/assets.js +65 -0
- package/dist/esm/assets.js.map +1 -0
- package/dist/esm/bridge.js +62 -0
- package/dist/esm/bridge.js.map +1 -0
- package/dist/esm/build.js +62 -0
- package/dist/esm/build.js.map +1 -0
- package/dist/esm/cli.js +135 -0
- package/dist/esm/cli.js.map +1 -0
- package/dist/esm/generation.js +30 -0
- package/dist/esm/generation.js.map +1 -0
- package/dist/esm/health.js +55 -0
- package/dist/esm/health.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/options.js +58 -0
- package/dist/esm/options.js.map +1 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/plugin.js +46 -0
- package/dist/esm/plugin.js.map +1 -0
- package/dist/esm/project.js +88 -0
- package/dist/esm/project.js.map +1 -0
- package/dist/esm/server.js +206 -0
- package/dist/esm/server.js.map +1 -0
- package/dist/esm/setup.js +223 -0
- package/dist/esm/setup.js.map +1 -0
- package/dist/generation.d.ts +14 -0
- package/dist/generation.d.ts.map +1 -0
- package/dist/generation.js +38 -0
- package/dist/generation.js.map +1 -0
- package/dist/health.d.ts +4 -0
- package/dist/health.d.ts.map +1 -0
- package/dist/health.js +59 -0
- package/dist/health.js.map +1 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/options.d.ts +41 -0
- package/dist/options.d.ts.map +1 -0
- package/dist/options.js +67 -0
- package/dist/options.js.map +1 -0
- package/dist/plugin.d.ts +5 -0
- package/dist/plugin.d.ts.map +1 -0
- package/dist/plugin.js +49 -0
- package/dist/plugin.js.map +1 -0
- package/dist/project.d.ts +24 -0
- package/dist/project.d.ts.map +1 -0
- package/dist/project.js +99 -0
- package/dist/project.js.map +1 -0
- package/dist/server.d.ts +18 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +212 -0
- package/dist/server.js.map +1 -0
- package/dist/setup.d.ts +18 -0
- package/dist/setup.d.ts.map +1 -0
- package/dist/setup.js +231 -0
- package/dist/setup.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
import fs from "node:fs/promises";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { createServer } from "node:http";
|
|
4
|
+
import { pathToFileURL } from "node:url";
|
|
5
|
+
import { createFluxReactHandler } from "@fluxfast/react/server";
|
|
6
|
+
import { webRequest, writeWebResponse } from "./bridge.js";
|
|
7
|
+
import { containedFile, createAssetHandler, readHostManifest } from "./assets.js";
|
|
8
|
+
import { serveHealth, healthProbe } from "./health.js";
|
|
9
|
+
import { BUILD_DIRECTORY, SERVER_ENTRY, configuredFluxOptions } from "./options.js";
|
|
10
|
+
function backendAddress(value) {
|
|
11
|
+
try {
|
|
12
|
+
const url = new URL(typeof value === "string" ? value : "");
|
|
13
|
+
if (!["http:", "https:"].includes(url.protocol) || url.username || url.password || url.search || url.hash)
|
|
14
|
+
throw new Error();
|
|
15
|
+
return url.href.replace(/\/$/, "");
|
|
16
|
+
}
|
|
17
|
+
catch {
|
|
18
|
+
throw new TypeError("Set a trusted HTTP(S) backendUrl or FLUXFAST_BACKEND_URL without credentials, query, or fragment");
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function rawPathIsSafe(url) {
|
|
22
|
+
try {
|
|
23
|
+
const decoded = decodeURIComponent(url.split("?", 1)[0]);
|
|
24
|
+
return url.startsWith("/") && !url.startsWith("//") && !/[\\\x00-\x1f\x7f]/.test(decoded) &&
|
|
25
|
+
!decoded.split("/").some(segment => segment === "." || segment === "..");
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
/** Own one public HTTP origin. Production never imports Vite or source config. */
|
|
32
|
+
export async function createFluxViteServer(options = {}) {
|
|
33
|
+
const root = path.resolve(options.root ?? process.cwd());
|
|
34
|
+
const backend = backendAddress(options.backendUrl ?? process.env.FLUXFAST_BACKEND_URL);
|
|
35
|
+
const host = options.host ?? "127.0.0.1";
|
|
36
|
+
const port = options.port ?? 3000;
|
|
37
|
+
const production = options.mode === "production";
|
|
38
|
+
if (options.mode !== undefined && options.mode !== "production" && options.mode !== "development")
|
|
39
|
+
throw new TypeError("Invalid FluxFast server mode");
|
|
40
|
+
if (!Number.isSafeInteger(port) || port < 0 || port > 65535)
|
|
41
|
+
throw new TypeError("FluxFast port must be an integer from 0 to 65535");
|
|
42
|
+
if (production && options.configFile !== undefined)
|
|
43
|
+
throw new TypeError("Production reads built artifacts, not a source configFile");
|
|
44
|
+
let stopping = false;
|
|
45
|
+
let vite;
|
|
46
|
+
let document;
|
|
47
|
+
let assets = async () => undefined;
|
|
48
|
+
const controllers = new Set();
|
|
49
|
+
const sockets = new Set();
|
|
50
|
+
const http = createServer((incoming, outgoing) => { void serve(incoming, outgoing); });
|
|
51
|
+
http.on("connection", socket => { sockets.add(socket); socket.once("close", () => sockets.delete(socket)); });
|
|
52
|
+
async function serve(incoming, outgoing) {
|
|
53
|
+
const controller = new AbortController();
|
|
54
|
+
controllers.add(controller);
|
|
55
|
+
const abort = () => controller.abort();
|
|
56
|
+
const disconnect = () => { if (!outgoing.writableEnded)
|
|
57
|
+
abort(); };
|
|
58
|
+
const destroy = () => outgoing.destroy();
|
|
59
|
+
incoming.once("aborted", abort);
|
|
60
|
+
outgoing.once("close", disconnect);
|
|
61
|
+
controller.signal.addEventListener("abort", destroy, { once: true });
|
|
62
|
+
try {
|
|
63
|
+
if (!rawPathIsSafe(incoming.url ?? "/")) {
|
|
64
|
+
await writeWebResponse(new Response(null, { status: 400 }), outgoing, controller.signal);
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
const request = webRequest(incoming, controller.signal);
|
|
68
|
+
if (healthProbe(request)) {
|
|
69
|
+
await writeWebResponse(await serveHealth(request, backend, stopping), outgoing, controller.signal);
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
if (stopping) {
|
|
73
|
+
await writeWebResponse(new Response(null, { status: 503 }), outgoing, controller.signal);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
// Protocol traffic always precedes Vite/static middleware: no path,
|
|
77
|
+
// extension, cookie, body or live stream is reinterpreted as an asset.
|
|
78
|
+
if (request.headers.get("x-fluxfast") !== "1") {
|
|
79
|
+
if (vite) {
|
|
80
|
+
const handled = await new Promise((resolve, reject) => {
|
|
81
|
+
const finish = () => { cleanup(); resolve(true); };
|
|
82
|
+
const cleanup = () => { outgoing.removeListener("finish", finish); outgoing.removeListener("close", finish); };
|
|
83
|
+
outgoing.once("finish", finish);
|
|
84
|
+
outgoing.once("close", finish);
|
|
85
|
+
vite.middlewares(incoming, outgoing, (error) => { cleanup(); if (error)
|
|
86
|
+
reject(error);
|
|
87
|
+
else
|
|
88
|
+
resolve(false); });
|
|
89
|
+
});
|
|
90
|
+
if (handled)
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
const asset = await assets(request);
|
|
95
|
+
if (asset) {
|
|
96
|
+
await writeWebResponse(asset, outgoing, controller.signal);
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
await writeWebResponse(await document(request), outgoing, controller.signal);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
if (outgoing.headersSent || controller.signal.aborted)
|
|
105
|
+
outgoing.destroy();
|
|
106
|
+
else {
|
|
107
|
+
outgoing.writeHead(500, { "content-type": "text/plain", "cache-control": "no-store" });
|
|
108
|
+
outgoing.end("Page unavailable");
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
incoming.removeListener("aborted", abort);
|
|
113
|
+
outgoing.removeListener("close", disconnect);
|
|
114
|
+
controller.signal.removeEventListener("abort", destroy);
|
|
115
|
+
controllers.delete(controller);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
if (production) {
|
|
120
|
+
const output = path.join(root, BUILD_DIRECTORY);
|
|
121
|
+
const manifest = readHostManifest(JSON.parse(await fs.readFile(path.join(output, "host.json"), "utf8")));
|
|
122
|
+
const client = path.join(output, "client");
|
|
123
|
+
const template = await fs.readFile(await containedFile(client, manifest.template), "utf8");
|
|
124
|
+
const rendererFile = await containedFile(path.join(output, "server"), "renderer.mjs");
|
|
125
|
+
const renderer = await import(pathToFileURL(rendererFile).href);
|
|
126
|
+
if (typeof renderer.render !== "function")
|
|
127
|
+
throw new Error("Invalid FluxFast production renderer");
|
|
128
|
+
document = createFluxReactHandler({ ...renderer.settings, backendUrl: backend, render: renderer.render, template, development: false });
|
|
129
|
+
assets = createAssetHandler(client, manifest.assets, manifest.template);
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
const { createServer: createViteServer } = await import("vite");
|
|
133
|
+
vite = await createViteServer({
|
|
134
|
+
root, ...(options.configFile === undefined ? {} : { configFile: options.configFile }), appType: "custom",
|
|
135
|
+
server: {
|
|
136
|
+
middlewareMode: true, hmr: { server: http }, host, port, strictPort: true,
|
|
137
|
+
// Transform requested modules normally, without speculative jobs that
|
|
138
|
+
// can wait on an optimizer batch after its cancellation on shutdown.
|
|
139
|
+
preTransformRequests: false,
|
|
140
|
+
},
|
|
141
|
+
});
|
|
142
|
+
configuredFluxOptions(vite.config);
|
|
143
|
+
const renderer = await vite.ssrLoadModule(SERVER_ENTRY);
|
|
144
|
+
if (typeof renderer.render !== "function")
|
|
145
|
+
throw new Error("Invalid FluxFast development renderer");
|
|
146
|
+
document = request => {
|
|
147
|
+
const configured = configuredFluxOptions(vite.config);
|
|
148
|
+
const handler = createFluxReactHandler({
|
|
149
|
+
...configured.settings, backendUrl: backend, development: configured.diagnostics,
|
|
150
|
+
render: async (props, renderOptions) => (await vite.ssrLoadModule(SERVER_ENTRY)).render(props, renderOptions),
|
|
151
|
+
template: async (input) => vite.transformIndexHtml(new URL(input.url).pathname, await fs.readFile(configured.template, "utf8")),
|
|
152
|
+
});
|
|
153
|
+
return handler(request);
|
|
154
|
+
};
|
|
155
|
+
}
|
|
156
|
+
await new Promise((resolve, reject) => {
|
|
157
|
+
const failed = (error) => { http.removeListener("listening", ready); reject(error); };
|
|
158
|
+
const ready = () => { http.removeListener("error", failed); resolve(); };
|
|
159
|
+
http.once("error", failed);
|
|
160
|
+
http.once("listening", ready);
|
|
161
|
+
http.listen(port, host);
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
catch (error) {
|
|
165
|
+
await vite?.close();
|
|
166
|
+
for (const socket of sockets)
|
|
167
|
+
socket.destroy();
|
|
168
|
+
if (http.listening)
|
|
169
|
+
await new Promise(resolve => http.close(() => resolve()));
|
|
170
|
+
throw error;
|
|
171
|
+
}
|
|
172
|
+
const address = http.address();
|
|
173
|
+
if (!address || typeof address === "string")
|
|
174
|
+
throw new Error("FluxFast server did not bind a TCP port");
|
|
175
|
+
let closing;
|
|
176
|
+
return {
|
|
177
|
+
url: `http://${host.includes(":") ? `[${host}]` : host}:${address.port}`,
|
|
178
|
+
close() {
|
|
179
|
+
return closing ??= (async () => {
|
|
180
|
+
stopping = true;
|
|
181
|
+
const closed = new Promise((resolve, reject) => http.close(error => error ? reject(error) : resolve()));
|
|
182
|
+
for (const controller of controllers)
|
|
183
|
+
controller.abort();
|
|
184
|
+
for (const socket of sockets)
|
|
185
|
+
socket.destroy();
|
|
186
|
+
try {
|
|
187
|
+
// A cold virtual-client request starts Vite's static-import crawl.
|
|
188
|
+
// Closing while its optimizer is held for that crawl can leave
|
|
189
|
+
// pending transforms waiting on a cancelled optimization batch.
|
|
190
|
+
// Release the owned network first, then let the crawl settle before
|
|
191
|
+
// Vite cancels its optimizer and closes the environments/watchers.
|
|
192
|
+
try {
|
|
193
|
+
await vite?.waitForRequestsIdle();
|
|
194
|
+
}
|
|
195
|
+
finally {
|
|
196
|
+
await vite?.close();
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
finally {
|
|
200
|
+
await closed;
|
|
201
|
+
}
|
|
202
|
+
})();
|
|
203
|
+
},
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { randomUUID } from "node:crypto";
|
|
4
|
+
import { mergeAgentBlock, renderKnowledge, KNOWLEDGE_MARKER } from "./agent-knowledge.js";
|
|
5
|
+
import { generateProject, validateGeneration } from "./generation.js";
|
|
6
|
+
import { assertSafePath, GENERATED_ARTIFACTS, HOST_CONFIG, HOST_SCRIPTS, HOST_TEMPLATE, relativeFile, sourceViteConfig, validatePackages } from "./project.js";
|
|
7
|
+
const MARKER = "// GENERATED BY FLUXFAST VITE.";
|
|
8
|
+
function read(project, file) {
|
|
9
|
+
assertSafePath(project.root, file);
|
|
10
|
+
try {
|
|
11
|
+
if (!fs.statSync(file).isFile())
|
|
12
|
+
throw new Error("A reserved FluxFast scaffold path is not a regular file");
|
|
13
|
+
return fs.readFileSync(file, "utf8");
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
if (error.code === "ENOENT")
|
|
17
|
+
return;
|
|
18
|
+
throw error;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function configContent(project) {
|
|
22
|
+
const original = sourceViteConfig(project);
|
|
23
|
+
const app = relativeFile(project, project.registry);
|
|
24
|
+
const owned = `{ plugins: [fluxfast({ application: ${JSON.stringify(app)} })] }`;
|
|
25
|
+
if (!original)
|
|
26
|
+
return `${MARKER}\nimport { fluxfast } from "@fluxfast/vite";\nexport default ${owned};\n`;
|
|
27
|
+
return `${MARKER}
|
|
28
|
+
// Existing SPA configuration is preserved and extended only for this host.
|
|
29
|
+
import { mergeConfig } from "vite";
|
|
30
|
+
import { fluxfast } from "@fluxfast/vite";
|
|
31
|
+
import original from ${JSON.stringify("./" + original)};
|
|
32
|
+
|
|
33
|
+
async function containsFluxPlugin(value) {
|
|
34
|
+
const plugin = await value;
|
|
35
|
+
if (Array.isArray(plugin)) return (await Promise.all(plugin.map(containsFluxPlugin))).some(Boolean);
|
|
36
|
+
return plugin && plugin.name === "fluxfast";
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default async context => {
|
|
40
|
+
const config = await (typeof original === "function" ? original(context) : original);
|
|
41
|
+
return mergeConfig(config, {
|
|
42
|
+
plugins: await containsFluxPlugin(config.plugins ?? []) ? [] : [fluxfast({ application: ${JSON.stringify(app)} })],
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
const TEMPLATE = '<!-- GENERATED BY FLUXFAST VITE. -->\n<!doctype html>\n<html lang="en">\n <head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>FluxFast</title></head>\n <body>\n <div id="fluxfast-root"><!--fluxfast:ssr--></div>\n <!--fluxfast:payload-->\n <script type="module" src="/@fluxfast/client"></script>\n </body>\n</html>\n';
|
|
48
|
+
const STARTER = 'export default function Home() {\n return <main><h1>FluxFast is ready</h1><p>FastAPI owns your application routes and resources.</p></main>;\n}\n';
|
|
49
|
+
/** Read-only planning; never evaluate a Vite config or install dependencies. */
|
|
50
|
+
export function planSetup(project, force = false) {
|
|
51
|
+
validatePackages(project);
|
|
52
|
+
validateGeneration(project);
|
|
53
|
+
const changes = [];
|
|
54
|
+
const add = (file, after, policy = "managed", marker = MARKER) => {
|
|
55
|
+
const before = read(project, file);
|
|
56
|
+
if (before === after || before !== undefined && policy === "preserve")
|
|
57
|
+
return;
|
|
58
|
+
if (before !== undefined) {
|
|
59
|
+
if (policy === "knowledge" && before.startsWith(marker)) { /* Refresh generated knowledge. */ }
|
|
60
|
+
else if (!force) {
|
|
61
|
+
if (before.startsWith(marker))
|
|
62
|
+
return; // Preserve customized config/templates.
|
|
63
|
+
throw new Error(`${relativeFile(project, file)} is user-owned; preserve/move it or explicitly use init --force for this reserved file`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
changes.push({ file, before, after });
|
|
67
|
+
};
|
|
68
|
+
add(path.join(project.root, HOST_CONFIG), configContent(project));
|
|
69
|
+
add(path.join(project.root, HOST_TEMPLATE), TEMPLATE, "managed", "<!-- GENERATED BY FLUXFAST VITE. -->");
|
|
70
|
+
const extension = fs.existsSync(path.join(project.root, "tsconfig.json")) ? "tsx" : "jsx";
|
|
71
|
+
const home = path.join(project.pages, "home");
|
|
72
|
+
const existingHome = ["tsx", "jsx"].find(ext => read(project, path.join(home, "index." + ext)) !== undefined);
|
|
73
|
+
if (!existingHome)
|
|
74
|
+
add(path.join(home, "index." + extension), STARTER, "preserve");
|
|
75
|
+
const knowledge = path.join(project.generated, "agent-knowledge.md");
|
|
76
|
+
add(knowledge, renderKnowledge(project), "knowledge", KNOWLEDGE_MARKER);
|
|
77
|
+
for (const name of ["AGENTS.md", "CLAUDE.md"]) {
|
|
78
|
+
const file = path.join(project.root, name);
|
|
79
|
+
const before = read(project, file);
|
|
80
|
+
const after = mergeAgentBlock(before ?? "", relativeFile(project, knowledge));
|
|
81
|
+
if (after !== before)
|
|
82
|
+
changes.push({ file, before, after });
|
|
83
|
+
}
|
|
84
|
+
const originalScripts = project.manifest.scripts ?? {};
|
|
85
|
+
if (!originalScripts || typeof originalScripts !== "object" || Array.isArray(originalScripts) ||
|
|
86
|
+
Object.values(originalScripts).some(value => typeof value !== "string" || !value.trim()))
|
|
87
|
+
throw new Error("Frontend scripts must contain non-empty command strings");
|
|
88
|
+
const scripts = { ...originalScripts };
|
|
89
|
+
let scriptsChanged = false;
|
|
90
|
+
for (const [name, command] of Object.entries(HOST_SCRIPTS)) {
|
|
91
|
+
if (scripts[name] === undefined) {
|
|
92
|
+
scripts[name] = command;
|
|
93
|
+
scriptsChanged = true;
|
|
94
|
+
}
|
|
95
|
+
else if (!scripts[name].includes("fluxfast-vite " + name.split(":")[1]))
|
|
96
|
+
throw new Error(`Preserve/rename custom ${name} before adding the FluxFast host script; existing scripts are never overwritten`);
|
|
97
|
+
}
|
|
98
|
+
if (scriptsChanged)
|
|
99
|
+
changes.push({ file: path.join(project.root, "package.json"), before: project.manifestContent,
|
|
100
|
+
after: JSON.stringify({ ...project.manifest, scripts }, null, 2) + "\n" });
|
|
101
|
+
return { project, changes };
|
|
102
|
+
}
|
|
103
|
+
function atomicWrite(file, content, mode) {
|
|
104
|
+
const temporary = path.join(path.dirname(file), ".fluxfast-init-" + randomUUID() + ".tmp");
|
|
105
|
+
let descriptor;
|
|
106
|
+
try {
|
|
107
|
+
descriptor = fs.openSync(temporary, "wx", mode);
|
|
108
|
+
fs.writeFileSync(descriptor, content, "utf8");
|
|
109
|
+
fs.fsyncSync(descriptor);
|
|
110
|
+
fs.closeSync(descriptor);
|
|
111
|
+
descriptor = undefined;
|
|
112
|
+
fs.renameSync(temporary, file);
|
|
113
|
+
}
|
|
114
|
+
finally {
|
|
115
|
+
if (descriptor !== undefined)
|
|
116
|
+
fs.closeSync(descriptor);
|
|
117
|
+
try {
|
|
118
|
+
fs.unlinkSync(temporary);
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
if (error.code !== "ENOENT")
|
|
122
|
+
throw error;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
/** Guard the complete plan, apply owned changes, and roll back on generation failure. */
|
|
127
|
+
export function applySetup(plan) {
|
|
128
|
+
const { project } = plan;
|
|
129
|
+
const targets = [...new Set([...plan.changes.map(change => change.file), ...GENERATED_ARTIFACTS.map(name => path.join(project.generated, name))])];
|
|
130
|
+
const saved = targets.map(file => {
|
|
131
|
+
const content = read(project, file);
|
|
132
|
+
return { file, content: content === undefined ? undefined : fs.readFileSync(file),
|
|
133
|
+
stat: content === undefined ? undefined : fs.statSync(file) };
|
|
134
|
+
});
|
|
135
|
+
for (const change of plan.changes) {
|
|
136
|
+
if (read(project, change.file) !== change.before)
|
|
137
|
+
throw new Error("A scaffold file changed after planning; rerun initialization without overwriting user work");
|
|
138
|
+
}
|
|
139
|
+
const directories = [];
|
|
140
|
+
const ensureDirectory = (directory) => {
|
|
141
|
+
assertSafePath(project.root, directory);
|
|
142
|
+
if (fs.existsSync(directory))
|
|
143
|
+
return;
|
|
144
|
+
ensureDirectory(path.dirname(directory));
|
|
145
|
+
fs.mkdirSync(directory);
|
|
146
|
+
directories.push(directory);
|
|
147
|
+
};
|
|
148
|
+
try {
|
|
149
|
+
for (const change of plan.changes) {
|
|
150
|
+
ensureDirectory(path.dirname(change.file));
|
|
151
|
+
atomicWrite(change.file, change.after, saved.find(item => item.file === change.file)?.stat?.mode);
|
|
152
|
+
}
|
|
153
|
+
ensureDirectory(project.generated);
|
|
154
|
+
// An already-current initialization is a true no-op, including artifact mtimes.
|
|
155
|
+
if (!generateProject(project, true).current)
|
|
156
|
+
generateProject(project, false);
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const rollbackFailures = [];
|
|
160
|
+
for (const item of saved.reverse()) {
|
|
161
|
+
try {
|
|
162
|
+
if (item.content === undefined) {
|
|
163
|
+
if (fs.existsSync(item.file))
|
|
164
|
+
fs.unlinkSync(item.file);
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
const replaced = !fs.existsSync(item.file) || !fs.readFileSync(item.file).equals(item.content);
|
|
168
|
+
if (replaced)
|
|
169
|
+
atomicWrite(item.file, item.content, item.stat?.mode);
|
|
170
|
+
const current = fs.statSync(item.file);
|
|
171
|
+
if (item.stat && (replaced || current.mode !== item.stat.mode || current.mtimeMs !== item.stat.mtimeMs)) {
|
|
172
|
+
fs.chmodSync(item.file, item.stat.mode);
|
|
173
|
+
fs.utimesSync(item.file, item.stat.atimeMs / 1000, item.stat.mtimeMs / 1000);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
catch (rollbackError) {
|
|
178
|
+
rollbackFailures.push(rollbackError);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
for (const directory of directories.reverse()) {
|
|
182
|
+
try {
|
|
183
|
+
fs.rmdirSync(directory);
|
|
184
|
+
}
|
|
185
|
+
catch { /* Only remove empty, task-created directories. */ }
|
|
186
|
+
}
|
|
187
|
+
if (rollbackFailures.length)
|
|
188
|
+
throw new AggregateError([error, ...rollbackFailures], "Initialization failed and rollback was incomplete; inspect scaffold/generated files before retrying");
|
|
189
|
+
throw error;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
/** Structural, read-only check; the real Vite build remains authoritative. */
|
|
193
|
+
export function checkSetup(project) {
|
|
194
|
+
validatePackages(project);
|
|
195
|
+
const problems = [];
|
|
196
|
+
const config = read(project, path.join(project.root, HOST_CONFIG));
|
|
197
|
+
if (!config?.includes("@fluxfast/vite") || !config.includes("fluxfast("))
|
|
198
|
+
problems.push("Missing FluxFast host config; run fluxfast-vite init");
|
|
199
|
+
const template = read(project, path.join(project.root, HOST_TEMPLATE)) ?? "";
|
|
200
|
+
if ([/<!--fluxfast:ssr-->/g, /<!--fluxfast:payload-->/g, /\bid\s*=\s*(["'])fluxfast-root\1/g, /\bsrc\s*=\s*(["'])\/@fluxfast\/client\1/g]
|
|
201
|
+
.some(marker => [...template.matchAll(marker)].length !== 1))
|
|
202
|
+
problems.push("Host template is missing or its SSR/hydration markers are invalid");
|
|
203
|
+
const scripts = project.manifest.scripts;
|
|
204
|
+
for (const name of Object.keys(HOST_SCRIPTS)) {
|
|
205
|
+
if (typeof scripts?.[name] !== "string" || !scripts[name].includes("fluxfast-vite " + name.split(":")[1]))
|
|
206
|
+
problems.push(`Missing scoped ${name} host script`);
|
|
207
|
+
}
|
|
208
|
+
const knowledge = path.join(project.generated, "agent-knowledge.md");
|
|
209
|
+
if (!read(project, knowledge)?.startsWith(KNOWLEDGE_MARKER))
|
|
210
|
+
problems.push("Generated agent knowledge is missing; run fluxfast-vite init");
|
|
211
|
+
for (const name of ["AGENTS.md", "CLAUDE.md"]) {
|
|
212
|
+
const content = read(project, path.join(project.root, name)) ?? "";
|
|
213
|
+
try {
|
|
214
|
+
if (mergeAgentBlock(content, relativeFile(project, knowledge)) !== content)
|
|
215
|
+
problems.push(`${name} is missing the FluxFast managed reference`);
|
|
216
|
+
}
|
|
217
|
+
catch {
|
|
218
|
+
problems.push(`${name} has malformed FluxFast managed markers`);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
return problems;
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=setup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"setup.js","sourceRoot":"","sources":["../../src/setup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type FrontendProject } from "./project.js";
|
|
2
|
+
export declare function generationOptions(project: FrontendProject, schemaFile?: string): {
|
|
3
|
+
registry: import("@fluxfast/codegen").PagesRegistrySnapshot;
|
|
4
|
+
generatedDir: string;
|
|
5
|
+
log: boolean;
|
|
6
|
+
schemaContent?: string | undefined;
|
|
7
|
+
};
|
|
8
|
+
export declare function generateProject(project: FrontendProject, check: boolean, schemaFile?: string): {
|
|
9
|
+
current: boolean;
|
|
10
|
+
files: readonly string[];
|
|
11
|
+
};
|
|
12
|
+
/** Compile existing contracts before initialization can write any scaffold. */
|
|
13
|
+
export declare function validateGeneration(project: FrontendProject): void;
|
|
14
|
+
//# sourceMappingURL=generation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation.d.ts","sourceRoot":"","sources":["../src/generation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuC,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAEzF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,eAAe,EAAE,UAAU,CAAC,EAAE,MAAM;;;;;EAW9E;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,CAO7I;AAED,+EAA+E;AAC/E,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,eAAe,GAAG,IAAI,CAEjE"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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.generationOptions = generationOptions;
|
|
7
|
+
exports.generateProject = generateProject;
|
|
8
|
+
exports.validateGeneration = validateGeneration;
|
|
9
|
+
const node_fs_1 = __importDefault(require("node:fs"));
|
|
10
|
+
const node_path_1 = __importDefault(require("node:path"));
|
|
11
|
+
const codegen_1 = require("@fluxfast/codegen");
|
|
12
|
+
const project_js_1 = require("./project.js");
|
|
13
|
+
function generationOptions(project, schemaFile) {
|
|
14
|
+
(0, project_js_1.assertSafePath)(project.root, project.pages);
|
|
15
|
+
(0, project_js_1.assertSafePath)(project.root, project.registry);
|
|
16
|
+
// The existing schema is also an input; do not read it through a symlink.
|
|
17
|
+
for (const name of project_js_1.GENERATED_ARTIFACTS)
|
|
18
|
+
(0, project_js_1.assertSafePath)(project.root, node_path_1.default.join(project.generated, name));
|
|
19
|
+
return {
|
|
20
|
+
registry: (0, codegen_1.createPagesRegistrySnapshot)({ pagesDir: project.pages, outputFile: project.registry,
|
|
21
|
+
target: { runtimeImport: "@fluxfast/react", rootExport: "FluxRoot", applicationPropsExport: "FluxApplicationProps", clientDirective: false } }),
|
|
22
|
+
generatedDir: project.generated, log: false,
|
|
23
|
+
...(schemaFile === undefined ? {} : { schemaContent: node_fs_1.default.readFileSync(node_path_1.default.resolve(project.root, schemaFile), "utf8") }),
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
function generateProject(project, check, schemaFile) {
|
|
27
|
+
const options = generationOptions(project, schemaFile);
|
|
28
|
+
if (check) {
|
|
29
|
+
const result = (0, codegen_1.checkFluxFastProject)(options);
|
|
30
|
+
return { current: result.current, files: result.staleFiles };
|
|
31
|
+
}
|
|
32
|
+
return { current: true, files: (0, codegen_1.generateFluxFastProject)(options).generatedFiles };
|
|
33
|
+
}
|
|
34
|
+
/** Compile existing contracts before initialization can write any scaffold. */
|
|
35
|
+
function validateGeneration(project) {
|
|
36
|
+
(0, codegen_1.checkFluxFastProject)(generationOptions(project));
|
|
37
|
+
}
|
|
38
|
+
//# sourceMappingURL=generation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generation.js","sourceRoot":"","sources":["../src/generation.ts"],"names":[],"mappings":";;;;;;;;AAAA,sDAAyB;AACzB,0DAA6B;AAC7B,+CAA+G;AAC/G,6CAAyF;AAEzF,2BAAkC,OAAwB,EAAE,UAAmB;IAC7E,IAAA,2BAAc,EAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAC5C,IAAA,2BAAc,EAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,0EAA0E;IAC1E,KAAK,MAAM,IAAI,IAAI,gCAAmB;QAAE,IAAA,2BAAc,EAAC,OAAO,CAAC,IAAI,EAAE,mBAAI,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC;IACzG,OAAO;QACL,QAAQ,EAAE,IAAA,qCAA2B,EAAC,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,iBAAE,CAAC,YAAY,CAAC,mBAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,EAAE,CAAC;KACxH,CAAC;AACJ,CAAC;AAED,yBAAgC,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,IAAA,8BAAoB,EAAC,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,IAAA,iCAAuB,EAAC,OAAO,CAAC,CAAC,cAAc,EAAE,CAAC;AACnF,CAAC;AAED,+EAA+E;AAC/E,4BAAmC,OAAwB;IACzD,IAAA,8BAAoB,EAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;AACnD,CAAC"}
|
package/dist/health.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
/** Host-owned minimal probes. No authentication, ports, paths, or upstream text. */
|
|
2
|
+
export declare function healthProbe(request: Request): "healthz" | "readyz" | undefined;
|
|
3
|
+
export declare function serveHealth(request: Request, backendUrl: string, stopping: boolean): Promise<Response>;
|
|
4
|
+
//# sourceMappingURL=health.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.d.ts","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"AAAA,oFAAoF;AACpF,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,CAG9E;AAQD,wBAAsB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,CAAC,CA4B5G"}
|
package/dist/health.js
ADDED
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.healthProbe = healthProbe;
|
|
4
|
+
exports.serveHealth = serveHealth;
|
|
5
|
+
/** Host-owned minimal probes. No authentication, ports, paths, or upstream text. */
|
|
6
|
+
function healthProbe(request) {
|
|
7
|
+
const path = new URL(request.url).pathname.replace(/\/$/, "");
|
|
8
|
+
return /^\/(?:_?fluxfast)\/(healthz|readyz)$/.exec(path)?.[1];
|
|
9
|
+
}
|
|
10
|
+
function statusResponse(status, code, head) {
|
|
11
|
+
return new Response(head ? null : JSON.stringify({ status }), {
|
|
12
|
+
status: code, headers: { "content-type": "application/json; charset=utf-8", "cache-control": "no-store" },
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
async function serveHealth(request, backendUrl, stopping) {
|
|
16
|
+
const probe = healthProbe(request);
|
|
17
|
+
const head = request.method === "HEAD";
|
|
18
|
+
if (request.method !== "GET" && !head)
|
|
19
|
+
return new Response(null, { status: 405, headers: { allow: "GET, HEAD" } });
|
|
20
|
+
if (!probe || stopping)
|
|
21
|
+
return statusResponse("not_ready", 503, head);
|
|
22
|
+
const signal = AbortSignal.any([request.signal, AbortSignal.timeout(3_000)]);
|
|
23
|
+
try {
|
|
24
|
+
const target = backendUrl.replace(/\/$/, "") + "/_fluxfast/" + probe;
|
|
25
|
+
const upstream = await fetch(target, { headers: { accept: "application/json" }, redirect: "manual", cache: "no-store", signal });
|
|
26
|
+
const reader = upstream.body?.getReader();
|
|
27
|
+
if (!reader)
|
|
28
|
+
return statusResponse("not_ready", 503, head);
|
|
29
|
+
const chunks = [];
|
|
30
|
+
let bytes = 0;
|
|
31
|
+
try {
|
|
32
|
+
while (true) {
|
|
33
|
+
const { value, done } = await reader.read();
|
|
34
|
+
if (done)
|
|
35
|
+
break;
|
|
36
|
+
bytes += value.byteLength;
|
|
37
|
+
if (bytes > 4_096) {
|
|
38
|
+
void reader.cancel().catch(() => undefined);
|
|
39
|
+
return statusResponse("not_ready", 503, head);
|
|
40
|
+
}
|
|
41
|
+
chunks.push(value);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
reader.releaseLock();
|
|
46
|
+
}
|
|
47
|
+
const payload = JSON.parse(Buffer.concat(chunks).toString("utf8"));
|
|
48
|
+
const status = payload && typeof payload === "object" && "status" in payload ? payload.status : undefined;
|
|
49
|
+
if (probe === "healthz" && upstream.status === 200 && status === "ok")
|
|
50
|
+
return statusResponse("ok", 200, head);
|
|
51
|
+
if (probe === "readyz" && upstream.status === 200 && status === "ready")
|
|
52
|
+
return statusResponse("ready", 200, head);
|
|
53
|
+
return statusResponse("not_ready", 503, head);
|
|
54
|
+
}
|
|
55
|
+
catch {
|
|
56
|
+
return statusResponse("not_ready", 503, head);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=health.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"health.js","sourceRoot":"","sources":["../src/health.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildFluxViteApp = exports.fluxfast = void 0;
|
|
4
|
+
var plugin_js_1 = require("./plugin.js");
|
|
5
|
+
Object.defineProperty(exports, "fluxfast", { enumerable: true, get: function () { return plugin_js_1.fluxfast; } });
|
|
6
|
+
var build_js_1 = require("./build.js");
|
|
7
|
+
Object.defineProperty(exports, "buildFluxViteApp", { enumerable: true, get: function () { return build_js_1.buildFluxViteApp; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,yCAAuC;AAA9B,qGAAA,QAAQ,OAAA;AACjB,uCAA8C;AAArC,4GAAA,gBAAgB,OAAA"}
|