@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
package/dist/index.mjs ADDED
@@ -0,0 +1,262 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+
3
+ // src/define-config.ts
4
+ function defineConfig(config) {
5
+ return config;
6
+ }
7
+
8
+ // src/index.ts
9
+ import { html, svg } from "@fluixi/core";
10
+
11
+ // src/document.ts
12
+ import { extractHeadMarker } from "@fluixi/head";
13
+ function injectApp(template, appHtml, mountId = "root") {
14
+ const mount = new RegExp(`<div id=["']${mountId}["']\\s*>\\s*</div>`);
15
+ if (mount.test(template)) {
16
+ return template.replace(mount, `<div id="${mountId}">${appHtml}</div>`);
17
+ }
18
+ if (template.includes("<!--ssr-outlet-->")) {
19
+ return template.replace("<!--ssr-outlet-->", appHtml);
20
+ }
21
+ return template.replace("</body>", `<div id="${mountId}">${appHtml}</div></body>`);
22
+ }
23
+ function splitTemplate(template, mountId = "root") {
24
+ const mount = new RegExp(`<div id=["']${mountId}["']\\s*>\\s*</div>`);
25
+ const m = template.match(mount);
26
+ if (m && m.index !== void 0) {
27
+ return {
28
+ head: template.slice(0, m.index) + `<div id="${mountId}">`,
29
+ tail: `</div>` + template.slice(m.index + m[0].length)
30
+ };
31
+ }
32
+ const outlet = template.indexOf("<!--ssr-outlet-->");
33
+ if (outlet !== -1) {
34
+ return {
35
+ head: template.slice(0, outlet),
36
+ tail: template.slice(outlet + "<!--ssr-outlet-->".length)
37
+ };
38
+ }
39
+ const body = template.indexOf("</body>");
40
+ if (body !== -1) {
41
+ return {
42
+ head: template.slice(0, body) + `<div id="${mountId}">`,
43
+ tail: `</div>` + template.slice(body)
44
+ };
45
+ }
46
+ return { head: template, tail: "" };
47
+ }
48
+ function injectPreload(template, files) {
49
+ const tags = files.filter((file) => !template.includes(file)).map(
50
+ (file) => file.endsWith(".css") ? `<link rel="stylesheet" href="${file}">` : (
51
+ // `modulepreload` also fetches the chunk's own static imports.
52
+ `<link rel="modulepreload" href="${file}">`
53
+ )
54
+ );
55
+ if (tags.length === 0) return template;
56
+ const head = template.indexOf("</head>");
57
+ if (head === -1) return template;
58
+ return template.slice(0, head) + tags.join("") + template.slice(head);
59
+ }
60
+ function setHtmlAttr(html2, name, value) {
61
+ const existing = new RegExp(`(<html\\b[^>]*?)\\s${name}="[^"]*"`, "i");
62
+ if (existing.test(html2)) return html2.replace(existing, `$1 ${name}="${value}"`);
63
+ return html2.replace(/<html\b/i, `<html ${name}="${value}"`);
64
+ }
65
+ function injectAppAndHead(template, rendered, mountId = "root") {
66
+ const { head, body } = extractHeadMarker(rendered);
67
+ let html2 = injectApp(template, body, mountId);
68
+ if (head) {
69
+ if (head.headHtml) {
70
+ if (/<title[\s>]/i.test(head.headHtml)) html2 = html2.replace(/<title>[\s\S]*?<\/title>/i, "");
71
+ html2 = html2.replace("</head>", `${head.headHtml}</head>`);
72
+ }
73
+ for (const [k, v] of Object.entries(head.htmlAttrs)) html2 = setHtmlAttr(html2, k, v);
74
+ }
75
+ return html2;
76
+ }
77
+ function guardHandler(handler, onError) {
78
+ return async (request) => {
79
+ try {
80
+ return await handler(request);
81
+ } catch (e) {
82
+ onError?.(e);
83
+ return new Response(String(e?.stack || e), {
84
+ status: 500,
85
+ headers: { "content-type": "text/plain; charset=utf-8" }
86
+ });
87
+ }
88
+ };
89
+ }
90
+
91
+ // src/handler.ts
92
+ function streamDocument(head, body, tail) {
93
+ const enc = new TextEncoder();
94
+ const stream = new ReadableStream({
95
+ async start(controller) {
96
+ try {
97
+ controller.enqueue(enc.encode(head));
98
+ const reader = body.getReader();
99
+ for (; ; ) {
100
+ const { done, value } = await reader.read();
101
+ if (done) break;
102
+ controller.enqueue(value);
103
+ }
104
+ controller.enqueue(enc.encode(tail));
105
+ controller.close();
106
+ } catch (err) {
107
+ controller.error(err);
108
+ }
109
+ }
110
+ });
111
+ return new Response(stream, {
112
+ status: 200,
113
+ headers: { "content-type": "text/html; charset=utf-8" }
114
+ });
115
+ }
116
+ function createRequestHandler(render) {
117
+ return async (request) => {
118
+ const url = new URL(request.url);
119
+ try {
120
+ const html2 = await render(url.pathname + url.search, request);
121
+ return new Response(html2, {
122
+ status: 200,
123
+ headers: { "content-type": "text/html; charset=utf-8" }
124
+ });
125
+ } catch (e) {
126
+ return new Response(String(e?.stack || e), {
127
+ status: 500,
128
+ headers: { "content-type": "text/plain; charset=utf-8" }
129
+ });
130
+ }
131
+ };
132
+ }
133
+
134
+ // src/middleware.ts
135
+ function defineMiddleware(mw) {
136
+ return Array.isArray(mw) ? mw.slice() : [mw];
137
+ }
138
+ function normalizeMiddleware(mod) {
139
+ const def = mod?.default ?? mod;
140
+ if (def == null) return [];
141
+ if (Array.isArray(def)) return def.filter((m) => typeof m === "function");
142
+ return typeof def === "function" ? [def] : [];
143
+ }
144
+ function composeMiddleware(middlewares, core) {
145
+ if (middlewares.length === 0) return core;
146
+ return (request) => {
147
+ let lastCalled = -1;
148
+ const dispatch = (i) => {
149
+ if (i <= lastCalled) {
150
+ return Promise.reject(new Error("middleware called next() more than once"));
151
+ }
152
+ lastCalled = i;
153
+ const mw = middlewares[i];
154
+ if (!mw) return Promise.resolve(core(request));
155
+ return Promise.resolve(mw(request, () => dispatch(i + 1)));
156
+ };
157
+ return dispatch(0);
158
+ };
159
+ }
160
+
161
+ // src/handler-core.ts
162
+ function createHandlerFrom({ template, mod, cfg, middleware, preload }) {
163
+ const withPreload = (html2, pathname) => preload ? injectPreload(html2, preload(pathname)) : html2;
164
+ let core;
165
+ if (!cfg.ssr) {
166
+ core = createRequestHandler(async (url) => withPreload(template, url.split("?")[0]));
167
+ } else if (typeof mod.renderStream === "function") {
168
+ core = async (request) => {
169
+ const url = new URL(request.url);
170
+ const { head, tail } = splitTemplate(withPreload(template, url.pathname), cfg.mountId);
171
+ const body = await mod.renderStream(url.pathname + url.search, request);
172
+ return streamDocument(head, body, tail);
173
+ };
174
+ } else {
175
+ const render = mod.render ?? mod.default;
176
+ core = createRequestHandler(
177
+ async (url, request) => (
178
+ // `url` here is `pathname + search`; matching only ever wants the path.
179
+ injectAppAndHead(withPreload(template, url.split("?")[0]), await render(url, request), cfg.mountId)
180
+ )
181
+ );
182
+ }
183
+ if (typeof mod.handleServerFn === "function" && typeof mod.isServerFnRequest === "function") {
184
+ const render = core;
185
+ core = async (request) => mod.isServerFnRequest(request) ? mod.handleServerFn(request) : render(request);
186
+ }
187
+ if (typeof mod.handleApiRequest === "function" && typeof mod.isApiRequest === "function") {
188
+ const next = core;
189
+ core = async (request) => mod.isApiRequest(request) ? mod.handleApiRequest(request) : next(request);
190
+ }
191
+ if (!middleware) return guardHandler(core);
192
+ return guardHandler(composeMiddleware(normalizeMiddleware(middleware), core));
193
+ }
194
+
195
+ // src/server-fn.ts
196
+ var _fetch = (...a) => fetch(...a);
197
+ function setServerFnFetch(f) {
198
+ _fetch = f;
199
+ }
200
+
201
+ // src/interceptors.ts
202
+ var interceptors = [];
203
+ function addInterceptor(interceptor) {
204
+ if (interceptors.length === 0) setServerFnFetch(fetchWithInterceptors);
205
+ interceptors.push(interceptor);
206
+ return () => {
207
+ const i = interceptors.indexOf(interceptor);
208
+ if (i >= 0) interceptors.splice(i, 1);
209
+ };
210
+ }
211
+ function clearInterceptors() {
212
+ interceptors.length = 0;
213
+ setServerFnFetch(((...a) => fetch(...a)));
214
+ }
215
+ async function fetchWithInterceptors(input, init) {
216
+ let request = input instanceof Request && !init ? input : new Request(input, init);
217
+ for (const i of interceptors) if (i.request) request = await i.request(request);
218
+ let response;
219
+ try {
220
+ response = await fetch(request);
221
+ } catch (error) {
222
+ for (const i of interceptors) {
223
+ if (!i.error) continue;
224
+ const recovered = await i.error(error, request);
225
+ if (recovered) return recovered;
226
+ }
227
+ throw error;
228
+ }
229
+ for (const i of interceptors) if (i.response) response = await i.response(response, request);
230
+ return response;
231
+ }
232
+
233
+ // src/image-loader.ts
234
+ function imageLoader(options = {}) {
235
+ const path = options.path ?? "/api/image";
236
+ return ({ src, width, quality }) => {
237
+ const params = new URLSearchParams({ url: src, w: String(width) });
238
+ if (quality != null) params.set("q", String(quality));
239
+ return `${path}?${params.toString()}`;
240
+ };
241
+ }
242
+
243
+ // src/index.ts
244
+ import { getRequestLocals, getLocals } from "@fluixi/server";
245
+ export {
246
+ addInterceptor,
247
+ clearInterceptors,
248
+ composeMiddleware,
249
+ createHandlerFrom,
250
+ defineConfig,
251
+ defineMiddleware,
252
+ fetchWithInterceptors,
253
+ getLocals,
254
+ getRequestLocals,
255
+ html,
256
+ imageLoader,
257
+ injectApp,
258
+ injectAppAndHead,
259
+ normalizeMiddleware,
260
+ splitTemplate,
261
+ svg
262
+ };
@@ -0,0 +1,72 @@
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/interceptors.ts
22
+ var interceptors_exports = {};
23
+ __export(interceptors_exports, {
24
+ addInterceptor: () => addInterceptor,
25
+ clearInterceptors: () => clearInterceptors,
26
+ fetchWithInterceptors: () => fetchWithInterceptors
27
+ });
28
+ module.exports = __toCommonJS(interceptors_exports);
29
+
30
+ // src/server-fn.ts
31
+ var _fetch = (...a) => fetch(...a);
32
+ function setServerFnFetch(f) {
33
+ _fetch = f;
34
+ }
35
+
36
+ // src/interceptors.ts
37
+ var interceptors = [];
38
+ function addInterceptor(interceptor) {
39
+ if (interceptors.length === 0) setServerFnFetch(fetchWithInterceptors);
40
+ interceptors.push(interceptor);
41
+ return () => {
42
+ const i = interceptors.indexOf(interceptor);
43
+ if (i >= 0) interceptors.splice(i, 1);
44
+ };
45
+ }
46
+ function clearInterceptors() {
47
+ interceptors.length = 0;
48
+ setServerFnFetch(((...a) => fetch(...a)));
49
+ }
50
+ async function fetchWithInterceptors(input, init) {
51
+ let request = input instanceof Request && !init ? input : new Request(input, init);
52
+ for (const i of interceptors) if (i.request) request = await i.request(request);
53
+ let response;
54
+ try {
55
+ response = await fetch(request);
56
+ } catch (error) {
57
+ for (const i of interceptors) {
58
+ if (!i.error) continue;
59
+ const recovered = await i.error(error, request);
60
+ if (recovered) return recovered;
61
+ }
62
+ throw error;
63
+ }
64
+ for (const i of interceptors) if (i.response) response = await i.response(response, request);
65
+ return response;
66
+ }
67
+ // Annotate the CommonJS export names for ESM import in node:
68
+ 0 && (module.exports = {
69
+ addInterceptor,
70
+ clearInterceptors,
71
+ fetchWithInterceptors
72
+ });
@@ -1,4 +1,4 @@
1
- // HTTP interceptors a request/response/error pipeline around fetch (Angular-style).
1
+ // HTTP interceptors: a request/response/error pipeline around fetch (Angular-style).
2
2
  // Register interceptors to attach auth headers, handle 401s, log, or retry. Server-function
