@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.
Files changed (253) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +334 -0
  3. package/dist/cdn/core.global.js +2 -0
  4. package/dist/cli/generate.cjs +5639 -0
  5. package/dist/cli/generate.d.ts +7 -0
  6. package/dist/cli/generate.d.ts.map +1 -0
  7. package/dist/cli/generate.js +2580 -0
  8. package/dist/cli/generate.mjs +5644 -0
  9. package/dist/cli/index.cjs +5639 -0
  10. package/dist/cli/index.d.ts +7 -0
  11. package/dist/cli/index.d.ts.map +1 -0
  12. package/dist/cli/index.js +2580 -0
  13. package/dist/cli/index.mjs +5644 -0
  14. package/dist/cli/run.cjs +64 -0
  15. package/dist/cli/run.d.ts +3 -0
  16. package/dist/cli/run.d.ts.map +1 -0
  17. package/dist/cli/run.js +62 -0
  18. package/dist/cli/run.mjs +40 -0
  19. package/dist/fluixi.d.ts +5 -0
  20. package/dist/src/cdn/chunk-RKBFEFZP.mjs +987 -0
  21. package/dist/src/cdn/core.cjs +1592 -0
  22. package/dist/src/cdn/core.d.ts +16 -0
  23. package/dist/src/cdn/core.d.ts.map +1 -0
  24. package/dist/src/cdn/core.js +15 -0
  25. package/dist/src/cdn/core.mjs +714 -0
  26. package/dist/src/cdn/router-V2THK27H.mjs +74 -0
  27. package/dist/src/index.cjs +1711 -0
  28. package/dist/src/index.d.ts +4 -0
  29. package/dist/src/index.d.ts.map +1 -0
  30. package/dist/src/index.js +11 -0
  31. package/dist/src/index.mjs +1833 -0
  32. package/dist/src/jsx-dev-runtime.cjs +26 -0
  33. package/dist/src/jsx-dev-runtime.d.ts +2 -0
  34. package/dist/src/jsx-dev-runtime.d.ts.map +1 -0
  35. package/dist/src/jsx-dev-runtime.js +1 -0
  36. package/dist/src/jsx-dev-runtime.mjs +24 -0
  37. package/dist/src/jsx-runtime.cjs +26 -0
  38. package/dist/src/jsx-runtime.d.ts +7 -0
  39. package/dist/src/jsx-runtime.d.ts.map +1 -0
  40. package/dist/src/jsx-runtime.js +8 -0
  41. package/dist/src/jsx-runtime.mjs +24 -0
  42. package/dist/src/lib/client/chunk-FDOPDB6Z.mjs +53 -0
  43. package/dist/src/lib/client/index.cjs +1210 -0
  44. package/dist/src/lib/client/index.d.ts +51 -0
  45. package/dist/src/lib/client/index.d.ts.map +1 -0
  46. package/dist/src/lib/client/index.js +174 -0
  47. package/dist/src/lib/client/index.mjs +293 -0
  48. package/dist/src/lib/client/router-4PTBPZLQ.mjs +891 -0
  49. package/dist/src/lib/context/context.cjs +81 -0
  50. package/dist/src/lib/context/context.d.ts +73 -0
  51. package/dist/src/lib/context/context.d.ts.map +1 -0
  52. package/dist/src/lib/context/context.js +93 -0
  53. package/dist/src/lib/context/context.mjs +64 -0
  54. package/dist/src/lib/context/index.cjs +83 -0
  55. package/dist/src/lib/context/index.d.ts +3 -0
  56. package/dist/src/lib/context/index.d.ts.map +1 -0
  57. package/dist/src/lib/context/index.js +1 -0
  58. package/dist/src/lib/context/index.mjs +64 -0
  59. package/dist/src/lib/control-flow.cjs +35 -0
  60. package/dist/src/lib/control-flow.d.ts +4 -0
  61. package/dist/src/lib/control-flow.d.ts.map +1 -0
  62. package/dist/src/lib/control-flow.js +1 -0
  63. package/dist/src/lib/control-flow.mjs +25 -0
  64. package/dist/src/lib/core.cjs +1710 -0
  65. package/dist/src/lib/core.d.ts +91 -0
  66. package/dist/src/lib/core.d.ts.map +1 -0
  67. package/dist/src/lib/core.js +158 -0
  68. package/dist/src/lib/core.mjs +1833 -0
  69. package/dist/src/lib/env/index.cjs +44 -0
  70. package/dist/src/lib/env/index.d.ts +26 -0
  71. package/dist/src/lib/env/index.d.ts.map +1 -0
  72. package/dist/src/lib/env/index.js +31 -0
  73. package/dist/src/lib/env/index.mjs +23 -0
  74. package/dist/src/lib/i18n/index.cjs +123 -0
  75. package/dist/src/lib/i18n/index.d.ts +110 -0
  76. package/dist/src/lib/i18n/index.d.ts.map +1 -0
  77. package/dist/src/lib/i18n/index.js +164 -0
  78. package/dist/src/lib/i18n/index.mjs +103 -0
  79. package/dist/src/lib/index.cjs +598 -0
  80. package/dist/src/lib/index.d.ts +81 -0
  81. package/dist/src/lib/index.d.ts.map +1 -0
  82. package/dist/src/lib/index.js +130 -0
  83. package/dist/src/lib/index.mjs +688 -0
  84. package/dist/src/lib/isomorphic.cjs +90 -0
  85. package/dist/src/lib/isomorphic.d.ts +114 -0
  86. package/dist/src/lib/isomorphic.d.ts.map +1 -0
  87. package/dist/src/lib/isomorphic.js +132 -0
  88. package/dist/src/lib/isomorphic.mjs +69 -0
  89. package/dist/src/lib/jsx-runtime/index.cjs +21 -0
  90. package/dist/src/lib/jsx-runtime/index.d.ts +13 -0
  91. package/dist/src/lib/jsx-runtime/index.d.ts.map +1 -0
  92. package/dist/src/lib/jsx-runtime/index.js +13 -0
  93. package/dist/src/lib/jsx-runtime/index.mjs +4 -0
  94. package/dist/src/lib/jsx-runtime/jsx-dev-runtime.cjs +21 -0
  95. package/dist/src/lib/jsx-runtime/jsx-dev-runtime.d.ts +2 -0
  96. package/dist/src/lib/jsx-runtime/jsx-dev-runtime.d.ts.map +1 -0
  97. package/dist/src/lib/jsx-runtime/jsx-dev-runtime.js +1 -0
  98. package/dist/src/lib/jsx-runtime/jsx-dev-runtime.mjs +4 -0
  99. package/dist/src/lib/plugins/fluixi-routes-plugin.cjs +302 -0
  100. package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts +35 -0
  101. package/dist/src/lib/plugins/fluixi-routes-plugin.d.ts.map +1 -0
  102. package/dist/src/lib/plugins/fluixi-routes-plugin.js +118 -0
  103. package/dist/src/lib/plugins/fluixi-routes-plugin.mjs +271 -0
  104. package/dist/src/lib/plugins/index.cjs +311 -0
  105. package/dist/src/lib/plugins/index.d.ts +6 -0
  106. package/dist/src/lib/plugins/index.d.ts.map +1 -0
  107. package/dist/src/lib/plugins/index.js +7 -0
  108. package/dist/src/lib/plugins/index.mjs +279 -0
  109. package/dist/src/lib/plugins/route-codegen.cjs +73 -0
  110. package/dist/src/lib/plugins/route-codegen.d.ts +12 -0
  111. package/dist/src/lib/plugins/route-codegen.d.ts.map +1 -0
  112. package/dist/src/lib/plugins/route-codegen.js +80 -0
  113. package/dist/src/lib/plugins/route-codegen.mjs +52 -0
  114. package/dist/src/lib/plugins/route-scanner.cjs +189 -0
  115. package/dist/src/lib/plugins/route-scanner.d.ts +38 -0
  116. package/dist/src/lib/plugins/route-scanner.d.ts.map +1 -0
  117. package/dist/src/lib/plugins/route-scanner.js +215 -0
  118. package/dist/src/lib/plugins/route-scanner.mjs +158 -0
  119. package/dist/src/lib/plugins/vite.cjs +27 -0
  120. package/dist/src/lib/plugins/vite.d.ts +3 -0
  121. package/dist/src/lib/plugins/vite.d.ts.map +1 -0
  122. package/dist/src/lib/plugins/vite.js +1 -0
  123. package/dist/src/lib/plugins/vite.mjs +6 -0
  124. package/dist/src/lib/render/await.cjs +38 -0
  125. package/dist/src/lib/render/await.d.ts +26 -0
  126. package/dist/src/lib/render/await.d.ts.map +1 -0
  127. package/dist/src/lib/render/await.js +45 -0
  128. package/dist/src/lib/render/await.mjs +17 -0
  129. package/dist/src/lib/render/component.cjs +221 -0
  130. package/dist/src/lib/render/component.d.ts +296 -0
  131. package/dist/src/lib/render/component.d.ts.map +1 -0
  132. package/dist/src/lib/render/component.js +514 -0
  133. package/dist/src/lib/render/component.mjs +214 -0
  134. package/dist/src/lib/render/deferred.cjs +175 -0
  135. package/dist/src/lib/render/deferred.d.ts +36 -0
  136. package/dist/src/lib/render/deferred.d.ts.map +1 -0
  137. package/dist/src/lib/render/deferred.js +141 -0
  138. package/dist/src/lib/render/deferred.mjs +158 -0
  139. package/dist/src/lib/render/index.cjs +573 -0
  140. package/dist/src/lib/render/index.d.ts +98 -0
  141. package/dist/src/lib/render/index.d.ts.map +1 -0
  142. package/dist/src/lib/render/index.js +180 -0
  143. package/dist/src/lib/render/index.mjs +590 -0
  144. package/dist/src/lib/render/lazy.cjs +67 -0
  145. package/dist/src/lib/render/lazy.d.ts +49 -0
  146. package/dist/src/lib/render/lazy.d.ts.map +1 -0
  147. package/dist/src/lib/render/lazy.js +105 -0
  148. package/dist/src/lib/render/lazy.mjs +50 -0
  149. package/dist/src/lib/render/suspense.cjs +141 -0
  150. package/dist/src/lib/render/suspense.d.ts +65 -0
  151. package/dist/src/lib/render/suspense.d.ts.map +1 -0
  152. package/dist/src/lib/render/suspense.js +196 -0
  153. package/dist/src/lib/render/suspense.mjs +136 -0
  154. package/dist/src/lib/render/versions.cjs +35 -0
  155. package/dist/src/lib/render/versions.d.ts +2 -0
  156. package/dist/src/lib/render/versions.d.ts.map +1 -0
  157. package/dist/src/lib/render/versions.js +21 -0
  158. package/dist/src/lib/render/versions.mjs +14 -0
  159. package/dist/src/lib/router/data.cjs +228 -0
  160. package/dist/src/lib/router/data.d.ts +142 -0
  161. package/dist/src/lib/router/data.d.ts.map +1 -0
  162. package/dist/src/lib/router/data.js +258 -0
  163. package/dist/src/lib/router/data.mjs +214 -0
  164. package/dist/src/lib/router/index.cjs +921 -0
  165. package/dist/src/lib/router/index.d.ts +274 -0
  166. package/dist/src/lib/router/index.d.ts.map +1 -0
  167. package/dist/src/lib/router/index.js +904 -0
  168. package/dist/src/lib/router/index.mjs +938 -0
  169. package/dist/src/lib/router/scroll.cjs +79 -0
  170. package/dist/src/lib/router/scroll.d.ts +19 -0
  171. package/dist/src/lib/router/scroll.d.ts.map +1 -0
  172. package/dist/src/lib/router/scroll.js +68 -0
  173. package/dist/src/lib/router/scroll.mjs +58 -0
  174. package/dist/src/lib/router/transition.cjs +75 -0
  175. package/dist/src/lib/router/transition.d.ts +81 -0
  176. package/dist/src/lib/router/transition.d.ts.map +1 -0
  177. package/dist/src/lib/router/transition.js +136 -0
  178. package/dist/src/lib/router/transition.mjs +54 -0
  179. package/dist/src/lib/server/hydration.cjs +169 -0
  180. package/dist/src/lib/server/hydration.d.ts +198 -0
  181. package/dist/src/lib/server/hydration.d.ts.map +1 -0
  182. package/dist/src/lib/server/hydration.js +345 -0
  183. package/dist/src/lib/server/hydration.mjs +148 -0
  184. package/dist/src/lib/server/index.cjs +406 -0
  185. package/dist/src/lib/server/index.d.ts +115 -0
  186. package/dist/src/lib/server/index.d.ts.map +1 -0
  187. package/dist/src/lib/server/index.js +164 -0
  188. package/dist/src/lib/server/index.mjs +384 -0
  189. package/dist/src/lib/server/reactive.cjs +197 -0
  190. package/dist/src/lib/server/reactive.d.ts +239 -0
  191. package/dist/src/lib/server/reactive.d.ts.map +1 -0
  192. package/dist/src/lib/server/reactive.js +413 -0
  193. package/dist/src/lib/server/reactive.mjs +176 -0
  194. package/dist/src/lib/storage/cache.cjs +51 -0
  195. package/dist/src/lib/storage/cache.d.ts +18 -0
  196. package/dist/src/lib/storage/cache.d.ts.map +1 -0
  197. package/dist/src/lib/storage/cache.js +42 -0
  198. package/dist/src/lib/storage/cache.mjs +30 -0
  199. package/dist/src/lib/storage/index.cjs +246 -0
  200. package/dist/src/lib/storage/index.d.ts +83 -0
  201. package/dist/src/lib/storage/index.d.ts.map +1 -0
  202. package/dist/src/lib/storage/index.js +179 -0
  203. package/dist/src/lib/storage/index.mjs +231 -0
  204. package/dist/src/lib/storage/persisted.cjs +91 -0
  205. package/dist/src/lib/storage/persisted.d.ts +53 -0
  206. package/dist/src/lib/storage/persisted.d.ts.map +1 -0
  207. package/dist/src/lib/storage/persisted.js +75 -0
  208. package/dist/src/lib/storage/persisted.mjs +70 -0
  209. package/dist/src/lib/theme/color-scheme.cjs +281 -0
  210. package/dist/src/lib/theme/color-scheme.d.ts +61 -0
  211. package/dist/src/lib/theme/color-scheme.d.ts.map +1 -0
  212. package/dist/src/lib/theme/color-scheme.js +120 -0
  213. package/dist/src/lib/theme/color-scheme.mjs +265 -0
  214. package/dist/src/lib/theme/index.cjs +267 -0
  215. package/dist/src/lib/theme/index.d.ts +78 -0
  216. package/dist/src/lib/theme/index.d.ts.map +1 -0
  217. package/dist/src/lib/theme/index.js +135 -0
  218. package/dist/src/lib/theme/index.mjs +251 -0
  219. package/dist/src/lib/theme/provider.cjs +346 -0
  220. package/dist/src/lib/theme/provider.d.ts +34 -0
  221. package/dist/src/lib/theme/provider.d.ts.map +1 -0
  222. package/dist/src/lib/theme/provider.js +60 -0
  223. package/dist/src/lib/theme/provider.mjs +332 -0
  224. package/dist/src/lib/utils/index.cjs +209 -0
  225. package/dist/src/lib/utils/index.d.ts +286 -0
  226. package/dist/src/lib/utils/index.d.ts.map +1 -0
  227. package/dist/src/lib/utils/index.js +434 -0
  228. package/dist/src/lib/utils/index.mjs +188 -0
  229. package/dist/src/routes.cjs +37 -0
  230. package/dist/src/routes.d.ts +22 -0
  231. package/dist/src/routes.d.ts.map +1 -0
  232. package/dist/src/routes.js +20 -0
  233. package/dist/src/routes.mjs +17 -0
  234. package/dist/src/server.cjs +405 -0
  235. package/dist/src/server.d.ts +63 -0
  236. package/dist/src/server.d.ts.map +1 -0
  237. package/dist/src/server.js +62 -0
  238. package/dist/src/server.mjs +382 -0
  239. package/dist/src/utils.cjs +21 -0
  240. package/dist/src/utils.d.ts +10 -0
  241. package/dist/src/utils.d.ts.map +1 -0
  242. package/dist/src/utils.js +9 -0
  243. package/dist/src/utils.mjs +4 -0
  244. package/dist/src/version.generated.cjs +26 -0
  245. package/dist/src/version.generated.d.ts +3 -0
  246. package/dist/src/version.generated.d.ts.map +1 -0
  247. package/dist/src/version.generated.js +3 -0
  248. package/dist/src/version.generated.mjs +5 -0
  249. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  250. package/package.json +164 -0
  251. package/src/index.ts +19 -0
  252. package/types/fluixi.d.ts +5 -0
  253. package/types/vinxi.d.ts +50 -0
