@madojs/mado 0.12.0 → 0.13.0

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 (154) hide show
  1. package/AGENTS.md +15 -8
  2. package/CHANGELOG.md +58 -0
  3. package/README.md +25 -3
  4. package/dist/src/component.d.ts +3 -1
  5. package/dist/src/component.d.ts.map +1 -0
  6. package/dist/src/component.js +65 -30
  7. package/dist/src/component.js.map +1 -1
  8. package/dist/src/context.d.ts +13 -32
  9. package/dist/src/context.d.ts.map +1 -0
  10. package/dist/src/context.js +73 -48
  11. package/dist/src/context.js.map +1 -1
  12. package/dist/src/css.d.ts +1 -0
  13. package/dist/src/css.d.ts.map +1 -0
  14. package/dist/src/css.js.map +1 -1
  15. package/dist/src/devtools-hook.d.ts +14 -0
  16. package/dist/src/devtools-hook.d.ts.map +1 -0
  17. package/dist/src/devtools-hook.js +27 -0
  18. package/dist/src/devtools-hook.js.map +1 -0
  19. package/dist/src/devtools.d.ts +24 -22
  20. package/dist/src/devtools.d.ts.map +1 -0
  21. package/dist/src/devtools.js +230 -58
  22. package/dist/src/devtools.js.map +1 -1
  23. package/dist/src/diagnostics.d.ts +12 -0
  24. package/dist/src/diagnostics.d.ts.map +1 -0
  25. package/dist/src/diagnostics.js +68 -8
  26. package/dist/src/diagnostics.js.map +1 -1
  27. package/dist/src/each.d.ts +1 -5
  28. package/dist/src/each.d.ts.map +1 -0
  29. package/dist/src/each.js +0 -8
  30. package/dist/src/each.js.map +1 -1
  31. package/dist/src/forms.d.ts +27 -96
  32. package/dist/src/forms.d.ts.map +1 -0
  33. package/dist/src/forms.js +184 -394
  34. package/dist/src/forms.js.map +1 -1
  35. package/dist/src/head.d.ts +1 -0
  36. package/dist/src/head.d.ts.map +1 -0
  37. package/dist/src/head.js +2 -1
  38. package/dist/src/head.js.map +1 -1
  39. package/dist/src/html/bindings.d.ts +1 -0
  40. package/dist/src/html/bindings.d.ts.map +1 -0
  41. package/dist/src/html/bindings.js.map +1 -1
  42. package/dist/src/html/parser.d.ts +3 -4
  43. package/dist/src/html/parser.d.ts.map +1 -0
  44. package/dist/src/html/parser.js +63 -14
  45. package/dist/src/html/parser.js.map +1 -1
  46. package/dist/src/html/template-types.d.ts +1 -0
  47. package/dist/src/html/template-types.d.ts.map +1 -0
  48. package/dist/src/html/template-types.js.map +1 -1
  49. package/dist/src/html/template.d.ts +5 -1
  50. package/dist/src/html/template.d.ts.map +1 -0
  51. package/dist/src/html/template.js +78 -3
  52. package/dist/src/html/template.js.map +1 -1
  53. package/dist/src/index.d.ts +7 -8
  54. package/dist/src/index.d.ts.map +1 -0
  55. package/dist/src/index.js +5 -7
  56. package/dist/src/index.js.map +1 -1
  57. package/dist/src/json.d.ts +3 -0
  58. package/dist/src/json.d.ts.map +1 -0
  59. package/dist/src/json.js +14 -0
  60. package/dist/src/json.js.map +1 -0
  61. package/dist/src/lifecycle.d.ts +1 -0
  62. package/dist/src/lifecycle.d.ts.map +1 -0
  63. package/dist/src/lifecycle.js +3 -2
  64. package/dist/src/lifecycle.js.map +1 -1
  65. package/dist/src/page.d.ts +1 -0
  66. package/dist/src/page.d.ts.map +1 -0
  67. package/dist/src/page.js.map +1 -1
  68. package/dist/src/persisted.d.ts +6 -1
  69. package/dist/src/persisted.d.ts.map +1 -0
  70. package/dist/src/persisted.js +17 -11
  71. package/dist/src/persisted.js.map +1 -1
  72. package/dist/src/resource.d.ts +2 -1
  73. package/dist/src/resource.d.ts.map +1 -0
  74. package/dist/src/resource.js +126 -49
  75. package/dist/src/resource.js.map +1 -1
  76. package/dist/src/router/base.d.ts +1 -0
  77. package/dist/src/router/base.d.ts.map +1 -0
  78. package/dist/src/router/base.js.map +1 -1
  79. package/dist/src/router/manifest.d.ts +1 -0
  80. package/dist/src/router/manifest.d.ts.map +1 -0
  81. package/dist/src/router/manifest.js +89 -148
  82. package/dist/src/router/manifest.js.map +1 -1
  83. package/dist/src/router/match.d.ts +1 -0
  84. package/dist/src/router/match.d.ts.map +1 -0
  85. package/dist/src/router/match.js +19 -5
  86. package/dist/src/router/match.js.map +1 -1
  87. package/dist/src/router/navigation.d.ts +1 -0
  88. package/dist/src/router/navigation.d.ts.map +1 -0
  89. package/dist/src/router/navigation.js.map +1 -1
  90. package/dist/src/signal.d.ts +1 -0
  91. package/dist/src/signal.d.ts.map +1 -0
  92. package/dist/src/signal.js +46 -17
  93. package/dist/src/signal.js.map +1 -1
  94. package/dist/src/static-runtime.d.ts +1 -0
  95. package/dist/src/static-runtime.d.ts.map +1 -0
  96. package/dist/src/static-runtime.js.map +1 -1
  97. package/dist/src/vite/index.d.ts +1 -0
  98. package/dist/src/vite/index.d.ts.map +1 -0
  99. package/dist/src/vite/index.js +4 -3
  100. package/dist/src/vite/index.js.map +1 -1
  101. package/docs/architecture/v1-roadmap.md +19 -0
  102. package/docs/en/10-pages-and-components.md +9 -1
  103. package/docs/en/13-data.md +8 -6
  104. package/docs/en/14-forms.md +66 -219
  105. package/docs/en/15-static-snapshots.md +4 -4
  106. package/docs/en/16-app-architecture.md +3 -2
  107. package/docs/en/20-deployment.md +21 -8
  108. package/docs/en/21-error-handling.md +9 -6
  109. package/docs/en/24-devtools-and-diagnostics.md +45 -0
  110. package/docs/en/30-api-freeze-map.md +8 -9
  111. package/docs/en/32-v1-stability.md +2 -2
  112. package/docs/en/33-migration-0.12-0.13.md +56 -0
  113. package/docs/en/40-llm-guide.md +7 -9
  114. package/docs/en/41-for-backenders.md +13 -9
  115. package/docs/en/42-why-mado.md +2 -2
  116. package/docs/en/README.md +2 -0
  117. package/docs/recipes/nginx/nginx.conf +2 -2
  118. package/llms.txt +25 -7
  119. package/package.json +37 -16
  120. package/scripts/clean.mjs +8 -0
  121. package/scripts/cli/generate.mjs +11 -14
  122. package/scripts/cli/help.mjs +2 -0
  123. package/scripts/cli/index.mjs +14 -6
  124. package/scripts/cli/init.mjs +13 -18
  125. package/scripts/cli/release.mjs +22 -19
  126. package/scripts/cli/run.mjs +5 -3
  127. package/scripts/logger.mjs +117 -0
  128. package/scripts/output-guard.mjs +128 -0
  129. package/scripts/preview.mjs +11 -19
  130. package/scripts/static/browser.mjs +49 -8
  131. package/scripts/static/discover.mjs +4 -1
  132. package/scripts/static.mjs +21 -7
  133. package/starters/default/package.json +4 -4
  134. package/starters/default/tsconfig.node.json +13 -0
  135. package/starters/default/vite.config.ts +0 -3
  136. package/starters/modular/README.md +4 -4
  137. package/starters/modular/package.json +4 -4
  138. package/starters/modular/src/layouts/app-shell.layout.ts +1 -2
  139. package/starters/modular/src/modules/auth/login.page.ts +5 -12
  140. package/starters/modular/src/modules/billing/pages/invoice-detail.page.ts +3 -4
  141. package/starters/modular/src/modules/billing/pages/invoices-list.page.ts +1 -1
  142. package/starters/modular/src/shared/styles/reset.css +21 -1
  143. package/starters/modular/tsconfig.json +10 -1
  144. package/starters/modular/tsconfig.node.json +13 -0
  145. package/starters/modular/vite.config.ts +6 -5
  146. package/dist/src/lazy.d.ts +0 -38
  147. package/dist/src/lazy.js +0 -73
  148. package/dist/src/lazy.js.map +0 -1
  149. package/scripts/bake.mjs +0 -5
  150. package/scripts/docs-lint.mjs +0 -170
  151. package/scripts/package-smoke.mjs +0 -135
  152. package/scripts/release-notes.mjs +0 -66
  153. package/scripts/size-budget.mjs +0 -95
  154. package/starters/modular/src/shared/ui/x-button.component.ts +0 -49
