@fluixi/start 0.1.0-alpha.73 → 0.1.0-alpha.75

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 (123) hide show
  1. package/dist/adapter.cjs +750 -0
  2. package/dist/adapter.d.ts +9 -9
  3. package/dist/adapter.d.ts.map +1 -1
  4. package/dist/adapter.js +10 -10
  5. package/dist/adapter.mjs +719 -0
  6. package/dist/adapters/entry.cjs +122 -0
  7. package/dist/adapters/entry.js +1 -1
  8. package/dist/adapters/entry.mjs +95 -0
  9. package/dist/adapters/platforms.cjs +311 -0
  10. package/dist/adapters/platforms.d.ts +2 -2
  11. package/dist/adapters/platforms.js +8 -8
  12. package/dist/adapters/platforms.mjs +284 -0
  13. package/dist/api-HD7KU3BS.mjs +114 -0
  14. package/dist/api.cjs +145 -0
  15. package/dist/api.js +1 -1
  16. package/dist/api.mjs +116 -0
  17. package/dist/commands/api-HD7KU3BS.mjs +114 -0
  18. package/dist/commands/api-PBT4QZ34.mjs +16 -0
  19. package/dist/commands/api-PJL37LV3.mjs +17 -0
  20. package/dist/commands/build.cjs +877 -0
  21. package/dist/commands/build.js +6 -6
  22. package/dist/commands/build.mjs +717 -0
  23. package/dist/commands/chunk-GFQ4MUIC.mjs +117 -0
  24. package/dist/commands/chunk-MTM6M3TC.mjs +115 -0
  25. package/dist/commands/dev.cjs +670 -0
  26. package/dist/commands/dev.js +3 -3
  27. package/dist/commands/dev.mjs +512 -0
  28. package/dist/commands/index.cjs +1145 -0
  29. package/dist/commands/index.d.ts +1 -1
  30. package/dist/commands/index.js +1 -1
  31. package/dist/commands/index.mjs +982 -0
  32. package/dist/commands/prerender.cjs +404 -0
  33. package/dist/commands/prerender.d.ts +1 -1
  34. package/dist/commands/prerender.js +2 -2
  35. package/dist/commands/prerender.mjs +377 -0
  36. package/dist/commands/start.cjs +463 -0
  37. package/dist/commands/start.d.ts +1 -1
  38. package/dist/commands/start.js +2 -2
  39. package/dist/commands/start.mjs +428 -0
  40. package/dist/config.cjs +150 -0
  41. package/dist/config.d.ts +24 -7
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +8 -6
  44. package/dist/config.mjs +114 -0
  45. package/dist/define-config.cjs +32 -0
  46. package/dist/define-config.d.ts +12 -0
  47. package/dist/define-config.d.ts.map +1 -0
  48. package/dist/define-config.js +3 -0
  49. package/dist/define-config.mjs +7 -0
  50. package/dist/di.cjs +200 -0
  51. package/dist/di.d.ts +4 -4
  52. package/dist/di.d.ts.map +1 -1
  53. package/dist/di.js +9 -9
  54. package/dist/di.mjs +169 -0
  55. package/dist/document.cjs +115 -0
  56. package/dist/document.d.ts +1 -1
  57. package/dist/document.js +1 -1
  58. package/dist/document.mjs +86 -0
  59. package/dist/generated-api.cjs +43 -0
  60. package/dist/generated-api.js +1 -1
  61. package/dist/generated-api.mjs +18 -0
  62. package/dist/generated-server-fns.cjs +43 -0
  63. package/dist/generated-server-fns.mjs +18 -0
  64. package/dist/handler-core.cjs +211 -0
  65. package/dist/handler-core.d.ts +2 -2
  66. package/dist/handler-core.js +2 -2
  67. package/dist/handler-core.mjs +185 -0
  68. package/dist/handler.cjs +182 -0
  69. package/dist/handler.d.ts +3 -3
  70. package/dist/handler.js +3 -3
  71. package/dist/handler.mjs +152 -0
  72. package/dist/head.cjs +25 -0
  73. package/dist/head.d.ts +1 -1
  74. package/dist/head.js +1 -1
  75. package/dist/head.mjs +4 -0
  76. package/dist/image-loader.cjs +37 -0
  77. package/dist/image-loader.d.ts +25 -0
  78. package/dist/image-loader.d.ts.map +1 -0
  79. package/dist/image-loader.js +18 -0
  80. package/dist/image-loader.mjs +12 -0
  81. package/dist/image.cjs +151 -0
  82. package/dist/image.d.ts +2 -19
  83. package/dist/image.d.ts.map +1 -1
  84. package/dist/image.js +5 -21
  85. package/dist/image.mjs +126 -0
  86. package/dist/index.cjs +303 -0
  87. package/dist/index.d.ts +28 -8
  88. package/dist/index.d.ts.map +1 -1
  89. package/dist/index.js +33 -17
  90. package/dist/index.mjs +262 -0
  91. package/dist/interceptors.cjs +72 -0
  92. package/dist/interceptors.js +1 -1
  93. package/dist/interceptors.mjs +44 -0
  94. package/dist/internal.cjs +393 -0
  95. package/dist/internal.d.ts +6 -6
  96. package/dist/internal.d.ts.map +1 -1
  97. package/dist/internal.js +23 -15
  98. package/dist/internal.mjs +223 -0
  99. package/dist/middleware.cjs +58 -0
  100. package/dist/middleware.d.ts +3 -3
  101. package/dist/middleware.d.ts.map +1 -1
  102. package/dist/middleware.js +1 -1
  103. package/dist/middleware.mjs +31 -0
  104. package/dist/preload.cjs +42 -0
  105. package/dist/preload.js +1 -1
  106. package/dist/preload.mjs +18 -0
  107. package/dist/router.cjs +25 -0
  108. package/dist/router.d.ts +3 -3
  109. package/dist/router.js +3 -3
  110. package/dist/router.mjs +4 -0
  111. package/dist/server-fn-setup.cjs +46 -0
  112. package/dist/server-fn-setup.d.ts +1 -1
  113. package/dist/server-fn-setup.js +2 -2
  114. package/dist/server-fn-setup.mjs +22 -0
  115. package/dist/server-fn.cjs +109 -0
  116. package/dist/server-fn.d.ts +2 -2
  117. package/dist/server-fn.js +2 -2
  118. package/dist/server-fn.mjs +79 -0
  119. package/dist/tsconfig.lib.tsbuildinfo +1 -1
  120. package/dist/ui.cjs +123 -0
  121. package/dist/ui.js +1 -1
  122. package/dist/ui.mjs +93 -0
  123. package/package.json +63 -25