3
3
  // RPC calls route through this automatically once any interceptor is added; use
4
4
  // `fetchWithInterceptors` for your own data fetching too.
@@ -0,0 +1,44 @@
1
+ /*! @fluixi/start v0.1.0-alpha.75 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
2
+
3
+ // src/server-fn.ts
4
+ var _fetch = (...a) => fetch(...a);
5
+ function setServerFnFetch(f) {
6
+ _fetch = f;
7
+ }
8
+
9
+ // src/interceptors.ts
10
+ var interceptors = [];
11
+ function addInterceptor(interceptor) {
12
+ if (interceptors.length === 0) setServerFnFetch(fetchWithInterceptors);
13
+ interceptors.push(interceptor);
14
+ return () => {
15
+ const i = interceptors.indexOf(interceptor);
16
+ if (i >= 0) interceptors.splice(i, 1);
17
+ };
18
+ }
19
+ function clearInterceptors() {
20
+ interceptors.length = 0;
21
+ setServerFnFetch(((...a) => fetch(...a)));
22
+ }
23
+ async function fetchWithInterceptors(input, init) {
24
+ let request = input instanceof Request && !init ? input : new Request(input, init);
25
+ for (const i of interceptors) if (i.request) request = await i.request(request);
26
+ let response;
27
+ try {
28
+ response = await fetch(request);
29
+ } catch (error) {
30
+ for (const i of interceptors) {
31
+ if (!i.error) continue;
32
+ const recovered = await i.error(error, request);
33
+ if (recovered) return recovered;
34
+ }
35
+ throw error;
36
+ }
37
+ for (const i of interceptors) if (i.response) response = await i.response(response, request);
38
+ return response;
39
+ }
40
+ export {
41
+ addInterceptor,
42
+ clearInterceptors,
43
+ fetchWithInterceptors
44
+ };