@@ -17,10 +17,10 @@
17
17
  */
18
18
  import { signal, effect, untracked } from "./signal.js";
19
19
  import { getCurrentLifecycle } from "./lifecycle.js";
20
- import { warnOnce } from "./diagnostics.js";
20
+ import { reportError, warnOnce } from "./diagnostics.js";
21
21
  import { trackStatic } from "./static-runtime.js";
22
- const cache = new Map();
23
- const inFlight = new Map();
22
+ import { emitDevtools } from "./devtools-hook.js";
23
+ const fetcherStates = new Map();
24
24
  const invalidators = new Set();
25
25
  /**
26
26
  * Remove from cache all keys matching the pattern, and force
@@ -36,26 +36,29 @@ const invalidators = new Set();
36
36
  * or iterate your own keys manually.
37
37
  */
38
38
  export function invalidate(pattern) {
39
- const isGlob = pattern.endsWith("*");
40
- const prefix = isGlob ? pattern.slice(0, -1) : pattern;
41
- const toDelete = [];
42
- for (const key of cache.keys()) {
43
- if (isGlob ? key.startsWith(prefix) : key === pattern) {
44
- toDelete.push(key);
39
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
40
+ emitDevtools("resource:invalidate", undefined, { pattern });
41
+ for (const [fetcher, state] of fetcherStates) {
42
+ for (const [key, entry] of state.cache) {
43
+ if (matchesPattern(key, pattern)) {
44
+ if (entry.expires)
45
+ clearTimeout(entry.expires);
46
+ state.cache.delete(key);
47
+ }
45
48
  }
49
+ releaseFetcherState(fetcher, state);
46
50
  }
47
- for (const k of toDelete)
48
- cache.delete(k);
49
- for (const fn of invalidators) {
50
- for (const k of toDelete)
51
- fn(k);
52
- }
51
+ for (const fn of invalidators)
52
+ fn(pattern);
53
53
  }
54
54
  export function resource(keyFn, fetcher, options = {}) {
55
55
  const data = signal(options.initialData);
56
56
  const error = signal(null);
57
57
  const loading = signal(false);
58
58
  const keySig = signal("");
59
+ const debugTarget = {};
60
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
61
+ emitDevtools("resource:create", debugTarget);
59
62
  let releaseInFlight = null;
60
63
  let requestSeq = 0;
61
64
  let lastKey = "";
@@ -74,15 +77,20 @@ export function resource(keyFn, fetcher, options = {}) {
74
77
  releaseInFlight?.();
75
78
  releaseInFlight = null;
76
79
  const seq = ++requestSeq;
80
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
81
+ emitDevtools("resource:request", debugTarget, { key, seq, force });
77
82
  // if there is a fresh cache and not forced — use it
78
- const cached = cache.get(key);
83
+ const cached = getFetcherState(fetcher).cache.get(key);
79
84
  if (cached &&
80
85
  !force &&
81
- (!options.staleTime || Date.now() - cached.timestamp < options.staleTime)) {
86
+ (options.staleTime === Infinity ||
87
+ Date.now() - cached.timestamp < (options.staleTime ?? 0))) {
82
88
  data.set(cached.data);
83
89
  error.set(null);
84
90
  loading.set(false);
85
- return;
91
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
92
+ emitDevtools("resource:cache-hit", debugTarget, { key });
93
+ return Promise.resolve(cached.data);
86
94
  }
87
95
  loading.set(true);
88
96
  error.set(null);
@@ -101,9 +109,11 @@ export function resource(keyFn, fetcher, options = {}) {
101
109
  return;
102
110
  if (key !== lastKey)
103
111
  return;
104
- cache.set(key, { data: result, timestamp: Date.now() });
112
+ writeCache(fetcher, key, result, options.staleTime ?? 0);
105
113
  data.set(result);
106
114
  loading.set(false);
115
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
116
+ emitDevtools("resource:success", debugTarget, { key, seq, result });
107
117
  }, (err) => {
108
118
  retained.release();
109
119
  if (seq !== requestSeq)
@@ -112,7 +122,10 @@ export function resource(keyFn, fetcher, options = {}) {
112
122
  return;
113
123
  error.set(err instanceof Error ? err : new Error(String(err)));
114
124
  loading.set(false);
125
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
126
+ emitDevtools("resource:error", debugTarget, { key, seq, error: err });
115
127
  });
128
+ return retained.promise;
116
129
  };
117
130
  // subscribe to key changes
118
131
  const stopKeyEffect = effect(() => {
@@ -120,14 +133,14 @@ export function resource(keyFn, fetcher, options = {}) {
120
133
  keySig.set(key);
121
134
  if (key !== lastKey || force) {
122
135
  lastKey = key;
123
- run(key);
136
+ void run(key);
124
137
  }
125
138
  });
126
139
  // subscribe to global invalidation
127
- const onInv = (invKey) => {
128
- if (invKey === lastKey) {
140
+ const onInv = (pattern) => {
141
+ if (matchesPattern(lastKey, pattern)) {
129
142
  force = true;
130
- run(lastKey);
143
+ void run(lastKey);
131
144
  }
132
145
  };
133
146
  invalidators.add(onInv);
@@ -139,6 +152,8 @@ export function resource(keyFn, fetcher, options = {}) {
139
152
  invalidators.delete(onInv);
140
153
  releaseInFlight?.();
141
154
  releaseInFlight = null;
155
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
156
+ emitDevtools("resource:dispose", debugTarget, { key: lastKey });
142
157
  });
143
158
  }
144
159
  return {
@@ -150,7 +165,9 @@ export function resource(keyFn, fetcher, options = {}) {
150
165
  force = true;
151
166
  // read key without tracking — otherwise we'd end up inside someone else's effect
152
167
  const key = untracked(keyFn);
153
- run(key);
168
+ lastKey = key;
169
+ keySig.set(key);
170
+ return run(key);
154
171
  },
155
172
  mutate(next) {
156
173
  const prev = data.peek();
@@ -159,33 +176,30 @@ export function resource(keyFn, fetcher, options = {}) {
159
176
  : next;
160
177
  data.set(value);
161
178
  if (lastKey)
162
- cache.set(lastKey, { data: value, timestamp: Date.now() });
179
+ writeCache(fetcher, lastKey, value, options.staleTime ?? 0);
163
180
  },
164
181
  };
165
182
  }
166
183
  function retainInFlight(key, fetcher, force) {
167
- let entry = (!force ? inFlight.get(key) : undefined);
168
- if (entry && entry.fetcher !== fetcher) {
169
- warnOnce(`resource-key-collision-${key}`, `resource key collision for "${key}": multiple in-flight ` +
170
- "resource() calls use different fetchers. Resource keys must uniquely " +
171
- "identify both the endpoint and the data shape.");
172
- }
184
+ const state = getFetcherState(fetcher);
185
+ let entry = (!force ? state.inFlight.get(key) : undefined);
173
186
  if (!entry) {
174
187
  const controller = new AbortController();
175
188
  entry = {
176
189
  controller,
177
- fetcher,
178
190
  consumers: 0,
179
191
  promise: trackStatic(fetcher(key, controller.signal), `resource ${key}`),
180
192
  };
181
193
  entry.promise.then(() => {
182
- if (inFlight.get(key) === entry)
183
- inFlight.delete(key);
194
+ if (state.inFlight.get(key) === entry)
195
+ state.inFlight.delete(key);
196
+ releaseFetcherState(fetcher, state);
184
197
  }, () => {
185
- if (inFlight.get(key) === entry)
186
- inFlight.delete(key);
198
+ if (state.inFlight.get(key) === entry)
199
+ state.inFlight.delete(key);
200
+ releaseFetcherState(fetcher, state);
187
201
  });
188
- inFlight.set(key, entry);
202
+ state.inFlight.set(key, entry);
189
203
  }
190
204
  entry.consumers++;
191
205
  let released = false;
@@ -194,13 +208,53 @@ function retainInFlight(key, fetcher, force) {
194
208
  return;
195
209
  released = true;
196
210
  entry.consumers--;
197
- if (entry.consumers === 0 && inFlight.get(key) === entry) {
211
+ if (entry.consumers === 0 && state.inFlight.get(key) === entry) {
198
212
  entry.controller.abort();
199
- inFlight.delete(key);
213
+ state.inFlight.delete(key);
214
+ releaseFetcherState(fetcher, state);
200
215
  }
201
216
  };
202
217
  return { promise: entry.promise, release };
203
218
  }
219
+ function getFetcherState(fetcher) {
220
+ let state = fetcherStates.get(fetcher);
221
+ if (!state) {
222
+ state = { cache: new Map(), inFlight: new Map() };
223
+ fetcherStates.set(fetcher, state);
224
+ }
225
+ return state;
226
+ }
227
+ function releaseFetcherState(fetcher, state) {
228
+ if (state.cache.size === 0 && state.inFlight.size === 0) {
229
+ fetcherStates.delete(fetcher);
230
+ }
231
+ }
232
+ function writeCache(fetcher, key, data, staleTime) {
233
+ const state = getFetcherState(fetcher);
234
+ const previous = state.cache.get(key);
235
+ if (previous?.expires)
236
+ clearTimeout(previous.expires);
237
+ if (staleTime <= 0) {
238
+ state.cache.delete(key);
239
+ releaseFetcherState(fetcher, state);
240
+ return;
241
+ }
242
+ const entry = { data, timestamp: Date.now(), expires: null };
243
+ if (staleTime !== Infinity) {
244
+ entry.expires = setTimeout(() => {
245
+ if (state.cache.get(key) === entry)
246
+ state.cache.delete(key);
247
+ releaseFetcherState(fetcher, state);
248
+ }, staleTime);
249
+ entry.expires.unref?.();
250
+ }
251
+ state.cache.set(key, entry);
252
+ }
253
+ function matchesPattern(key, pattern) {
254
+ return pattern.endsWith("*")
255
+ ? key.startsWith(pattern.slice(0, -1))
256
+ : key === pattern;
257
+ }
204
258
  export function mutation(fetcher, options = {}) {
205
259
  const loading = signal(false);
206
260
  const error = signal(null);
@@ -209,8 +263,14 @@ export function mutation(fetcher, options = {}) {
209
263
  // counter so `loading` stays true while ANY concurrent run is pending.
210
264
  const controllers = new Set();
211
265
  let inFlight = 0;
212
- const settle = (ac) => {
266
+ let generation = 0;
267
+ const debugTarget = {};
268
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
269
+ emitDevtools("mutation:create", debugTarget);
270
+ const settle = (ac, runGeneration) => {
213
271
  controllers.delete(ac);
272
+ if (runGeneration !== generation)
273
+ return;
214
274
  inFlight--;
215
275
  if (inFlight === 0)
216
276
  loading.set(false);
@@ -227,9 +287,12 @@ export function mutation(fetcher, options = {}) {
227
287
  c.abort();
228
288
  }
229
289
  const ac = new AbortController();
290
+ const runGeneration = generation;
230
291
  controllers.add(ac);
231
292
  inFlight++;
232
293
  loading.set(true);
294
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
295
+ emitDevtools("mutation:request", debugTarget, { args, generation });
233
296
  error.set(null);
234
297
  try {
235
298
  const result = await fetcher(args, ac.signal);
@@ -237,7 +300,9 @@ export function mutation(fetcher, options = {}) {
237
300
  throw new DOMException("aborted", "AbortError");
238
301
  }
239
302
  data.set(result);
240
- settle(ac);
303
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
304
+ emitDevtools("mutation:success", debugTarget, { args, result, generation });
305
+ settle(ac, runGeneration);
241
306
  const inv = options.invalidates;
242
307
  if (inv) {
243
308
  let patterns = [];
@@ -246,8 +311,7 @@ export function mutation(fetcher, options = {}) {
246
311
  }
247
312
  catch (err) {
248
313
  // Invalidation is best-effort. Don't fail the mutation because of it.
249
- // eslint-disable-next-line no-console
250
- console.error("[mado] mutation.invalidates threw:", err);
314
+ reportError("resource", "mutation-invalidates", "mutation invalidation threw", err);
251
315
  }
252
316
  for (const p of patterns)
253
317
  invalidate(p);
@@ -258,11 +322,16 @@ export function mutation(fetcher, options = {}) {
258
322
  if (!ac.signal.aborted) {
259
323
  error.set(err instanceof Error ? err : new Error(String(err)));
260
324
  }
261
- settle(ac);
325
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
326
+ emitDevtools("mutation:error", debugTarget, { args, error: err, generation });
327
+ settle(ac, runGeneration);
262
328
  throw err;
263
329
  }
264
330
  },
265
331
  reset() {
332
+ if (typeof __MADO_DEVTOOLS__ === "undefined" || __MADO_DEVTOOLS__)
333
+ emitDevtools("mutation:reset", debugTarget, { generation });
334
+ generation++;
266
335
  for (const c of controllers)
267
336
  c.abort();
268
337
  controllers.clear();
@@ -342,13 +411,21 @@ export const _testHooks = {
342
411
  return invalidators.size;
343
412
  },
344
413
  cacheSize() {
345
- return cache.size;
414
+ let size = 0;
415
+ for (const state of fetcherStates.values())
416
+ size += state.cache.size;
417
+ return size;
346
418
  },
347
419
  clearCache() {
348
- cache.clear();
349
- for (const entry of inFlight.values())
350
- entry.controller.abort();
351
- inFlight.clear();
420
+ for (const state of fetcherStates.values()) {
421
+ for (const entry of state.cache.values()) {
422
+ if (entry.expires)
423
+ clearTimeout(entry.expires);
424
+ }
425
+ for (const entry of state.inFlight.values())
426
+ entry.controller.abort();
427
+ }
428
+ fetcherStates.clear();
352
429
  },
353
430
  };
354
431
  //# sourceMappingURL=resource.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/resource.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"resource.js","sourceRoot":"","sources":["../../src/resource.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Reactive fetch + cache. Replaces React-Query / SWR.\n *\n * Core idea:\n * 1. resource(keyFn, fetcher) — keyFn reads signals like a normal effect.\n * When dependencies change the key is recomputed, and if the key\n * actually differs — a new fetch starts (the old one is cancelled via\n * AbortController).\n * 2. Data is cached by key in a global Map.\n * 3. resource returns three signals: data/error/loading, plus\n * refresh()/mutate()/invalidate().\n *\n * mutation(fetcher) — a wrapper for POST/PUT/DELETE. After a successful run\n * it can invalidate specified resource keys (exact match or prefix-glob 'users/*').\n *\n * No runtime dependencies: only fetch + AbortController + signals.\n */\n\nimport { signal, effect, untracked, type Signal } from \"./signal.js\";\nimport { getCurrentLifecycle } from \"./lifecycle.js\";\nimport { reportError, warnOnce } from \"./diagnostics.js\";\nimport { trackStatic } from \"./static-runtime.js\";\nimport { emitDevtools } from \"./devtools-hook.js\";\n\n// ---------- Global cache ----------\n\n\ninterface CacheEntry<T> {\n data: T;\n timestamp: number;\n expires: ReturnType<typeof setTimeout> | null;\n}\n\ntype ResourceFetcher<T> = (key: string, signal: AbortSignal) => Promise<T>;\n\ninterface InFlightEntry<T> {\n controller: AbortController;\n promise: Promise<T>;\n consumers: number;\n}\n\ninterface FetcherState {\n cache: Map<string, CacheEntry<unknown>>;\n inFlight: Map<string, InFlightEntry<unknown>>;\n}\n\nconst fetcherStates = new Map<ResourceFetcher<unknown>, FetcherState>();\nconst invalidators = new Set<(pattern: string) => void>();\n\n/**\n * Remove from cache all keys matching the pattern, and force\n * all live resource() instances with that key to re-fetch.\n *\n * Only a trailing `*` is supported for prefix-match:\n * invalidate('users/42') → exact match\n * invalidate('users/*') → everything starting with 'users/'\n * invalidate('*') → drop the ENTIRE cache (use intentionally)\n *\n * NOT supported: glob-in-middle (`users/* /posts`), regex, multi-star.\n * For more complex cases call invalidate() multiple times with different prefixes,\n * or iterate your own keys manually.\n */\nexport function invalidate(pattern: string): void {\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"resource:invalidate\", undefined, { pattern });\n for (const [fetcher, state] of fetcherStates) {\n for (const [key, entry] of state.cache) {\n if (matchesPattern(key, pattern)) {\n if (entry.expires) clearTimeout(entry.expires);\n state.cache.delete(key);\n }\n }\n releaseFetcherState(fetcher, state);\n }\n for (const fn of invalidators) fn(pattern);\n}\n\n// ---------- resource ----------\n\n\nexport interface ResourceOptions {\n /** How many ms the data is considered fresh (fetch is skipped). */\n staleTime?: number;\n /** Initial value shown immediately. */\n initialData?: unknown;\n}\n\nexport interface Resource<T> {\n /** Signal: data or undefined */\n data: () => T | undefined;\n /** Signal: error or null */\n error: () => Error | null;\n /** Signal: whether a request is in progress */\n loading: () => boolean;\n /** Signal: current key (useful for debugging and DI) */\n key: () => string;\n /** Force re-run the request. */\n refresh(): Promise<T>;\n /**\n * Locally replace the data (optimistic update).\n * The cache is also updated.\n */\n mutate(next: T | ((prev: T | undefined) => T)): void;\n}\n\nexport function resource<T>(\n keyFn: () => string,\n fetcher: ResourceFetcher<T>,\n options: ResourceOptions = {},\n): Resource<T> {\n const data = signal<T | undefined>(options.initialData as T | undefined);\n const error = signal<Error | null>(null);\n const loading = signal(false);\n const keySig = signal<string>(\"\");\n const debugTarget = {};\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"resource:create\", debugTarget);\n\n let releaseInFlight: (() => void) | null = null;\n let requestSeq = 0;\n let lastKey = \"\";\n let force = false;\n\n // if inside component-setup — auto-cleanup on unmount.\n // if outside — print a warning so the developer knows\n // about the potential leak.\n const lifecycle = getCurrentLifecycle();\n if (!lifecycle) {\n warnOnce(\n \"resource-outside-lifecycle\",\n \"resource() called outside of component-setup. \" +\n \"Invalidator subscriptions will not be cleaned up automatically — \" +\n \"this is a leak. Use resource() inside component(...), or \" +\n \"manage the lifecycle manually via createLifecycle()/runInLifecycle().\",\n );\n }\n\n const run = (key: string): Promise<T> => {\n releaseInFlight?.();\n releaseInFlight = null;\n const seq = ++requestSeq;\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"resource:request\", debugTarget, { key, seq, force });\n\n // if there is a fresh cache and not forced — use it\n const cached = getFetcherState(fetcher).cache.get(key) as CacheEntry<T> | undefined;\n if (\n cached &&\n !force &&\n (options.staleTime === Infinity ||\n Date.now() - cached.timestamp < (options.staleTime ?? 0))\n ) {\n data.set(cached.data);\n error.set(null);\n loading.set(false);\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"resource:cache-hit\", debugTarget, { key });\n return Promise.resolve(cached.data);\n }\n\n loading.set(true);\n error.set(null);\n\n const retained = retainInFlight(key, fetcher, force);\n releaseInFlight = retained.release;\n force = false;\n\n retained.promise.then(\n (result) => {\n // Two-layer staleness check:\n // 1. seq !== requestSeq — this resource has moved to a newer run().\n // 2. key !== lastKey — defensive guard for fetchers that ignore\n // the AbortSignal and resolve after a newer run() has started.\n // Without this, a slow stale response can overwrite the data\n // from a faster newer one when the key changes rapidly.\n retained.release();\n if (seq !== requestSeq) return;\n if (key !== lastKey) return;\n writeCache(fetcher, key, result, options.staleTime ?? 0);\n data.set(result);\n loading.set(false);\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"resource:success\", debugTarget, { key, seq, result });\n },\n (err: unknown) => {\n retained.release();\n if (seq !== requestSeq) return;\n if (key !== lastKey) return;\n error.set(err instanceof Error ? err : new Error(String(err)));\n loading.set(false);\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"resource:error\", debugTarget, { key, seq, error: err });\n },\n );\n return retained.promise;\n };\n\n // subscribe to key changes\n const stopKeyEffect = effect(() => {\n const key = keyFn();\n keySig.set(key);\n if (key !== lastKey || force) {\n lastKey = key;\n void run(key);\n }\n });\n\n // subscribe to global invalidation\n const onInv = (pattern: string) => {\n if (matchesPattern(lastKey, pattern)) {\n force = true;\n void run(lastKey);\n }\n };\n invalidators.add(onInv);\n\n // auto-cleanup if inside a component\n if (lifecycle) {\n lifecycle.onDispose(() => {\n requestSeq++;\n stopKeyEffect();\n invalidators.delete(onInv);\n releaseInFlight?.();\n releaseInFlight = null;\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"resource:dispose\", debugTarget, { key: lastKey });\n });\n }\n\n return {\n data,\n error,\n loading,\n key: keySig,\n refresh() {\n force = true;\n // read key without tracking — otherwise we'd end up inside someone else's effect\n const key = untracked(keyFn);\n lastKey = key;\n keySig.set(key);\n return run(key);\n },\n mutate(next) {\n const prev = data.peek();\n const value =\n typeof next === \"function\"\n ? (next as (p: T | undefined) => T)(prev)\n : next;\n data.set(value);\n if (lastKey) writeCache(fetcher, lastKey, value, options.staleTime ?? 0);\n },\n };\n}\n\nfunction retainInFlight<T>(\n key: string,\n fetcher: ResourceFetcher<T>,\n force: boolean,\n): { promise: Promise<T>; release: () => void } {\n const state = getFetcherState(fetcher);\n let entry = (!force ? state.inFlight.get(key) : undefined) as\n | InFlightEntry<T>\n | undefined;\n\n if (!entry) {\n const controller = new AbortController();\n entry = {\n controller,\n consumers: 0,\n promise: trackStatic(fetcher(key, controller.signal), `resource ${key}`),\n };\n entry.promise.then(\n () => {\n if (state.inFlight.get(key) === entry) state.inFlight.delete(key);\n releaseFetcherState(fetcher, state);\n },\n () => {\n if (state.inFlight.get(key) === entry) state.inFlight.delete(key);\n releaseFetcherState(fetcher, state);\n },\n );\n state.inFlight.set(key, entry as InFlightEntry<unknown>);\n }\n\n entry.consumers++;\n let released = false;\n const release = () => {\n if (released) return;\n released = true;\n entry.consumers--;\n if (entry.consumers === 0 && state.inFlight.get(key) === entry) {\n entry.controller.abort();\n state.inFlight.delete(key);\n releaseFetcherState(fetcher, state);\n }\n };\n\n return { promise: entry.promise, release };\n}\n\nfunction getFetcherState<T>(fetcher: ResourceFetcher<T>): FetcherState {\n let state = fetcherStates.get(fetcher as ResourceFetcher<unknown>);\n if (!state) {\n state = { cache: new Map(), inFlight: new Map() };\n fetcherStates.set(fetcher as ResourceFetcher<unknown>, state);\n }\n return state;\n}\n\nfunction releaseFetcherState(\n fetcher: ResourceFetcher<unknown>,\n state: FetcherState,\n): void {\n if (state.cache.size === 0 && state.inFlight.size === 0) {\n fetcherStates.delete(fetcher);\n }\n}\n\nfunction writeCache<T>(\n fetcher: ResourceFetcher<T>,\n key: string,\n data: T,\n staleTime: number,\n): void {\n const state = getFetcherState(fetcher);\n const previous = state.cache.get(key);\n if (previous?.expires) clearTimeout(previous.expires);\n if (staleTime <= 0) {\n state.cache.delete(key);\n releaseFetcherState(fetcher as ResourceFetcher<unknown>, state);\n return;\n }\n const entry: CacheEntry<T> = { data, timestamp: Date.now(), expires: null };\n if (staleTime !== Infinity) {\n entry.expires = setTimeout(() => {\n if (state.cache.get(key) === entry) state.cache.delete(key);\n releaseFetcherState(fetcher as ResourceFetcher<unknown>, state);\n }, staleTime);\n (entry.expires as ReturnType<typeof setTimeout> & { unref?: () => void }).unref?.();\n }\n state.cache.set(key, entry as CacheEntry<unknown>);\n}\n\nfunction matchesPattern(key: string, pattern: string): boolean {\n return pattern.endsWith(\"*\")\n ? key.startsWith(pattern.slice(0, -1))\n : key === pattern;\n}\n\n// ---------- mutation ----------\n\n\nexport interface MutationOptions<TArgs = unknown, TResult = unknown> {\n /**\n * Invalidate cache by these patterns after success.\n *\n * Can be:\n * - a static array: `['users/*']`\n * - a function of result and args:\n * `(result, args) => [${'`'}posts/${result.id}${'`'}, 'feed/*']`\n *\n * The function is called AFTER a successful request. If it throws — the error\n * is logged to console, but the mutation success is preserved (invalidation is best-effort).\n *\n * Only `*` at the END of a pattern is supported (see invalidate()).\n */\n invalidates?:\n | readonly string[]\n | ((result: TResult, args: TArgs) => readonly string[]);\n /**\n * Abort the previous in-flight run when a new run starts.\n *\n * Default: `false`. Mutations (POST/PUT/DELETE) are concurrent by default —\n * two quick submits of different entities must both complete; client-side\n * aborting the first would drop its `invalidates` even though the server\n * likely applied it. Set `true` only for last-write-wins flows like\n * search-as-you-type, where stale in-flight requests should be cancelled.\n */\n abortPrevious?: boolean;\n}\n\n\nexport interface Mutation<TArgs, TResult> {\n /** Signal: request in progress */\n loading: Signal<boolean>;\n /** Signal: error */\n error: Signal<Error | null>;\n /** Signal: last received data */\n data: Signal<TResult | undefined>;\n /** Execute. Returns a Promise. */\n run(args: TArgs): Promise<TResult>;\n /** Reset error/data state. */\n reset(): void;\n}\n\nexport function mutation<TArgs, TResult>(\n fetcher: (args: TArgs, signal: AbortSignal) => Promise<TResult>,\n options: MutationOptions<TArgs, TResult> = {},\n): Mutation<TArgs, TResult> {\n const loading = signal(false);\n const error = signal<Error | null>(null);\n const data = signal<TResult | undefined>(undefined);\n // Track every controller so reset() can abort them all; `inFlight` is a\n // counter so `loading` stays true while ANY concurrent run is pending.\n const controllers = new Set<AbortController>();\n let inFlight = 0;\n let generation = 0;\n const debugTarget = {};\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"mutation:create\", debugTarget);\n\n const settle = (ac: AbortController, runGeneration: number): void => {\n controllers.delete(ac);\n if (runGeneration !== generation) return;\n inFlight--;\n if (inFlight === 0) loading.set(false);\n };\n\n return {\n loading,\n error,\n data,\n async run(args) {\n // Mutations are concurrent by default — only abort the previous run when\n // explicitly opted in (search-as-you-type). (FABLE_REPORT.md finding #6)\n if (options.abortPrevious) {\n for (const c of controllers) c.abort();\n }\n const ac = new AbortController();\n const runGeneration = generation;\n controllers.add(ac);\n inFlight++;\n loading.set(true);\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"mutation:request\", debugTarget, { args, generation });\n error.set(null);\n try {\n const result = await fetcher(args, ac.signal);\n if (ac.signal.aborted) {\n throw new DOMException(\"aborted\", \"AbortError\");\n }\n data.set(result);\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"mutation:success\", debugTarget, { args, result, generation });\n settle(ac, runGeneration);\n const inv = options.invalidates;\n if (inv) {\n let patterns: readonly string[] = [];\n try {\n patterns = typeof inv === \"function\" ? inv(result, args) : inv;\n } catch (err) {\n // Invalidation is best-effort. Don't fail the mutation because of it.\n reportError(\"resource\", \"mutation-invalidates\", \"mutation invalidation threw\", err);\n }\n for (const p of patterns) invalidate(p);\n }\n return result;\n } catch (err) {\n if (!ac.signal.aborted) {\n error.set(err instanceof Error ? err : new Error(String(err)));\n }\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"mutation:error\", debugTarget, { args, error: err, generation });\n settle(ac, runGeneration);\n throw err;\n }\n },\n reset() {\n if (typeof __MADO_DEVTOOLS__ === \"undefined\" || __MADO_DEVTOOLS__) emitDevtools(\"mutation:reset\", debugTarget, { generation });\n generation++;\n for (const c of controllers) c.abort();\n controllers.clear();\n inFlight = 0;\n loading.set(false);\n error.set(null);\n data.set(undefined);\n },\n };\n}\n\n\n// ---------- Utilities ----------\n\n\n/**\n * Extended HTTP error thrown by jsonFetcher() on `!response.ok`.\n *\n * Unlike a plain `Error(\"HTTP 422\")`, it preserves:\n * - `status` / `statusText` — for UI discrimination (\"422 → show form errors\")\n * - `url` — which endpoint failed\n * - `body` — parsed response body (JSON if possible, then text, then null)\n *\n * try {\n * await api.save(user);\n * } catch (err) {\n * if (err instanceof HttpError && err.status === 422) {\n * // err.body may contain { errors: { email: 'taken' } }\n * }\n * }\n */\nexport class HttpError extends Error {\n readonly status: number;\n readonly statusText: string;\n readonly url: string;\n readonly body: unknown;\n\n constructor(\n status: number,\n statusText: string,\n url: string,\n body: unknown,\n ) {\n super(`HTTP ${status} ${statusText} ${url}`);\n this.name = \"HttpError\";\n this.status = status;\n this.statusText = statusText;\n this.url = url;\n this.body = body;\n }\n}\n\n/**\n * Simple JSON fetcher for resource. Throws HttpError on `!response.ok`,\n * with a parsed body (JSON → text → null) for proper UI error handling.\n *\n * const user = resource(() => `/api/users/${id()}`, jsonFetcher());\n */\nexport function jsonFetcher<T>(\n init: RequestInit = {},\n): (url: string, signal: AbortSignal) => Promise<T> {\n return async (url, signal) => {\n const res = await fetch(url, { ...init, signal });\n if (!res.ok) {\n let body: unknown = null;\n // Try to read the body: JSON first, then text. Don't fail if that doesn't work.\n try {\n const ct = res.headers.get(\"content-type\") ?? \"\";\n if (ct.includes(\"application/json\")) {\n body = await res.json();\n } else {\n body = await res.text();\n }\n } catch {\n body = null;\n }\n throw new HttpError(res.status, res.statusText, url, body);\n }\n return (await res.json()) as T;\n };\n}\n\n// ---------- Test hooks ----------\n//\n// Not public API. Used by tests to inspect lifecycle cleanup.\n\n/** @internal */\nexport const _testHooks = {\n invalidatorsSize(): number {\n return invalidators.size;\n },\n cacheSize(): number {\n let size = 0;\n for (const state of fetcherStates.values()) size += state.cache.size;\n return size;\n },\n clearCache(): void {\n for (const state of fetcherStates.values()) {\n for (const entry of state.cache.values()) {\n if (entry.expires) clearTimeout(entry.expires);\n }\n for (const entry of state.inFlight.values()) entry.controller.abort();\n }\n fetcherStates.clear();\n },\n};\n"]}
@@ -63,3 +63,4 @@ export declare function withBase(pathname: string, base?: string): string;
63
63
  * routeUrl("/docs") === "/docs"
64
64
  */
65
65
  export declare function routeUrl(pathname: string, base?: string): string;
66
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/router/base.ts"],"names":[],"mappings":"AA+BA;;;;;;;;;;;GAWG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,CAQpE;AAED;;;;GAIG;AACH,eAAO,MAAM,OAAO,EAAE,MAAqC,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAgB,GAAG,MAAM,CAgB1E;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAgB,GAAG,MAAM,CAezE;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAgB,GAAG,MAAM,CAiBzE"}
@@ -1 +1 @@
1
- {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/router/base.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,SAAS,WAAW;IAClB,4DAA4D;IAC5D,iEAAiE;IACjE,gEAAgE;IAChE,gEAAgE;IAChE,kEAAkE;IAClE,IAAI,CAAC;QACH,8DAA8D;QAC9D,MAAM,KAAK,GAAI,MAAM,CAAC,IAAY,CAAC,GAAG,EAAE,QAAQ,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,kBAAkB;IACpB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,GAA8B;IAC1D,IAAI,CAAC,GAAG;QAAE,OAAO,GAAG,CAAC;IACrB,IAAI,CAAC,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC3B,IAAI,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAChC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;IACpC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC;QAAE,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IAClC,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC3B,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAW,aAAa,CAAC,WAAW,EAAE,CAAC,CAAC;AAE5D;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,SAAS,CAAC,QAAgB,EAAE,OAAe,OAAO;IAChE,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9B,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAC1B,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,QAAQ,CAAC;IAC3E,qDAAqD;IACrD,MAAM,QAAQ,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAChC,IAAI,QAAQ,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC;IACtC,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/B,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,qBAAqB;QAChE,OAAO,IAAI,IAAI,GAAG,CAAC;IACrB,CAAC;IACD,uEAAuE;IACvE,qEAAqE;IACrE,qBAAqB;IACrB,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,OAAe,OAAO;IAC/D,MAAM,CAAC,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,CAAC,GAAG,QAAQ,IAAI,GAAG,CAAC;IAC1B,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;IAC5C,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,GAAG,CAAC;IAC1B,sEAAsE;IACtE,kEAAkE;IAClE,kEAAkE;IAClE,IAAI,GAAG,KAAK,GAAG;QAAE,OAAO,CAAC,CAAC;IAC1B,2EAA2E;IAC3E,wEAAwE;IACxE,oCAAoC;IACpC,IAAI,GAAG,KAAK,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IAC/C,IAAI,GAAG,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACvC,OAAO,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1B,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACH,MAAM,UAAU,QAAQ,CAAC,QAAgB,EAAE,OAAe,OAAO;IAC/D,IAAI,CAAC,QAAQ;QAAE,OAAO,QAAQ,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC1C,sEAAsE;IACtE,IAAI,IAAI,GAAG,QAAQ,CAAC;IACpB,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACjC,IAAI,MAAM,IAAI,CAAC,EAAE,CAAC;QAChB,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC;QACrC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;IAC/B,CAAC;IACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,IAAI,CAAC,EAAE,CAAC;QACjB,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,MAAM,CAAC;QACtC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,IAAI,KAAK,EAAE;QAAE,IAAI,GAAG,GAAG,CAAC;IAC5B,OAAO,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,MAAM,CAAC;AACvC,CAAC"}
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/router/base.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Single source of truth for the Vite `base` URL prefix at runtime.\n *\n * Mado reads `import.meta.env.BASE_URL` once at module init and exposes\n * three pure helpers used by the router, navigation, head and any user\n * code that constructs internal links.\n *\n * vite.config.ts → base\n * ├── runtime: import.meta.env.BASE_URL (this module)\n * └── CLI: resolved config → _mado/build.json\n *\n * There is intentionally NO `<meta name=\"mado:base\">`, no\n * `routes({}, { base })`, no second runtime config. Tools that load Mado\n * outside Vite (native ESM tests, partial SSR probes) fall back to \"/\".\n */\nfunction readEnvBase(): string {\n // Direct access to the well-known constant so Vite's static\n // `define`-replacement (and Vite-only `import.meta.env.BASE_URL`\n // injection) sees the expression verbatim. Optional chaining or\n // intermediate variables would defeat the rewriter. In non-Vite\n // environments the property is undefined and we fall back to \"/\".\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const value = (import.meta as any).env?.BASE_URL;\n if (typeof value === \"string\") return value;\n } catch {\n /* fall through */\n }\n return \"/\";\n}\n\n/**\n * Normalise an arbitrary base value into the canonical Mado form:\n * starts with \"/\", ends with \"/\", collapses repeated slashes. The root\n * base is the literal \"/\".\n *\n * normalizeBase(\"\") === \"/\"\n * normalizeBase(\"/\") === \"/\"\n * normalizeBase(\"mado\") === \"/mado/\"\n * normalizeBase(\"/mado\") === \"/mado/\"\n * normalizeBase(\"/mado/\") === \"/mado/\"\n * normalizeBase(\"//x//y/\") === \"/x/y/\"\n */\nexport function normalizeBase(raw: string | null | undefined): string {\n if (!raw) return \"/\";\n let s = String(raw).trim();\n if (!s || s === \"/\") return \"/\";\n if (!s.startsWith(\"/\")) s = \"/\" + s;\n if (!s.endsWith(\"/\")) s = s + \"/\";\n s = s.replace(/\\/+/g, \"/\");\n return s;\n}\n\n/**\n * The active base prefix for the running app. Computed once from\n * `import.meta.env.BASE_URL` and normalised. Use it inside Mado runtime;\n * application code should call `routeUrl()` instead.\n */\nexport const appBase: string = normalizeBase(readEnvBase());\n\n/**\n * Strip the base prefix off a browser pathname so it becomes a route\n * pathname the matcher understands.\n *\n * base = \"/mado/\"\n * stripBase(\"/mado/\") === \"/\"\n * stripBase(\"/mado/docs\") === \"/docs\"\n * stripBase(\"/mado/docs/\") === \"/docs\"\n * stripBase(\"/other\") === \"/other\" (no base → unchanged)\n * stripBase(\"\") === \"/\"\n *\n * base = \"/\"\n * stripBase(\"/docs\") === \"/docs\"\n */\nexport function stripBase(pathname: string, base: string = appBase): string {\n const b = normalizeBase(base);\n if (!pathname) return \"/\";\n if (b === \"/\") return pathname.startsWith(\"/\") ? pathname : \"/\" + pathname;\n // Exact match of base without trailing slash → root.\n const bNoTrail = b.slice(0, -1);\n if (pathname === bNoTrail) return \"/\";\n if (pathname === b) return \"/\";\n if (pathname.startsWith(b)) {\n const rest = pathname.slice(b.length - 1); // keep leading slash\n return rest || \"/\";\n }\n // Pathname is outside our base (foreign link clicked, etc.); return it\n // unchanged so the caller can detect the mismatch and fall back to a\n // native navigation.\n return pathname;\n}\n\n/**\n * Prefix a route pathname with the active base so it becomes a real\n * browser URL suitable for `history.pushState` and `<a href>`.\n *\n * base = \"/mado/\"\n * withBase(\"/\") === \"/mado/\"\n * withBase(\"/docs\") === \"/mado/docs\"\n * withBase(\"/docs/\", b) === \"/mado/docs/\"\n * withBase(\"docs\") === \"/mado/docs\"\n *\n * base = \"/\"\n * withBase(\"/docs\") === \"/docs\"\n */\nexport function withBase(pathname: string, base: string = appBase): string {\n const b = normalizeBase(base);\n const p = pathname || \"/\";\n const abs = p.startsWith(\"/\") ? p : \"/\" + p;\n if (b === \"/\") return abs;\n // Root route under a non-trivial base must keep the trailing slash so\n // that `<a href>` agrees with the canonical deployment URL shape.\n // routeUrl(\"/\") with base \"/mado/\" === \"/mado/\" (not \"/mado\")\n if (abs === \"/\") return b;\n // Strip leading slash from abs so we can concatenate with base (\"/mado/\").\n // If abs already starts with the base prefix, return it unchanged so we\n // do not double-prefix on accident.\n if (abs === b || abs.startsWith(b)) return abs;\n if (abs === b.slice(0, -1)) return abs;\n return b + abs.slice(1);\n}\n\n/**\n * Build an internal link URL: prefix the given route pathname with the\n * active Vite base, preserving query and hash. This is the canonical way\n * to emit `<a href>` values in Mado views.\n *\n * import { routeUrl } from \"@madojs/mado\";\n * html`<a data-link href=${routeUrl(\"/docs\")}>Docs</a>`\n *\n * base = \"/mado/\"\n * routeUrl(\"/docs\") === \"/mado/docs\"\n * routeUrl(\"/docs?q=1#h\") === \"/mado/docs?q=1#h\"\n * routeUrl(\"/\") === \"/mado/\"\n *\n * base = \"/\"\n * routeUrl(\"/docs\") === \"/docs\"\n */\nexport function routeUrl(pathname: string, base: string = appBase): string {\n if (!pathname) return withBase(\"/\", base);\n // Split off ?query and #hash so we only run withBase on the pathname.\n let path = pathname;\n let suffix = \"\";\n const hashAt = path.indexOf(\"#\");\n if (hashAt >= 0) {\n suffix = path.slice(hashAt) + suffix;\n path = path.slice(0, hashAt);\n }\n const queryAt = path.indexOf(\"?\");\n if (queryAt >= 0) {\n suffix = path.slice(queryAt) + suffix;\n path = path.slice(0, queryAt);\n }\n if (path === \"\") path = \"/\";\n return withBase(path, base) + suffix;\n}\n\n"]}
@@ -66,3 +66,4 @@ export declare function routes(manifest: RoutesMap, options?: RoutesOptions): Ro
66
66
  * If there is no active routes() — no-op.
67
67
  */
68
68
  export declare function prefetchPath(pathname: string): void;
69
+ //# sourceMappingURL=manifest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"manifest.d.ts","sourceRoot":"","sources":["../../../src/router/manifest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAMH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAShE,OAAO,EAIL,KAAK,WAAW,EAEhB,KAAK,SAAS,EACf,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAoB,KAAK,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAWnE,MAAM,WAAW,aAAa;IAC5B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,cAAc,CAAC;IAC/B,0CAA0C;IAC1C,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,cAAc,CAAC;IACvC;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,KAAK,cAAc,CAAC;IAChE,mDAAmD;IACnD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;;OAGG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AA2CD;;GAEG;AACH,wBAAgB,MAAM,CACpB,QAAQ,EAAE,SAAS,EACnB,OAAO,GAAE,aAAkB,GAC1B,SAAS,CA4DX;AAiCD;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAInD"}