@@ -0,0 +1,223 @@
1
+ // src/internal.ts
2
+ import { readdirSync, readFileSync, writeFileSync, existsSync } from "node:fs";
3
+ import { resolve as resolvePath, relative as relativePath } from "node:path";
4
+
5
+ // src/document.ts
6
+ import { extractHeadMarker } from "@fluixi/head";
7
+ function injectApp(template, appHtml, mountId = "root") {
8
+ const mount = new RegExp(`<div id=["']${mountId}["']\\s*>\\s*</div>`);
9
+ if (mount.test(template)) {
10
+ return template.replace(mount, `<div id="${mountId}">${appHtml}</div>`);
11
+ }
12
+ if (template.includes("<!--ssr-outlet-->")) {
13
+ return template.replace("<!--ssr-outlet-->", appHtml);
14
+ }
15
+ return template.replace("</body>", `<div id="${mountId}">${appHtml}</div></body>`);
16
+ }
17
+ function splitTemplate(template, mountId = "root") {
18
+ const mount = new RegExp(`<div id=["']${mountId}["']\\s*>\\s*</div>`);
19
+ const m = template.match(mount);
20
+ if (m && m.index !== void 0) {
21
+ return {
22
+ head: template.slice(0, m.index) + `<div id="${mountId}">`,
23
+ tail: `</div>` + template.slice(m.index + m[0].length)
24
+ };
25
+ }
26
+ const outlet = template.indexOf("<!--ssr-outlet-->");
27
+ if (outlet !== -1) {
28
+ return {
29
+ head: template.slice(0, outlet),
30
+ tail: template.slice(outlet + "<!--ssr-outlet-->".length)
31
+ };
32
+ }
33
+ const body = template.indexOf("</body>");
34
+ if (body !== -1) {
35
+ return {
36
+ head: template.slice(0, body) + `<div id="${mountId}">`,
37
+ tail: `</div>` + template.slice(body)
38
+ };
39
+ }
40
+ return { head: template, tail: "" };
41
+ }
42
+ function setHtmlAttr(html, name, value) {
43
+ const existing = new RegExp(`(<html\\b[^>]*?)\\s${name}="[^"]*"`, "i");
44
+ if (existing.test(html)) return html.replace(existing, `$1 ${name}="${value}"`);
45
+ return html.replace(/<html\b/i, `<html ${name}="${value}"`);
46
+ }
47
+ function injectAppAndHead(template, rendered, mountId = "root") {
48
+ const { head, body } = extractHeadMarker(rendered);
49
+ let html = injectApp(template, body, mountId);
50
+ if (head) {
51
+ if (head.headHtml) {
52
+ if (/<title[\s>]/i.test(head.headHtml)) html = html.replace(/<title>[\s\S]*?<\/title>/i, "");
53
+ html = html.replace("</head>", `${head.headHtml}</head>`);
54
+ }
55
+ for (const [k, v] of Object.entries(head.htmlAttrs)) html = setHtmlAttr(html, k, v);
56
+ }
57
+ return html;
58
+ }
59
+ function guardHandler(handler, onError) {
60
+ return async (request) => {
61
+ try {
62
+ return await handler(request);
63
+ } catch (e) {
64
+ onError?.(e);
65
+ return new Response(String(e?.stack || e), {
66
+ status: 500,
67
+ headers: { "content-type": "text/plain; charset=utf-8" }
68
+ });
69
+ }
70
+ };
71
+ }
72
+
73
+ // src/internal.ts
74
+ var SERVER_FNS_VMOD = "virtual:fluixi-server-fns";
75
+ var I18N_VMOD = "virtual:fluixi-i18n";
76
+ function i18nVitePlugin(opts) {
77
+ let root = process.cwd();
78
+ const id = "\0" + I18N_VMOD;
79
+ return {
80
+ name: "fluixi-i18n",
81
+ configResolved(config) {
82
+ root = config.root || root;
83
+ },
84
+ resolveId(source) {
85
+ return source === I18N_VMOD ? id : null;
86
+ },
87
+ load(source) {
88
+ if (source !== id) return null;
89
+ const dir = resolvePath(root, opts.dir);
90
+ let files = [];
91
+ try {
92
+ files = readdirSync(dir).filter((f) => f.endsWith(".json"));
93
+ } catch {
94
+ }
95
+ const discovered = files.map((f) => f.replace(/\.json$/, "")).sort();
96
+ const locales = opts.locales?.length ? opts.locales : discovered;
97
+ const defaultLocale = opts.defaultLocale ?? locales[0] ?? "en";
98
+ const imports = locales.map((l, i) => `import _${i} from ${JSON.stringify(resolvePath(dir, l + ".json"))};`).join("\n");
99
+ const messages = `export const messages = {${locales.map((l, i) => `${JSON.stringify(l)}:_${i}`).join(",")}};`;
100
+ return `${imports}
101
+ export const locales = ${JSON.stringify(locales)};
102
+ export const defaultLocale = ${JSON.stringify(defaultLocale)};
103
+ ${messages}
104
+ `;
105
+ }
106
+ };
107
+ }
108
+ async function loadServerEnv(root, mode) {
109
+ const { loadEnv } = await import("vite");
110
+ const env = loadEnv(mode, root, "");
111
+ for (const [k, v] of Object.entries(env)) {
112
+ if (process.env[k] === void 0) process.env[k] = v;
113
+ }
114
+ }
115
+ function i18nTypeBlock(root, i18n) {
116
+ const dir = resolvePath(root, i18n.dir);
117
+ let discovered = [];
118
+ try {
119
+ discovered = readdirSync(dir).filter((f) => f.endsWith(".json")).map((f) => f.replace(/\.json$/, "")).sort();
120
+ } catch {
121
+ }
122
+ const locales = i18n.locales?.length ? i18n.locales : discovered;
123
+ const defaultLocale = i18n.defaultLocale ?? locales[0] ?? "en";
124
+ const typed = locales.length > 0 && locales.every((l) => discovered.includes(l));
125
+ if (!typed) {
126
+ return [
127
+ `declare module 'virtual:fluixi-i18n' {`,
128
+ ` export const messages: Record<string, Record<string, unknown>>;`,
129
+ ` export const locales: string[];`,
130
+ ` export const defaultLocale: string;`,
131
+ `}`
132
+ ];
133
+ }
134
+ const srcDir = resolvePath(root, "src");
135
+ const toSpec = (l) => {
136
+ const rel = relativePath(srcDir, resolvePath(dir, l + ".json")).split(/[\\/]/).join("/");
137
+ return rel.startsWith(".") ? rel : "./" + rel;
138
+ };
139
+ const entries = locales.map((l) => ` ${JSON.stringify(l)}: (typeof import(${JSON.stringify(toSpec(l))}))['default'];`);
140
+ const tuple = locales.map((l) => JSON.stringify(l)).join(", ");
141
+ return [
142
+ `declare module 'virtual:fluixi-i18n' {`,
143
+ ` export const messages: {`,
144
+ ...entries,
145
+ ` };`,
146
+ ` export const locales: readonly [${tuple}];`,
147
+ ` export const defaultLocale: ${JSON.stringify(defaultLocale)};`,
148
+ `}`
149
+ ];
150
+ }
151
+ function startTypesPlugin(cfg) {
152
+ let root = process.cwd();
153
+ return {
154
+ name: "fluixi-start-types",
155
+ configResolved(config) {
156
+ root = config.root || root;
157
+ },
158
+ buildStart() {
159
+ const blocks = [];
160
+ if (cfg.i18n) blocks.push(...i18nTypeBlock(root, cfg.i18n));
161
+ if (blocks.length === 0) return;
162
+ const content = `// Auto-generated by @fluixi/start, do not edit.
163
+ ${blocks.join("\n")}
164
+ `;
165
+ const file = resolvePath(root, "src/fluixi-start-env.d.ts");
166
+ try {
167
+ if (!existsSync(file) || readFileSync(file, "utf8") !== content) writeFileSync(file, content);
168
+ } catch {
169
+ }
170
+ }
171
+ };
172
+ }
173
+ async function fluixiPlugins(cfg) {
174
+ const { fluixi, fluixiRoutesPlugin } = await import("@fluixi/core/plugins");
175
+ const { serverFunctionsVitePlugin } = await import("@fluixi/compiler/integrations");
176
+ const plugins = [
177
+ serverFunctionsVitePlugin(),
178
+ fluixiRoutesPlugin({ routesDir: cfg.routesDir, polyfills: false }),
179
+ // The app's component-resolution rules reach the compiler here; without this an SSR
180
+ // app has no way to say where an unimported tag comes from.
181
+ //
182
+ // `fluixi()` and not `createVitePlugin()`: the latter is the bare compiler integration,
183
+ // and the reactive graph: agent, source marks, /__fluixi/graph, is composed on top of
184
+ // it by the former. A start app got no graph at all until this changed.
185
+ // Everything the app declared for the compiler, with `resolve` still usable on its
186
+ // own because it is the one most apps set. A start app never writes
187
+ // `fluixi()` itself, so without this passthrough the plugin's other options
188
+ // (propsDestructure and the rest) had nowhere to be declared.
189
+ fluixi({ ...cfg.vitePlugin ?? {}, ...cfg.resolve ? { resolve: cfg.resolve } : {} })
190
+ ];
191
+ if (cfg.plugins?.length) plugins.push(...cfg.plugins);
192
+ if (cfg.i18n) plugins.push(i18nVitePlugin(cfg.i18n));
193
+ const { apiRoutesVitePlugin } = await import("./api-HD7KU3BS.mjs");
194
+ plugins.push(apiRoutesVitePlugin({ dir: cfg.apiDir }));
195
+ plugins.push(startTypesPlugin(cfg));
196
+ return plugins;
197
+ }
198
+ var _guardsInstalled = false;
199
+ function installCrashGuards() {
200
+ if (_guardsInstalled) return;
201
+ _guardsInstalled = true;
202
+ process.on(
203
+ "unhandledRejection",
204
+ (reason) => console.warn("[fluixi] unhandled rejection (backend likely down) —", reason?.message || reason)
205
+ );
206
+ process.on(
207
+ "uncaughtException",
208
+ (err) => console.warn("[fluixi] uncaught exception —", err?.message || err)
209
+ );
210
+ }
211
+ export {
212
+ I18N_VMOD,
213
+ SERVER_FNS_VMOD,
214
+ fluixiPlugins,
215
+ guardHandler,
216
+ i18nVitePlugin,
217
+ injectApp,
218
+ injectAppAndHead,
219
+ installCrashGuards,
220
+ loadServerEnv,
221
+ splitTemplate,
222
+ startTypesPlugin
223
+ };
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/middleware.ts
21
+ var middleware_exports = {};
22
+ __export(middleware_exports, {
23
+ composeMiddleware: () => composeMiddleware,
24
+ defineMiddleware: () => defineMiddleware,
25
+ normalizeMiddleware: () => normalizeMiddleware
26
+ });
27
+ module.exports = __toCommonJS(middleware_exports);
28
+ function defineMiddleware(mw) {
29
+ return Array.isArray(mw) ? mw.slice() : [mw];
30
+ }
31
+ function normalizeMiddleware(mod) {
32
+ const def = mod?.default ?? mod;
33
+ if (def == null) return [];
34
+ if (Array.isArray(def)) return def.filter((m) => typeof m === "function");
35
+ return typeof def === "function" ? [def] : [];
36
+ }
37
+ function composeMiddleware(middlewares, core) {
38
+ if (middlewares.length === 0) return core;
39
+ return (request) => {
40
+ let lastCalled = -1;
41
+ const dispatch = (i) => {
42
+ if (i <= lastCalled) {
43
+ return Promise.reject(new Error("middleware called next() more than once"));
44
+ }
45
+ lastCalled = i;
46
+ const mw = middlewares[i];
47
+ if (!mw) return Promise.resolve(core(request));
48
+ return Promise.resolve(mw(request, () => dispatch(i + 1)));
49
+ };
50
+ return dispatch(0);
51
+ };
52
+ }
53
+ // Annotate the CommonJS export names for ESM import in node:
54
+ 0 && (module.exports = {
55
+ composeMiddleware,
56
+ defineMiddleware,
57
+ normalizeMiddleware
58
+ });
@@ -1,8 +1,8 @@
1
1
  /**
2
- * Request middleware a chain that runs BEFORE the SSR render, in both `fluixi dev`
2
+ * Request middleware: a chain that runs BEFORE the SSR render, in both `fluixi dev`
3
3
  * and `fluixi start`. Each middleware gets `(request, next)`; calling `next()` runs
4
4
  * the rest of the chain (ending in the renderer). A middleware may short-circuit
5
- * (return a Response without calling `next` e.g. an auth redirect or a 401), or
5
+ * (return a Response without calling `next`: e.g. an auth redirect or a 401), or
6
6
  * call `next()` and adjust the result (add headers, rewrite). Runtime-neutral: a
7
7
  * middleware sees a Web `Request` and returns a Web `Response`.
8
8
  *
@@ -22,7 +22,7 @@
22
22
  import type { FetchHandler } from './handler.js';
23
23
  export type MiddlewareNext = () => Promise<Response>;
24
24
  export type Middleware = (request: Request, next: MiddlewareNext) => Response | Promise<Response>;
25
- /** Identity helper for `export default` accepts one middleware or an array. */
25
+ /** Identity helper for `export default`: accepts one middleware or an array. */
26
26
  export declare function defineMiddleware(mw: Middleware | Middleware[]): Middleware[];