@@ -0,0 +1,136 @@
1
+ // src/lib/render/suspense.ts
2
+ import {
3
+ createSignal,
4
+ createMemo,
5
+ createEffect,
6
+ createRenderEffect,
7
+ isSignal,
8
+ readChildren,
9
+ useContext,
10
+ createContext,
11
+ createSuspenseBoundary,
12
+ provideSuspense
13
+ } from "@fluixi/reactive/signal";
14
+ import {
15
+ asSuspense,
16
+ isComponent,
17
+ createComponent,
18
+ runWithoutHydration
19
+ } from "@fluixi/dom";
20
+ var $SUSPENSE = /* @__PURE__ */ Symbol.for("suspense");
21
+ function isNode(value) {
22
+ if (typeof window === "undefined") return false;
23
+ if (typeof Node === "function" && value instanceof Node) return true;
24
+ return !!(value && typeof value === "object" && typeof value.nodeType === "number");
25
+ }
26
+ function isLitResult(value) {
27
+ if (!value || typeof value !== "object") return false;
28
+ return !!(typeof value["_$litType$"] !== "undefined" || typeof value["_$litDirective$"] !== "undefined" || Array.isArray(value.strings) && Array.isArray(value.values));
29
+ }
30
+ function isPromise(value) {
31
+ return !!(value && typeof value === "object" && typeof value.then === "function" || value instanceof Promise);
32
+ }
33
+ function isJSXElement(value) {
34
+ return !!(value && typeof value === "object" && "type" in value && "props" in value);
35
+ }
36
+ var SuspenseListContext = createContext(void 0, "suspense-list");
37
+ function Suspense(props) {
38
+ return createComponent(SuspenseImpl, props);
39
+ }
40
+ function SuspenseImpl(props) {
41
+ const boundary = createSuspenseBoundary();
42
+ const listCtx = useContext(SuspenseListContext);
43
+ const listState = listCtx ? listCtx.register(boundary.inFallback) : void 0;
44
+ function instantiateOnce(val) {
45
+ if (val == null || typeof val === "boolean") return null;
46
+ if (typeof val === "function" && isComponent(val) && !isSignal(val)) return val();
47
+ return val;
48
+ }
49
+ const fallback = runWithoutHydration(() => instantiateOnce(props.fallback ?? null));
50
+ const children = provideSuspense(boundary, () => readChildren(() => props.children));
51
+ const track = (value, depth) => {
52
+ if (depth > 8) return;
53
+ if (Array.isArray(value)) {
54
+ for (const x of value) track(x, depth + 1);
55
+ } else if (typeof value === "function" && isSignal(value)) {
56
+ track(value(), depth + 1);
57
+ }
58
+ };
59
+ provideSuspense(boundary, () => {
60
+ createRenderEffect(() => track(children, 0));
61
+ });
62
+ const [resolved, setResolved] = createSignal(void 0);
63
+ const childIsPromise = isPromise(children);
64
+ if (childIsPromise) {
65
+ boundary.increment();
66
+ children.then(
67
+ (v) => {
68
+ setResolved(() => v);
69
+ boundary.decrement();
70
+ },
71
+ () => boundary.decrement()
72
+ );
73
+ }
74
+ return createMemo(() => {
75
+ const showFallback = listState ? listState.showFallback() : boundary.inFallback();
76
+ if (showFallback) return fallback;
77
+ if (childIsPromise) return resolved();
78
+ return children;
79
+ });
80
+ }
81
+ function SuspenseList(props) {
82
+ return createComponent(SuspenseListImpl, props);
83
+ }
84
+ function SuspenseListImpl(props) {
85
+ const { revealOrder = "together", tail } = props;
86
+ const registrations = [];
87
+ function coordinateReveal() {
88
+ if (revealOrder === "together") {
89
+ const allResolved = registrations.every((r) => !r.inFallback());
90
+ registrations.forEach((r) => {
91
+ r.setShowContent(allResolved);
92
+ r.setShowFallback(!allResolved);
93
+ });
94
+ } else {
95
+ const items = revealOrder === "backwards" ? [...registrations].reverse() : registrations;
96
+ let blocked = false;
97
+ for (const r of items) {
98
+ if (blocked || r.inFallback()) {
99
+ blocked = true;
100
+ r.setShowContent(false);
101
+ r.setShowFallback(tail !== "hidden");
102
+ } else {
103
+ r.setShowContent(true);
104
+ r.setShowFallback(false);
105
+ }
106
+ }
107
+ }
108
+ }
109
+ const coordinator = {
110
+ register: (inFallback) => {
111
+ const [showContent, setShowContent] = createSignal(true);
112
+ const [showFallback, setShowFallback] = createSignal(false);
113
+ registrations.push({ inFallback, setShowContent, setShowFallback });
114
+ createEffect(() => {
115
+ inFallback();
116
+ coordinateReveal();
117
+ });
118
+ return { showContent, showFallback };
119
+ }
120
+ };
121
+ return SuspenseListContext.Provider({
122
+ value: coordinator,
123
+ children: props.children
124
+ });
125
+ }
126
+ asSuspense(Suspense);
127
+ Object.defineProperty(Suspense, "__suspense", { value: true, enumerable: true });
128
+ export {
129
+ $SUSPENSE,
130
+ Suspense,
131
+ SuspenseList,
132
+ isJSXElement,
133
+ isLitResult,
134
+ isNode,
135
+ isPromise
136
+ };
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/lib/render/versions.ts
21
+ var versions_exports = {};
22
+ __export(versions_exports, {
23
+ stampVersions: () => import_dom2.stampVersions,
24
+ versions: () => import_dom2.versions,
25
+ warnOnVersionSkew: () => import_dom2.warnOnVersionSkew
26
+ });
27
+ module.exports = __toCommonJS(versions_exports);
28
+ var import_dom = require("@fluixi/dom");
29
+
30
+ // src/version.generated.ts
31
+ var VERSION = "1.0.0-alpha.100";
32
+
33
+ // src/lib/render/versions.ts
34
+ var import_dom2 = require("@fluixi/dom");
35
+ (0, import_dom.registerCoreVersion)(VERSION);
@@ -0,0 +1,2 @@
1
+ export { stampVersions, warnOnVersionSkew, versions, type FluixiVersions } from '@fluixi/dom';
2
+ //# sourceMappingURL=versions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"versions.d.ts","sourceRoot":"","sources":["../../../../src/lib/render/versions.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Register this package's version with the DOM runtime, which owns the stamping.
3
+ *
4
+ * It used to be owned here, and stamped only by core's `render`, so an app that reached
5
+ * the DOM any other way (`startClient` -> `hydrate` -> the dom runtime's `render`) got no
6
+ * version attributes at all. Every SSR app is in that position, including the docs site.
7
+ *
8
+ * The stamping therefore moved down to `@fluixi/dom`, which both paths pass through. The
9
+ * core version cannot be imported from there: core depends on dom, and reversing that is
10
+ * a cycle, so it is pushed down instead, on import.
11
+ *
12
+ * Read from a generated constant rather than `package.json`: bundlers and ESM resolvers
13
+ * treat a manifest import inconsistently, and it would pull the whole file into the bundle
14
+ * for one string.
15
+ */
16
+ import { registerCoreVersion } from '@fluixi/dom';
17
+ import { VERSION as CORE } from '../../version.generated.js';
18
+ registerCoreVersion(CORE);
19
+ // Re-exported so existing importers keep working, and so core's own `render`, which does
20
+ // not delegate to the dom runtime's `render`: can still stamp.
21
+ export { stampVersions, warnOnVersionSkew, versions } from '@fluixi/dom';
@@ -0,0 +1,14 @@
1
+ // src/lib/render/versions.ts
2
+ import { registerCoreVersion } from "@fluixi/dom";
3
+
4
+ // src/version.generated.ts
5
+ var VERSION = "1.0.0-alpha.100";
6
+
7
+ // src/lib/render/versions.ts
8
+ import { stampVersions, warnOnVersionSkew, versions } from "@fluixi/dom";
9
+ registerCoreVersion(VERSION);
10
+ export {
11
+ stampVersions,
12
+ versions,
13
+ warnOnVersionSkew
14
+ };
@@ -0,0 +1,228 @@
1
+ "use strict";
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/lib/router/data.ts
21
+ var data_exports = {};
22
+ __export(data_exports, {
23
+ RouteDataContext: () => RouteDataContext,
24
+ RouteDataProvider: () => RouteDataProvider,
25
+ action: () => action,
26
+ cache: () => cache,
27
+ createAsync: () => createAsync,
28
+ onRevalidate: () => onRevalidate,
29
+ revalidate: () => revalidate,
30
+ useAction: () => useAction,
31
+ useRouteData: () => useRouteData,
32
+ useSubmission: () => useSubmission,
33
+ useSubmissions: () => useSubmissions
34
+ });
35
+ module.exports = __toCommonJS(data_exports);
36
+ var import_signal2 = require("@fluixi/reactive/signal");
37
+ var import_signal3 = require("@fluixi/reactive/signal");
38
+
39
+ // src/lib/context/context.ts
40
+ var import_dom = require("@fluixi/dom");
41
+ var import_signal = require("@fluixi/reactive/signal");
42
+ function createContext(defaultValue, name) {
43
+ const context = (0, import_signal.createContext)(defaultValue, name);
44
+ const Provider = (props) => (
45
+ // Children stay a getter: the reactive Provider reads them after stamping the value on
46
+ // its owner. Reading `props.children` here would render them, and any <Outlet/> in them,
47
+ // before the context exists.
48
+ context.Provider({
49
+ value: props.value,
50
+ get children() {
51
+ return props.children;
52
+ },
53
+ debug: props.debug
54
+ })
55
+ );
56
+ return {
57
+ id: context.id,
58
+ Provider: (0, import_dom.asProvider)(Provider),
59
+ defaultValue
60
+ };
61
+ }
62
+ function useContext(context) {
63
+ const value = (0, import_signal.useContext)(context);
64
+ return value !== void 0 ? value : context.defaultValue;
65
+ }
66
+
67
+ // src/lib/router/data.ts
68
+ var revalidationListeners = /* @__PURE__ */ new Set();
69
+ function onRevalidate(listener) {
70
+ revalidationListeners.add(listener);
71
+ return () => void revalidationListeners.delete(listener);
72
+ }
73
+ var reloadMounted = () => {
74
+ for (const listener of [...revalidationListeners]) listener();
75
+ };
76
+ function cache(fn, name, options = {}) {
77
+ const { ttl = Infinity, staleWhileRevalidate = true } = options;
78
+ return (...args) => {
79
+ const store = options.cache ?? (0, import_signal3.currentResourceCache)();
80
+ const key = name + ":" + JSON.stringify(args);
81
+ const fetchFresh = () => {
82
+ const running = store.inflight.get(key);
83
+ if (running) return running;
84
+ const promise = Promise.resolve(fn(...args)).then(
85
+ (value) => {
86
+ store.set(key, { value, timestamp: Date.now() });
87
+ store.inflight.delete(key);
88
+ return value;
89
+ },
90
+ (error) => {
91
+ store.inflight.delete(key);
92
+ throw error;
93
+ }
94
+ );
95
+ store.inflight.set(key, promise);
96
+ return promise;
97
+ };
98
+ const hit = store.get(key);
99
+ if (hit && (ttl === Infinity || Date.now() - hit.timestamp <= ttl)) return Promise.resolve(hit.value);
100
+ if (hit && staleWhileRevalidate) {
101
+ fetchFresh().then(reloadMounted, () => void 0);
102
+ return Promise.resolve(hit.value);
103
+ }
104
+ return fetchFresh();
105
+ };
106
+ }
107
+ function revalidate(key, store) {
108
+ const names = typeof key === "string" ? [key] : Array.isArray(key) ? key : null;
109
+ drop(names ?? key, store ?? (0, import_signal3.currentResourceCache)());
110
+ if (names && !store) tellOtherTabs(names);
111
+ }
112
+ function drop(what, store) {
113
+ const matches = Array.isArray(what) ? (k) => what.some((n) => k === n || k.startsWith(n + ":")) : what;
114
+ for (const k of [...store.keys()]) if (matches(k)) store.delete(k);
115
+ reloadMounted();
116
+ }
117
+ var TABS_KEY = "fluixi:revalidate";
118
+ function tellOtherTabs(names) {
119
+ try {
120
+ localStorage.setItem(TABS_KEY, JSON.stringify({ names, at: Date.now() + Math.random() }));
121
+ } catch {
122
+ }
123
+ }
124
+ if (typeof window !== "undefined") {
125
+ window.addEventListener("storage", (event) => {
126
+ if (event.key !== TABS_KEY || !event.newValue) return;
127
+ try {
128
+ const names = JSON.parse(event.newValue).names;
129
+ if (Array.isArray(names) && names.every((n) => typeof n === "string")) drop(names, (0, import_signal3.currentResourceCache)());
130
+ } catch {
131
+ }
132
+ });
133
+ }
134
+ globalThis[/* @__PURE__ */ Symbol.for("fluixi.revalidate")] = (names) => revalidate(names);
135
+ function createAsync(fetcher, source) {
136
+ const [data] = (0, import_signal2.createResource)(source || (() => true), fetcher);
137
+ return data;
138
+ }
139
+ var submissionState = /* @__PURE__ */ new Map();
140
+ function getSubmissionSignal(url) {
141
+ if (!submissionState.has(url)) {
142
+ submissionState.set(
143
+ url,
144
+ (0, import_signal2.createSignal)(void 0)
145
+ );
146
+ }
147
+ return submissionState.get(url);
148
+ }
149
+ var submissionsState = /* @__PURE__ */ new Map();
150
+ function getSubmissionsSignal(url) {
151
+ if (!submissionsState.has(url)) submissionsState.set(url, (0, import_signal2.createSignal)([]));
152
+ return submissionsState.get(url);
153
+ }
154
+ function action(fn, name, options = {}) {
155
+ const actionUrl = name || fn.name || "action";
156
+ const submit = async (...args) => {
157
+ const input = args.length > 1 ? args : args[0];
158
+ const [, setSubmission] = getSubmissionSignal(actionUrl);
159
+ const [, setSubmissions] = getSubmissionsSignal(actionUrl);
160
+ let entry;
161
+ const drop2 = () => setSubmissions((list) => list.filter((s) => s !== entry));
162
+ const settle = (next) => {
163
+ setSubmissions((list) => list.map((s) => s === entry ? next : s));
164
+ entry = next;
165
+ };
166
+ const clear = () => {
167
+ setSubmission(void 0);
168
+ drop2();
169
+ };
170
+ const retry = () => {
171
+ drop2();
172
+ return submit(...args);
173
+ };
174
+ entry = {
175
+ input,
176
+ pending: true,
177
+ clear,
178
+ retry
179
+ };
180
+ setSubmission(entry);
181
+ setSubmissions((list) => [...list, entry]);
182
+ try {
183
+ const result = await fn(...args);
184
+ setSubmission({
185
+ input,
186
+ result,
187
+ pending: false,
188
+ clear,
189
+ retry
190
+ });
191
+ drop2();
192
+ const stale = typeof options.invalidates === "function" ? options.invalidates(result) : options.invalidates;
193
+ for (const key of stale ?? []) revalidate(key);
194
+ return result;
195
+ } catch (error) {
196
+ const failed = {
197
+ input,
198
+ error,
199
+ pending: false,
200
+ clear,
201
+ retry
202
+ };
203
+ setSubmission(failed);
204
+ settle(failed);
205
+ throw error;
206
+ }
207
+ };
208
+ submit.url = actionUrl;
209
+ submit.with = (args) => action((...a) => fn(args, ...a), name, options);
210
+ return submit;
211
+ }
212
+ function useSubmission(actionFn) {
213
+ const [submission] = getSubmissionSignal(actionFn.url);
214
+ return submission;
215
+ }
216
+ function useSubmissions(actionFn) {
217
+ const [submissions] = getSubmissionsSignal(actionFn.url);
218
+ return submissions;
219
+ }
220
+ function useAction(actionFn) {
221
+ return actionFn;
222
+ }
223
+ var RouteDataContext = createContext(void 0, "route-data");
224
+ var RouteDataProvider = RouteDataContext.Provider;
225
+ function useRouteData() {
226
+ const ctx = useContext(RouteDataContext);
227
+ return typeof ctx === "function" ? ctx : () => ctx;
228
+ }
@@ -0,0 +1,142 @@
1
+ /**
2
+ * @module @fluixi/core/router/data
3
+ */
4
+ import { type Accessor, Resource } from '@fluixi/reactive/signal';
5
+ import { type ResourceCache } from '@fluixi/reactive/signal';
6
+ export type CacheFn<T, Args extends any[]> = (...args: Args) => Promise<T> | T | undefined;
7
+ export interface Action<T, Args extends any[]> {
8
+ (...args: Args): Promise<T>;
9
+ url?: string;
10
+ with?: (args: any) => Action<T, Args>;
11
+ }
12
+ export interface Submission<T, Args extends any[]> {
13
+ input: Args;
14
+ result?: T;
15
+ error?: any;
16
+ pending: boolean;
17
+ clear: () => void;
18
+ retry: () => void;
19
+ }
20
+ export interface CacheOptions {
21
+ /** Milliseconds a value stays fresh. Default: until revalidated. */
22
+ ttl?: number;
23
+ /**
24
+ * Once stale, return the old value at once and refresh in the background; the routes on
25
+ * screen then load again and pick up the new one. Default true.
26
+ */
27
+ staleWhileRevalidate?: boolean;
28
+ /** Where entries live. Defaults to the request's cache on the server and the page's in a browser. */
29
+ cache?: ResourceCache;
30
+ }
31
+ /** @internal: the router registers each layer's refetch here. */
32
+ export declare function onRevalidate(listener: () => void): () => void;
33
+ /**
34
+ * A function whose results are kept by name and arguments: route data that should not be
35
+ * fetched again on every visit.
36
+ *
37
+ * Readers of the same key share one request in flight. Entries live in the request's cache on
38
+ * the server, so visitors never share one, and in the page's cache in a browser.
39
+ *
40
+ * @example
41
+ * ```ts
42
+ * const organisations = cache(() => api.get('/api/v1/organizations'), 'orgs', { ttl: 30_000 });
43
+ * export const routeData = () => organisations();
44
+ * // after a change:
45
+ * revalidate('orgs');
46
+ * ```
47
+ */
48
+ export declare function cache<T, Args extends any[]>(fn: (...args: Args) => Promise<T> | T, name: string, options?: CacheOptions): (...args: Args) => Promise<T>;
49
+ /**
50
+ * Drops cached entries, by name (`'orgs'` matches every `orgs:` key), several names, or a
51
+ * predicate, then loads the data of the routes on screen again. What is still cached is
52
+ * served from the cache, so only the dropped entries are fetched.
53
+ */
54
+ export declare function revalidate(key: string | string[] | ((key: string) => boolean), store?: ResourceCache): void;
55
+ /**
56
+ * Create an async resource from a promise or cache function
57
+ */
58
+ export declare function createAsync<T, S extends any = true>(fetcher: (source: S) => Promise<T> | T, source?: () => S): Resource<S>;
59
+ /**
60
+ * Create a server action
61
+ */
62
+ export interface ActionOptions<T> {
63
+ /**
64
+ * Cache names this action changes (`['orgs']`), or a function of its result that returns
65
+ * them. They are revalidated when it succeeds, so the routes on screen show the change.
66
+ */
67
+ invalidates?: string[] | ((result: T) => string[]);
68
+ }
69
+ export declare function action<T, Args extends any[]>(fn: (...args: Args) => Promise<T> | T, name?: string, options?: ActionOptions<T>): Action<T, Args>;
70
+ /**
71
+ * Hook to track action submission state
72
+ */
73
+ export declare function useSubmission<T, Args extends any[]>(actionFn: Action<T, Args>): Accessor<Submission<T, Args> | undefined>;
74
+ /**
75
+ * Every call of `actionFn` still in flight, and the ones that failed, oldest first. One entry
76
+ * per call, so concurrent calls do not overwrite each other. A call that succeeds leaves the
77
+ * list; one that fails stays with its `error` until `retry()` or `clear()`.
78
+ *
79
+ * The optimistic pattern: render the server's rows, then the pending entries mapped to the
80
+ * same shape. When a call succeeds its entry goes and the server row takes its place; when it
81
+ * fails it stops being pending, so it leaves the optimistic rows by itself.
82
+ *
83
+ * @example
84
+ * ```tsx
85
+ * const moves = useSubmissions(moveDeal);
86
+ * const rows = $memo(() => [
87
+ * ...deals(),
88
+ * ...moves().filter((s) => s.pending).map((s) => ({ ...s.input, pending: true })),
89
+ * ]);
90
+ * ```
91
+ */
92
+ export declare function useSubmissions<T, Args extends any[]>(actionFn: Action<T, Args>): Accessor<Submission<T, Args>[]>;
93
+ /**
94
+ * Hook to get action executor
95
+ */
96
+ export declare function useAction<T, Args extends any[]>(actionFn: Action<T, Args>): (...args: Args) => Promise<T>;
97
+ export interface RouteDataArgs {
98
+ /**
99
+ * Route params, either a reactive signal accessor (when called from the
100
+ * router's createRoot during layout creation) or a plain snapshot object
101
+ * (legacy / manual usage). Always normalise with:
102
+ * `const getParams = typeof args.params === 'function' ? args.params : () => args.params;`
103
+ */
104
+ params: Record<string, string> | (() => Record<string, string>);
105
+ location: {
106
+ pathname: string;
107
+ search: string;
108
+ } | (() => {
109
+ pathname: string;
110
+ search: string;
111
+ });
112
+ /**
113
+ * What the route's `routeDeps` export returned when this load started: app-wide values the
114
+ * data depends on, such as the signed-in user. Key a `cache()` call by them.
115
+ */
116
+ deps?: unknown;
117
+ }
118
+ export type RouteLoadFunc = (args: RouteDataArgs, owner?: any, isCancelled?: () => boolean) => any;
119
+ export declare const RouteDataContext: {
120
+ id: symbol;
121
+ Provider: (props: {
122
+ value: any;
123
+ children?: any;
124
+ debug?: boolean;
125
+ }) => any;
126
+ defaultValue: any;
127
+ };
128
+ export declare const RouteDataProvider: (props: {
129
+ value: any;
130
+ children?: any;
131
+ debug?: boolean;
132
+ }) => any;
133
+ /**
134
+ * Access the data returned by the nearest ancestor route's `routeData` export.
135
+ *
136
+ * Returns a stable accessor function. Call it to get the current route data:
137
+ *
138
+ * const data = useRouteData<WorkspaceRouteData>();
139
+ * createEffect(() => console.log(data()?.workspace()));
140
+ */
141
+ export declare function useRouteData<T>(): () => T | undefined;
142
+ //# sourceMappingURL=data.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data.d.ts","sourceRoot":"","sources":["../../../../src/lib/router/data.ts"],"names":[],"mappings":"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"}