@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,1210 @@
|
|
|
1
|
+
/*! @fluixi/core v1.0.0-alpha.100 | (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 __esm = (fn, res) => function __init() {
|
|
8
|
+
return fn && (res = (0, fn[__getOwnPropNames(fn)[0]])(fn = 0)), res;
|
|
9
|
+
};
|
|
10
|
+
var __export = (target, all) => {
|
|
11
|
+
for (var name in all)
|
|
12
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
13
|
+
};
|
|
14
|
+
var __copyProps = (to, from, except, desc) => {
|
|
15
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
16
|
+
for (let key of __getOwnPropNames(from))
|
|
17
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
18
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
19
|
+
}
|
|
20
|
+
return to;
|
|
21
|
+
};
|
|
22
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
23
|
+
|
|
24
|
+
// src/lib/render/lazy.ts
|
|
25
|
+
function fromChunk(value) {
|
|
26
|
+
if (value != null && (typeof value === "object" || typeof value === "function")) {
|
|
27
|
+
try {
|
|
28
|
+
value["$lazy"] = true;
|
|
29
|
+
} catch {
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return value;
|
|
33
|
+
}
|
|
34
|
+
function lazy(loader, options) {
|
|
35
|
+
let resolved;
|
|
36
|
+
let promise;
|
|
37
|
+
let component;
|
|
38
|
+
function load() {
|
|
39
|
+
if (!promise) {
|
|
40
|
+
promise = loader().then((mod) => resolved = mod.default);
|
|
41
|
+
}
|
|
42
|
+
return promise;
|
|
43
|
+
}
|
|
44
|
+
if (options?.preload) load();
|
|
45
|
+
const LazyWrapper = ((props) => {
|
|
46
|
+
if (resolved) {
|
|
47
|
+
const C = resolved;
|
|
48
|
+
return fromChunk((0, import_signal3.untrack)(() => C(props)));
|
|
49
|
+
}
|
|
50
|
+
if (!component) {
|
|
51
|
+
const [resource] = (0, import_signal3.createResource)(() => load(), { transport: false });
|
|
52
|
+
component = resource;
|
|
53
|
+
if (resource.error) throw resource.error;
|
|
54
|
+
}
|
|
55
|
+
return (0, import_signal3.createMemo)(() => {
|
|
56
|
+
const C = component();
|
|
57
|
+
return C ? fromChunk((0, import_dom7.createComponent)(C, props)) : void 0;
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
LazyWrapper.preload = () => load().then(() => void 0);
|
|
61
|
+
LazyWrapper.$lazy = true;
|
|
62
|
+
LazyWrapper.loader = loader;
|
|
63
|
+
return LazyWrapper;
|
|
64
|
+
}
|
|
65
|
+
var import_dom7, import_signal3;
|
|
66
|
+
var init_lazy = __esm({
|
|
67
|
+
"src/lib/render/lazy.ts"() {
|
|
68
|
+
"use strict";
|
|
69
|
+
import_dom7 = require("@fluixi/dom");
|
|
70
|
+
import_signal3 = require("@fluixi/reactive/signal");
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
// src/lib/router/transition.ts
|
|
75
|
+
function supportsViewTransitions() {
|
|
76
|
+
return typeof document !== "undefined" && typeof document.startViewTransition === "function";
|
|
77
|
+
}
|
|
78
|
+
function prefersReducedMotion() {
|
|
79
|
+
if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
return window.matchMedia("(prefers-reduced-motion: reduce)").matches;
|
|
84
|
+
} catch {
|
|
85
|
+
return false;
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
function shouldAnimate(mode) {
|
|
89
|
+
return mode !== "none" && supportsViewTransitions() && !prefersReducedMotion();
|
|
90
|
+
}
|
|
91
|
+
function prepareComponents(components) {
|
|
92
|
+
const pending = [];
|
|
93
|
+
for (const component of components) {
|
|
94
|
+
const preload = component?.preload;
|
|
95
|
+
if (typeof preload === "function") {
|
|
96
|
+
try {
|
|
97
|
+
const result = preload();
|
|
98
|
+
if (result && typeof result.then === "function") {
|
|
99
|
+
pending.push(result.catch(() => void 0));
|
|
100
|
+
}
|
|
101
|
+
} catch {
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
return pending.length ? Promise.all(pending).then(() => void 0) : null;
|
|
106
|
+
}
|
|
107
|
+
function runTransition(mode, commit) {
|
|
108
|
+
if (!shouldAnimate(mode)) {
|
|
109
|
+
return Promise.resolve(commit()).then(() => void 0);
|
|
110
|
+
}
|
|
111
|
+
const start = document.startViewTransition;
|
|
112
|
+
try {
|
|
113
|
+
const transition = start.call(document, () => commit());
|
|
114
|
+
transition.finished?.catch(() => void 0);
|
|
115
|
+
transition.ready?.catch(() => void 0);
|
|
116
|
+
return transition.updateCallbackDone.catch(() => void 0);
|
|
117
|
+
} catch {
|
|
118
|
+
return Promise.resolve(commit()).then(() => void 0);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
var init_transition = __esm({
|
|
122
|
+
"src/lib/router/transition.ts"() {
|
|
123
|
+
"use strict";
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// src/lib/router/scroll.ts
|
|
128
|
+
function keepScroll(initial) {
|
|
129
|
+
const read2 = () => {
|
|
130
|
+
try {
|
|
131
|
+
return JSON.parse(sessionStorage.getItem(STORE) ?? "{}");
|
|
132
|
+
} catch {
|
|
133
|
+
return {};
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
const positions = read2();
|
|
137
|
+
const write = () => {
|
|
138
|
+
const keys = Object.keys(positions);
|
|
139
|
+
for (const key of keys.slice(0, Math.max(0, keys.length - KEEP))) delete positions[key];
|
|
140
|
+
try {
|
|
141
|
+
sessionStorage.setItem(STORE, JSON.stringify(positions));
|
|
142
|
+
} catch {
|
|
143
|
+
}
|
|
144
|
+
};
|
|
145
|
+
let current = initial.key;
|
|
146
|
+
const save = () => {
|
|
147
|
+
if (current === void 0) return;
|
|
148
|
+
delete positions[current];
|
|
149
|
+
positions[current] = window.scrollY;
|
|
150
|
+
write();
|
|
151
|
+
};
|
|
152
|
+
const restoration = history.scrollRestoration;
|
|
153
|
+
history.scrollRestoration = "manual";
|
|
154
|
+
window.addEventListener("pagehide", save);
|
|
155
|
+
const to = (top) => window.scrollTo({ top, left: 0, behavior: "instant" });
|
|
156
|
+
const toHash = (hash) => {
|
|
157
|
+
if (!hash || hash === "#") return false;
|
|
158
|
+
const target = document.getElementById(decodeURIComponent(hash.slice(1)));
|
|
159
|
+
target?.scrollIntoView({ behavior: "instant" });
|
|
160
|
+
return target !== null;
|
|
161
|
+
};
|
|
162
|
+
return {
|
|
163
|
+
leave: save,
|
|
164
|
+
arrive(location, from) {
|
|
165
|
+
current = location.key;
|
|
166
|
+
if (location.action === "pop" || from === void 0) {
|
|
167
|
+
const y = location.key === void 0 ? void 0 : positions[location.key];
|
|
168
|
+
if (y !== void 0) to(y);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
if (location.action === "replace" && location.pathname === from.pathname) return;
|
|
172
|
+
if (!toHash(location.hash)) to(0);
|
|
173
|
+
},
|
|
174
|
+
dispose() {
|
|
175
|
+
window.removeEventListener("pagehide", save);
|
|
176
|
+
history.scrollRestoration = restoration;
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
var STORE, KEEP;
|
|
181
|
+
var init_scroll = __esm({
|
|
182
|
+
"src/lib/router/scroll.ts"() {
|
|
183
|
+
"use strict";
|
|
184
|
+
STORE = "fx:scroll";
|
|
185
|
+
KEEP = 100;
|
|
186
|
+
}
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// src/lib/context/context.ts
|
|
190
|
+
function createContext3(defaultValue, name) {
|
|
191
|
+
const context = (0, import_signal7.createContext)(defaultValue, name);
|
|
192
|
+
const Provider = (props) => (
|
|
193
|
+
// Children stay a getter: the reactive Provider reads them after stamping the value on
|
|
194
|
+
// its owner. Reading `props.children` here would render them, and any <Outlet/> in them,
|
|
195
|
+
// before the context exists.
|
|
196
|
+
context.Provider({
|
|
197
|
+
value: props.value,
|
|
198
|
+
get children() {
|
|
199
|
+
return props.children;
|
|
200
|
+
},
|
|
201
|
+
debug: props.debug
|
|
202
|
+
})
|
|
203
|
+
);
|
|
204
|
+
return {
|
|
205
|
+
id: context.id,
|
|
206
|
+
Provider: (0, import_dom11.asProvider)(Provider),
|
|
207
|
+
defaultValue
|
|
208
|
+
};
|
|
209
|
+
}
|
|
210
|
+
var import_dom11, import_signal7;
|
|
211
|
+
var init_context = __esm({
|
|
212
|
+
"src/lib/context/context.ts"() {
|
|
213
|
+
"use strict";
|
|
214
|
+
import_dom11 = require("@fluixi/dom");
|
|
215
|
+
import_signal7 = require("@fluixi/reactive/signal");
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// src/lib/router/data.ts
|
|
220
|
+
function onRevalidate(listener) {
|
|
221
|
+
revalidationListeners.add(listener);
|
|
222
|
+
return () => void revalidationListeners.delete(listener);
|
|
223
|
+
}
|
|
224
|
+
function cache(fn, name, options = {}) {
|
|
225
|
+
const { ttl = Infinity, staleWhileRevalidate = true } = options;
|
|
226
|
+
return (...args) => {
|
|
227
|
+
const store = options.cache ?? (0, import_signal9.currentResourceCache)();
|
|
228
|
+
const key = name + ":" + JSON.stringify(args);
|
|
229
|
+
const fetchFresh = () => {
|
|
230
|
+
const running = store.inflight.get(key);
|
|
231
|
+
if (running) return running;
|
|
232
|
+
const promise = Promise.resolve(fn(...args)).then(
|
|
233
|
+
(value) => {
|
|
234
|
+
store.set(key, { value, timestamp: Date.now() });
|
|
235
|
+
store.inflight.delete(key);
|
|
236
|
+
return value;
|
|
237
|
+
},
|
|
238
|
+
(error) => {
|
|
239
|
+
store.inflight.delete(key);
|
|
240
|
+
throw error;
|
|
241
|
+
}
|
|
242
|
+
);
|
|
243
|
+
store.inflight.set(key, promise);
|
|
244
|
+
return promise;
|
|
245
|
+
};
|
|
246
|
+
const hit = store.get(key);
|
|
247
|
+
if (hit && (ttl === Infinity || Date.now() - hit.timestamp <= ttl)) return Promise.resolve(hit.value);
|
|
248
|
+
if (hit && staleWhileRevalidate) {
|
|
249
|
+
fetchFresh().then(reloadMounted, () => void 0);
|
|
250
|
+
return Promise.resolve(hit.value);
|
|
251
|
+
}
|
|
252
|
+
return fetchFresh();
|
|
253
|
+
};
|
|
254
|
+
}
|
|
255
|
+
function revalidate(key, store) {
|
|
256
|
+
const names = typeof key === "string" ? [key] : Array.isArray(key) ? key : null;
|
|
257
|
+
drop(names ?? key, store ?? (0, import_signal9.currentResourceCache)());
|
|
258
|
+
if (names && !store) tellOtherTabs(names);
|
|
259
|
+
}
|
|
260
|
+
function drop(what, store) {
|
|
261
|
+
const matches = Array.isArray(what) ? (k) => what.some((n) => k === n || k.startsWith(n + ":")) : what;
|
|
262
|
+
for (const k of [...store.keys()]) if (matches(k)) store.delete(k);
|
|
263
|
+
reloadMounted();
|
|
264
|
+
}
|
|
265
|
+
function tellOtherTabs(names) {
|
|
266
|
+
try {
|
|
267
|
+
localStorage.setItem(TABS_KEY, JSON.stringify({ names, at: Date.now() + Math.random() }));
|
|
268
|
+
} catch {
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
function createAsync(fetcher, source) {
|
|
272
|
+
const [data] = (0, import_signal8.createResource)(source || (() => true), fetcher);
|
|
273
|
+
return data;
|
|
274
|
+
}
|
|
275
|
+
function getSubmissionSignal(url) {
|
|
276
|
+
if (!submissionState.has(url)) {
|
|
277
|
+
submissionState.set(
|
|
278
|
+
url,
|
|
279
|
+
(0, import_signal8.createSignal)(void 0)
|
|
280
|
+
);
|
|
281
|
+
}
|
|
282
|
+
return submissionState.get(url);
|
|
283
|
+
}
|
|
284
|
+
function getSubmissionsSignal(url) {
|
|
285
|
+
if (!submissionsState.has(url)) submissionsState.set(url, (0, import_signal8.createSignal)([]));
|
|
286
|
+
return submissionsState.get(url);
|
|
287
|
+
}
|
|
288
|
+
function action(fn, name, options = {}) {
|
|
289
|
+
const actionUrl = name || fn.name || "action";
|
|
290
|
+
const submit = async (...args) => {
|
|
291
|
+
const input = args.length > 1 ? args : args[0];
|
|
292
|
+
const [, setSubmission] = getSubmissionSignal(actionUrl);
|
|
293
|
+
const [, setSubmissions] = getSubmissionsSignal(actionUrl);
|
|
294
|
+
let entry;
|
|
295
|
+
const drop2 = () => setSubmissions((list) => list.filter((s) => s !== entry));
|
|
296
|
+
const settle = (next) => {
|
|
297
|
+
setSubmissions((list) => list.map((s) => s === entry ? next : s));
|
|
298
|
+
entry = next;
|
|
299
|
+
};
|
|
300
|
+
const clear = () => {
|
|
301
|
+
setSubmission(void 0);
|
|
302
|
+
drop2();
|
|
303
|
+
};
|
|
304
|
+
const retry = () => {
|
|
305
|
+
drop2();
|
|
306
|
+
return submit(...args);
|
|
307
|
+
};
|
|
308
|
+
entry = {
|
|
309
|
+
input,
|
|
310
|
+
pending: true,
|
|
311
|
+
clear,
|
|
312
|
+
retry
|
|
313
|
+
};
|
|
314
|
+
setSubmission(entry);
|
|
315
|
+
setSubmissions((list) => [...list, entry]);
|
|
316
|
+
try {
|
|
317
|
+
const result = await fn(...args);
|
|
318
|
+
setSubmission({
|
|
319
|
+
input,
|
|
320
|
+
result,
|
|
321
|
+
pending: false,
|
|
322
|
+
clear,
|
|
323
|
+
retry
|
|
324
|
+
});
|
|
325
|
+
drop2();
|
|
326
|
+
const stale = typeof options.invalidates === "function" ? options.invalidates(result) : options.invalidates;
|
|
327
|
+
for (const key of stale ?? []) revalidate(key);
|
|
328
|
+
return result;
|
|
329
|
+
} catch (error) {
|
|
330
|
+
const failed = {
|
|
331
|
+
input,
|
|
332
|
+
error,
|
|
333
|
+
pending: false,
|
|
334
|
+
clear,
|
|
335
|
+
retry
|
|
336
|
+
};
|
|
337
|
+
setSubmission(failed);
|
|
338
|
+
settle(failed);
|
|
339
|
+
throw error;
|
|
340
|
+
}
|
|
341
|
+
};
|
|
342
|
+
submit.url = actionUrl;
|
|
343
|
+
submit.with = (args) => action((...a) => fn(args, ...a), name, options);
|
|
344
|
+
return submit;
|
|
345
|
+
}
|
|
346
|
+
function useSubmission(actionFn) {
|
|
347
|
+
const [submission] = getSubmissionSignal(actionFn.url);
|
|
348
|
+
return submission;
|
|
349
|
+
}
|
|
350
|
+
function useSubmissions(actionFn) {
|
|
351
|
+
const [submissions] = getSubmissionsSignal(actionFn.url);
|
|
352
|
+
return submissions;
|
|
353
|
+
}
|
|
354
|
+
function useAction(actionFn) {
|
|
355
|
+
return actionFn;
|
|
356
|
+
}
|
|
357
|
+
var import_signal8, import_signal9, revalidationListeners, reloadMounted, TABS_KEY, submissionState, submissionsState, RouteDataContext, RouteDataProvider;
|
|
358
|
+
var init_data = __esm({
|
|
359
|
+
"src/lib/router/data.ts"() {
|
|
360
|
+
"use strict";
|
|
361
|
+
import_signal8 = require("@fluixi/reactive/signal");
|
|
362
|
+
import_signal9 = require("@fluixi/reactive/signal");
|
|
363
|
+
init_context();
|
|
364
|
+
revalidationListeners = /* @__PURE__ */ new Set();
|
|
365
|
+
reloadMounted = () => {
|
|
366
|
+
for (const listener of [...revalidationListeners]) listener();
|
|
367
|
+
};
|
|
368
|
+
TABS_KEY = "fluixi:revalidate";
|
|
369
|
+
if (typeof window !== "undefined") {
|
|
370
|
+
window.addEventListener("storage", (event) => {
|
|
371
|
+
if (event.key !== TABS_KEY || !event.newValue) return;
|
|
372
|
+
try {
|
|
373
|
+
const names = JSON.parse(event.newValue).names;
|
|
374
|
+
if (Array.isArray(names) && names.every((n) => typeof n === "string")) drop(names, (0, import_signal9.currentResourceCache)());
|
|
375
|
+
} catch {
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
}
|
|
379
|
+
globalThis[/* @__PURE__ */ Symbol.for("fluixi.revalidate")] = (names) => revalidate(names);
|
|
380
|
+
submissionState = /* @__PURE__ */ new Map();
|
|
381
|
+
submissionsState = /* @__PURE__ */ new Map();
|
|
382
|
+
RouteDataContext = createContext3(void 0, "route-data");
|
|
383
|
+
RouteDataProvider = RouteDataContext.Provider;
|
|
384
|
+
}
|
|
385
|
+
});
|
|
386
|
+
|
|
387
|
+
// src/lib/router/index.ts
|
|
388
|
+
var router_exports = {};
|
|
389
|
+
__export(router_exports, {
|
|
390
|
+
A: () => A,
|
|
391
|
+
ActionForm: () => ActionForm,
|
|
392
|
+
Link: () => Link,
|
|
393
|
+
Outlet: () => Outlet,
|
|
394
|
+
Redirect: () => Redirect,
|
|
395
|
+
Router: () => Router,
|
|
396
|
+
action: () => action,
|
|
397
|
+
cache: () => cache,
|
|
398
|
+
createAsync: () => createAsync,
|
|
399
|
+
createBrowserHistory: () => import_router2.createBrowserHistory,
|
|
400
|
+
createMemoryHistory: () => import_router2.createMemoryHistory,
|
|
401
|
+
lazy: () => lazy,
|
|
402
|
+
matchPath: () => import_router2.matchPath,
|
|
403
|
+
matchRoutes: () => import_router2.matchRoutes,
|
|
404
|
+
prefersReducedMotion: () => prefersReducedMotion,
|
|
405
|
+
preloadRoutes: () => preloadRoutes,
|
|
406
|
+
revalidate: () => revalidate,
|
|
407
|
+
runWithOwner: () => import_signal12.runWithOwner,
|
|
408
|
+
select: () => select,
|
|
409
|
+
supportsViewTransitions: () => supportsViewTransitions,
|
|
410
|
+
useAction: () => useAction,
|
|
411
|
+
useIsRouting: () => useIsRouting,
|
|
412
|
+
useLevelParams: () => useLevelParams,
|
|
413
|
+
useLinkNavigation: () => useLinkNavigation,
|
|
414
|
+
useLocation: () => useLocation,
|
|
415
|
+
useMatch: () => useMatch,
|
|
416
|
+
useNavigate: () => useNavigate,
|
|
417
|
+
useParam: () => useParam,
|
|
418
|
+
useParamSelector: () => useParamSelector,
|
|
419
|
+
useParams: () => useParams,
|
|
420
|
+
useRouteData: () => useRouteData,
|
|
421
|
+
useRouter: () => useRouter,
|
|
422
|
+
useSearchParams: () => useSearchParams,
|
|
423
|
+
useSubmission: () => useSubmission,
|
|
424
|
+
useSubmissions: () => useSubmissions
|
|
425
|
+
});
|
|
426
|
+
function renderLayer(m, depth, base) {
|
|
427
|
+
let data;
|
|
428
|
+
const loader = m.route.data;
|
|
429
|
+
if (typeof loader === "function") {
|
|
430
|
+
let cancelled = false;
|
|
431
|
+
(0, import_signal10.onCleanup)(() => {
|
|
432
|
+
cancelled = true;
|
|
433
|
+
});
|
|
434
|
+
const owner = (0, import_signal10.getOwner)();
|
|
435
|
+
const router = (0, import_signal11.useContext)(RouterContext);
|
|
436
|
+
let watching = false;
|
|
437
|
+
const trackDeps = (deps) => {
|
|
438
|
+
if (watching || cancelled) return;
|
|
439
|
+
watching = true;
|
|
440
|
+
(0, import_signal10.runWithOwner)(owner, () => {
|
|
441
|
+
let first = true;
|
|
442
|
+
(0, import_signal10.createEffect)(() => {
|
|
443
|
+
deps();
|
|
444
|
+
if (first) first = false;
|
|
445
|
+
else (0, import_signal10.untrack)(() => void refetch());
|
|
446
|
+
});
|
|
447
|
+
});
|
|
448
|
+
};
|
|
449
|
+
let readsLocation;
|
|
450
|
+
const [resource, { refetch }] = (0, import_signal10.createResource)(() => {
|
|
451
|
+
const params = (0, import_signal10.untrack)(base.params);
|
|
452
|
+
const location = (0, import_signal10.untrack)(base.location);
|
|
453
|
+
readsLocation = false;
|
|
454
|
+
const result = loader(
|
|
455
|
+
{
|
|
456
|
+
params: () => params,
|
|
457
|
+
location: () => {
|
|
458
|
+
readsLocation = true;
|
|
459
|
+
return location;
|
|
460
|
+
}
|
|
461
|
+
},
|
|
462
|
+
owner,
|
|
463
|
+
() => cancelled,
|
|
464
|
+
trackDeps
|
|
465
|
+
);
|
|
466
|
+
return router ? router.trackLoad(result) : result;
|
|
467
|
+
});
|
|
468
|
+
(0, import_signal10.onCleanup)(
|
|
469
|
+
onRevalidate(() => {
|
|
470
|
+
if ((0, import_signal10.untrack)(() => base.matched()[depth]?.route) !== m.route) return;
|
|
471
|
+
void refetch();
|
|
472
|
+
})
|
|
473
|
+
);
|
|
474
|
+
let loadedFor = (0, import_signal10.untrack)(() => JSON.stringify(base.matched()[depth]?.params ?? {}));
|
|
475
|
+
let searchedFor = (0, import_signal10.untrack)(() => base.location().search);
|
|
476
|
+
(0, import_signal10.createEffect)(() => {
|
|
477
|
+
const now = base.matched()[depth];
|
|
478
|
+
const search = base.location().search;
|
|
479
|
+
if (now?.route !== m.route) return;
|
|
480
|
+
const params = JSON.stringify(now.params ?? {});
|
|
481
|
+
const paramsMoved = params !== loadedFor;
|
|
482
|
+
const searchMoved = readsLocation !== false && search !== searchedFor;
|
|
483
|
+
loadedFor = params;
|
|
484
|
+
searchedFor = search;
|
|
485
|
+
if (paramsMoved || searchMoved) (0, import_signal10.untrack)(() => void refetch());
|
|
486
|
+
});
|
|
487
|
+
data = () => {
|
|
488
|
+
const error = resource.error;
|
|
489
|
+
if (error !== void 0 && error !== null) throw error;
|
|
490
|
+
const r = resource;
|
|
491
|
+
if (r.state === "refreshing") return r.latest;
|
|
492
|
+
return resource();
|
|
493
|
+
};
|
|
494
|
+
Object.defineProperty(data, "loading", { get: () => resource.loading });
|
|
495
|
+
Object.defineProperty(data, "state", { get: () => resource.state });
|
|
496
|
+
}
|
|
497
|
+
const buildPage = () => RouteDataContext2.Provider({
|
|
498
|
+
value: data,
|
|
499
|
+
get children() {
|
|
500
|
+
return LevelParamsContext.Provider({
|
|
501
|
+
value: m.params,
|
|
502
|
+
get children() {
|
|
503
|
+
return OutletContext.Provider({
|
|
504
|
+
value: { depth, ...base },
|
|
505
|
+
get children() {
|
|
506
|
+
return (0, import_dom12.createComponent)(m.component, {});
|
|
507
|
+
}
|
|
508
|
+
});
|
|
509
|
+
}
|
|
510
|
+
});
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
if (!data) return { view: buildPage(), ready: () => true };
|
|
514
|
+
const res = data;
|
|
515
|
+
const isLoading = () => {
|
|
516
|
+
const state = res.state;
|
|
517
|
+
return state === void 0 ? res.loading : state === "pending" || state === "unresolved";
|
|
518
|
+
};
|
|
519
|
+
const [ready, setReady] = (0, import_signal10.createSignal)((0, import_signal10.untrack)(() => !isLoading()));
|
|
520
|
+
(0, import_signal10.createEffect)(() => setReady(!isLoading()));
|
|
521
|
+
return { view: (0, import_signal10.createMemo)(() => ready() ? buildPage() : null), ready };
|
|
522
|
+
}
|
|
523
|
+
function renderChild(ctx) {
|
|
524
|
+
const childIdx = ctx.depth + 1;
|
|
525
|
+
const [childComp, setChildComp] = (0, import_signal10.createSignal)(
|
|
526
|
+
(0, import_signal10.untrack)(() => ctx.matched()[childIdx]?.component)
|
|
527
|
+
);
|
|
528
|
+
(0, import_signal10.createEffect)(() => {
|
|
529
|
+
const c = ctx.matched()[childIdx]?.component;
|
|
530
|
+
if ((0, import_signal10.untrack)(childComp) !== c) setChildComp(() => c);
|
|
531
|
+
});
|
|
532
|
+
const owner = (0, import_signal10.getOwner)();
|
|
533
|
+
let shown = null;
|
|
534
|
+
let pending = null;
|
|
535
|
+
const drop2 = (layer) => layer?.dispose();
|
|
536
|
+
(0, import_signal10.onCleanup)(() => {
|
|
537
|
+
drop2(shown);
|
|
538
|
+
drop2(pending);
|
|
539
|
+
shown = pending = null;
|
|
540
|
+
});
|
|
541
|
+
const incoming = (0, import_signal10.createMemo)(() => {
|
|
542
|
+
const component = childComp();
|
|
543
|
+
if (!component) return null;
|
|
544
|
+
const m = (0, import_signal10.untrack)(() => ctx.matched())[childIdx];
|
|
545
|
+
return (0, import_signal10.runWithOwner)(
|
|
546
|
+
owner,
|
|
547
|
+
() => (0, import_signal10.createRoot)((dispose) => ({
|
|
548
|
+
...renderLayer(m, childIdx, { matched: ctx.matched, params: ctx.params, location: ctx.location }),
|
|
549
|
+
dispose
|
|
550
|
+
}))
|
|
551
|
+
);
|
|
552
|
+
});
|
|
553
|
+
return (0, import_signal10.createMemo)(() => {
|
|
554
|
+
const next = incoming();
|
|
555
|
+
if (!next) {
|
|
556
|
+
drop2(shown);
|
|
557
|
+
drop2(pending);
|
|
558
|
+
shown = pending = null;
|
|
559
|
+
return ctx.notFound ? ctx.notFound() : null;
|
|
560
|
+
}
|
|
561
|
+
if (next === shown) return shown.view;
|
|
562
|
+
if (pending && pending !== next) drop2(pending);
|
|
563
|
+
pending = next;
|
|
564
|
+
if (shown && !next.ready()) return shown.view;
|
|
565
|
+
drop2(shown);
|
|
566
|
+
shown = next;
|
|
567
|
+
pending = null;
|
|
568
|
+
return shown.view;
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
function renderNotFound(notFound) {
|
|
572
|
+
if (notFound == null) return buildDefaultNotFound();
|
|
573
|
+
return typeof notFound === "function" ? (0, import_dom12.createComponent)(notFound, {}) : notFound;
|
|
574
|
+
}
|
|
575
|
+
function buildDefaultNotFound() {
|
|
576
|
+
const el = (0, import_dom12.createNativeElement)("div");
|
|
577
|
+
(0, import_dom12.setAttribute)(el, "class", "fx-not-found");
|
|
578
|
+
(0, import_dom12.setAttribute)(el, "role", "main");
|
|
579
|
+
(0, import_dom12.setAttribute)(
|
|
580
|
+
el,
|
|
581
|
+
"style",
|
|
582
|
+
"min-height:60vh;display:grid;place-content:center;gap:.25rem;text-align:center;font-family:system-ui,-apple-system,sans-serif"
|
|
583
|
+
);
|
|
584
|
+
const h1 = (0, import_dom12.createNativeElement)("h1");
|
|
585
|
+
(0, import_dom12.setAttribute)(h1, "style", "margin:0;font-size:2.5rem;font-weight:700");
|
|
586
|
+
(0, import_dom12.insert)(h1, "404");
|
|
587
|
+
const p = (0, import_dom12.createNativeElement)("p");
|
|
588
|
+
(0, import_dom12.setAttribute)(p, "style", "margin:0;opacity:.7");
|
|
589
|
+
(0, import_dom12.insert)(p, "This page could not be found.");
|
|
590
|
+
el.appendChild(h1);
|
|
591
|
+
el.appendChild(p);
|
|
592
|
+
return el;
|
|
593
|
+
}
|
|
594
|
+
function Router(props) {
|
|
595
|
+
const history2 = props.history ?? (0, import_router.createBrowserHistory)();
|
|
596
|
+
const router = (0, import_router.createRouter)({
|
|
597
|
+
routes: props.routes,
|
|
598
|
+
base: props.base,
|
|
599
|
+
history: history2
|
|
600
|
+
});
|
|
601
|
+
const [state, setState] = (0, import_signal10.createSignal)(router.state());
|
|
602
|
+
const [navigating, setNavigating] = (0, import_signal10.createSignal)(false);
|
|
603
|
+
const [loads, setLoads] = (0, import_signal10.createSignal)(0);
|
|
604
|
+
let navigationId = 0;
|
|
605
|
+
const scroll = history2.window ? keepScroll(router.state().location) : void 0;
|
|
606
|
+
let arriving = scroll ? { id: 0, location: router.state().location, from: void 0 } : null;
|
|
607
|
+
const [arrived, setArrived] = (0, import_signal10.createSignal)(0);
|
|
608
|
+
const takeMode = () => {
|
|
609
|
+
const mode = pendingTransitionMode ?? (props.transition ?? "auto");
|
|
610
|
+
pendingTransitionMode = void 0;
|
|
611
|
+
return mode;
|
|
612
|
+
};
|
|
613
|
+
const unsub = router.subscribe((next) => {
|
|
614
|
+
const id = ++navigationId;
|
|
615
|
+
const mode = takeMode();
|
|
616
|
+
setNavigating(true);
|
|
617
|
+
if (scroll) {
|
|
618
|
+
scroll.leave();
|
|
619
|
+
arriving = { id, location: next.location, from: (0, import_signal10.untrack)(state).location };
|
|
620
|
+
}
|
|
621
|
+
const prepared = prepareComponents(
|
|
622
|
+
(next.match?.matched ?? []).map((m) => m.component).filter(Boolean)
|
|
623
|
+
);
|
|
624
|
+
const commit = () => {
|
|
625
|
+
setState(next);
|
|
626
|
+
const flushed = (0, import_signal10.flush)();
|
|
627
|
+
if (id === navigationId) setNavigating(false);
|
|
628
|
+
if (scroll) setArrived(id);
|
|
629
|
+
return flushed;
|
|
630
|
+
};
|
|
631
|
+
if (!prepared) {
|
|
632
|
+
void runTransition(mode, commit);
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
void prepared.then(() => {
|
|
636
|
+
if (id !== navigationId) return;
|
|
637
|
+
return runTransition(mode, commit);
|
|
638
|
+
});
|
|
639
|
+
});
|
|
640
|
+
(0, import_signal10.onCleanup)(() => {
|
|
641
|
+
unsub();
|
|
642
|
+
scroll?.dispose();
|
|
643
|
+
router.destroy();
|
|
644
|
+
navigationId++;
|
|
645
|
+
});
|
|
646
|
+
const matched = (0, import_signal10.createMemo)(
|
|
647
|
+
() => (state().match?.matched ?? []).filter((m) => m.component)
|
|
648
|
+
);
|
|
649
|
+
const ctx = {
|
|
650
|
+
router,
|
|
651
|
+
location: (0, import_signal10.createMemo)(() => state().location),
|
|
652
|
+
params: (0, import_signal10.createMemo)(() => state().match?.params ?? {}),
|
|
653
|
+
isRouting: () => navigating() || loads() > 0,
|
|
654
|
+
// Counted by the promise, not by an owner: a load a newer navigation superseded still
|
|
655
|
+
// settles and uncounts itself, and a resource seeded from the server never calls it.
|
|
656
|
+
trackLoad(result) {
|
|
657
|
+
if (result && typeof result.finally === "function") {
|
|
658
|
+
setLoads((n) => n + 1);
|
|
659
|
+
void result.finally(() => setLoads((n) => n - 1)).catch(() => {
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
return result;
|
|
663
|
+
}
|
|
664
|
+
};
|
|
665
|
+
if (scroll) {
|
|
666
|
+
const nextFrame = typeof requestAnimationFrame === "function" ? requestAnimationFrame : (fn) => setTimeout(fn, 0);
|
|
667
|
+
(0, import_signal10.createEffect)(() => {
|
|
668
|
+
const id = arrived();
|
|
669
|
+
if (ctx.isRouting()) return;
|
|
670
|
+
const next = arriving;
|
|
671
|
+
if (!next || next.id !== id || id !== navigationId) return;
|
|
672
|
+
arriving = null;
|
|
673
|
+
nextFrame(() => {
|
|
674
|
+
if (id === navigationId) scroll.arrive(next.location, next.from);
|
|
675
|
+
});
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
const root = {
|
|
679
|
+
depth: -1,
|
|
680
|
+
matched,
|
|
681
|
+
params: ctx.params,
|
|
682
|
+
location: ctx.location,
|
|
683
|
+
// Only the root carries this: renderChild shows it when the URL matched nothing.
|
|
684
|
+
notFound: () => renderNotFound(props.notFound)
|
|
685
|
+
};
|
|
686
|
+
let rootView;
|
|
687
|
+
return RouterContext.Provider({
|
|
688
|
+
value: ctx,
|
|
689
|
+
get children() {
|
|
690
|
+
return rootView ??= renderChild(root);
|
|
691
|
+
}
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
function Outlet() {
|
|
695
|
+
const ctx = (0, import_signal11.useContext)(OutletContext);
|
|
696
|
+
if (!ctx) return null;
|
|
697
|
+
return renderChild(ctx);
|
|
698
|
+
}
|
|
699
|
+
function useIsRouting(options = {}) {
|
|
700
|
+
const routing = (0, import_signal11.useContext)(RouterContext)?.isRouting ?? (() => false);
|
|
701
|
+
const delay = options.delay ?? 0;
|
|
702
|
+
if (delay <= 0) return routing;
|
|
703
|
+
const [late, setLate] = (0, import_signal10.createSignal)(false);
|
|
704
|
+
(0, import_signal10.createEffect)(() => {
|
|
705
|
+
if (!routing()) {
|
|
706
|
+
setLate(false);
|
|
707
|
+
return;
|
|
708
|
+
}
|
|
709
|
+
const timer = setTimeout(() => setLate(true), delay);
|
|
710
|
+
(0, import_signal10.onCleanup)(() => clearTimeout(timer));
|
|
711
|
+
});
|
|
712
|
+
return () => routing() && late();
|
|
713
|
+
}
|
|
714
|
+
function Redirect(props) {
|
|
715
|
+
const ctx = (0, import_signal11.useContext)(RouterContext);
|
|
716
|
+
if (ctx && typeof window !== "undefined") {
|
|
717
|
+
let cancelled = false;
|
|
718
|
+
(0, import_signal10.onCleanup)(() => cancelled = true);
|
|
719
|
+
queueMicrotask(() => {
|
|
720
|
+
if (!cancelled) ctx.router.navigate(props.to, { replace: props.replace !== false });
|
|
721
|
+
});
|
|
722
|
+
}
|
|
723
|
+
return null;
|
|
724
|
+
}
|
|
725
|
+
function useRouter() {
|
|
726
|
+
const ctx = (0, import_signal11.useContext)(RouterContext);
|
|
727
|
+
if (ctx) return ctx;
|
|
728
|
+
if (typeof window === "undefined") return _ssrRouterStub;
|
|
729
|
+
throw new Error("[router] useRouter must be used within <Router>");
|
|
730
|
+
}
|
|
731
|
+
function useParams() {
|
|
732
|
+
const params = useRouter().params;
|
|
733
|
+
return (0, import_signal10.createMemo)(() => params(), {}, {
|
|
734
|
+
equals: (a, b) => JSON.stringify(a) === JSON.stringify(b)
|
|
735
|
+
});
|
|
736
|
+
}
|
|
737
|
+
function useLevelParams() {
|
|
738
|
+
return (0, import_signal11.useContext)(LevelParamsContext) ?? {};
|
|
739
|
+
}
|
|
740
|
+
function useParam(key) {
|
|
741
|
+
const params = useParams();
|
|
742
|
+
return (0, import_signal10.createMemo)(() => params()[key]);
|
|
743
|
+
}
|
|
744
|
+
function useParamSelector(selector, equals) {
|
|
745
|
+
const params = useParams();
|
|
746
|
+
return (0, import_signal10.createMemo)(
|
|
747
|
+
() => selector(params()),
|
|
748
|
+
void 0,
|
|
749
|
+
equals ? { equals } : void 0
|
|
750
|
+
);
|
|
751
|
+
}
|
|
752
|
+
function useMatch(path) {
|
|
753
|
+
const location = useLocation();
|
|
754
|
+
return (0, import_signal10.createMemo)(
|
|
755
|
+
() => (0, import_router.matchPath)(typeof path === "function" ? path() : path, location.pathname)
|
|
756
|
+
);
|
|
757
|
+
}
|
|
758
|
+
function useSearchParams() {
|
|
759
|
+
const location = useLocation();
|
|
760
|
+
const navigate = useNavigate();
|
|
761
|
+
const params = (0, import_signal10.createMemo)(() => location.query);
|
|
762
|
+
const setParams = (next, options) => {
|
|
763
|
+
const current = new URLSearchParams(location.search);
|
|
764
|
+
for (const [k, v] of Object.entries(next)) {
|
|
765
|
+
if (v === null) current.delete(k);
|
|
766
|
+
else current.set(k, v);
|
|
767
|
+
}
|
|
768
|
+
const search = current.toString();
|
|
769
|
+
navigate(location.pathname + (search ? `?${search}` : ""), options);
|
|
770
|
+
};
|
|
771
|
+
return [params, setParams];
|
|
772
|
+
}
|
|
773
|
+
function select(source, key) {
|
|
774
|
+
const equals = (a, b) => (0, import_compare.deepEqual)(a, b);
|
|
775
|
+
if (key !== void 0) {
|
|
776
|
+
return (0, import_signal10.createMemo)(
|
|
777
|
+
() => (0, import_object.get)(source(), key),
|
|
778
|
+
void 0,
|
|
779
|
+
{ equals }
|
|
780
|
+
);
|
|
781
|
+
}
|
|
782
|
+
return (0, import_signal10.createMemo)(source, void 0, { equals });
|
|
783
|
+
}
|
|
784
|
+
function useLocation() {
|
|
785
|
+
const { location } = useRouter();
|
|
786
|
+
return new Proxy({}, {
|
|
787
|
+
get: (_t, key) => location()[key],
|
|
788
|
+
has: (_t, key) => key in location(),
|
|
789
|
+
ownKeys: () => Reflect.ownKeys(location()),
|
|
790
|
+
getOwnPropertyDescriptor: (_t, key) => Object.getOwnPropertyDescriptor(location(), key)
|
|
791
|
+
});
|
|
792
|
+
}
|
|
793
|
+
function useLinkNavigation(options = {}) {
|
|
794
|
+
const ctx = (0, import_signal11.useContext)(RouterContext);
|
|
795
|
+
return (event) => {
|
|
796
|
+
if (!ctx || event.defaultPrevented || event.button !== 0) return;
|
|
797
|
+
if (event.metaKey || event.ctrlKey || event.shiftKey || event.altKey) return;
|
|
798
|
+
const target = event.target;
|
|
799
|
+
const anchor = target?.closest?.("a");
|
|
800
|
+
if (!anchor || !anchor.getAttribute("href")) return;
|
|
801
|
+
if (anchor.target && anchor.target !== "_self") return;
|
|
802
|
+
if (anchor.hasAttribute("download")) return;
|
|
803
|
+
if (/(^|\s)external(\s|$)/.test(anchor.getAttribute("rel") ?? "")) return;
|
|
804
|
+
const url = new URL(anchor.href);
|
|
805
|
+
if (url.protocol !== "http:" && url.protocol !== "https:") return;
|
|
806
|
+
if (url.origin !== window.location.origin) return;
|
|
807
|
+
if (url.hash && url.pathname === window.location.pathname && url.search === window.location.search) return;
|
|
808
|
+
if (options.shouldNavigate && !options.shouldNavigate(url, anchor)) return;
|
|
809
|
+
event.preventDefault();
|
|
810
|
+
pendingTransitionMode = options.transition;
|
|
811
|
+
ctx.router.navigate(url.pathname + url.search + url.hash, { replace: options.replace });
|
|
812
|
+
};
|
|
813
|
+
}
|
|
814
|
+
function useNavigate() {
|
|
815
|
+
const { router } = useRouter();
|
|
816
|
+
return (to, options) => {
|
|
817
|
+
pendingTransitionMode = options?.transition;
|
|
818
|
+
router.navigate(to, options);
|
|
819
|
+
};
|
|
820
|
+
}
|
|
821
|
+
function useRouteData() {
|
|
822
|
+
const acc = (0, import_signal11.useContext)(RouteDataContext2);
|
|
823
|
+
return acc ?? (() => void 0);
|
|
824
|
+
}
|
|
825
|
+
function Link(props) {
|
|
826
|
+
const ctx = (0, import_signal11.useContext)(RouterContext);
|
|
827
|
+
const navigate = () => ctx.router.navigate(read(props.href) ?? "", { replace: read(props.replace) });
|
|
828
|
+
const a = (0, import_dom12.createNativeElement)("a");
|
|
829
|
+
(0, import_dom12.setAttribute)(a, "href", read(props.href) ?? "");
|
|
830
|
+
if (props.slot) (0, import_dom12.setAttribute)(a, "slot", read(props.slot));
|
|
831
|
+
for (const k of Object.keys(props)) {
|
|
832
|
+
if (LINK_OWN_PROPS.has(k)) continue;
|
|
833
|
+
const v = props[k];
|
|
834
|
+
if (typeof v === "function") {
|
|
835
|
+
if (/^on[A-Z]/.test(k)) continue;
|
|
836
|
+
const read2 = v;
|
|
837
|
+
const apply = () => {
|
|
838
|
+
const value = read2();
|
|
839
|
+
if (value == null || value === false) a.removeAttribute?.(k);
|
|
840
|
+
else (0, import_dom12.setAttribute)(a, k, String(value));
|
|
841
|
+
};
|
|
842
|
+
if (typeof a.addEventListener === "function") (0, import_signal10.createEffect)(apply);
|
|
843
|
+
else apply();
|
|
844
|
+
continue;
|
|
845
|
+
}
|
|
846
|
+
if (v != null) (0, import_dom12.setAttribute)(a, k, String(v));
|
|
847
|
+
}
|
|
848
|
+
if (typeof a.addEventListener === "function") {
|
|
849
|
+
a.addEventListener("click", (e) => {
|
|
850
|
+
if (e.metaKey || e.ctrlKey || e.shiftKey || e.altKey) return;
|
|
851
|
+
if (!ctx) return;
|
|
852
|
+
e.preventDefault();
|
|
853
|
+
navigate();
|
|
854
|
+
});
|
|
855
|
+
} else {
|
|
856
|
+
const base = read(props.className ?? props.class) ?? "";
|
|
857
|
+
if (base) (0, import_dom12.setAttribute)(a, "class", base);
|
|
858
|
+
}
|
|
859
|
+
if (typeof a.addEventListener === "function") {
|
|
860
|
+
(0, import_signal10.createEffect)(() => {
|
|
861
|
+
const href = read(props.href) ?? "";
|
|
862
|
+
a.setAttribute("href", href);
|
|
863
|
+
const base = read(props.className ?? props.class) ?? "";
|
|
864
|
+
const activeClass = read(props.activeClass) ?? "";
|
|
865
|
+
const active = read(props.active) ?? ctx?.location().pathname === href;
|
|
866
|
+
a.className = [base, active ? activeClass : ""].filter(Boolean).join(" ");
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
const linkChildren = props.children;
|
|
870
|
+
if (linkChildren != null) (0, import_dom12.insert)(a, linkChildren);
|
|
871
|
+
return a;
|
|
872
|
+
}
|
|
873
|
+
function ActionForm(props) {
|
|
874
|
+
const action2 = props.action;
|
|
875
|
+
const cls = props.className ?? props.class;
|
|
876
|
+
const url = action2.url ?? "";
|
|
877
|
+
const form = (0, import_dom12.createNativeElement)("form");
|
|
878
|
+
(0, import_dom12.setAttribute)(form, "method", "post");
|
|
879
|
+
if (url) (0, import_dom12.setAttribute)(form, "action", url);
|
|
880
|
+
if (cls) (0, import_dom12.setAttribute)(form, "class", cls);
|
|
881
|
+
for (const k of Object.keys(props)) {
|
|
882
|
+
if (k === "action" || k === "children" || k === "class" || k === "className") continue;
|
|
883
|
+
const v = props[k];
|
|
884
|
+
if (v != null && typeof v !== "function") (0, import_dom12.setAttribute)(form, k, String(v));
|
|
885
|
+
}
|
|
886
|
+
if (typeof form.addEventListener === "function") {
|
|
887
|
+
form.addEventListener("submit", (e) => {
|
|
888
|
+
e.preventDefault();
|
|
889
|
+
const data = {};
|
|
890
|
+
new FormData(form).forEach((v, k) => {
|
|
891
|
+
data[k] = v;
|
|
892
|
+
});
|
|
893
|
+
Promise.resolve(action2(data)).catch(() => {
|
|
894
|
+
});
|
|
895
|
+
});
|
|
896
|
+
}
|
|
897
|
+
const children = props.children;
|
|
898
|
+
if (children != null) (0, import_dom12.insert)(form, children);
|
|
899
|
+
return form;
|
|
900
|
+
}
|
|
901
|
+
async function preloadRoutes(routes, pathname) {
|
|
902
|
+
const match = (0, import_router.matchRoutes)(routes, pathname);
|
|
903
|
+
if (!match) return;
|
|
904
|
+
const loads = [];
|
|
905
|
+
for (const m of match.matched) {
|
|
906
|
+
const c = m.component;
|
|
907
|
+
if (c && typeof c.preload === "function") loads.push(c.preload());
|
|
908
|
+
}
|
|
909
|
+
await Promise.all(loads);
|
|
910
|
+
}
|
|
911
|
+
var import_signal10, import_dom12, import_signal11, import_object, import_compare, import_router, import_router2, import_signal12, RouterContext, OutletContext, LevelParamsContext, RouteDataContext2, pendingTransitionMode, _ssrRouterStub, read, LINK_OWN_PROPS, A;
|
|
912
|
+
var init_router = __esm({
|
|
913
|
+
"src/lib/router/index.ts"() {
|
|
914
|
+
"use strict";
|
|
915
|
+
import_signal10 = require("@fluixi/reactive/signal");
|
|
916
|
+
init_transition();
|
|
917
|
+
import_dom12 = require("@fluixi/dom");
|
|
918
|
+
import_signal11 = require("@fluixi/reactive/signal");
|
|
919
|
+
import_object = require("@fluixi/utils/object");
|
|
920
|
+
import_compare = require("@fluixi/utils/compare");
|
|
921
|
+
init_scroll();
|
|
922
|
+
import_router = require("@fluixi/router");
|
|
923
|
+
init_data();
|
|
924
|
+
import_router2 = require("@fluixi/router");
|
|
925
|
+
init_data();
|
|
926
|
+
init_lazy();
|
|
927
|
+
init_transition();
|
|
928
|
+
import_signal12 = require("@fluixi/reactive/signal");
|
|
929
|
+
RouterContext = (0, import_signal11.createContext)(void 0, "router");
|
|
930
|
+
OutletContext = (0, import_signal11.createContext)(void 0, "outlet");
|
|
931
|
+
LevelParamsContext = (0, import_signal11.createContext)(void 0, "route-params");
|
|
932
|
+
RouteDataContext2 = (0, import_signal11.createContext)(void 0, "route-data");
|
|
933
|
+
_ssrRouterStub = {
|
|
934
|
+
router: { navigate: () => {
|
|
935
|
+
} },
|
|
936
|
+
location: () => ({ pathname: "", search: "", hash: "", query: {} }),
|
|
937
|
+
params: () => ({}),
|
|
938
|
+
isRouting: () => false,
|
|
939
|
+
trackLoad: (result) => result
|
|
940
|
+
};
|
|
941
|
+
read = (v) => typeof v === "function" ? v() : v;
|
|
942
|
+
LINK_OWN_PROPS = /* @__PURE__ */ new Set([
|
|
943
|
+
"href",
|
|
944
|
+
"slot",
|
|
945
|
+
"class",
|
|
946
|
+
"className",
|
|
947
|
+
"active",
|
|
948
|
+
"activeClass",
|
|
949
|
+
"replace",
|
|
950
|
+
"children"
|
|
951
|
+
]);
|
|
952
|
+
A = Link;
|
|
953
|
+
}
|
|
954
|
+
});
|
|
955
|
+
|
|
956
|
+
// src/lib/client/index.ts
|
|
957
|
+
var index_exports = {};
|
|
958
|
+
__export(index_exports, {
|
|
959
|
+
hydrate: () => import_dom14.hydrate,
|
|
960
|
+
mount: () => mount,
|
|
961
|
+
startClient: () => startClient
|
|
962
|
+
});
|
|
963
|
+
module.exports = __toCommonJS(index_exports);
|
|
964
|
+
var import_dom13 = require("@fluixi/dom");
|
|
965
|
+
|
|
966
|
+
// src/lib/render/versions.ts
|
|
967
|
+
var import_dom = require("@fluixi/dom");
|
|
968
|
+
|
|
969
|
+
// src/version.generated.ts
|
|
970
|
+
var VERSION = "1.0.0-alpha.100";
|
|
971
|
+
|
|
972
|
+
// src/lib/render/versions.ts
|
|
973
|
+
var import_dom2 = require("@fluixi/dom");
|
|
974
|
+
(0, import_dom.registerCoreVersion)(VERSION);
|
|
975
|
+
|
|
976
|
+
// src/lib/server/hydration.ts
|
|
977
|
+
var import_dom3 = require("@fluixi/dom");
|
|
978
|
+
var hydrating = false;
|
|
979
|
+
var hydrationDataMap = /* @__PURE__ */ new Map();
|
|
980
|
+
function setHydrating(state) {
|
|
981
|
+
hydrating = state;
|
|
982
|
+
}
|
|
983
|
+
function clearHydrationData() {
|
|
984
|
+
hydrationDataMap.clear();
|
|
985
|
+
}
|
|
986
|
+
function deserializeHydrationData() {
|
|
987
|
+
if (typeof window === "undefined") {
|
|
988
|
+
return false;
|
|
989
|
+
}
|
|
990
|
+
const script = document.getElementById("__FLUIXI_HYDRATION__");
|
|
991
|
+
if (!script || script.getAttribute("type") !== "application/json") {
|
|
992
|
+
return false;
|
|
993
|
+
}
|
|
994
|
+
try {
|
|
995
|
+
const json = script.textContent || "{}";
|
|
996
|
+
const data = JSON.parse(json);
|
|
997
|
+
for (const [key, value] of Object.entries(data)) {
|
|
998
|
+
hydrationDataMap.set(key, value);
|
|
999
|
+
}
|
|
1000
|
+
return true;
|
|
1001
|
+
} catch (error) {
|
|
1002
|
+
console.error("Failed to deserialize hydration data:", error);
|
|
1003
|
+
return false;
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
function cleanupHydration() {
|
|
1007
|
+
if (typeof window === "undefined") {
|
|
1008
|
+
return;
|
|
1009
|
+
}
|
|
1010
|
+
const script = document.getElementById("__FLUIXI_HYDRATION__");
|
|
1011
|
+
if (script) {
|
|
1012
|
+
script.remove();
|
|
1013
|
+
}
|
|
1014
|
+
const walker = document.createTreeWalker(
|
|
1015
|
+
document.body,
|
|
1016
|
+
NodeFilter.SHOW_COMMENT,
|
|
1017
|
+
null
|
|
1018
|
+
);
|
|
1019
|
+
const comments = [];
|
|
1020
|
+
let node;
|
|
1021
|
+
while (node = walker.nextNode()) {
|
|
1022
|
+
const comment = node;
|
|
1023
|
+
const text = comment.nodeValue || "";
|
|
1024
|
+
if (text.startsWith("#") || text.startsWith("/")) {
|
|
1025
|
+
comments.push(comment);
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
comments.forEach((comment) => comment.remove());
|
|
1029
|
+
clearHydrationData();
|
|
1030
|
+
}
|
|
1031
|
+
if (typeof window !== "undefined") {
|
|
1032
|
+
window.addEventListener("load", () => {
|
|
1033
|
+
setTimeout(cleanupHydration, 100);
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
|
|
1037
|
+
// src/lib/render/index.ts
|
|
1038
|
+
var import_dom9 = require("@fluixi/dom");
|
|
1039
|
+
var import_signal6 = require("@fluixi/reactive/signal");
|
|
1040
|
+
var import_dom10 = require("@fluixi/dom");
|
|
1041
|
+
|
|
1042
|
+
// src/lib/render/component.ts
|
|
1043
|
+
var import_dom4 = require("@fluixi/dom");
|
|
1044
|
+
var import_dom5 = require("@fluixi/dom");
|
|
1045
|
+
var import_signal = require("@fluixi/reactive/signal");
|
|
1046
|
+
function createComponent(Comp, props) {
|
|
1047
|
+
return (0, import_dom5.createComponent)(Comp, props);
|
|
1048
|
+
}
|
|
1049
|
+
|
|
1050
|
+
// src/lib/render/suspense.ts
|
|
1051
|
+
var import_signal2 = require("@fluixi/reactive/signal");
|
|
1052
|
+
var import_dom6 = require("@fluixi/dom");
|
|
1053
|
+
function isPromise(value) {
|
|
1054
|
+
return !!(value && typeof value === "object" && typeof value.then === "function" || value instanceof Promise);
|
|
1055
|
+
}
|
|
1056
|
+
var SuspenseListContext = (0, import_signal2.createContext)(void 0, "suspense-list");
|
|
1057
|
+
function Suspense(props) {
|
|
1058
|
+
return (0, import_dom6.createComponent)(SuspenseImpl, props);
|
|
1059
|
+
}
|
|
1060
|
+
function SuspenseImpl(props) {
|
|
1061
|
+
const boundary = (0, import_signal2.createSuspenseBoundary)();
|
|
1062
|
+
const listCtx = (0, import_signal2.useContext)(SuspenseListContext);
|
|
1063
|
+
const listState = listCtx ? listCtx.register(boundary.inFallback) : void 0;
|
|
1064
|
+
function instantiateOnce(val) {
|
|
1065
|
+
if (val == null || typeof val === "boolean") return null;
|
|
1066
|
+
if (typeof val === "function" && (0, import_dom6.isComponent)(val) && !(0, import_signal2.isSignal)(val)) return val();
|
|
1067
|
+
return val;
|
|
1068
|
+
}
|
|
1069
|
+
const fallback = (0, import_dom6.runWithoutHydration)(() => instantiateOnce(props.fallback ?? null));
|
|
1070
|
+
const children = (0, import_signal2.provideSuspense)(boundary, () => (0, import_signal2.readChildren)(() => props.children));
|
|
1071
|
+
const track = (value, depth) => {
|
|
1072
|
+
if (depth > 8) return;
|
|
1073
|
+
if (Array.isArray(value)) {
|
|
1074
|
+
for (const x of value) track(x, depth + 1);
|
|
1075
|
+
} else if (typeof value === "function" && (0, import_signal2.isSignal)(value)) {
|
|
1076
|
+
track(value(), depth + 1);
|
|
1077
|
+
}
|
|
1078
|
+
};
|
|
1079
|
+
(0, import_signal2.provideSuspense)(boundary, () => {
|
|
1080
|
+
(0, import_signal2.createRenderEffect)(() => track(children, 0));
|
|
1081
|
+
});
|
|
1082
|
+
const [resolved, setResolved] = (0, import_signal2.createSignal)(void 0);
|
|
1083
|
+
const childIsPromise = isPromise(children);
|
|
1084
|
+
if (childIsPromise) {
|
|
1085
|
+
boundary.increment();
|
|
1086
|
+
children.then(
|
|
1087
|
+
(v) => {
|
|
1088
|
+
setResolved(() => v);
|
|
1089
|
+
boundary.decrement();
|
|
1090
|
+
},
|
|
1091
|
+
() => boundary.decrement()
|
|
1092
|
+
);
|
|
1093
|
+
}
|
|
1094
|
+
return (0, import_signal2.createMemo)(() => {
|
|
1095
|
+
const showFallback = listState ? listState.showFallback() : boundary.inFallback();
|
|
1096
|
+
if (showFallback) return fallback;
|
|
1097
|
+
if (childIsPromise) return resolved();
|
|
1098
|
+
return children;
|
|
1099
|
+
});
|
|
1100
|
+
}
|
|
1101
|
+
(0, import_dom6.asSuspense)(Suspense);
|
|
1102
|
+
Object.defineProperty(Suspense, "__suspense", { value: true, enumerable: true });
|
|
1103
|
+
|
|
1104
|
+
// src/lib/render/index.ts
|
|
1105
|
+
init_lazy();
|
|
1106
|
+
|
|
1107
|
+
// src/lib/render/deferred.ts
|
|
1108
|
+
var import_dom8 = require("@fluixi/dom");
|
|
1109
|
+
var import_signal4 = require("@fluixi/reactive/signal");
|
|
1110
|
+
var import_utils = require("@fluixi/dom/utils");
|
|
1111
|
+
init_lazy();
|
|
1112
|
+
|
|
1113
|
+
// src/lib/render/await.ts
|
|
1114
|
+
var import_signal5 = require("@fluixi/reactive/signal");
|
|
1115
|
+
|
|
1116
|
+
// src/lib/render/index.ts
|
|
1117
|
+
function render(code, container, options = {}) {
|
|
1118
|
+
(0, import_dom10.delegateEvents)(["click", "input", "change", "submit"]);
|
|
1119
|
+
if ((0, import_dom9.isServer)()) {
|
|
1120
|
+
throw new Error(
|
|
1121
|
+
"render() is for client-side only. Use renderToString() on server."
|
|
1122
|
+
);
|
|
1123
|
+
}
|
|
1124
|
+
if (!container) {
|
|
1125
|
+
throw new Error("Container element is required");
|
|
1126
|
+
}
|
|
1127
|
+
let disposer;
|
|
1128
|
+
(0, import_signal6.createRoot)((dispose) => {
|
|
1129
|
+
disposer = dispose;
|
|
1130
|
+
const result = typeof code === "function" ? code() : code;
|
|
1131
|
+
container.textContent = "";
|
|
1132
|
+
(0, import_dom2.stampVersions)(container);
|
|
1133
|
+
(0, import_dom2.warnOnVersionSkew)();
|
|
1134
|
+
(0, import_dom10.insert)(container, () => result);
|
|
1135
|
+
});
|
|
1136
|
+
return () => {
|
|
1137
|
+
if (disposer) {
|
|
1138
|
+
disposer();
|
|
1139
|
+
disposer = void 0;
|
|
1140
|
+
}
|
|
1141
|
+
};
|
|
1142
|
+
}
|
|
1143
|
+
|
|
1144
|
+
// src/lib/client/index.ts
|
|
1145
|
+
var import_signal13 = require("@fluixi/reactive/signal");
|
|
1146
|
+
var import_head = require("@fluixi/head");
|
|
1147
|
+
var import_dom14 = require("@fluixi/dom");
|
|
1148
|
+
function mount(App, container) {
|
|
1149
|
+
if (!container) {
|
|
1150
|
+
throw new Error("Container element not found for mount()");
|
|
1151
|
+
}
|
|
1152
|
+
(0, import_dom13.render)(() => App(), container);
|
|
1153
|
+
}
|
|
1154
|
+
var rootOf = (App) => (0, import_signal13.createMemo)(() => createComponent(App));
|
|
1155
|
+
async function startClient(App, options = {}) {
|
|
1156
|
+
const container = typeof options.root === "string" ? document.querySelector(options.root) : options.root ?? document.querySelector("#app");
|
|
1157
|
+
if (!container) {
|
|
1158
|
+
throw new Error(
|
|
1159
|
+
`[Fluixi] Mount container not found: ${options.root ?? "#app"}`
|
|
1160
|
+
);
|
|
1161
|
+
}
|
|
1162
|
+
const hasServerDom = !!document.getElementById("__FLUIXI_HYDRATION__") || !!options.routes && container.firstElementChild != null;
|
|
1163
|
+
const shouldHydrate = options.hydrate ?? hasServerDom;
|
|
1164
|
+
const head = (0, import_head.createHead)();
|
|
1165
|
+
(0, import_head.setActiveHead)(head);
|
|
1166
|
+
(0, import_head.stripHeadMarker)(container);
|
|
1167
|
+
if (shouldHydrate) {
|
|
1168
|
+
(0, import_dom13.beginAppHydration)();
|
|
1169
|
+
try {
|
|
1170
|
+
if (options.routes && options.routes.length) {
|
|
1171
|
+
const { preloadRoutes: preloadRoutes2 } = await Promise.resolve().then(() => (init_router(), router_exports));
|
|
1172
|
+
await preloadRoutes2(options.routes, window.location.pathname);
|
|
1173
|
+
}
|
|
1174
|
+
deserializeHydrationData();
|
|
1175
|
+
setHydrating(true);
|
|
1176
|
+
(0, import_dom13.hydrate)(() => rootOf(App), container);
|
|
1177
|
+
replayEvents();
|
|
1178
|
+
} finally {
|
|
1179
|
+
(0, import_dom13.endAppHydration)();
|
|
1180
|
+
}
|
|
1181
|
+
setTimeout(() => {
|
|
1182
|
+
setHydrating(false);
|
|
1183
|
+
const removed = (0, import_dom13.removeUnclaimedKeyed)(container);
|
|
1184
|
+
if (removed && typeof process !== "undefined" && false) {
|
|
1185
|
+
console.warn(`[fluixi] hydration: removed ${removed} server element(s) the client did not render. Check for markup that depends on client-only state.`);
|
|
1186
|
+
}
|
|
1187
|
+
(0, import_dom13.clearHydrationKeys)();
|
|
1188
|
+
cleanupHydration();
|
|
1189
|
+
}, 100);
|
|
1190
|
+
} else {
|
|
1191
|
+
render(rootOf(App), container);
|
|
1192
|
+
}
|
|
1193
|
+
(0, import_head.mountHead)(head);
|
|
1194
|
+
}
|
|
1195
|
+
function replayEvents() {
|
|
1196
|
+
if (typeof window === "undefined") return;
|
|
1197
|
+
const w = window;
|
|
1198
|
+
if (typeof w.__FX_REPLAY_STOP__ === "function") w.__FX_REPLAY_STOP__();
|
|
1199
|
+
const queue = w.__FX_REPLAY__;
|
|
1200
|
+
w.__FX_REPLAY__ = void 0;
|
|
1201
|
+
w.__FX_REPLAY_STOP__ = void 0;
|
|
1202
|
+
if (!Array.isArray(queue) || queue.length === 0) return;
|
|
1203
|
+
for (const rec of queue) {
|
|
1204
|
+
const target = rec && rec.target;
|
|
1205
|
+
if (!target || target.isConnected === false || typeof target.dispatchEvent !== "function") continue;
|
|
1206
|
+
const type = rec.type;
|
|
1207
|
+
const ev = type === "click" ? new MouseEvent(type, { bubbles: true, cancelable: true }) : new Event(type, { bubbles: true, cancelable: true });
|
|
1208
|
+
target.dispatchEvent(ev);
|
|
1209
|
+
}
|
|
1210
|
+
}
|