27
27
  /**
28
28
  * Normalize a loaded `src/middleware.ts` module's default export into a Middleware[].
@@ -1 +1 @@
1
- {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrD,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,KACjB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElC,iFAAiF;AACjF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE,CAE5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,EAAE,CAK9D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,UAAU,EAAE,EACzB,IAAI,EAAE,YAAY,GACjB,YAAY,CAed"}
1
+ {"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../src/middleware.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,MAAM,cAAc,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,CAAC;AACrD,MAAM,MAAM,UAAU,GAAG,CACvB,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,cAAc,KACjB,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAElC,gFAAgF;AAChF,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,UAAU,GAAG,UAAU,EAAE,GAAG,UAAU,EAAE,CAE5E;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,EAAE,CAK9D;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAC/B,WAAW,EAAE,UAAU,EAAE,EACzB,IAAI,EAAE,YAAY,GACjB,YAAY,CAed"}
@@ -1,4 +1,4 @@
1
- /** Identity helper for `export default` accepts one middleware or an array. */
1
+ /** Identity helper for `export default`: accepts one middleware or an array. */
2
2
  export function defineMiddleware(mw) {
3
3
  return Array.isArray(mw) ? mw.slice() : [mw];
4
4
  }
@@ -0,0 +1,31 @@
1
+ // src/middleware.ts
2
+ function defineMiddleware(mw) {
3
+ return Array.isArray(mw) ? mw.slice() : [mw];
4
+ }
5
+ function normalizeMiddleware(mod) {
6
+ const def = mod?.default ?? mod;
7
+ if (def == null) return [];
8
+ if (Array.isArray(def)) return def.filter((m) => typeof m === "function");
9
+ return typeof def === "function" ? [def] : [];
10
+ }
11
+ function composeMiddleware(middlewares, core) {
12
+ if (middlewares.length === 0) return core;
13
+ return (request) => {
14
+ let lastCalled = -1;
15
+ const dispatch = (i) => {
16
+ if (i <= lastCalled) {
17
+ return Promise.reject(new Error("middleware called next() more than once"));
18
+ }
19
+ lastCalled = i;
20
+ const mw = middlewares[i];
21
+ if (!mw) return Promise.resolve(core(request));
22
+ return Promise.resolve(mw(request, () => dispatch(i + 1)));
23
+ };
24
+ return dispatch(0);
25
+ };
26
+ }
27
+ export {
28
+ composeMiddleware,
29
+ defineMiddleware,
30
+ normalizeMiddleware
31
+ };
@@ -0,0 +1,42 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/preload.ts
22
+ var preload_exports = {};
23
+ __export(preload_exports, {
24
+ createPreloader: () => createPreloader
25
+ });
26
+ module.exports = __toCommonJS(preload_exports);
27
+ var import_router = require("@fluixi/core/router");
28
+ function createPreloader(assets) {
29
+ const patterns = Object.keys(assets ?? {});
30
+ if (!patterns.length) return () => [];
31
+ const routes = patterns.map((path) => ({ path, meta: { path } }));
32
+ return (pathname) => {
33
+ const matched = (0, import_router.matchRoutes)(routes, pathname)?.matched;
34
+ const leaf = matched?.[matched.length - 1];
35
+ const pattern = leaf?.route.meta?.path;
36
+ return pattern ? assets[pattern] ?? [] : [];
37
+ };
38
+ }
39
+ // Annotate the CommonJS export names for ESM import in node:
40
+ 0 && (module.exports = {
41
+ createPreloader
42
+ });
package/dist/preload.js CHANGED
@@ -2,7 +2,7 @@
2
2
  * Which built files a URL needs.
