mikuru 1.0.19 → 1.0.21

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 (62) hide show
  1. package/CHANGELOG.md +92 -0
  2. package/README.md +23 -13
  3. package/dist/compiler/analyzeTemplate.js +116 -12
  4. package/dist/compiler/analyzeTemplate.js.map +1 -1
  5. package/dist/compiler/compile.js +2 -2
  6. package/dist/compiler/compile.js.map +1 -1
  7. package/dist/compiler/compileHydration.d.ts +2 -0
  8. package/dist/compiler/compileHydration.js +27 -0
  9. package/dist/compiler/compileHydration.js.map +1 -0
  10. package/dist/compiler/compileSsr.d.ts +2 -0
  11. package/dist/compiler/compileSsr.js +21 -0
  12. package/dist/compiler/compileSsr.js.map +1 -0
  13. package/dist/compiler/generate.d.ts +6 -1
  14. package/dist/compiler/generate.js +1399 -93
  15. package/dist/compiler/generate.js.map +1 -1
  16. package/dist/compiler/generateHydration.d.ts +6 -0
  17. package/dist/compiler/generateHydration.js +1553 -0
  18. package/dist/compiler/generateHydration.js.map +1 -0
  19. package/dist/compiler/generateSsr.d.ts +2 -0
  20. package/dist/compiler/generateSsr.js +915 -0
  21. package/dist/compiler/generateSsr.js.map +1 -0
  22. package/dist/compiler/index.d.ts +3 -1
  23. package/dist/compiler/index.js +2 -0
  24. package/dist/compiler/index.js.map +1 -1
  25. package/dist/compiler/parseTemplate.js +16 -1
  26. package/dist/compiler/parseTemplate.js.map +1 -1
  27. package/dist/compiler/sourceMap.d.ts +2 -2
  28. package/dist/compiler/sourceMap.js +110 -6
  29. package/dist/compiler/sourceMap.js.map +1 -1
  30. package/dist/compiler/types.d.ts +8 -0
  31. package/dist/index.d.ts +6 -3
  32. package/dist/index.js +3 -1
  33. package/dist/index.js.map +1 -1
  34. package/dist/router/index.d.ts +8 -0
  35. package/dist/router/index.js +133 -3
  36. package/dist/router/index.js.map +1 -1
  37. package/dist/runtime/asyncComponent.d.ts +22 -2
  38. package/dist/runtime/asyncComponent.js +84 -2
  39. package/dist/runtime/asyncComponent.js.map +1 -1
  40. package/dist/runtime/devtools.d.ts +51 -0
  41. package/dist/runtime/devtools.js +113 -0
  42. package/dist/runtime/devtools.js.map +1 -0
  43. package/dist/runtime/dom.d.ts +5 -1
  44. package/dist/runtime/dom.js +100 -3
  45. package/dist/runtime/dom.js.map +1 -1
  46. package/dist/runtime/index.d.ts +7 -5
  47. package/dist/runtime/index.js +3 -2
  48. package/dist/runtime/index.js.map +1 -1
  49. package/dist/runtime/lifecycle.d.ts +6 -0
  50. package/dist/runtime/lifecycle.js +66 -10
  51. package/dist/runtime/lifecycle.js.map +1 -1
  52. package/dist/runtime/reactivity.d.ts +33 -1
  53. package/dist/runtime/reactivity.js +254 -13
  54. package/dist/runtime/reactivity.js.map +1 -1
  55. package/dist/server.d.ts +33 -0
  56. package/dist/server.js +285 -0
  57. package/dist/server.js.map +1 -0
  58. package/dist/vite.d.ts +1 -0
  59. package/dist/vite.js +39 -18
  60. package/dist/vite.js.map +1 -1
  61. package/package.json +110 -100
  62. package/types/env.d.ts +58 -29
@@ -1,5 +1,12 @@
1
1
  const effectStack = [];
2
2
  let activeEffect;
