@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.
- package/AGENTS.md +15 -8
- package/CHANGELOG.md +58 -0
- package/README.md +25 -3
- package/dist/src/component.d.ts +3 -1
- package/dist/src/component.d.ts.map +1 -0
- package/dist/src/component.js +65 -30
- package/dist/src/component.js.map +1 -1
- package/dist/src/context.d.ts +13 -32
- package/dist/src/context.d.ts.map +1 -0
- package/dist/src/context.js +73 -48
- package/dist/src/context.js.map +1 -1
- package/dist/src/css.d.ts +1 -0
- package/dist/src/css.d.ts.map +1 -0
- package/dist/src/css.js.map +1 -1
- package/dist/src/devtools-hook.d.ts +14 -0
- package/dist/src/devtools-hook.d.ts.map +1 -0
- package/dist/src/devtools-hook.js +27 -0
- package/dist/src/devtools-hook.js.map +1 -0
- package/dist/src/devtools.d.ts +24 -22
- package/dist/src/devtools.d.ts.map +1 -0
- package/dist/src/devtools.js +230 -58
- package/dist/src/devtools.js.map +1 -1
- package/dist/src/diagnostics.d.ts +12 -0
- package/dist/src/diagnostics.d.ts.map +1 -0
- package/dist/src/diagnostics.js +68 -8
- package/dist/src/diagnostics.js.map +1 -1
- package/dist/src/each.d.ts +1 -5
- package/dist/src/each.d.ts.map +1 -0
- package/dist/src/each.js +0 -8
- package/dist/src/each.js.map +1 -1
- package/dist/src/forms.d.ts +27 -96
- package/dist/src/forms.d.ts.map +1 -0
- package/dist/src/forms.js +184 -394
- package/dist/src/forms.js.map +1 -1
- package/dist/src/head.d.ts +1 -0
- package/dist/src/head.d.ts.map +1 -0
- package/dist/src/head.js +2 -1
- package/dist/src/head.js.map +1 -1
- package/dist/src/html/bindings.d.ts +1 -0
- package/dist/src/html/bindings.d.ts.map +1 -0
- package/dist/src/html/bindings.js.map +1 -1
- package/dist/src/html/parser.d.ts +3 -4
- package/dist/src/html/parser.d.ts.map +1 -0
- package/dist/src/html/parser.js +63 -14
- package/dist/src/html/parser.js.map +1 -1
- package/dist/src/html/template-types.d.ts +1 -0
- package/dist/src/html/template-types.d.ts.map +1 -0
- package/dist/src/html/template-types.js.map +1 -1
- package/dist/src/html/template.d.ts +5 -1
- package/dist/src/html/template.d.ts.map +1 -0
- package/dist/src/html/template.js +78 -3
- package/dist/src/html/template.js.map +1 -1
- package/dist/src/index.d.ts +7 -8
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +5 -7
- package/dist/src/index.js.map +1 -1
- package/dist/src/json.d.ts +3 -0
- package/dist/src/json.d.ts.map +1 -0
- package/dist/src/json.js +14 -0
- package/dist/src/json.js.map +1 -0
- package/dist/src/lifecycle.d.ts +1 -0
- package/dist/src/lifecycle.d.ts.map +1 -0
- package/dist/src/lifecycle.js +3 -2
- package/dist/src/lifecycle.js.map +1 -1
- package/dist/src/page.d.ts +1 -0
- package/dist/src/page.d.ts.map +1 -0
- package/dist/src/page.js.map +1 -1
- package/dist/src/persisted.d.ts +6 -1
- package/dist/src/persisted.d.ts.map +1 -0
- package/dist/src/persisted.js +17 -11
- package/dist/src/persisted.js.map +1 -1
- package/dist/src/resource.d.ts +2 -1
- package/dist/src/resource.d.ts.map +1 -0
- package/dist/src/resource.js +126 -49
- package/dist/src/resource.js.map +1 -1
- package/dist/src/router/base.d.ts +1 -0
- package/dist/src/router/base.d.ts.map +1 -0
- package/dist/src/router/base.js.map +1 -1
- package/dist/src/router/manifest.d.ts +1 -0
- package/dist/src/router/manifest.d.ts.map +1 -0
- package/dist/src/router/manifest.js +89 -148
- package/dist/src/router/manifest.js.map +1 -1
- package/dist/src/router/match.d.ts +1 -0
- package/dist/src/router/match.d.ts.map +1 -0
- package/dist/src/router/match.js +19 -5
- package/dist/src/router/match.js.map +1 -1
- package/dist/src/router/navigation.d.ts +1 -0
- package/dist/src/router/navigation.d.ts.map +1 -0
- package/dist/src/router/navigation.js.map +1 -1
- package/dist/src/signal.d.ts +1 -0
- package/dist/src/signal.d.ts.map +1 -0
- package/dist/src/signal.js +46 -17
- package/dist/src/signal.js.map +1 -1
- package/dist/src/static-runtime.d.ts +1 -0
- package/dist/src/static-runtime.d.ts.map +1 -0
- package/dist/src/static-runtime.js.map +1 -1
- package/dist/src/vite/index.d.ts +1 -0
- package/dist/src/vite/index.d.ts.map +1 -0
- package/dist/src/vite/index.js +4 -3
- package/dist/src/vite/index.js.map +1 -1
- package/docs/architecture/v1-roadmap.md +19 -0
- package/docs/en/10-pages-and-components.md +9 -1
- package/docs/en/13-data.md +8 -6
- package/docs/en/14-forms.md +66 -219
- package/docs/en/15-static-snapshots.md +4 -4
- package/docs/en/16-app-architecture.md +3 -2
- package/docs/en/20-deployment.md +21 -8
- package/docs/en/21-error-handling.md +9 -6
- package/docs/en/24-devtools-and-diagnostics.md +45 -0
- package/docs/en/30-api-freeze-map.md +8 -9
- package/docs/en/32-v1-stability.md +2 -2
- package/docs/en/33-migration-0.12-0.13.md +56 -0
- package/docs/en/40-llm-guide.md +7 -9
- package/docs/en/41-for-backenders.md +13 -9
- package/docs/en/42-why-mado.md +2 -2
- package/docs/en/README.md +2 -0
- package/docs/recipes/nginx/nginx.conf +2 -2
- package/llms.txt +25 -7
- package/package.json +37 -16
- package/scripts/clean.mjs +8 -0
- package/scripts/cli/generate.mjs +11 -14
- package/scripts/cli/help.mjs +2 -0
- package/scripts/cli/index.mjs +14 -6
- package/scripts/cli/init.mjs +13 -18
- package/scripts/cli/release.mjs +22 -19
- package/scripts/cli/run.mjs +5 -3
- package/scripts/logger.mjs +117 -0
- package/scripts/output-guard.mjs +128 -0
- package/scripts/preview.mjs +11 -19
- package/scripts/static/browser.mjs +49 -8
- package/scripts/static/discover.mjs +4 -1
- package/scripts/static.mjs +21 -7
- package/starters/default/package.json +4 -4
- package/starters/default/tsconfig.node.json +13 -0
- package/starters/default/vite.config.ts +0 -3
- package/starters/modular/README.md +4 -4
- package/starters/modular/package.json +4 -4
- package/starters/modular/src/layouts/app-shell.layout.ts +1 -2
- package/starters/modular/src/modules/auth/login.page.ts +5 -12
- package/starters/modular/src/modules/billing/pages/invoice-detail.page.ts +3 -4
- package/starters/modular/src/modules/billing/pages/invoices-list.page.ts +1 -1
- package/starters/modular/src/shared/styles/reset.css +21 -1
- package/starters/modular/tsconfig.json +10 -1
- package/starters/modular/tsconfig.node.json +13 -0
- package/starters/modular/vite.config.ts +6 -5
- package/dist/src/lazy.d.ts +0 -38
- package/dist/src/lazy.js +0 -73
- package/dist/src/lazy.js.map +0 -1
- package/scripts/bake.mjs +0 -5
- package/scripts/docs-lint.mjs +0 -170
- package/scripts/package-smoke.mjs +0 -135
- package/scripts/release-notes.mjs +0 -66
- package/scripts/size-budget.mjs +0 -95
- package/starters/modular/src/shared/ui/x-button.component.ts +0 -49
package/dist/src/resource.js
CHANGED
|
@@ -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
|
-
|
|
23
|
-
const
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
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
|
|
48
|
-
|
|
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
|
-
(
|
|
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
|
-
|
|
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
|
-
|
|
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 = (
|
|
128
|
-
if (
|
|
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
|
-
|
|
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
|
-
|
|
179
|
+
writeCache(fetcher, lastKey, value, options.staleTime ?? 0);
|
|
163
180
|
},
|
|
164
181
|
};
|
|
165
182
|
}
|
|
166
183
|
function retainInFlight(key, fetcher, force) {
|
|
167
|
-
|
|
168
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
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
|
package/dist/src/resource.js.map
CHANGED
|
@@ -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"]}
|
|
@@ -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,
|
|
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"]}
|
|
@@ -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"}
|