3
3
  *
4
4
  * Keyed by URL pattern, not module id: the server only has a path, and the route table
5
- * that would map one to the other lives inside the bundle it is serving
5
+ * that would map one to the other lives inside the bundle it is serving ,
6
6
  * `@fluixi/core/routes` resolves to a stub outside a build. `fluixi build` does the
7
7
  * join, with each route's layouts folded in.
8
8
  *
@@ -0,0 +1,18 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+
3
+ // src/preload.ts
4
+ import { matchRoutes } from "@fluixi/core/router";
5
+ function createPreloader(assets) {
6
+ const patterns = Object.keys(assets ?? {});
7
+ if (!patterns.length) return () => [];
8
+ const routes = patterns.map((path) => ({ path, meta: { path } }));
9
+ return (pathname) => {
10
+ const matched = matchRoutes(routes, pathname)?.matched;
11
+ const leaf = matched?.[matched.length - 1];
12
+ const pattern = leaf?.route.meta?.path;
13
+ return pattern ? assets[pattern] ?? [] : [];
14
+ };
15
+ }
16
+ export {
17
+ createPreloader
18
+ };
@@ -0,0 +1,25 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __copyProps = (to, from, except, desc) => {
8
+ if (from && typeof from === "object" || typeof from === "function") {
9
+ for (let key of __getOwnPropNames(from))
10
+ if (!__hasOwnProp.call(to, key) && key !== except)
11
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
12
+ }
13
+ return to;
14
+ };
15
+ var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
16
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
17
+
18
+ // src/router.ts
19
+ var router_exports = {};
20
+ module.exports = __toCommonJS(router_exports);
21
+ __reExport(router_exports, require("@fluixi/core/router"), module.exports);
22
+ // Annotate the CommonJS export names for ESM import in node:
23
+ 0 && (module.exports = {
24
+ ...require("@fluixi/core/router")
25
+ });
package/dist/router.d.ts CHANGED
@@ -1,13 +1,13 @@
1
1
  /**
2
- * `@fluixi/start/router` the app-facing routing surface, re-exported from
2
+ * `@fluixi/start/router`: the app-facing routing surface, re-exported from
3
3
  * `@fluixi/core/router` (the framework-agnostic `@fluixi/router` core + its
4
4
  * fluixi adapter). Importing routing from the meta-framework gives apps a single,
5
- * stable dependency surface they don't reach into fluixi internals:
5
+ * stable dependency surface, they don't reach into fluixi internals:
6
6
  *
7
7
  * import { Router, Outlet, Link, createMemoryHistory } from '@fluixi/start/router';
8
8
  *
9
9
  * Framework primitives (Suspense, lazy, signals, components) still come from
10
- * `@fluixi/core` only routing lives here.
10
+ * `@fluixi/core`: only routing lives here.
11
11
  */