3
+ const targetDeps = new WeakMap();
4
+ const reactiveCache = new WeakMap();
5
+ const readonlyCache = new WeakMap();
6
+ const rawTargets = new WeakMap();
7
+ const reactiveTargets = new WeakSet();
8
+ const readonlyTargets = new WeakSet();
9
+ const ITERATE_KEY = Symbol("mikuru.iterate");
3
10
  export function ref(initialValue) {
4
11
  let currentValue = initialValue;
5
12
  const dep = new Set();
@@ -17,35 +24,140 @@ export function ref(initialValue) {
17
24
  }
18
25
  };
19
26
  }
20
- export function computed(getter) {
21
- const result = ref(getter());
22
- effect(() => {
23
- result.value = getter();
27
+ export function reactive(target) {
28
+ return createReactiveProxy(target, false);
29
+ }
30
+ export function readonly(target) {
31
+ return createReactiveProxy(target, true);
32
+ }
33
+ export function isReactive(value) {
34
+ return typeof value === "object" && value !== null && reactiveTargets.has(value);
35
+ }
36
+ export function isReadonly(value) {
37
+ return typeof value === "object" && value !== null && readonlyTargets.has(value);
38
+ }
39
+ export function isProxy(value) {
40
+ return isReactive(value) || isReadonly(value);
41
+ }
42
+ export function toRaw(value) {
43
+ return (typeof value === "object" && value !== null ? rawTargets.get(value) : undefined) ?? value;
44
+ }
45
+ export function computed(source) {
46
+ const getter = typeof source === "function" ? source : source.get;
47
+ const dep = new Set();
48
+ let value;
49
+ let dirty = true;
50
+ const computedEffect = createReactiveEffect(() => {
51
+ value = getter();
52
+ dirty = false;
53
+ }, {
54
+ scheduler: () => {
55
+ if (dirty) {
56
+ return;
57
+ }
58
+ dirty = true;
59
+ trigger(dep);
60
+ }
24
61
  });
62
+ if (typeof source === "function") {
63
+ return {
64
+ get value() {
65
+ track(dep);
66
+ if (dirty) {
67
+ runEffect(computedEffect);
68
+ }
69
+ return value;
70
+ }
71
+ };
72
+ }
25
73
  return {
26
74
  get value() {
27
- return result.value;
75
+ track(dep);
76
+ if (dirty) {
77
+ runEffect(computedEffect);
78
+ }
79
+ return value;
80
+ },
81
+ set value(nextValue) {
82
+ source.set(nextValue);
28
83
  }
29
84
  };
30
85
  }
31
- export function effect(fn) {
32
- const reactiveEffect = {
33
- run: fn,
34
- deps: new Set(),
35
- active: true
36
- };
86
+ export function effect(fn, options = {}) {
87
+ const reactiveEffect = createReactiveEffect(fn, options);
37
88
  runEffect(reactiveEffect);
38
89
  return () => {
39
90
  reactiveEffect.active = false;
40
91
  cleanupEffect(reactiveEffect);
41
92
  };
42
93
  }
94
+ function createReactiveEffect(fn, options = {}) {
95
+ const reactiveEffect = {
96
+ fn,
97
+ runner: () => runEffect(reactiveEffect),
98
+ deps: new Set(),
99
+ active: true,
100
+ scheduler: options.scheduler
101
+ };
102
+ return reactiveEffect;
103
+ }
104
+ export function watchEffect(fn) {
105
+ let cleanup;
106
+ const onCleanup = (nextCleanup) => {
107
+ cleanup = nextCleanup;
108
+ };
109
+ const runCleanup = () => {
110
+ if (!cleanup)
111
+ return;
112
+ const fn = cleanup;
113
+ cleanup = undefined;
114
+ try {
115
+ fn();
116
+ }
117
+ catch (e) {
118
+ setTimeout(() => { throw e; });
119
+ }
120
+ };
121
+ const stopEffect = effect(() => {
122
+ runCleanup();
123
+ fn(onCleanup);
124
+ });
125
+ return () => {
126
+ runCleanup();
127
+ stopEffect();
128
+ };
129
+ }
43
130
  export function unwrap(value) {
44
131
  if (isRefLike(value)) {
45
132
  return value.value;
46
133
  }
47
134
  return value;
48
135
  }
136
+ export function unref(value) {
137
+ return unwrap(value);
138
+ }
139
+ export function isRef(value) {
140
+ return isRefLike(value);
141
+ }
142
+ export function toRef(object, key) {
143
+ return {
144
+ get value() {
145
+ return object[key];
146
+ },
147
+ set value(nextValue) {
148
+ object[key] = nextValue;
149
+ }
150
+ };
151
+ }
152
+ export function toRefs(object) {
153
+ const refs = {};
154
+ for (const key of Reflect.ownKeys(object)) {
155
+ if (Object.prototype.propertyIsEnumerable.call(object, key)) {
156
+ refs[key] = toRef(object, key);
157
+ }
158
+ }
159
+ return refs;
160
+ }
49
161
  function track(dep) {
50
162
  if (!activeEffect || !activeEffect.active) {
51
163
  return;
@@ -53,19 +165,65 @@ function track(dep) {
53
165
  dep.add(activeEffect);
54
166
  activeEffect.deps.add(dep);
55
167
  }
168
+ function trackTarget(target, key) {
169
+ if (!activeEffect || !activeEffect.active) {
170
+ return;
171
+ }
172
+ let deps = targetDeps.get(target);
173
+ if (!deps) {
174
+ deps = new Map();
175
+ targetDeps.set(target, deps);
176
+ }
177
+ let dep = deps.get(key);
178
+ if (!dep) {
179
+ dep = new Set();
180
+ deps.set(key, dep);
181
+ }
182
+ track(dep);
183
+ }
56
184
  function trigger(dep) {
57
185
  for (const reactiveEffect of [...dep]) {
58
186
  if (reactiveEffect.active) {
59
- runEffect(reactiveEffect);
187
+ if (reactiveEffect.scheduler) {
188
+ reactiveEffect.scheduler(reactiveEffect.runner);
189
+ }
190
+ else {
191
+ runEffect(reactiveEffect);
192
+ }
193
+ }
194
+ }
195
+ }
196
+ function triggerTargetKeys(target, keys) {
197
+ const deps = targetDeps.get(target);
198
+ if (!deps) {
199
+ return;
200
+ }
201
+ const effects = new Set();
202
+ for (const key of keys) {
203
+ for (const reactiveEffect of deps.get(key) ?? []) {
204
+ effects.add(reactiveEffect);
205
+ }
206
+ }
207
+ for (const reactiveEffect of effects) {
208
+ if (reactiveEffect.active) {
209
+ if (reactiveEffect.scheduler) {
210
+ reactiveEffect.scheduler(reactiveEffect.runner);
211
+ }
212
+ else {
213
+ runEffect(reactiveEffect);
214
+ }
60
215
  }
61
216
  }
62
217
  }
63
218
  function runEffect(reactiveEffect) {
219
+ if (!reactiveEffect.active) {
220
+ return;
221
+ }
64
222
  cleanupEffect(reactiveEffect);
65
223
  effectStack.push(reactiveEffect);
66
224
  activeEffect = reactiveEffect;
67
225
  try {
68
- reactiveEffect.run();
226
+ reactiveEffect.fn();
69
227
  }
70
228
  finally {
71
229
  effectStack.pop();
@@ -81,4 +239,87 @@ function cleanupEffect(reactiveEffect) {
81
239
  function isRefLike(value) {
82
240
  return typeof value === "object" && value !== null && "value" in value;
83
241
  }
242
+ function createReactiveProxy(target, readonlyMode) {
243
+ if ((readonlyMode && isReadonly(target)) || (!readonlyMode && isReactive(target))) {
244
+ return target;
245
+ }
246
+ const rawTarget = toRaw(target);
247
+ const cache = readonlyMode ? readonlyCache : reactiveCache;
248
+ const cached = cache.get(rawTarget);
249
+ if (cached) {
250
+ return cached;
251
+ }
252
+ const proxy = new Proxy(rawTarget, {
253
+ get(nextTarget, key, receiver) {
254
+ if (key === "__mikuru_raw") {
255
+ return nextTarget;
256
+ }
257
+ trackTarget(nextTarget, key);
258
+ const value = Reflect.get(nextTarget, key, receiver);
259
+ if (typeof value === "object" && value !== null) {
260
+ return readonlyMode ? readonly(value) : reactive(value);
261
+ }
262
+ return value;
263
+ },
264
+ set(nextTarget, key, value, receiver) {
265
+ if (readonlyMode) {
266
+ return true;
267
+ }
268
+ const oldValue = Reflect.get(nextTarget, key, receiver);
269
+ const hadKey = Object.prototype.hasOwnProperty.call(nextTarget, key);
270
+ const result = Reflect.set(nextTarget, key, value, receiver);
271
+ if (!result || Object.is(oldValue, value)) {
272
+ return result;
273
+ }
274
+ const keys = [key];
275
+ if (!hadKey) {
276
+ keys.push(ITERATE_KEY);
277
+ if (Array.isArray(nextTarget) && isArrayIndex(key)) {
278
+ keys.push("length");
279
+ }
280
+ }
281
+ triggerTargetKeys(nextTarget, keys);
282
+ return result;
283
+ },
284
+ deleteProperty(nextTarget, key) {
285
+ if (readonlyMode) {
286
+ return true;
287
+ }
288
+ const hadKey = Object.prototype.hasOwnProperty.call(nextTarget, key);
289
+ const result = Reflect.deleteProperty(nextTarget, key);
290
+ if (result && hadKey) {
291
+ const keys = [key, ITERATE_KEY];
292
+ if (Array.isArray(nextTarget) && isArrayIndex(key)) {
293
+ keys.push("length");
294
+ }
295
+ triggerTargetKeys(nextTarget, keys);
296
+ }
297
+ return result;
298
+ },
299
+ ownKeys(nextTarget) {
300
+ trackTarget(nextTarget, Array.isArray(nextTarget) ? "length" : ITERATE_KEY);
301
+ return Reflect.ownKeys(nextTarget);
302
+ },
303
+ has(nextTarget, key) {
304
+ trackTarget(nextTarget, key);
305
+ return Reflect.has(nextTarget, key);
306
+ }
307
+ });
308
+ cache.set(rawTarget, proxy);
309
+ rawTargets.set(proxy, rawTarget);
310
+ if (readonlyMode) {
311
+ readonlyTargets.add(proxy);
312
+ }
313
+ else {
314
+ reactiveTargets.add(proxy);
315
+ }
316
+ return proxy;
317
+ }
318
+ function isArrayIndex(key) {
319
+ if (typeof key === "symbol") {
320
+ return false;
321
+ }
322
+ const value = typeof key === "number" ? key : Number(key);
323
+ return Number.isInteger(value) && value >= 0;
324
+ }
84
325
  //# sourceMappingURL=reactivity.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"reactivity.js","sourceRoot":"","sources":["../../src/runtime/reactivity.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reactivity.js","sourceRoot":"","sources":["../../src/runtime/reactivity.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { RouteLocation, RouteLocationRaw, Router } from "./router/index.js";
2
+ export type MikuruSsrComponent = {
3
+ renderToString: (props?: Record<string, unknown>) => string | Promise<string>;
4
+ };
5
+ export type MikuruSsrStream = AsyncIterable<string>;
6
+ export type MikuruHydrationInstance = {
7
+ element: Element | Comment;
8
+ unmount(): void;
9
+ };
10
+ export type MikuruHydrationComponent = {
11
+ hydrate?: (target: Element, props?: Record<string, unknown>) => MikuruHydrationInstance | Promise<MikuruHydrationInstance>;
12
+ mount?: (target: Element | DocumentFragment, props?: Record<string, unknown>) => MikuruHydrationInstance;
13
+ };
14
+ export type MikuruSsrRouteRenderResult = {
15
+ html: string;
16
+ route: RouteLocation;
17
+ };
18
+ export type MikuruRouteHydrationResult = {
19
+ element: Element | Comment;
20
+ route: RouteLocation;
21
+ unmount(): void;
22
+ };
23
+ export type MikuruRouteHydrationOptions = {
24
+ listen?: boolean;
25
+ };
26
+ export declare function escapeHtml(value: unknown): string;
27
+ export declare function renderAttr(name: string, value: unknown): string;
28
+ export declare function renderAttrs(attrs: Record<string, unknown> | null | undefined): string;
29
+ export declare function renderComponentToString(component: MikuruSsrComponent | ((props?: Record<string, unknown>) => string | Promise<string>), props?: Record<string, unknown>): Promise<string>;
30
+ export declare function renderToStream(component: MikuruSsrComponent | ((props?: Record<string, unknown>) => string | Promise<string>), props?: Record<string, unknown>): MikuruSsrStream;
31
+ export declare function renderToString(component: MikuruSsrComponent | ((props?: Record<string, unknown>) => string | Promise<string>), props?: Record<string, unknown>): string | Promise<string>;
32
+ export declare function renderRouteToString(router: Router, to?: RouteLocationRaw): Promise<MikuruSsrRouteRenderResult>;
33
+ export declare function hydrateRoute(router: Router, target: Element, toOrOptions?: RouteLocationRaw | MikuruRouteHydrationOptions, options?: MikuruRouteHydrationOptions): Promise<MikuruRouteHydrationResult>;
package/dist/server.js ADDED
@@ -0,0 +1,285 @@
1
+ import { normalizeClass, normalizeStyle } from "./runtime/dom.js";
2
+ const routerInjectionKey = Symbol.for("mikuru.router");
3
+ const booleanAttributes = new Set([
4
+ "allowfullscreen",
5
+ "async",
6
+ "autofocus",
7
+ "checked",
8
+ "controls",
9
+ "default",
10
+ "defer",
11
+ "disabled",
12
+ "formnovalidate",
13
+ "hidden",
14
+ "inert",
15
+ "ismap",
16
+ "itemscope",
17
+ "loop",
18
+ "multiple",
19
+ "muted",
20
+ "nomodule",
21
+ "novalidate",
22
+ "open",
23
+ "playsinline",
24
+ "readonly",
25
+ "required",
26
+ "reversed",
27
+ "selected"
28
+ ]);
29
+ const unsafeAttributeNamePattern = /[\s"'<>/=]/;
30
+ export function escapeHtml(value) {
31
+ return String(value ?? "")
32
+ .replaceAll("&", "&amp;")
33
+ .replaceAll("<", "&lt;")
34
+ .replaceAll(">", "&gt;")
35
+ .replaceAll("\"", "&quot;")
36
+ .replaceAll("'", "&#39;");
37
+ }
38
+ export function renderAttr(name, value) {
39
+ if (!name || unsafeAttributeNamePattern.test(name) || value === null || value === undefined) {
40
+ return "";
41
+ }
42
+ const normalizedName = name.toLowerCase();
43
+ if (value === false && booleanAttributes.has(normalizedName)) {
44
+ return "";
45
+ }
46
+ if (value === true && booleanAttributes.has(normalizedName)) {
47
+ return ` ${name}`;
48
+ }
49
+ if (value === true) {
50
+ return ` ${name}="true"`;
51
+ }
52
+ if (normalizedName === "class") {
53
+ const className = normalizeClass(value);
54
+ return className ? ` ${name}="${escapeHtml(className)}"` : "";
55
+ }
56
+ if (normalizedName === "style") {
57
+ const style = normalizeStyle(value);
58
+ return style ? ` ${name}="${escapeHtml(style)}"` : "";
59
+ }
60
+ return ` ${name}="${escapeHtml(value)}"`;
61
+ }
62
+ export function renderAttrs(attrs) {
63
+ if (!attrs) {
64
+ return "";
65
+ }
66
+ let rendered = "";
67
+ for (const [name, value] of Object.entries(attrs)) {
68
+ rendered += renderAttr(name, value);
69
+ }
70
+ return rendered;
71
+ }
72
+ export async function renderComponentToString(component, props = {}) {
73
+ return String(await renderToString(component, props));
74
+ }
75
+ export async function* renderToStream(component, props = {}) {
76
+ yield String(await renderToString(component, props));
77
+ }
78
+ export function renderToString(component, props = {}) {
79
+ if (typeof component === "function") {
80
+ return component(props);
81
+ }
82
+ if (component && typeof component.renderToString === "function") {
83
+ return component.renderToString(props);
84
+ }
85
+ throw new TypeError("renderToString() expects a component with renderToString(props) or a render function.");
86
+ }
87
+ export async function renderRouteToString(router, to = router.currentRoute.value.fullPath) {
88
+ const target = router.resolve(to);
89
+ let route = target;
90
+ if (router.currentRoute.value.fullPath !== target.fullPath) {
91
+ const navigation = await router.replace(to);
92
+ if (isNavigationFailureLike(navigation)) {
93
+ throw new Error(navigation.message);
94
+ }
95
+ route = navigation;
96
+ }
97
+ await router.isReady();
98
+ route = router.currentRoute.value.fullPath === route.fullPath ? router.currentRoute.value : router.resolve(route.fullPath);
99
+ const context = createRouteComponentContext(router);
100
+ return {
101
+ html: await renderMatchedRoute(route, router, 0, context),
102
+ route
103
+ };
104
+ }
105
+ export async function hydrateRoute(router, target, toOrOptions = router.currentRoute.value.fullPath, options = {}) {
106
+ const to = isRouteHydrationOptions(toOrOptions) ? router.currentRoute.value.fullPath : toOrOptions;
107
+ const hydrationOptions = isRouteHydrationOptions(toOrOptions) ? toOrOptions : options;
108
+ const targetRoute = router.resolve(to);
109
+ let route = targetRoute;
110
+ if (router.currentRoute.value.fullPath !== targetRoute.fullPath) {
111
+ const navigation = await router.replace(to);
112
+ if (isNavigationFailureLike(navigation)) {
113
+ throw new Error(navigation.message);
114
+ }
115
+ route = navigation;
116
+ }
117
+ await router.isReady();
118
+ route = router.currentRoute.value.fullPath === route.fullPath ? router.currentRoute.value : router.resolve(route.fullPath);
119
+ const instance = await hydrateMatchedRoute(route, router, 0, target, createRouteComponentContext(router));
120
+ const stopListening = hydrationOptions.listen ? router.listen() : undefined;
121
+ return {
122
+ element: instance.element,
123
+ route: instance.route,
124
+ unmount() {
125
+ stopListening?.();
126
+ instance.unmount();
127
+ }
128
+ };
129
+ }
130
+ async function renderMatchedRoute(route, router, depth, context) {
131
+ const record = route.matchedRecords[depth];
132
+ if (!record) {
133
+ return "";
134
+ }
135
+ const component = await resolveSsrRouteComponent(record);
136
+ const props = {
137
+ ...resolveSsrRouteProps(record, route),
138
+ route,
139
+ router,
140
+ __mikuru_context: context,
141
+ children: (slotProps) => renderMatchedRoute(route, router, depth + 1, readRouteSlotContext(slotProps, context)),
142
+ slots: {
143
+ default: (slotProps) => renderMatchedRoute(route, router, depth + 1, readRouteSlotContext(slotProps, context))
144
+ }
145
+ };
146
+ return renderComponentToString(component, props);
147
+ }
148
+ async function hydrateMatchedRoute(route, router, depth, target, context) {
149
+ const record = route.matchedRecords[depth];
150
+ if (!record) {
151
+ return {
152
+ element: target,
153
+ route,
154
+ unmount() { }
155
+ };
156
+ }
157
+ const component = await resolveHydrationRouteComponent(record);
158
+ const cleanups = [];
159
+ const props = {
160
+ ...resolveSsrRouteProps(record, route),
161
+ route,
162
+ router,
163
+ __mikuru_context: context,
164
+ children: (childTarget, slotProps) => childTarget ? trackHydratedChild(cleanups, hydrateMatchedRoute(route, router, depth + 1, childTarget, readRouteSlotContext(slotProps, context))) : Promise.resolve(""),
165
+ slots: {
166
+ default: (childTarget, slotProps) => childTarget ? trackHydratedChild(cleanups, hydrateMatchedRoute(route, router, depth + 1, childTarget, readRouteSlotContext(slotProps, context))) : Promise.resolve("")
167
+ }
168
+ };
169
+ let instance;
170
+ if (component.hydrate) {
171
+ instance = await component.hydrate(target, props);
172
+ }
173
+ else if (component.mount) {
174
+ const parent = target.parentNode;
175
+ const anchor = target.ownerDocument.createComment("mikuru-route-hydrate");
176
+ parent?.insertBefore(anchor, target);
177
+ target.remove();
178
+ const fragment = target.ownerDocument.createDocumentFragment();
179
+ instance = component.mount(fragment, props);
180
+ parent?.insertBefore(fragment, anchor);
181
+ anchor.remove();
182
+ }
183
+ else {
184
+ throw new TypeError(`Route ${record.path} does not have hydrate() or mount().`);
185
+ }
186
+ return {
187
+ element: instance.element,
188
+ route,
189
+ unmount() {
190
+ for (const cleanup of cleanups.splice(0).reverse())
191
+ cleanup();
192
+ instance.unmount();
193
+ }
194
+ };
195
+ }
196
+ async function trackHydratedChild(cleanups, promise) {
197
+ const child = await promise;
198
+ cleanups.push(() => child.unmount());
199
+ return "";
200
+ }
201
+ function createRouteComponentContext(router) {
202
+ return {
203
+ provides: new Map([[routerInjectionKey, router]])
204
+ };
205
+ }
206
+ function readRouteSlotContext(slotProps, fallback) {
207
+ const context = slotProps?.__mikuru_context;
208
+ return isComponentContext(context) ? context : fallback;
209
+ }
210
+ function isComponentContext(value) {
211
+ return !!value && typeof value === "object" && value.provides instanceof Map;
212
+ }
213
+ function isRouteHydrationOptions(value) {
214
+ return !!value
215
+ && typeof value === "object"
216
+ && "listen" in value
217
+ && !("path" in value)
218
+ && !("name" in value);
219
+ }
220
+ async function resolveSsrRouteComponent(record) {
221
+ const cached = record.__mikuru_resolvedComponent;
222
+ if (isSsrComponent(cached)) {
223
+ return cached;
224
+ }
225
+ const component = record.component;
226
+ if (isSsrComponent(component)) {
227
+ record.__mikuru_resolvedComponent = component;
228
+ return component;
229
+ }
230
+ if (typeof component === "function") {
231
+ const loaded = await component();
232
+ const resolved = isSsrComponent(loaded) ? loaded : isSsrComponent(loaded?.default) ? loaded.default : undefined;
233
+ if (resolved) {
234
+ record.__mikuru_resolvedComponent = resolved;
235
+ return resolved;
236
+ }
237
+ }
238
+ throw new TypeError(`Route ${record.path} does not have an SSR renderToString component.`);
239
+ }
240
+ async function resolveHydrationRouteComponent(record) {
241
+ const cached = record.__mikuru_resolvedComponent;
242
+ if (isHydrationComponent(cached)) {
243
+ return cached;
244
+ }
245
+ const component = record.component;
246
+ if (isHydrationComponent(component)) {
247
+ record.__mikuru_resolvedComponent = component;
248
+ return component;
249
+ }
250
+ if (typeof component === "function") {
251
+ const loaded = await component();
252
+ const resolved = isHydrationComponent(loaded)
253
+ ? loaded
254
+ : isHydrationComponent(loaded?.default)
255
+ ? loaded.default
256
+ : undefined;
257
+ if (resolved) {
258
+ record.__mikuru_resolvedComponent = resolved;
259
+ return resolved;
260
+ }
261
+ }
262
+ throw new TypeError(`Route ${record.path} does not have a hydration component.`);
263
+ }
264
+ function resolveSsrRouteProps(record, route) {
265
+ if (record.props === true)
266
+ return { ...route.params };
267
+ if (typeof record.props === "function")
268
+ return record.props(route) ?? {};
269
+ if (record.props && typeof record.props === "object")
270
+ return { ...record.props };
271
+ return {};
272
+ }
273
+ function isSsrComponent(component) {
274
+ return !!component && typeof component === "object" && typeof component.renderToString === "function";
275
+ }
276
+ function isHydrationComponent(component) {
277
+ return !!component
278
+ && typeof component === "object"
279
+ && (typeof component.hydrate === "function"
280
+ || typeof component.mount === "function");
281
+ }
282
+ function isNavigationFailureLike(value) {
283
+ return !!value && typeof value === "object" && typeof value.type === "string" && typeof value.message === "string";
284
+ }
285
+ //# sourceMappingURL=server.js.map