@fluixi/core 1.0.0-alpha.100
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 +334 -0
- package/dist/cdn/core.global.js +2 -0
- package/dist/cli/generate.cjs +5639 -0
- package/dist/cli/generate.d.ts +7 -0
- package/dist/cli/generate.d.ts.map +1 -0
- package/dist/cli/generate.js +2580 -0
- package/dist/cli/generate.mjs +5644 -0
- package/dist/cli/index.cjs +5639 -0
- package/dist/cli/index.d.ts +7 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +2580 -0
- package/dist/cli/index.mjs +5644 -0
- package/dist/cli/run.cjs +64 -0
- package/dist/cli/run.d.ts +3 -0
- package/dist/cli/run.d.ts.map +1 -0
- package/dist/cli/run.js +62 -0
- package/dist/cli/run.mjs +40 -0
- package/dist/fluixi.d.ts +5 -0
- package/dist/src/cdn/chunk-RKBFEFZP.mjs +987 -0
- package/dist/src/cdn/core.cjs +1592 -0
- package/dist/src/cdn/core.d.ts +16 -0
- package/dist/src/cdn/core.d.ts.map +1 -0
- package/dist/src/cdn/core.js +15 -0
- package/dist/src/cdn/core.mjs +714 -0
- package/dist/src/cdn/router-V2THK27H.mjs +74 -0
- package/dist/src/index.cjs +1711 -0
- package/dist/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +11 -0
- package/dist/src/index.mjs +1833 -0
- package/dist/src/jsx-dev-runtime.cjs +26 -0
- package/dist/src/jsx-dev-runtime.d.ts +2 -0
- package/dist/src/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/src/jsx-dev-runtime.js +1 -0
- package/dist/src/jsx-dev-runtime.mjs +24 -0
- package/dist/src/jsx-runtime.cjs +26 -0
- package/dist/src/jsx-runtime.d.ts +7 -0
- package/dist/src/jsx-runtime.d.ts.map +1 -0
- package/dist/src/jsx-runtime.js +8 -0
- package/dist/src/jsx-runtime.mjs +24 -0
- package/dist/src/lib/client/chunk-FDOPDB6Z.mjs +53 -0
- package/dist/src/lib/client/index.cjs +1210 -0
- package/dist/src/lib/client/index.d.ts +51 -0
- package/dist/src/lib/client/index.d.ts.map +1 -0
- package/dist/src/lib/client/index.js +174 -0
- package/dist/src/lib/client/index.mjs +293 -0
- package/dist/src/lib/client/router-4PTBPZLQ.mjs +891 -0
- package/dist/src/lib/context/context.cjs +81 -0
- package/dist/src/lib/context/context.d.ts +73 -0
- package/dist/src/lib/context/context.d.ts.map +1 -0
- package/dist/src/lib/context/context.js +93 -0
- package/dist/src/lib/context/context.mjs +64 -0
- package/dist/src/lib/context/index.cjs +83 -0
- package/dist/src/lib/context/index.d.ts +3 -0
- package/dist/src/lib/context/index.d.ts.map +1 -0
- package/dist/src/lib/context/index.js +1 -0
- package/dist/src/lib/context/index.mjs +64 -0
- package/dist/src/lib/control-flow.cjs +35 -0
- package/dist/src/lib/control-flow.d.ts +4 -0
- package/dist/src/lib/control-flow.d.ts.map +1 -0
- package/dist/src/lib/control-flow.js +1 -0
- package/dist/src/lib/control-flow.mjs +25 -0
- package/dist/src/lib/core.cjs +1710 -0
- package/dist/src/lib/core.d.ts +91 -0
- package/dist/src/lib/core.d.ts.map +1 -0
- package/dist/src/lib/core.js +158 -0
- package/dist/src/lib/core.mjs +1833 -0
- package/dist/src/lib/env/index.cjs +44 -0
- package/dist/src/lib/env/index.d.ts +26 -0
- package/dist/src/lib/env/index.d.ts.map +1 -0
- package/dist/src/lib/env/index.js +31 -0
- package/dist/src/lib/env/index.mjs +23 -0
- package/dist/src/lib/i18n/index.cjs +123 -0
- package/dist/src/lib/i18n/index.d.ts +110 -0
- package/dist/src/lib/i18n/index.d.ts.map +1 -0
- package/dist/src/lib/i18n/index.js +164 -0
- package/dist/src/lib/i18n/index.mjs +103 -0
- package/dist/src/lib/index.cjs +598 -0
- package/dist/src/lib/index.d.ts +81 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +130 -0
- package/dist/src/lib/index.mjs +688 -0
- package/dist/src/lib/isomorphic.cjs +90 -0
- package/dist/src/lib/isomorphic.d.ts +114 -0
- package/dist/src/lib/isomorphic.d.ts.map +1 -0
- package/dist/src/lib/isomorphic.js +132 -0
- package/dist/src/lib/isomorphic.mjs +69 -0
- package/dist/src/lib/jsx-runtime/index.cjs +21 -0
- package/dist/src/lib/jsx-runtime/index.d.ts +13 -0
- package/dist/src/lib/jsx-runtime/index.d.ts.map +1 -0
- package/dist/src/lib/jsx-runtime/index.js +13 -0
- package/dist/src/lib/jsx-runtime/index.mjs +4 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.cjs +21 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.d.ts +2 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.js +1 -0
- package/dist/src/lib/jsx-runtime/jsx-dev-runtime.mjs +4 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.cjs +302 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts +35 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts.map +1 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.js +118 -0
- package/dist/src/lib/plugins/fluixi-routes-plugin.mjs +271 -0
- package/dist/src/lib/plugins/index.cjs +311 -0
- package/dist/src/lib/plugins/index.d.ts +6 -0
- package/dist/src/lib/plugins/index.d.ts.map +1 -0
- package/dist/src/lib/plugins/index.js +7 -0
- package/dist/src/lib/plugins/index.mjs +279 -0
- package/dist/src/lib/plugins/route-codegen.cjs +73 -0
- package/dist/src/lib/plugins/route-codegen.d.ts +12 -0
- package/dist/src/lib/plugins/route-codegen.d.ts.map +1 -0
- package/dist/src/lib/plugins/route-codegen.js +80 -0
- package/dist/src/lib/plugins/route-codegen.mjs +52 -0
- package/dist/src/lib/plugins/route-scanner.cjs +189 -0
- package/dist/src/lib/plugins/route-scanner.d.ts +38 -0
- package/dist/src/lib/plugins/route-scanner.d.ts.map +1 -0
- package/dist/src/lib/plugins/route-scanner.js +215 -0
- package/dist/src/lib/plugins/route-scanner.mjs +158 -0
- package/dist/src/lib/plugins/vite.cjs +27 -0
- package/dist/src/lib/plugins/vite.d.ts +3 -0
- package/dist/src/lib/plugins/vite.d.ts.map +1 -0
- package/dist/src/lib/plugins/vite.js +1 -0
- package/dist/src/lib/plugins/vite.mjs +6 -0
- package/dist/src/lib/render/await.cjs +38 -0
- package/dist/src/lib/render/await.d.ts +26 -0
- package/dist/src/lib/render/await.d.ts.map +1 -0
- package/dist/src/lib/render/await.js +45 -0
- package/dist/src/lib/render/await.mjs +17 -0
- package/dist/src/lib/render/component.cjs +221 -0
- package/dist/src/lib/render/component.d.ts +296 -0
- package/dist/src/lib/render/component.d.ts.map +1 -0
- package/dist/src/lib/render/component.js +514 -0
- package/dist/src/lib/render/component.mjs +214 -0
- package/dist/src/lib/render/deferred.cjs +175 -0
- package/dist/src/lib/render/deferred.d.ts +36 -0
- package/dist/src/lib/render/deferred.d.ts.map +1 -0
- package/dist/src/lib/render/deferred.js +141 -0
- package/dist/src/lib/render/deferred.mjs +158 -0
- package/dist/src/lib/render/index.cjs +573 -0
- package/dist/src/lib/render/index.d.ts +98 -0
- package/dist/src/lib/render/index.d.ts.map +1 -0
- package/dist/src/lib/render/index.js +180 -0
- package/dist/src/lib/render/index.mjs +590 -0
- package/dist/src/lib/render/lazy.cjs +67 -0
- package/dist/src/lib/render/lazy.d.ts +49 -0
- package/dist/src/lib/render/lazy.d.ts.map +1 -0
- package/dist/src/lib/render/lazy.js +105 -0
- package/dist/src/lib/render/lazy.mjs +50 -0
- package/dist/src/lib/render/suspense.cjs +141 -0
- package/dist/src/lib/render/suspense.d.ts +65 -0
- package/dist/src/lib/render/suspense.d.ts.map +1 -0
- package/dist/src/lib/render/suspense.js +196 -0
- package/dist/src/lib/render/suspense.mjs +136 -0
- package/dist/src/lib/render/versions.cjs +35 -0
- package/dist/src/lib/render/versions.d.ts +2 -0
- package/dist/src/lib/render/versions.d.ts.map +1 -0
- package/dist/src/lib/render/versions.js +21 -0
- package/dist/src/lib/render/versions.mjs +14 -0
- package/dist/src/lib/router/data.cjs +228 -0
- package/dist/src/lib/router/data.d.ts +142 -0
- package/dist/src/lib/router/data.d.ts.map +1 -0
- package/dist/src/lib/router/data.js +258 -0
- package/dist/src/lib/router/data.mjs +214 -0
- package/dist/src/lib/router/index.cjs +921 -0
- package/dist/src/lib/router/index.d.ts +274 -0
- package/dist/src/lib/router/index.d.ts.map +1 -0
- package/dist/src/lib/router/index.js +904 -0
- package/dist/src/lib/router/index.mjs +938 -0
- package/dist/src/lib/router/scroll.cjs +79 -0
- package/dist/src/lib/router/scroll.d.ts +19 -0
- package/dist/src/lib/router/scroll.d.ts.map +1 -0
- package/dist/src/lib/router/scroll.js +68 -0
- package/dist/src/lib/router/scroll.mjs +58 -0
- package/dist/src/lib/router/transition.cjs +75 -0
- package/dist/src/lib/router/transition.d.ts +81 -0
- package/dist/src/lib/router/transition.d.ts.map +1 -0
- package/dist/src/lib/router/transition.js +136 -0
- package/dist/src/lib/router/transition.mjs +54 -0
- package/dist/src/lib/server/hydration.cjs +169 -0
- package/dist/src/lib/server/hydration.d.ts +198 -0
- package/dist/src/lib/server/hydration.d.ts.map +1 -0
- package/dist/src/lib/server/hydration.js +345 -0
- package/dist/src/lib/server/hydration.mjs +148 -0
- package/dist/src/lib/server/index.cjs +406 -0
- package/dist/src/lib/server/index.d.ts +115 -0
- package/dist/src/lib/server/index.d.ts.map +1 -0
- package/dist/src/lib/server/index.js +164 -0
- package/dist/src/lib/server/index.mjs +384 -0
- package/dist/src/lib/server/reactive.cjs +197 -0
- package/dist/src/lib/server/reactive.d.ts +239 -0
- package/dist/src/lib/server/reactive.d.ts.map +1 -0
- package/dist/src/lib/server/reactive.js +413 -0
- package/dist/src/lib/server/reactive.mjs +176 -0
- package/dist/src/lib/storage/cache.cjs +51 -0
- package/dist/src/lib/storage/cache.d.ts +18 -0
- package/dist/src/lib/storage/cache.d.ts.map +1 -0
- package/dist/src/lib/storage/cache.js +42 -0
- package/dist/src/lib/storage/cache.mjs +30 -0
- package/dist/src/lib/storage/index.cjs +246 -0
- package/dist/src/lib/storage/index.d.ts +83 -0
- package/dist/src/lib/storage/index.d.ts.map +1 -0
- package/dist/src/lib/storage/index.js +179 -0
- package/dist/src/lib/storage/index.mjs +231 -0
- package/dist/src/lib/storage/persisted.cjs +91 -0
- package/dist/src/lib/storage/persisted.d.ts +53 -0
- package/dist/src/lib/storage/persisted.d.ts.map +1 -0
- package/dist/src/lib/storage/persisted.js +75 -0
- package/dist/src/lib/storage/persisted.mjs +70 -0
- package/dist/src/lib/theme/color-scheme.cjs +281 -0
- package/dist/src/lib/theme/color-scheme.d.ts +61 -0
- package/dist/src/lib/theme/color-scheme.d.ts.map +1 -0
- package/dist/src/lib/theme/color-scheme.js +120 -0
- package/dist/src/lib/theme/color-scheme.mjs +265 -0
- package/dist/src/lib/theme/index.cjs +267 -0
- package/dist/src/lib/theme/index.d.ts +78 -0
- package/dist/src/lib/theme/index.d.ts.map +1 -0
- package/dist/src/lib/theme/index.js +135 -0
- package/dist/src/lib/theme/index.mjs +251 -0
- package/dist/src/lib/theme/provider.cjs +346 -0
- package/dist/src/lib/theme/provider.d.ts +34 -0
- package/dist/src/lib/theme/provider.d.ts.map +1 -0
- package/dist/src/lib/theme/provider.js +60 -0
- package/dist/src/lib/theme/provider.mjs +332 -0
- package/dist/src/lib/utils/index.cjs +209 -0
- package/dist/src/lib/utils/index.d.ts +286 -0
- package/dist/src/lib/utils/index.d.ts.map +1 -0
- package/dist/src/lib/utils/index.js +434 -0
- package/dist/src/lib/utils/index.mjs +188 -0
- package/dist/src/routes.cjs +37 -0
- package/dist/src/routes.d.ts +22 -0
- package/dist/src/routes.d.ts.map +1 -0
- package/dist/src/routes.js +20 -0
- package/dist/src/routes.mjs +17 -0
- package/dist/src/server.cjs +405 -0
- package/dist/src/server.d.ts +63 -0
- package/dist/src/server.d.ts.map +1 -0
- package/dist/src/server.js +62 -0
- package/dist/src/server.mjs +382 -0
- package/dist/src/utils.cjs +21 -0
- package/dist/src/utils.d.ts +10 -0
- package/dist/src/utils.d.ts.map +1 -0
- package/dist/src/utils.js +9 -0
- package/dist/src/utils.mjs +4 -0
- package/dist/src/version.generated.cjs +26 -0
- package/dist/src/version.generated.d.ts +3 -0
- package/dist/src/version.generated.d.ts.map +1 -0
- package/dist/src/version.generated.js +3 -0
- package/dist/src/version.generated.mjs +5 -0
- package/dist/tsconfig.lib.tsbuildinfo +1 -0
- package/package.json +164 -0
- package/src/index.ts +19 -0
- package/types/fluixi.d.ts +5 -0
- package/types/vinxi.d.ts +50 -0
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @module @fluixi/core/server
|
|
3
|
+
*
|
|
4
|
+
* Implements Unified SSR Engine compatible with Lit and JSX.
|
|
5
|
+
*/
|
|
6
|
+
import { serializeHydrationData, setHydrating, isHydrating, setHydrationData, getHydrationData, hasHydrationData, clearHydrationData, clearHydrationDataKey, deserializeHydrationData, hydrationMarker, hydrationMarkerStart, hydrationMarkerEnd, createHydratableResource, useHydrationData, cleanupHydration, isServerEnvironment, isClientEnvironment, } from './hydration.js';
|
|
7
|
+
// SSR runs through @fluixi/server: the universal renderer + request-scoping,
|
|
8
|
+
// with AsyncLocalStorage injected so concurrent renders are isolated.
|
|
9
|
+
import { renderToString as domRenderToString } from '@fluixi/server';
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// SSR CONTEXT MANAGEMENT
|
|
12
|
+
// ============================================================================
|
|
13
|
+
let currentSSRContext = null;
|
|
14
|
+
/**
|
|
15
|
+
* Get current SSR context
|
|
16
|
+
*/
|
|
17
|
+
export function getSSRContext() {
|
|
18
|
+
return currentSSRContext;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set SSR context
|
|
22
|
+
*/
|
|
23
|
+
export function setSSRContext(context) {
|
|
24
|
+
currentSSRContext = context;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Run function with SSR context
|
|
28
|
+
*/
|
|
29
|
+
export function withSSRContext(context, fn) {
|
|
30
|
+
const prev = currentSSRContext;
|
|
31
|
+
currentSSRContext = context;
|
|
32
|
+
try {
|
|
33
|
+
return fn();
|
|
34
|
+
}
|
|
35
|
+
finally {
|
|
36
|
+
currentSSRContext = prev;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
// ============================================================================
|
|
40
|
+
// HTML GENERATION
|
|
41
|
+
// ============================================================================
|
|
42
|
+
/**
|
|
43
|
+
* Render complete HTML page
|
|
44
|
+
*/
|
|
45
|
+
export async function renderToPage(code, options = {}) {
|
|
46
|
+
const content = await renderToString(code);
|
|
47
|
+
return createHtmlDocument(content, options);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Create HTML document wrapper
|
|
51
|
+
*/
|
|
52
|
+
export function createHtmlDocument(content, options = {}) {
|
|
53
|
+
const { title = 'Fluixi App', lang = 'en', stylesheets = [], scripts = [], head = '', bodyAttributes = '', } = options;
|
|
54
|
+
const styleTags = stylesheets
|
|
55
|
+
.map((href) => `<link rel="stylesheet" href="${href}">`)
|
|
56
|
+
.join('\n ');
|
|
57
|
+
const scriptTags = scripts
|
|
58
|
+
.map((src) => `<script type="module" src="${src}"></script>`)
|
|
59
|
+
.join('\n ');
|
|
60
|
+
return `<!DOCTYPE html>
|
|
61
|
+
<html lang="${lang}">
|
|
62
|
+
<head>
|
|
63
|
+
<meta charset="UTF-8">
|
|
64
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
65
|
+
<title>${title}</title>
|
|
66
|
+
${styleTags}
|
|
67
|
+
${head}
|
|
68
|
+
</head>
|
|
69
|
+
<body${bodyAttributes ? ' ' + bodyAttributes : ''}>
|
|
70
|
+
${content}
|
|
71
|
+
${scriptTags}
|
|
72
|
+
</body>
|
|
73
|
+
</html>`;
|
|
74
|
+
}
|
|
75
|
+
// ============================================================================
|
|
76
|
+
// ENVIRONMENT DETECTION
|
|
77
|
+
// ============================================================================
|
|
78
|
+
/**
|
|
79
|
+
* Whether this is a server render.
|
|
80
|
+
*
|
|
81
|
+
* Re-exported from `@fluixi/dom`, which owns the answer: the flag lives on a realm
|
|
82
|
+
* singleton that `renderToString` sets, so it is true for the whole of a server render
|
|
83
|
+
* even in a jsdom process where `window` exists.
|
|
84
|
+
*
|
|
85
|
+
* This used to be a local `typeof window === 'undefined'`, which meant
|
|
86
|
+
* `@fluixi/core/server` and `@fluixi/core` disagreed about the same question, and the
|
|
87
|
+
* local one was wrong in exactly the case that matters. Four copies of that test were
|
|
88
|
+
* the alpha.83 SSR bug; do not add a fifth.
|
|
89
|
+
*/
|
|
90
|
+
export { isServer } from '@fluixi/dom';
|
|
91
|
+
/** Whether this is running in a browser, which is the negation of a server render. */
|
|
92
|
+
export function isClient() {
|
|
93
|
+
return !domIsServer();
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Run `fn` only during a server render, otherwise take `fallback`.
|
|
97
|
+
*
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const secret = onServer(() => process.env.API_KEY, '');
|
|
101
|
+
* ```
|
|
102
|
+
*/
|
|
103
|
+
export function onServer(fn, fallback) {
|
|
104
|
+
return domIsServer() ? fn() : fallback;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Run `fn` only in the browser, otherwise take `fallback`.
|
|
108
|
+
*
|
|
109
|
+
* @example
|
|
110
|
+
* ```ts
|
|
111
|
+
* const width = onClient(() => window.innerWidth, 0);
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
export function onClient(fn, fallback) {
|
|
115
|
+
return !domIsServer() ? fn() : fallback;
|
|
116
|
+
}
|
|
117
|
+
// ============================================================================
|
|
118
|
+
// EXPORTS
|
|
119
|
+
// ============================================================================
|
|
120
|
+
/**
|
|
121
|
+
* Render component to HTML string
|
|
122
|
+
*/
|
|
123
|
+
export async function renderToString(code) {
|
|
124
|
+
const html = await domRenderToString(code);
|
|
125
|
+
const script = serializeHydrationData();
|
|
126
|
+
return html + script;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Render component to stream (includes hydration data)
|
|
130
|
+
*/
|
|
131
|
+
export async function renderToStream(code) {
|
|
132
|
+
const html = await domRenderToString(code);
|
|
133
|
+
const script = serializeHydrationData();
|
|
134
|
+
return html + script;
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Standard server entry point.
|
|
138
|
+
* Returns an object with render/stream/page helpers
|
|
139
|
+
* for use in server frameworks (Express, Hono, Nitro, etc.)
|
|
140
|
+
*
|
|
141
|
+
* @example
|
|
142
|
+
* ```ts
|
|
143
|
+
* // entry-server.ts
|
|
144
|
+
* import { startServer } from '@fluixi/core/server';
|
|
145
|
+
* import App from './app';
|
|
146
|
+
*
|
|
147
|
+
* export default startServer(App);
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export function startServer(App) {
|
|
151
|
+
return {
|
|
152
|
+
/** Render the app to a full HTML string (includes hydration data) */
|
|
153
|
+
render: (url) => renderToString(() => App({ url })),
|
|
154
|
+
/** Render the app to a streamable HTML string (includes hydration data) */
|
|
155
|
+
stream: (url) => renderToStream(() => App({ url })),
|
|
156
|
+
/** Render the app to a complete HTML page document */
|
|
157
|
+
page: (url, opts) => renderToPage(() => App({ url }), opts),
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
// Re-export server-mapped reactive primitives
|
|
161
|
+
export { createSignal, createEffect, createMemo, createRoot, batch, untrack, onCleanup, getOwner, runWithOwner, createContext, useContext, createComputed, createRenderEffect, createDeferred, createSelector, createResource, startTransition, isServer as isServerReactive, isClient as isClientReactive, } from './reactive.js';
|
|
162
|
+
import { isServer as domIsServer } from '@fluixi/dom';
|
|
163
|
+
// Re-export all hydration utilities
|
|
164
|
+
export { isHydrating, setHydrating, setHydrationData, getHydrationData, hasHydrationData, clearHydrationData, clearHydrationDataKey, serializeHydrationData, deserializeHydrationData, hydrationMarker, hydrationMarkerStart, hydrationMarkerEnd, createHydratableResource, useHydrationData, cleanupHydration, isServerEnvironment, isClientEnvironment, };
|
|
@@ -0,0 +1,384 @@
|
|
|
1
|
+
/*! @fluixi/core v1.0.0-alpha.100 | (c) 2026 Ibrahima Touré and Fluixi contributors | MIT */
|
|
2
|
+
|
|
3
|
+
// src/lib/server/hydration.ts
|
|
4
|
+
import { isServer as domIsServer } from "@fluixi/dom";
|
|
5
|
+
var hydrating = false;
|
|
6
|
+
var hydrationDataMap = /* @__PURE__ */ new Map();
|
|
7
|
+
function isHydrating() {
|
|
8
|
+
return hydrating;
|
|
9
|
+
}
|
|
10
|
+
function setHydrating(state) {
|
|
11
|
+
hydrating = state;
|
|
12
|
+
}
|
|
13
|
+
function setHydrationData(key, data) {
|
|
14
|
+
hydrationDataMap.set(key, data);
|
|
15
|
+
}
|
|
16
|
+
function getHydrationData(key) {
|
|
17
|
+
return hydrationDataMap.get(key);
|
|
18
|
+
}
|
|
19
|
+
function hasHydrationData(key) {
|
|
20
|
+
return hydrationDataMap.has(key);
|
|
21
|
+
}
|
|
22
|
+
function clearHydrationData() {
|
|
23
|
+
hydrationDataMap.clear();
|
|
24
|
+
}
|
|
25
|
+
function clearHydrationDataKey(key) {
|
|
26
|
+
hydrationDataMap.delete(key);
|
|
27
|
+
}
|
|
28
|
+
function serializeHydrationData() {
|
|
29
|
+
if (hydrationDataMap.size === 0) {
|
|
30
|
+
return "";
|
|
31
|
+
}
|
|
32
|
+
const data = Object.fromEntries(hydrationDataMap);
|
|
33
|
+
const json = JSON.stringify(data);
|
|
34
|
+
return `<script type="application/json" id="__FLUIXI_HYDRATION__">${json}<\/script>`;
|
|
35
|
+
}
|
|
36
|
+
function deserializeHydrationData() {
|
|
37
|
+
if (typeof window === "undefined") {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
const script = document.getElementById("__FLUIXI_HYDRATION__");
|
|
41
|
+
if (!script || script.getAttribute("type") !== "application/json") {
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
const json = script.textContent || "{}";
|
|
46
|
+
const data = JSON.parse(json);
|
|
47
|
+
for (const [key, value] of Object.entries(data)) {
|
|
48
|
+
hydrationDataMap.set(key, value);
|
|
49
|
+
}
|
|
50
|
+
return true;
|
|
51
|
+
} catch (error) {
|
|
52
|
+
console.error("Failed to deserialize hydration data:", error);
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function hydrationMarker(id) {
|
|
57
|
+
return `<!--#${id}-->`;
|
|
58
|
+
}
|
|
59
|
+
function hydrationMarkerStart(id) {
|
|
60
|
+
return `<!--#${id}-->`;
|
|
61
|
+
}
|
|
62
|
+
function hydrationMarkerEnd(id) {
|
|
63
|
+
return `<!--/${id}-->`;
|
|
64
|
+
}
|
|
65
|
+
function createHydratableResource(key, fetcher) {
|
|
66
|
+
return async () => {
|
|
67
|
+
if (isHydrating() || typeof window !== "undefined") {
|
|
68
|
+
const cached = getHydrationData(key);
|
|
69
|
+
if (cached !== void 0) {
|
|
70
|
+
return cached;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
const data = await fetcher();
|
|
74
|
+
if (typeof window === "undefined") {
|
|
75
|
+
setHydrationData(key, data);
|
|
76
|
+
}
|
|
77
|
+
return data;
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function useHydrationData(key, value) {
|
|
81
|
+
const hydrationData = getHydrationData(key);
|
|
82
|
+
if (hydrationData !== void 0) {
|
|
83
|
+
return hydrationData;
|
|
84
|
+
}
|
|
85
|
+
const computedValue = typeof value === "function" ? value() : value;
|
|
86
|
+
if (typeof window === "undefined") {
|
|
87
|
+
setHydrationData(key, computedValue);
|
|
88
|
+
}
|
|
89
|
+
return computedValue;
|
|
90
|
+
}
|
|
91
|
+
function cleanupHydration() {
|
|
92
|
+
if (typeof window === "undefined") {
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
const script = document.getElementById("__FLUIXI_HYDRATION__");
|
|
96
|
+
if (script) {
|
|
97
|
+
script.remove();
|
|
98
|
+
}
|
|
99
|
+
const walker = document.createTreeWalker(
|
|
100
|
+
document.body,
|
|
101
|
+
NodeFilter.SHOW_COMMENT,
|
|
102
|
+
null
|
|
103
|
+
);
|
|
104
|
+
const comments = [];
|
|
105
|
+
let node;
|
|
106
|
+
while (node = walker.nextNode()) {
|
|
107
|
+
const comment = node;
|
|
108
|
+
const text = comment.nodeValue || "";
|
|
109
|
+
if (text.startsWith("#") || text.startsWith("/")) {
|
|
110
|
+
comments.push(comment);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
comments.forEach((comment) => comment.remove());
|
|
114
|
+
clearHydrationData();
|
|
115
|
+
}
|
|
116
|
+
if (typeof window !== "undefined") {
|
|
117
|
+
window.addEventListener("load", () => {
|
|
118
|
+
setTimeout(cleanupHydration, 100);
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
function isServerEnvironment() {
|
|
122
|
+
return domIsServer();
|
|
123
|
+
}
|
|
124
|
+
function isClientEnvironment() {
|
|
125
|
+
return !domIsServer();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// src/lib/server/index.ts
|
|
129
|
+
import { renderToString as domRenderToString } from "@fluixi/server";
|
|
130
|
+
import { isServer as isServer2 } from "@fluixi/dom";
|
|
131
|
+
|
|
132
|
+
// src/lib/server/reactive.ts
|
|
133
|
+
function createSignal(value, options) {
|
|
134
|
+
let current = value;
|
|
135
|
+
const read = (() => current);
|
|
136
|
+
const write = (newValue) => {
|
|
137
|
+
if (typeof newValue === "function") {
|
|
138
|
+
current = newValue(current);
|
|
139
|
+
} else {
|
|
140
|
+
current = newValue;
|
|
141
|
+
}
|
|
142
|
+
return current;
|
|
143
|
+
};
|
|
144
|
+
return [read, write];
|
|
145
|
+
}
|
|
146
|
+
function createEffect(fn, value, options) {
|
|
147
|
+
try {
|
|
148
|
+
fn(value);
|
|
149
|
+
} catch (error) {
|
|
150
|
+
console.error("[Fluixi Server] Effect error:", error);
|
|
151
|
+
}
|
|
152
|
+
return { dispose: () => {
|
|
153
|
+
} };
|
|
154
|
+
}
|
|
155
|
+
function createMemo(fn, value, options) {
|
|
156
|
+
const computed = fn(value);
|
|
157
|
+
return (() => computed);
|
|
158
|
+
}
|
|
159
|
+
function createRoot(fn) {
|
|
160
|
+
const cleanups = [];
|
|
161
|
+
const dispose = () => {
|
|
162
|
+
cleanups.forEach((cleanup) => {
|
|
163
|
+
try {
|
|
164
|
+
cleanup();
|
|
165
|
+
} catch (error) {
|
|
166
|
+
console.error("[Fluixi Server] Cleanup error:", error);
|
|
167
|
+
}
|
|
168
|
+
});
|
|
169
|
+
cleanups.length = 0;
|
|
170
|
+
};
|
|
171
|
+
try {
|
|
172
|
+
return fn(dispose);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
dispose();
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
function batch(fn) {
|
|
179
|
+
return fn();
|
|
180
|
+
}
|
|
181
|
+
function untrack(fn) {
|
|
182
|
+
return fn();
|
|
183
|
+
}
|
|
184
|
+
var currentCleanups = null;
|
|
185
|
+
function onCleanup(fn) {
|
|
186
|
+
if (currentCleanups) {
|
|
187
|
+
currentCleanups.push(fn);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
var currentOwner = null;
|
|
191
|
+
function getOwner() {
|
|
192
|
+
return currentOwner;
|
|
193
|
+
}
|
|
194
|
+
function runWithOwner(owner, fn) {
|
|
195
|
+
const prev = currentOwner;
|
|
196
|
+
currentOwner = owner;
|
|
197
|
+
try {
|
|
198
|
+
return fn();
|
|
199
|
+
} finally {
|
|
200
|
+
currentOwner = prev;
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
var contextMap = /* @__PURE__ */ new Map();
|
|
204
|
+
function createContext(defaultValue) {
|
|
205
|
+
const id = /* @__PURE__ */ Symbol("context");
|
|
206
|
+
const Provider = (props) => {
|
|
207
|
+
const prevValue = contextMap.get(id);
|
|
208
|
+
contextMap.set(id, props.value);
|
|
209
|
+
try {
|
|
210
|
+
return props.children;
|
|
211
|
+
} finally {
|
|
212
|
+
if (prevValue !== void 0) {
|
|
213
|
+
contextMap.set(id, prevValue);
|
|
214
|
+
} else {
|
|
215
|
+
contextMap.delete(id);
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
};
|
|
219
|
+
return {
|
|
220
|
+
id,
|
|
221
|
+
Provider,
|
|
222
|
+
defaultValue
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
function useContext(context) {
|
|
226
|
+
const value = contextMap.get(context.id);
|
|
227
|
+
return value !== void 0 ? value : context.defaultValue;
|
|
228
|
+
}
|
|
229
|
+
function createComputed(fn) {
|
|
230
|
+
return createEffect(fn);
|
|
231
|
+
}
|
|
232
|
+
function createRenderEffect(fn) {
|
|
233
|
+
return createEffect(fn);
|
|
234
|
+
}
|
|
235
|
+
function createDeferred(fn) {
|
|
236
|
+
return createMemo(fn);
|
|
237
|
+
}
|
|
238
|
+
function createSelector(source) {
|
|
239
|
+
const value = source();
|
|
240
|
+
return (key) => key === value;
|
|
241
|
+
}
|
|
242
|
+
function createResource(source, fetcher, options) {
|
|
243
|
+
return [
|
|
244
|
+
() => void 0,
|
|
245
|
+
{
|
|
246
|
+
mutate: (v) => v,
|
|
247
|
+
refetch: () => {
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
];
|
|
251
|
+
}
|
|
252
|
+
function startTransition(fn) {
|
|
253
|
+
fn();
|
|
254
|
+
}
|
|
255
|
+
var isServer = true;
|
|
256
|
+
var isClient = false;
|
|
257
|
+
|
|
258
|
+
// src/lib/server/index.ts
|
|
259
|
+
import { isServer as domIsServer2 } from "@fluixi/dom";
|
|
260
|
+
var currentSSRContext = null;
|
|
261
|
+
function getSSRContext() {
|
|
262
|
+
return currentSSRContext;
|
|
263
|
+
}
|
|
264
|
+
function setSSRContext(context) {
|
|
265
|
+
currentSSRContext = context;
|
|
266
|
+
}
|
|
267
|
+
function withSSRContext(context, fn) {
|
|
268
|
+
const prev = currentSSRContext;
|
|
269
|
+
currentSSRContext = context;
|
|
270
|
+
try {
|
|
271
|
+
return fn();
|
|
272
|
+
} finally {
|
|
273
|
+
currentSSRContext = prev;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
async function renderToPage(code, options = {}) {
|
|
277
|
+
const content = await renderToString(code);
|
|
278
|
+
return createHtmlDocument(content, options);
|
|
279
|
+
}
|
|
280
|
+
function createHtmlDocument(content, options = {}) {
|
|
281
|
+
const {
|
|
282
|
+
title = "Fluixi App",
|
|
283
|
+
lang = "en",
|
|
284
|
+
stylesheets = [],
|
|
285
|
+
scripts = [],
|
|
286
|
+
head = "",
|
|
287
|
+
bodyAttributes = ""
|
|
288
|
+
} = options;
|
|
289
|
+
const styleTags = stylesheets.map((href) => `<link rel="stylesheet" href="${href}">`).join("\n ");
|
|
290
|
+
const scriptTags = scripts.map((src) => `<script type="module" src="${src}"><\/script>`).join("\n ");
|
|
291
|
+
return `<!DOCTYPE html>
|
|
292
|
+
<html lang="${lang}">
|
|
293
|
+
<head>
|
|
294
|
+
<meta charset="UTF-8">
|
|
295
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
296
|
+
<title>${title}</title>
|
|
297
|
+
${styleTags}
|
|
298
|
+
${head}
|
|
299
|
+
</head>
|
|
300
|
+
<body${bodyAttributes ? " " + bodyAttributes : ""}>
|
|
301
|
+
${content}
|
|
302
|
+
${scriptTags}
|
|
303
|
+
</body>
|
|
304
|
+
</html>`;
|
|
305
|
+
}
|
|
306
|
+
function isClient2() {
|
|
307
|
+
return !domIsServer2();
|
|
308
|
+
}
|
|
309
|
+
function onServer(fn, fallback) {
|
|
310
|
+
return domIsServer2() ? fn() : fallback;
|
|
311
|
+
}
|
|
312
|
+
function onClient(fn, fallback) {
|
|
313
|
+
return !domIsServer2() ? fn() : fallback;
|
|
314
|
+
}
|
|
315
|
+
async function renderToString(code) {
|
|
316
|
+
const html = await domRenderToString(code);
|
|
317
|
+
const script = serializeHydrationData();
|
|
318
|
+
return html + script;
|
|
319
|
+
}
|
|
320
|
+
async function renderToStream(code) {
|
|
321
|
+
const html = await domRenderToString(code);
|
|
322
|
+
const script = serializeHydrationData();
|
|
323
|
+
return html + script;
|
|
324
|
+
}
|
|
325
|
+
function startServer(App) {
|
|
326
|
+
return {
|
|
327
|
+
/** Render the app to a full HTML string (includes hydration data) */
|
|
328
|
+
render: (url) => renderToString(() => App({ url })),
|
|
329
|
+
/** Render the app to a streamable HTML string (includes hydration data) */
|
|
330
|
+
stream: (url) => renderToStream(() => App({ url })),
|
|
331
|
+
/** Render the app to a complete HTML page document */
|
|
332
|
+
page: (url, opts) => renderToPage(() => App({ url }), opts)
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
export {
|
|
336
|
+
batch,
|
|
337
|
+
cleanupHydration,
|
|
338
|
+
clearHydrationData,
|
|
339
|
+
clearHydrationDataKey,
|
|
340
|
+
createComputed,
|
|
341
|
+
createContext,
|
|
342
|
+
createDeferred,
|
|
343
|
+
createEffect,
|
|
344
|
+
createHtmlDocument,
|
|
345
|
+
createHydratableResource,
|
|
346
|
+
createMemo,
|
|
347
|
+
createRenderEffect,
|
|
348
|
+
createResource,
|
|
349
|
+
createRoot,
|
|
350
|
+
createSelector,
|
|
351
|
+
createSignal,
|
|
352
|
+
deserializeHydrationData,
|
|
353
|
+
getHydrationData,
|
|
354
|
+
getOwner,
|
|
355
|
+
getSSRContext,
|
|
356
|
+
hasHydrationData,
|
|
357
|
+
hydrationMarker,
|
|
358
|
+
hydrationMarkerEnd,
|
|
359
|
+
hydrationMarkerStart,
|
|
360
|
+
isClient2 as isClient,
|
|
361
|
+
isClientEnvironment,
|
|
362
|
+
isClient as isClientReactive,
|
|
363
|
+
isHydrating,
|
|
364
|
+
isServer2 as isServer,
|
|
365
|
+
isServerEnvironment,
|
|
366
|
+
isServer as isServerReactive,
|
|
367
|
+
onCleanup,
|
|
368
|
+
onClient,
|
|
369
|
+
onServer,
|
|
370
|
+
renderToPage,
|
|
371
|
+
renderToStream,
|
|
372
|
+
renderToString,
|
|
373
|
+
runWithOwner,
|
|
374
|
+
serializeHydrationData,
|
|
375
|
+
setHydrating,
|
|
376
|
+
setHydrationData,
|
|
377
|
+
setSSRContext,
|
|
378
|
+
startServer,
|
|
379
|
+
startTransition,
|
|
380
|
+
untrack,
|
|
381
|
+
useContext,
|
|
382
|
+
useHydrationData,
|
|
383
|
+
withSSRContext
|
|
384
|
+
};
|