12
12
  export * from '@fluixi/core/router';
13
13
  //# sourceMappingURL=router.d.ts.map
package/dist/router.js CHANGED
@@ -1,12 +1,12 @@
1
1
  /**
2
- * `@fluixi/start/router` the app-facing routing surface, re-exported from
2
+ * `@fluixi/start/router`: the app-facing routing surface, re-exported from
3
3
  * `@fluixi/core/router` (the framework-agnostic `@fluixi/router` core + its
4
4
  * fluixi adapter). Importing routing from the meta-framework gives apps a single,
5
- * stable dependency surface they don't reach into fluixi internals:
5
+ * stable dependency surface, they don't reach into fluixi internals:
6
6
  *
7
7
  * import { Router, Outlet, Link, createMemoryHistory } from '@fluixi/start/router';
8
8
  *
9
9
  * Framework primitives (Suspense, lazy, signals, components) still come from
10
- * `@fluixi/core` only routing lives here.
10
+ * `@fluixi/core`: only routing lives here.
11
11
  */
12
12
  export * from '@fluixi/core/router';
@@ -0,0 +1,4 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+
3
+ // src/router.ts
4
+ export * from "@fluixi/core/router";
@@ -0,0 +1,46 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+ "use strict";
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
7
+ var __export = (target, all) => {
8
+ for (var name in all)
9
+ __defProp(target, name, { get: all[name], enumerable: true });
10
+ };
11
+ var __copyProps = (to, from, except, desc) => {
12
+ if (from && typeof from === "object" || typeof from === "function") {
13
+ for (let key of __getOwnPropNames(from))
14
+ if (!__hasOwnProp.call(to, key) && key !== except)
15
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
16
+ }
17
+ return to;
18
+ };
19
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
+
21
+ // src/server-fn-setup.ts
22
+ var server_fn_setup_exports = {};
23
+ __export(server_fn_setup_exports, {
24
+ getRequestEvent: () => import_server.getRequestEvent
25
+ });
26
+ module.exports = __toCommonJS(server_fn_setup_exports);
27
+ var import_server = require("@fluixi/server");
28
+
29
+ // src/server-fn.ts
30
+ var contextRunner = null;
31
+ function setServerFnContextRunner(runner) {
32
+ contextRunner = runner;
33
+ }
34
+
35
+ // src/server-fn-setup.ts
36
+ setServerFnContextRunner((request, run) => {
37
+ const responseHeaders = {};
38
+ const event = { request, url: new URL(request.url).pathname, responseHeaders };
39
+ const ctx = (0, import_server.createRequestContext)(event);
40
+ const result = Promise.resolve((0, import_server.runWithRequestContext)(ctx, run));
41
+ return { result, responseHeaders };
42
+ });
43
+ // Annotate the CommonJS export names for ESM import in node:
44
+ 0 && (module.exports = {
45
+ getRequestEvent
46
+ });
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Server-only bridge: wire `@fluixi/server`'s request context into the server-function
3
3
  * dispatcher so `getRequestEvent()` works inside a `"use server"` function. Imported by
4
- * `virtual:fluixi-server-fns` (server build only) never by the client.
4
+ * `virtual:fluixi-server-fns` (server build only), never by the client.
5
5
  */
6
6
  import { getRequestEvent } from '@fluixi/server';
7
7
  export { getRequestEvent };
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Server-only bridge: wire `@fluixi/server`'s request context into the server-function
3
3
  * dispatcher so `getRequestEvent()` works inside a `"use server"` function. Imported by
4
- * `virtual:fluixi-server-fns` (server build only) never by the client.
4
+ * `virtual:fluixi-server-fns` (server build only), never by the client.
5
5
  */
6
6
  import { createRequestContext, runWithRequestContext, getRequestEvent } from '@fluixi/server';
7
7
  import { setServerFnContextRunner } from './server-fn.js';
@@ -13,5 +13,5 @@ setServerFnContextRunner((request, run) => {
13
13
  return { result, responseHeaders };
14
14
  });
15
15
  // Re-exported so a server function can `import { getRequestEvent } from '@fluixi/start/server-fn-setup'`
16
- // though importing from `@fluixi/server` directly works too.
16
+ //: though importing from `@fluixi/server` directly works too.
17
17
  export { getRequestEvent };
@@ -0,0 +1,22 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+
3
+ // src/server-fn-setup.ts
4
+ import { createRequestContext, runWithRequestContext, getRequestEvent } from "@fluixi/server";
5
+
6
+ // src/server-fn.ts
7
+ var contextRunner = null;
8
+ function setServerFnContextRunner(runner) {
9
+ contextRunner = runner;
10
+ }
11
+
12
+ // src/server-fn-setup.ts
13
+ setServerFnContextRunner((request, run) => {
14
+ const responseHeaders = {};
15
+ const event = { request, url: new URL(request.url).pathname, responseHeaders };
16
+ const ctx = createRequestContext(event);
17
+ const result = Promise.resolve(runWithRequestContext(ctx, run));
18
+ return { result, responseHeaders };
19
+ });
20
+ export {
21
+ getRequestEvent
22
+ };