@loozo/angular-router 0.0.0-stage → 0.0.1
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/.npmignore +3 -0
- package/LICENSE +21 -0
- package/README.md +114 -2
- package/builders.json +15 -0
- package/fesm2022/loozo-angular-router-_core.mjs +565 -0
- package/fesm2022/loozo-angular-router-_core.mjs.map +1 -0
- package/fesm2022/loozo-angular-router-_generated.mjs +658 -0
- package/fesm2022/loozo-angular-router-_generated.mjs.map +1 -0
- package/fesm2022/loozo-angular-router.mjs +6 -0
- package/fesm2022/loozo-angular-router.mjs.map +1 -0
- package/node/_core/src/path.js +50 -0
- package/node/src/builders/application.js +40 -0
- package/node/src/builders/options.js +70 -0
- package/node/src/builders/serve.js +155 -0
- package/node/src/generation/emit.js +245 -0
- package/node/src/generation/files.js +168 -0
- package/node/src/generation/generate.js +19 -0
- package/node/src/generation/selectors.js +60 -0
- package/node/src/generation/sources.js +493 -0
- package/node/src/generation/validate.js +463 -0
- package/package.json +47 -3
- package/schemas/application.json +17 -0
- package/schemas/serve.json +16 -0
- package/types/loozo-angular-router-_core.d.ts +185 -0
- package/types/loozo-angular-router-_generated.d.ts +56 -0
- package/types/loozo-angular-router.d.ts +1 -0
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
const presence = new WeakMap();
|
|
2
|
+
function codecPresence(codec) {
|
|
3
|
+
return presence.get(codec);
|
|
4
|
+
}
|
|
5
|
+
function validateCodec(codec) {
|
|
6
|
+
if (codec === null ||
|
|
7
|
+
(typeof codec !== "object" && typeof codec !== "function") ||
|
|
8
|
+
typeof codec.parse !== "function" ||
|
|
9
|
+
typeof codec.stringify !== "function") {
|
|
10
|
+
throw new TypeError("Codec must have callable parse and stringify methods");
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
const stringParam = {
|
|
14
|
+
parse(raw) {
|
|
15
|
+
return raw;
|
|
16
|
+
},
|
|
17
|
+
stringify(value) {
|
|
18
|
+
if (typeof value !== "string") {
|
|
19
|
+
throw new TypeError("Expected a string");
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
const numberParam = {
|
|
25
|
+
parse(raw) {
|
|
26
|
+
const value = Number(raw);
|
|
27
|
+
if (raw.trim() === "" || !Number.isFinite(value)) {
|
|
28
|
+
throw new Error("Expected a finite number");
|
|
29
|
+
}
|
|
30
|
+
return value;
|
|
31
|
+
},
|
|
32
|
+
stringify(value) {
|
|
33
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
34
|
+
throw new Error("Expected a finite number");
|
|
35
|
+
}
|
|
36
|
+
return String(value);
|
|
37
|
+
},
|
|
38
|
+
};
|
|
39
|
+
const booleanParam = {
|
|
40
|
+
parse(raw) {
|
|
41
|
+
if (raw === "true") {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
if (raw === "false") {
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
throw new Error("Expected true or false");
|
|
48
|
+
},
|
|
49
|
+
stringify(value) {
|
|
50
|
+
if (value === true) {
|
|
51
|
+
return "true";
|
|
52
|
+
}
|
|
53
|
+
if (value === false) {
|
|
54
|
+
return "false";
|
|
55
|
+
}
|
|
56
|
+
throw new Error("Expected a boolean");
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
function enumParam(values) {
|
|
60
|
+
if (!Array.isArray(values)) {
|
|
61
|
+
throw new TypeError("Enum values must be a string list");
|
|
62
|
+
}
|
|
63
|
+
const members = new Set();
|
|
64
|
+
for (const value of values) {
|
|
65
|
+
if (typeof value !== "string") {
|
|
66
|
+
throw new TypeError("Enum values must be strings");
|
|
67
|
+
}
|
|
68
|
+
members.add(value);
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
parse(raw) {
|
|
72
|
+
if (!members.has(raw)) {
|
|
73
|
+
throw new Error("Unknown enum value");
|
|
74
|
+
}
|
|
75
|
+
return raw;
|
|
76
|
+
},
|
|
77
|
+
stringify(value) {
|
|
78
|
+
if (!members.has(value)) {
|
|
79
|
+
throw new Error("Unknown enum value");
|
|
80
|
+
}
|
|
81
|
+
return value;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
function optionalSearchParam(codec) {
|
|
86
|
+
validateCodec(codec);
|
|
87
|
+
const wrapper = {
|
|
88
|
+
parse(raw) {
|
|
89
|
+
return codec.parse(raw);
|
|
90
|
+
},
|
|
91
|
+
stringify(value) {
|
|
92
|
+
if (value === undefined) {
|
|
93
|
+
throw new TypeError("Omitted search has no scalar representation");
|
|
94
|
+
}
|
|
95
|
+
return codec.stringify(value);
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
presence.set(wrapper, "optional");
|
|
99
|
+
return wrapper;
|
|
100
|
+
}
|
|
101
|
+
function nullableSearchParam(codec) {
|
|
102
|
+
validateCodec(codec);
|
|
103
|
+
if (codecPresence(codec) === "optional") {
|
|
104
|
+
throw new TypeError("Nullable cannot wrap optional");
|
|
105
|
+
}
|
|
106
|
+
const wrapper = {
|
|
107
|
+
parse(raw) {
|
|
108
|
+
if (raw === "null") {
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
return codec.parse(raw);
|
|
112
|
+
},
|
|
113
|
+
stringify(value) {
|
|
114
|
+
if (value === null) {
|
|
115
|
+
return "null";
|
|
116
|
+
}
|
|
117
|
+
return codec.stringify(value);
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
presence.set(wrapper, "nullable");
|
|
121
|
+
return wrapper;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
function parsePath(path) {
|
|
125
|
+
if (typeof path !== "string") {
|
|
126
|
+
throw new TypeError("Path must be a string");
|
|
127
|
+
}
|
|
128
|
+
if (path === "") {
|
|
129
|
+
return Object.freeze([]);
|
|
130
|
+
}
|
|
131
|
+
const segments = [];
|
|
132
|
+
const scalarNames = new Set();
|
|
133
|
+
const parts = path.split("/");
|
|
134
|
+
for (let index = 0; index < parts.length; index += 1) {
|
|
135
|
+
const part = parts[index];
|
|
136
|
+
if (part.startsWith("$")) {
|
|
137
|
+
let name = part.slice(1);
|
|
138
|
+
let kind = "scalar";
|
|
139
|
+
if (name.endsWith("[]")) {
|
|
140
|
+
name = name.slice(0, -2);
|
|
141
|
+
kind = "catchall";
|
|
142
|
+
}
|
|
143
|
+
if (name === "" ||
|
|
144
|
+
name === "__proto__" ||
|
|
145
|
+
name.startsWith("...") ||
|
|
146
|
+
name.includes("?") ||
|
|
147
|
+
name.includes("*") ||
|
|
148
|
+
name.includes("[]")) {
|
|
149
|
+
throw new TypeError(`Invalid parameter name: ${name}`);
|
|
150
|
+
}
|
|
151
|
+
if (kind === "catchall" && (index !== parts.length - 1 || scalarNames.has(name))) {
|
|
152
|
+
throw new TypeError("Catchall must be terminal and cannot repeat a scalar name");
|
|
153
|
+
}
|
|
154
|
+
scalarNames.add(name);
|
|
155
|
+
segments.push(Object.freeze({ kind, name }));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
if (part === "" ||
|
|
159
|
+
part === "." ||
|
|
160
|
+
part === ".." ||
|
|
161
|
+
part === "*" ||
|
|
162
|
+
part === "**" ||
|
|
163
|
+
part.startsWith(":")) {
|
|
164
|
+
throw new TypeError(`Invalid static segment: ${part}`);
|
|
165
|
+
}
|
|
166
|
+
if (!part.isWellFormed()) {
|
|
167
|
+
throw new TypeError("Static path Unicode must be well formed");
|
|
168
|
+
}
|
|
169
|
+
segments.push(Object.freeze({ kind: "static", text: part }));
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
return Object.freeze(segments);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
function ownRecord(value, label, allowSymbols = false) {
|
|
176
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
177
|
+
throw new TypeError(`${label} must be an own record`);
|
|
178
|
+
}
|
|
179
|
+
const prototype = Object.getPrototypeOf(value);
|
|
180
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
181
|
+
throw new TypeError(`${label} cannot contain inherited entries`);
|
|
182
|
+
}
|
|
183
|
+
for (const key of Reflect.ownKeys(value)) {
|
|
184
|
+
if ((!allowSymbols && typeof key !== "string") ||
|
|
185
|
+
!Object.prototype.propertyIsEnumerable.call(value, key)) {
|
|
186
|
+
throw new TypeError(`${label} contains an unsupported key`);
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
return value;
|
|
190
|
+
}
|
|
191
|
+
function checkKeys(record, allowed, label) {
|
|
192
|
+
for (const key of Object.keys(record)) {
|
|
193
|
+
if (!allowed.has(key)) {
|
|
194
|
+
throw new TypeError(`Unknown ${label} key: ${key}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
function has(record, key) {
|
|
199
|
+
return Object.hasOwn(record, key);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const routes = new WeakMap();
|
|
203
|
+
const configKeys = new Set([
|
|
204
|
+
"parent",
|
|
205
|
+
"params",
|
|
206
|
+
"search",
|
|
207
|
+
"resolve",
|
|
208
|
+
"runGuardsAndResolvers",
|
|
209
|
+
"redirect",
|
|
210
|
+
"fragments",
|
|
211
|
+
"canActivate",
|
|
212
|
+
"canActivateChild",
|
|
213
|
+
"canMatch",
|
|
214
|
+
"canDeactivate",
|
|
215
|
+
"providers",
|
|
216
|
+
"title",
|
|
217
|
+
"data",
|
|
218
|
+
]);
|
|
219
|
+
const policies = new Set([
|
|
220
|
+
"pathParamsChange",
|
|
221
|
+
"pathParamsOrQueryParamsChange",
|
|
222
|
+
"paramsChange",
|
|
223
|
+
"paramsOrQueryParamsChange",
|
|
224
|
+
"always",
|
|
225
|
+
]);
|
|
226
|
+
const identityKey = "__loozoAngularRouterRouteId";
|
|
227
|
+
function routeMetadata(route) {
|
|
228
|
+
if (route === null || typeof route !== "object" || !routes.has(route)) {
|
|
229
|
+
throw new TypeError("Expected a genuine route from this package instance");
|
|
230
|
+
}
|
|
231
|
+
return routes.get(route);
|
|
232
|
+
}
|
|
233
|
+
function copyCodecs(value, path) {
|
|
234
|
+
const record = ownRecord(value, "Codec map");
|
|
235
|
+
const result = Object.create(null);
|
|
236
|
+
for (const key of Object.keys(record)) {
|
|
237
|
+
const codec = record[key];
|
|
238
|
+
validateCodec(codec);
|
|
239
|
+
if (path && codecPresence(codec) !== undefined) {
|
|
240
|
+
throw new TypeError("Search wrappers cannot be path codecs");
|
|
241
|
+
}
|
|
242
|
+
result[key] = codec;
|
|
243
|
+
}
|
|
244
|
+
return Object.freeze(result);
|
|
245
|
+
}
|
|
246
|
+
function snapshotRedirect(value, source) {
|
|
247
|
+
const redirect = ownRecord(value, "Redirect");
|
|
248
|
+
checkKeys(redirect, new Set(["to", "params", "search", "fragment"]), "redirect");
|
|
249
|
+
const target = routeMetadata(redirect.to);
|
|
250
|
+
const mapping = Object.create(null);
|
|
251
|
+
if (has(redirect, "params")) {
|
|
252
|
+
const supplied = ownRecord(redirect.params, "Redirect params");
|
|
253
|
+
checkKeys(supplied, new Set(Object.keys(target.params)), "redirect params");
|
|
254
|
+
for (const key of Object.keys(target.params)) {
|
|
255
|
+
const sourceKey = supplied[key];
|
|
256
|
+
if (!has(supplied, key) || typeof sourceKey !== "string" || !has(source.params, sourceKey)) {
|
|
257
|
+
throw new TypeError(`Missing or invalid redirect mapping: ${key}`);
|
|
258
|
+
}
|
|
259
|
+
mapping[key] = sourceKey;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
else {
|
|
263
|
+
for (const key of Object.keys(target.params)) {
|
|
264
|
+
if (!has(source.params, key)) {
|
|
265
|
+
throw new TypeError(`Cannot forward redirect param: ${key}`);
|
|
266
|
+
}
|
|
267
|
+
mapping[key] = key;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
const search = ownRecord(redirect.search, "Redirect search");
|
|
271
|
+
let searchSnapshot;
|
|
272
|
+
if (search.mode === "replace") {
|
|
273
|
+
checkKeys(search, new Set(["mode", "values"]), "redirect search");
|
|
274
|
+
const values = ownRecord(search.values, "Redirect replacement");
|
|
275
|
+
validateSearchValues(target.search, values);
|
|
276
|
+
searchSnapshot = { mode: "replace", values: Object.freeze({ ...values }) };
|
|
277
|
+
}
|
|
278
|
+
else if (search.mode === "preserve" || search.mode === "drop") {
|
|
279
|
+
checkKeys(search, new Set(["mode"]), "redirect search");
|
|
280
|
+
for (const key of Object.keys(target.search)) {
|
|
281
|
+
if (codecPresence(target.search[key]) === "optional") {
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
if (search.mode === "drop" ||
|
|
285
|
+
!has(source.search, key) ||
|
|
286
|
+
codecPresence(source.search[key]) === "optional") {
|
|
287
|
+
throw new TypeError(`Redirect cannot guarantee required search: ${key}`);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
searchSnapshot = { mode: search.mode };
|
|
291
|
+
}
|
|
292
|
+
else {
|
|
293
|
+
throw new TypeError("Invalid redirect search policy");
|
|
294
|
+
}
|
|
295
|
+
const fragment = ownRecord(redirect.fragment, "Redirect fragment");
|
|
296
|
+
if (fragment.mode === "replace") {
|
|
297
|
+
checkKeys(fragment, new Set(["mode", "value"]), "redirect fragment");
|
|
298
|
+
if (typeof fragment.value !== "string" || !target.fragments.includes(fragment.value)) {
|
|
299
|
+
throw new TypeError("Redirect fragment must belong to target declaration");
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
else if (fragment.mode === "preserve" || fragment.mode === "drop") {
|
|
303
|
+
checkKeys(fragment, new Set(["mode"]), "redirect fragment");
|
|
304
|
+
}
|
|
305
|
+
else {
|
|
306
|
+
throw new TypeError("Invalid redirect fragment policy");
|
|
307
|
+
}
|
|
308
|
+
return Object.freeze({
|
|
309
|
+
to: redirect.to,
|
|
310
|
+
params: Object.freeze(mapping),
|
|
311
|
+
search: Object.freeze(searchSnapshot),
|
|
312
|
+
fragment: Object.freeze({ ...fragment }),
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
function validateSearchValues(codecs, values) {
|
|
316
|
+
checkKeys(values, new Set(Object.keys(codecs)), "search values");
|
|
317
|
+
for (const key of Object.keys(codecs)) {
|
|
318
|
+
if (codecPresence(codecs[key]) !== "optional" && !has(values, key)) {
|
|
319
|
+
throw new TypeError(`Missing required search: ${key}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
function defineRoute(path, config) {
|
|
324
|
+
const supplied = ownRecord(config, "Route config");
|
|
325
|
+
checkKeys(supplied, configKeys, "route config");
|
|
326
|
+
const localSegments = parsePath(path);
|
|
327
|
+
let parent;
|
|
328
|
+
let inherited;
|
|
329
|
+
if (has(supplied, "parent")) {
|
|
330
|
+
inherited = routeMetadata(supplied.parent);
|
|
331
|
+
parent = supplied.parent;
|
|
332
|
+
for (const segment of inherited.segments) {
|
|
333
|
+
if (segment.kind === "catchall") {
|
|
334
|
+
throw new TypeError("Catchall declarations cannot have children");
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
}
|
|
338
|
+
const localNames = new Set();
|
|
339
|
+
for (const segment of localSegments) {
|
|
340
|
+
if (segment.kind !== "static") {
|
|
341
|
+
localNames.add(segment.name);
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
let localParams = Object.freeze(Object.create(null));
|
|
345
|
+
if (localNames.size === 0) {
|
|
346
|
+
if (has(supplied, "params")) {
|
|
347
|
+
throw new TypeError("Static paths cannot declare params");
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
else {
|
|
351
|
+
localParams = copyCodecs(supplied.params, true);
|
|
352
|
+
checkKeys(localParams, localNames, "local params");
|
|
353
|
+
for (const key of localNames) {
|
|
354
|
+
if (!has(localParams, key)) {
|
|
355
|
+
throw new TypeError(`Missing local codec: ${key}`);
|
|
356
|
+
}
|
|
357
|
+
if (inherited && has(inherited.params, key)) {
|
|
358
|
+
throw new TypeError(`Inherited param already owned: ${key}`);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
let localSearch = Object.freeze(Object.create(null));
|
|
363
|
+
if (has(supplied, "search")) {
|
|
364
|
+
localSearch = copyCodecs(supplied.search, false);
|
|
365
|
+
}
|
|
366
|
+
for (const key of Object.keys(localSearch)) {
|
|
367
|
+
if (inherited && has(inherited.search, key)) {
|
|
368
|
+
throw new TypeError(`Inherited search already owned: ${key}`);
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
const retained = { ...supplied };
|
|
372
|
+
const result = { path: path };
|
|
373
|
+
if (has(supplied, "resolve")) {
|
|
374
|
+
const resolve = ownRecord(supplied.resolve, "Resolvers", true);
|
|
375
|
+
const copied = Object.create(null);
|
|
376
|
+
for (const key of Reflect.ownKeys(resolve)) {
|
|
377
|
+
if (key === identityKey || typeof resolve[key] !== "function") {
|
|
378
|
+
throw new TypeError(`Invalid resolver: ${String(key)}`);
|
|
379
|
+
}
|
|
380
|
+
copied[key] = resolve[key];
|
|
381
|
+
}
|
|
382
|
+
result.resolve = Object.freeze(copied);
|
|
383
|
+
retained.resolve = result.resolve;
|
|
384
|
+
}
|
|
385
|
+
if (has(supplied, "runGuardsAndResolvers")) {
|
|
386
|
+
const policy = supplied.runGuardsAndResolvers;
|
|
387
|
+
if (typeof policy !== "function" && (typeof policy !== "string" || !policies.has(policy))) {
|
|
388
|
+
throw new TypeError("Invalid native rerun policy");
|
|
389
|
+
}
|
|
390
|
+
result.runGuardsAndResolvers = policy;
|
|
391
|
+
}
|
|
392
|
+
for (const key of ["canActivate", "canActivateChild", "canMatch", "canDeactivate", "providers"]) {
|
|
393
|
+
if (!has(supplied, key)) {
|
|
394
|
+
continue;
|
|
395
|
+
}
|
|
396
|
+
const list = supplied[key];
|
|
397
|
+
if (!Array.isArray(list)) {
|
|
398
|
+
throw new TypeError(`${key} must be an array`);
|
|
399
|
+
}
|
|
400
|
+
if (key === "canActivate" || key === "canActivateChild" || key === "canMatch") {
|
|
401
|
+
for (const callback of list) {
|
|
402
|
+
if (typeof callback !== "function") {
|
|
403
|
+
throw new TypeError(`${key} entries must be callbacks`);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
else if (key === "canDeactivate") {
|
|
408
|
+
for (const guard of list) {
|
|
409
|
+
if (guard === null ||
|
|
410
|
+
(typeof guard !== "function" && typeof guard !== "object" && typeof guard !== "string")) {
|
|
411
|
+
throw new TypeError("canDeactivate entries must be native callbacks or tokens");
|
|
412
|
+
}
|
|
413
|
+
}
|
|
414
|
+
}
|
|
415
|
+
retained[key] = Object.freeze([...list]);
|
|
416
|
+
}
|
|
417
|
+
if (has(supplied, "title") &&
|
|
418
|
+
typeof supplied.title !== "string" &&
|
|
419
|
+
typeof supplied.title !== "function") {
|
|
420
|
+
throw new TypeError("Invalid native title");
|
|
421
|
+
}
|
|
422
|
+
if (has(supplied, "data")) {
|
|
423
|
+
const data = ownRecord(supplied.data, "Static data", true);
|
|
424
|
+
if (has(data, identityKey)) {
|
|
425
|
+
throw new TypeError("Static data cannot set generated identity");
|
|
426
|
+
}
|
|
427
|
+
retained.data = Object.freeze({ ...data });
|
|
428
|
+
}
|
|
429
|
+
const fragments = [];
|
|
430
|
+
if (has(supplied, "fragments")) {
|
|
431
|
+
if (!Array.isArray(supplied.fragments)) {
|
|
432
|
+
throw new TypeError("Fragments must be a string list");
|
|
433
|
+
}
|
|
434
|
+
for (const name of supplied.fragments) {
|
|
435
|
+
if (typeof name !== "string") {
|
|
436
|
+
throw new TypeError("Fragment names must be strings");
|
|
437
|
+
}
|
|
438
|
+
fragments.push(name);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
retained.fragments = Object.freeze(fragments);
|
|
442
|
+
retained.params = localParams;
|
|
443
|
+
retained.search = localSearch;
|
|
444
|
+
const metadata = {
|
|
445
|
+
parent,
|
|
446
|
+
localSegments,
|
|
447
|
+
segments: Object.freeze([...(inherited?.segments ?? []), ...localSegments]),
|
|
448
|
+
localParams,
|
|
449
|
+
localSearch,
|
|
450
|
+
params: Object.freeze({ ...inherited?.params, ...localParams }),
|
|
451
|
+
search: Object.freeze({ ...inherited?.search, ...localSearch }),
|
|
452
|
+
fragments: retained.fragments,
|
|
453
|
+
config: retained,
|
|
454
|
+
};
|
|
455
|
+
if (has(supplied, "redirect")) {
|
|
456
|
+
if (has(supplied, "canActivate") || has(supplied, "canMatch")) {
|
|
457
|
+
throw new TypeError("Redirect cannot declare own canActivate or canMatch");
|
|
458
|
+
}
|
|
459
|
+
retained.redirect = snapshotRedirect(supplied.redirect, metadata);
|
|
460
|
+
}
|
|
461
|
+
Object.freeze(retained);
|
|
462
|
+
routes.set(result, Object.freeze(metadata));
|
|
463
|
+
return Object.freeze(result);
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
function encode(value) {
|
|
467
|
+
return encodeURIComponent(value).replaceAll("(", "%28").replaceAll(")", "%29");
|
|
468
|
+
}
|
|
469
|
+
function stringify(codec, value, path) {
|
|
470
|
+
const text = codec.stringify(value);
|
|
471
|
+
if (typeof text !== "string") {
|
|
472
|
+
throw new TypeError("Codec stringify must return a string");
|
|
473
|
+
}
|
|
474
|
+
if (path && (text === "" || text === "." || text === "..")) {
|
|
475
|
+
throw new TypeError("Path output cannot be empty, dot or dotdot");
|
|
476
|
+
}
|
|
477
|
+
return encode(text);
|
|
478
|
+
}
|
|
479
|
+
function createUrl(route, values) {
|
|
480
|
+
const metadata = routeMetadata(route);
|
|
481
|
+
const options = ownRecord(values, "URL options");
|
|
482
|
+
checkKeys(options, new Set(["params", "search", "fragment"]), "URL options");
|
|
483
|
+
const paramKeys = Object.keys(metadata.params);
|
|
484
|
+
let params = Object.create(null);
|
|
485
|
+
if (paramKeys.length === 0) {
|
|
486
|
+
if (has(options, "params")) {
|
|
487
|
+
throw new TypeError("Route has no path params");
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
else {
|
|
491
|
+
params = ownRecord(options.params, "Path values");
|
|
492
|
+
checkKeys(params, new Set(paramKeys), "path values");
|
|
493
|
+
for (const key of paramKeys) {
|
|
494
|
+
if (!has(params, key)) {
|
|
495
|
+
throw new TypeError(`Missing path value: ${key}`);
|
|
496
|
+
}
|
|
497
|
+
}
|
|
498
|
+
}
|
|
499
|
+
const searchKeys = Object.keys(metadata.search).sort();
|
|
500
|
+
let search = Object.create(null);
|
|
501
|
+
if (searchKeys.length === 0) {
|
|
502
|
+
if (has(options, "search")) {
|
|
503
|
+
throw new TypeError("Route has no search declarations");
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
else {
|
|
507
|
+
if (has(options, "search")) {
|
|
508
|
+
search = ownRecord(options.search, "Search values");
|
|
509
|
+
}
|
|
510
|
+
validateSearchValues(metadata.search, search);
|
|
511
|
+
}
|
|
512
|
+
if (has(options, "fragment")) {
|
|
513
|
+
if (typeof options.fragment !== "string" || !metadata.fragments.includes(options.fragment)) {
|
|
514
|
+
throw new TypeError("Fragment must belong to this declaration");
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
// Check all cardinalities before invoking application stringifiers.
|
|
518
|
+
for (const segment of metadata.segments) {
|
|
519
|
+
if (segment.kind === "catchall" && !Array.isArray(params[segment.name])) {
|
|
520
|
+
throw new TypeError(`Catchall requires an array: ${segment.name}`);
|
|
521
|
+
}
|
|
522
|
+
}
|
|
523
|
+
const parts = [];
|
|
524
|
+
for (const segment of metadata.segments) {
|
|
525
|
+
if (segment.kind === "static") {
|
|
526
|
+
parts.push(encode(segment.text));
|
|
527
|
+
}
|
|
528
|
+
else if (segment.kind === "scalar") {
|
|
529
|
+
parts.push(stringify(metadata.params[segment.name], params[segment.name], true));
|
|
530
|
+
}
|
|
531
|
+
else {
|
|
532
|
+
for (const value of params[segment.name]) {
|
|
533
|
+
parts.push(stringify(metadata.params[segment.name], value, true));
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
let url = `/${parts.join("/")}`;
|
|
538
|
+
const query = [];
|
|
539
|
+
for (const key of searchKeys) {
|
|
540
|
+
const codec = metadata.search[key];
|
|
541
|
+
const optional = codecPresence(codec) === "optional";
|
|
542
|
+
if (optional && !has(search, key)) {
|
|
543
|
+
continue;
|
|
544
|
+
}
|
|
545
|
+
const value = search[key];
|
|
546
|
+
if (optional && value === undefined) {
|
|
547
|
+
continue;
|
|
548
|
+
}
|
|
549
|
+
query.push(`${encode(key)}=${stringify(codec, value, false)}`);
|
|
550
|
+
}
|
|
551
|
+
if (query.length > 0) {
|
|
552
|
+
url += `?${query.join("&")}`;
|
|
553
|
+
}
|
|
554
|
+
if (has(options, "fragment")) {
|
|
555
|
+
url += `#${encode(options.fragment)}`;
|
|
556
|
+
}
|
|
557
|
+
return url;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
/**
|
|
561
|
+
* Generated bundle index. Do not edit.
|
|
562
|
+
*/
|
|
563
|
+
|
|
564
|
+
export { booleanParam, codecPresence, createUrl, defineRoute, enumParam, nullableSearchParam, numberParam, optionalSearchParam, routeMetadata, stringParam };
|
|
565
|
+
//# sourceMappingURL=loozo-angular-router-_core.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loozo-angular-router-_core.mjs","sources":["../../_core/src/codecs.ts","../../_core/src/path.ts","../../_core/src/records.ts","../../_core/src/route.ts","../../_core/src/url.ts","../../_core/src/loozo-angular-router-_core.ts"],"sourcesContent":["export interface ParamCodec<Value> {\n parse(raw: string): Value | Promise<Value>;\n stringify(value: Value): string;\n}\n\ndeclare const searchPresence: unique symbol;\n\nexport type OptionalCodec<Value> = ParamCodec<Value | undefined> & {\n readonly [searchPresence]: \"optional\";\n};\nexport type NullableCodec<Value> = ParamCodec<Value | null> & {\n readonly [searchPresence]: \"nullable\";\n};\nexport type PathCodec = ParamCodec<any> & { readonly [searchPresence]?: never };\nexport type CodecValue<Codec> = Codec extends ParamCodec<infer Value> ? Value : never;\nexport type IsOptional<Codec> = Codec extends { readonly [searchPresence]: \"optional\" }\n ? true\n : false;\n\nconst presence = new WeakMap<object, \"optional\" | \"nullable\">();\n\nexport function codecPresence(codec: object): \"optional\" | \"nullable\" | undefined {\n return presence.get(codec);\n}\n\nexport function validateCodec(codec: unknown): asserts codec is ParamCodec<any> {\n if (\n codec === null ||\n (typeof codec !== \"object\" && typeof codec !== \"function\") ||\n typeof (codec as ParamCodec<unknown>).parse !== \"function\" ||\n typeof (codec as ParamCodec<unknown>).stringify !== \"function\"\n ) {\n throw new TypeError(\"Codec must have callable parse and stringify methods\");\n }\n}\n\nexport const stringParam: ParamCodec<string> = {\n parse(raw) {\n return raw;\n },\n stringify(value) {\n if (typeof value !== \"string\") {\n throw new TypeError(\"Expected a string\");\n }\n\n return value;\n },\n};\n\nexport const numberParam: ParamCodec<number> = {\n parse(raw) {\n const value = Number(raw);\n\n if (raw.trim() === \"\" || !Number.isFinite(value)) {\n throw new Error(\"Expected a finite number\");\n }\n\n return value;\n },\n stringify(value) {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new Error(\"Expected a finite number\");\n }\n\n return String(value);\n },\n};\n\nexport const booleanParam: ParamCodec<boolean> = {\n parse(raw) {\n if (raw === \"true\") {\n return true;\n }\n\n if (raw === \"false\") {\n return false;\n }\n\n throw new Error(\"Expected true or false\");\n },\n stringify(value) {\n if (value === true) {\n return \"true\";\n }\n\n if (value === false) {\n return \"false\";\n }\n\n throw new Error(\"Expected a boolean\");\n },\n};\n\nexport function enumParam<const Values extends readonly string[]>(\n values: Values,\n): ParamCodec<Values[number]> {\n if (!Array.isArray(values)) {\n throw new TypeError(\"Enum values must be a string list\");\n }\n\n const members = new Set<string>();\n\n for (const value of values) {\n if (typeof value !== \"string\") {\n throw new TypeError(\"Enum values must be strings\");\n }\n\n members.add(value);\n }\n\n return {\n parse(raw) {\n if (!members.has(raw)) {\n throw new Error(\"Unknown enum value\");\n }\n\n return raw as Values[number];\n },\n stringify(value) {\n if (!members.has(value)) {\n throw new Error(\"Unknown enum value\");\n }\n\n return value;\n },\n };\n}\n\nexport function optionalSearchParam<Value>(codec: ParamCodec<Value>): OptionalCodec<Value> {\n validateCodec(codec);\n\n const wrapper: ParamCodec<Value | undefined> = {\n parse(raw) {\n return codec.parse(raw);\n },\n stringify(value) {\n if (value === undefined) {\n throw new TypeError(\"Omitted search has no scalar representation\");\n }\n\n return codec.stringify(value);\n },\n };\n\n presence.set(wrapper, \"optional\");\n\n return wrapper as OptionalCodec<Value>;\n}\n\nexport function nullableSearchParam<Value>(\n codec: ParamCodec<Value> & { readonly [searchPresence]?: \"nullable\" },\n): NullableCodec<Value> {\n validateCodec(codec);\n\n if (codecPresence(codec) === \"optional\") {\n throw new TypeError(\"Nullable cannot wrap optional\");\n }\n\n const wrapper: ParamCodec<Value | null> = {\n parse(raw) {\n if (raw === \"null\") {\n return null;\n }\n\n return codec.parse(raw);\n },\n stringify(value) {\n if (value === null) {\n return \"null\";\n }\n\n return codec.stringify(value);\n },\n };\n\n presence.set(wrapper, \"nullable\");\n\n return wrapper as NullableCodec<Value>;\n}\n","type ValidName<Name extends string> = Name extends\n | \"\"\n | \"__proto__\"\n | `...${string}`\n | `${string}?${string}`\n | `${string}*${string}`\n | `${string}[]${string}`\n ? false\n : true;\ntype SegmentValid<Segment extends string> = Segment extends `$${infer Name}`\n ? ValidName<Name>\n : Segment extends \"\" | \".\" | \"..\" | \"*\" | \"**\" | `:${string}`\n ? false\n : true;\ntype ValidateSegments<\n Path extends string,\n Scalars extends string = never,\n> = Path extends `${infer Head}/${infer Tail}`\n ? Head extends `$${string}[]`\n ? false\n : SegmentValid<Head> extends true\n ? ValidateSegments<Tail, Scalars | ScalarName<Head>>\n : false\n : Path extends `$${infer Name}[]`\n ? ValidName<Name> extends true\n ? Name extends Scalars\n ? false\n : true\n : false\n : SegmentValid<Path>;\nexport type ValidPath<Path extends string> = string extends Path\n ? never\n : Path extends \"\"\n ? Path\n : ValidateSegments<Path> extends true\n ? Path\n : never;\ntype ScalarName<Segment extends string> = Segment extends `$${infer Name}` ? Name : never;\ntype SegmentName<Segment extends string> = Segment extends `$${infer Name}[]`\n ? Name\n : ScalarName<Segment>;\nexport type PathNames<Path extends string> = Path extends `${infer Head}/${infer Tail}`\n ? SegmentName<Head> | PathNames<Tail>\n : SegmentName<Path>;\nexport type CatchallName<Path extends string> = Path extends `${string}/${infer Tail}`\n ? CatchallName<Tail>\n : Path extends `$${infer Name}[]`\n ? Name\n : never;\n\nexport type Segment =\n | { readonly kind: \"static\"; readonly text: string }\n | { readonly kind: \"scalar\" | \"catchall\"; readonly name: string };\n\nexport function parsePath(path: unknown): readonly Segment[] {\n if (typeof path !== \"string\") {\n throw new TypeError(\"Path must be a string\");\n }\n\n if (path === \"\") {\n return Object.freeze([]);\n }\n\n const segments: Segment[] = [];\n const scalarNames = new Set<string>();\n const parts = path.split(\"/\");\n\n for (let index = 0; index < parts.length; index += 1) {\n const part = parts[index];\n\n if (part.startsWith(\"$\")) {\n let name = part.slice(1);\n let kind: \"scalar\" | \"catchall\" = \"scalar\";\n\n if (name.endsWith(\"[]\")) {\n name = name.slice(0, -2);\n kind = \"catchall\";\n }\n\n if (\n name === \"\" ||\n name === \"__proto__\" ||\n name.startsWith(\"...\") ||\n name.includes(\"?\") ||\n name.includes(\"*\") ||\n name.includes(\"[]\")\n ) {\n throw new TypeError(`Invalid parameter name: ${name}`);\n }\n\n if (kind === \"catchall\" && (index !== parts.length - 1 || scalarNames.has(name))) {\n throw new TypeError(\"Catchall must be terminal and cannot repeat a scalar name\");\n }\n\n scalarNames.add(name);\n segments.push(Object.freeze({ kind, name }));\n } else {\n if (\n part === \"\" ||\n part === \".\" ||\n part === \"..\" ||\n part === \"*\" ||\n part === \"**\" ||\n part.startsWith(\":\")\n ) {\n throw new TypeError(`Invalid static segment: ${part}`);\n }\n\n if (!part.isWellFormed()) {\n throw new TypeError(\"Static path Unicode must be well formed\");\n }\n\n segments.push(Object.freeze({ kind: \"static\", text: part }));\n }\n }\n\n return Object.freeze(segments);\n}\n","export function ownRecord(\n value: unknown,\n label: string,\n allowSymbols = false,\n): Record<string, unknown> {\n if (value === null || typeof value !== \"object\" || Array.isArray(value)) {\n throw new TypeError(`${label} must be an own record`);\n }\n\n const prototype = Object.getPrototypeOf(value);\n\n if (prototype !== Object.prototype && prototype !== null) {\n throw new TypeError(`${label} cannot contain inherited entries`);\n }\n\n for (const key of Reflect.ownKeys(value)) {\n if (\n (!allowSymbols && typeof key !== \"string\") ||\n !Object.prototype.propertyIsEnumerable.call(value, key)\n ) {\n throw new TypeError(`${label} contains an unsupported key`);\n }\n }\n\n return value as Record<string, unknown>;\n}\n\nexport function checkKeys(\n record: Record<string, unknown>,\n allowed: ReadonlySet<string>,\n label: string,\n): void {\n for (const key of Object.keys(record)) {\n if (!allowed.has(key)) {\n throw new TypeError(`Unknown ${label} key: ${key}`);\n }\n }\n}\n\nexport function has(record: object, key: PropertyKey): boolean {\n return Object.hasOwn(record, key);\n}\n","import { codecPresence, validateCodec, type ParamCodec, type PathCodec } from \"./codecs.js\";\nimport { parsePath, type Segment, type ValidPath, type CatchallName } from \"./path.js\";\nimport { checkKeys, has, ownRecord } from \"./records.js\";\nimport type {\n AnyRoute,\n CodecMap,\n EffectiveParams,\n EffectiveSearch,\n Route,\n RouteConfig,\n SearchOf,\n} from \"./types.js\";\n\nexport interface RouteMetadata {\n readonly parent?: AnyRoute;\n readonly localSegments: readonly Segment[];\n readonly segments: readonly Segment[];\n readonly localParams: Readonly<Record<string, ParamCodec<any>>>;\n readonly localSearch: Readonly<Record<string, ParamCodec<any>>>;\n readonly params: Readonly<Record<string, ParamCodec<any>>>;\n readonly search: Readonly<Record<string, ParamCodec<any>>>;\n readonly fragments: readonly string[];\n readonly config: Readonly<Record<string, unknown>>;\n}\n\nconst routes = new WeakMap<object, RouteMetadata>();\nconst configKeys = new Set([\n \"parent\",\n \"params\",\n \"search\",\n \"resolve\",\n \"runGuardsAndResolvers\",\n \"redirect\",\n \"fragments\",\n \"canActivate\",\n \"canActivateChild\",\n \"canMatch\",\n \"canDeactivate\",\n \"providers\",\n \"title\",\n \"data\",\n]);\nconst policies = new Set([\n \"pathParamsChange\",\n \"pathParamsOrQueryParamsChange\",\n \"paramsChange\",\n \"paramsOrQueryParamsChange\",\n \"always\",\n]);\nconst identityKey = \"__loozoAngularRouterRouteId\";\n\nexport function routeMetadata(route: unknown): RouteMetadata {\n if (route === null || typeof route !== \"object\" || !routes.has(route)) {\n throw new TypeError(\"Expected a genuine route from this package instance\");\n }\n\n return routes.get(route)!;\n}\n\nfunction copyCodecs(value: unknown, path: boolean): Readonly<Record<string, ParamCodec<any>>> {\n const record = ownRecord(value, \"Codec map\");\n const result: Record<string, ParamCodec<any>> = Object.create(null);\n\n for (const key of Object.keys(record)) {\n const codec = record[key];\n\n validateCodec(codec);\n\n if (path && codecPresence(codec) !== undefined) {\n throw new TypeError(\"Search wrappers cannot be path codecs\");\n }\n\n result[key] = codec;\n }\n\n return Object.freeze(result);\n}\n\nfunction snapshotRedirect(\n value: unknown,\n source: RouteMetadata,\n): Readonly<Record<string, unknown>> {\n const redirect = ownRecord(value, \"Redirect\");\n\n checkKeys(redirect, new Set([\"to\", \"params\", \"search\", \"fragment\"]), \"redirect\");\n\n const target = routeMetadata(redirect.to);\n const mapping: Record<string, string> = Object.create(null);\n\n if (has(redirect, \"params\")) {\n const supplied = ownRecord(redirect.params, \"Redirect params\");\n\n checkKeys(supplied, new Set(Object.keys(target.params)), \"redirect params\");\n\n for (const key of Object.keys(target.params)) {\n const sourceKey = supplied[key];\n\n if (!has(supplied, key) || typeof sourceKey !== \"string\" || !has(source.params, sourceKey)) {\n throw new TypeError(`Missing or invalid redirect mapping: ${key}`);\n }\n\n mapping[key] = sourceKey;\n }\n } else {\n for (const key of Object.keys(target.params)) {\n if (!has(source.params, key)) {\n throw new TypeError(`Cannot forward redirect param: ${key}`);\n }\n\n mapping[key] = key;\n }\n }\n\n const search = ownRecord(redirect.search, \"Redirect search\");\n let searchSnapshot: Record<string, unknown>;\n\n if (search.mode === \"replace\") {\n checkKeys(search, new Set([\"mode\", \"values\"]), \"redirect search\");\n\n const values = ownRecord(search.values, \"Redirect replacement\");\n\n validateSearchValues(target.search, values);\n searchSnapshot = { mode: \"replace\", values: Object.freeze({ ...values }) };\n } else if (search.mode === \"preserve\" || search.mode === \"drop\") {\n checkKeys(search, new Set([\"mode\"]), \"redirect search\");\n\n for (const key of Object.keys(target.search)) {\n if (codecPresence(target.search[key]) === \"optional\") {\n continue;\n }\n\n if (\n search.mode === \"drop\" ||\n !has(source.search, key) ||\n codecPresence(source.search[key]) === \"optional\"\n ) {\n throw new TypeError(`Redirect cannot guarantee required search: ${key}`);\n }\n }\n\n searchSnapshot = { mode: search.mode };\n } else {\n throw new TypeError(\"Invalid redirect search policy\");\n }\n\n const fragment = ownRecord(redirect.fragment, \"Redirect fragment\");\n\n if (fragment.mode === \"replace\") {\n checkKeys(fragment, new Set([\"mode\", \"value\"]), \"redirect fragment\");\n\n if (typeof fragment.value !== \"string\" || !target.fragments.includes(fragment.value)) {\n throw new TypeError(\"Redirect fragment must belong to target declaration\");\n }\n } else if (fragment.mode === \"preserve\" || fragment.mode === \"drop\") {\n checkKeys(fragment, new Set([\"mode\"]), \"redirect fragment\");\n } else {\n throw new TypeError(\"Invalid redirect fragment policy\");\n }\n\n return Object.freeze({\n to: redirect.to,\n params: Object.freeze(mapping),\n search: Object.freeze(searchSnapshot),\n fragment: Object.freeze({ ...fragment }),\n });\n}\n\nexport function validateSearchValues(\n codecs: Readonly<Record<string, ParamCodec<any>>>,\n values: Record<string, unknown>,\n): void {\n checkKeys(values, new Set(Object.keys(codecs)), \"search values\");\n\n for (const key of Object.keys(codecs)) {\n if (codecPresence(codecs[key]) !== \"optional\" && !has(values, key)) {\n throw new TypeError(`Missing required search: ${key}`);\n }\n }\n}\n\nexport function defineRoute<\n const Path extends string,\n Parent extends AnyRoute | undefined = undefined,\n Params extends Record<string, PathCodec> = {},\n Search extends CodecMap = {},\n Resolvers extends Record<string, (...args: any[]) => unknown> = {},\n const Fragments extends readonly string[] = [],\n Target extends AnyRoute | undefined = undefined,\n ReplacementKeys extends keyof SearchOf<NoInfer<Target>> = never,\n>(\n path: Path & ValidPath<Path>,\n config: RouteConfig<Path, Parent, Params, Search, Resolvers, Fragments, Target, ReplacementKeys>,\n): Route<\n Path,\n EffectiveParams<Path, Params, Parent>,\n EffectiveSearch<Search, Parent>,\n Resolvers,\n Fragments[number],\n CatchallName<Path> extends never ? false : true\n>;\n\nexport function defineRoute(path: unknown, config: unknown): AnyRoute {\n const supplied = ownRecord(config, \"Route config\");\n\n checkKeys(supplied, configKeys, \"route config\");\n\n const localSegments = parsePath(path);\n let parent: AnyRoute | undefined;\n let inherited: RouteMetadata | undefined;\n\n if (has(supplied, \"parent\")) {\n inherited = routeMetadata(supplied.parent);\n parent = supplied.parent as AnyRoute;\n\n for (const segment of inherited.segments) {\n if (segment.kind === \"catchall\") {\n throw new TypeError(\"Catchall declarations cannot have children\");\n }\n }\n }\n\n const localNames = new Set<string>();\n\n for (const segment of localSegments) {\n if (segment.kind !== \"static\") {\n localNames.add(segment.name);\n }\n }\n\n let localParams: Readonly<Record<string, ParamCodec<any>>> = Object.freeze(Object.create(null));\n\n if (localNames.size === 0) {\n if (has(supplied, \"params\")) {\n throw new TypeError(\"Static paths cannot declare params\");\n }\n } else {\n localParams = copyCodecs(supplied.params, true);\n checkKeys(localParams, localNames, \"local params\");\n\n for (const key of localNames) {\n if (!has(localParams, key)) {\n throw new TypeError(`Missing local codec: ${key}`);\n }\n\n if (inherited && has(inherited.params, key)) {\n throw new TypeError(`Inherited param already owned: ${key}`);\n }\n }\n }\n\n let localSearch: Readonly<Record<string, ParamCodec<any>>> = Object.freeze(Object.create(null));\n\n if (has(supplied, \"search\")) {\n localSearch = copyCodecs(supplied.search, false);\n }\n\n for (const key of Object.keys(localSearch)) {\n if (inherited && has(inherited.search, key)) {\n throw new TypeError(`Inherited search already owned: ${key}`);\n }\n }\n\n const retained: Record<string, unknown> = { ...supplied };\n const result: {\n path: string;\n resolve?: Readonly<Record<PropertyKey, unknown>>;\n runGuardsAndResolvers?: unknown;\n } = { path: path as string };\n\n if (has(supplied, \"resolve\")) {\n const resolve = ownRecord(supplied.resolve, \"Resolvers\", true) as Record<PropertyKey, unknown>;\n const copied: Record<PropertyKey, unknown> = Object.create(null);\n\n for (const key of Reflect.ownKeys(resolve)) {\n if (key === identityKey || typeof resolve[key] !== \"function\") {\n throw new TypeError(`Invalid resolver: ${String(key)}`);\n }\n\n copied[key] = resolve[key];\n }\n\n result.resolve = Object.freeze(copied);\n retained.resolve = result.resolve;\n }\n\n if (has(supplied, \"runGuardsAndResolvers\")) {\n const policy = supplied.runGuardsAndResolvers;\n\n if (typeof policy !== \"function\" && (typeof policy !== \"string\" || !policies.has(policy))) {\n throw new TypeError(\"Invalid native rerun policy\");\n }\n\n result.runGuardsAndResolvers = policy;\n }\n\n for (const key of [\"canActivate\", \"canActivateChild\", \"canMatch\", \"canDeactivate\", \"providers\"]) {\n if (!has(supplied, key)) {\n continue;\n }\n\n const list = supplied[key];\n\n if (!Array.isArray(list)) {\n throw new TypeError(`${key} must be an array`);\n }\n\n if (key === \"canActivate\" || key === \"canActivateChild\" || key === \"canMatch\") {\n for (const callback of list) {\n if (typeof callback !== \"function\") {\n throw new TypeError(`${key} entries must be callbacks`);\n }\n }\n } else if (key === \"canDeactivate\") {\n for (const guard of list) {\n if (\n guard === null ||\n (typeof guard !== \"function\" && typeof guard !== \"object\" && typeof guard !== \"string\")\n ) {\n throw new TypeError(\"canDeactivate entries must be native callbacks or tokens\");\n }\n }\n }\n\n retained[key] = Object.freeze([...list]);\n }\n\n if (\n has(supplied, \"title\") &&\n typeof supplied.title !== \"string\" &&\n typeof supplied.title !== \"function\"\n ) {\n throw new TypeError(\"Invalid native title\");\n }\n\n if (has(supplied, \"data\")) {\n const data = ownRecord(supplied.data, \"Static data\", true);\n\n if (has(data, identityKey)) {\n throw new TypeError(\"Static data cannot set generated identity\");\n }\n\n retained.data = Object.freeze({ ...data });\n }\n\n const fragments: string[] = [];\n\n if (has(supplied, \"fragments\")) {\n if (!Array.isArray(supplied.fragments)) {\n throw new TypeError(\"Fragments must be a string list\");\n }\n\n for (const name of supplied.fragments) {\n if (typeof name !== \"string\") {\n throw new TypeError(\"Fragment names must be strings\");\n }\n\n fragments.push(name);\n }\n }\n\n retained.fragments = Object.freeze(fragments);\n retained.params = localParams;\n retained.search = localSearch;\n\n const metadata: RouteMetadata = {\n parent,\n localSegments,\n segments: Object.freeze([...(inherited?.segments ?? []), ...localSegments]),\n localParams,\n localSearch,\n params: Object.freeze({ ...inherited?.params, ...localParams }),\n search: Object.freeze({ ...inherited?.search, ...localSearch }),\n fragments: retained.fragments as readonly string[],\n config: retained,\n };\n\n if (has(supplied, \"redirect\")) {\n if (has(supplied, \"canActivate\") || has(supplied, \"canMatch\")) {\n throw new TypeError(\"Redirect cannot declare own canActivate or canMatch\");\n }\n\n retained.redirect = snapshotRedirect(supplied.redirect, metadata);\n }\n\n Object.freeze(retained);\n routes.set(result, Object.freeze(metadata));\n\n return Object.freeze(result) as AnyRoute;\n}\n","import { codecPresence, type ParamCodec } from \"./codecs.js\";\nimport { ownRecord, checkKeys, has } from \"./records.js\";\nimport { routeMetadata, validateSearchValues } from \"./route.js\";\nimport type { AnyRoute, SearchOf, UrlValues } from \"./types.js\";\n\nfunction encode(value: string): string {\n return encodeURIComponent(value).replaceAll(\"(\", \"%28\").replaceAll(\")\", \"%29\");\n}\n\nfunction stringify(codec: ParamCodec<any>, value: unknown, path: boolean): string {\n const text = codec.stringify(value);\n\n if (typeof text !== \"string\") {\n throw new TypeError(\"Codec stringify must return a string\");\n }\n\n if (path && (text === \"\" || text === \".\" || text === \"..\")) {\n throw new TypeError(\"Path output cannot be empty, dot or dotdot\");\n }\n\n return encode(text);\n}\n\nexport function createUrl<\n Target extends AnyRoute,\n SearchKeys extends keyof SearchOf<NoInfer<Target>> = never,\n>(route: Target, values: UrlValues<NoInfer<Target>, SearchKeys>): string;\n\nexport function createUrl(route: unknown, values: unknown): string {\n const metadata = routeMetadata(route);\n const options = ownRecord(values, \"URL options\");\n\n checkKeys(options, new Set([\"params\", \"search\", \"fragment\"]), \"URL options\");\n\n const paramKeys = Object.keys(metadata.params);\n let params: Record<string, unknown> = Object.create(null);\n\n if (paramKeys.length === 0) {\n if (has(options, \"params\")) {\n throw new TypeError(\"Route has no path params\");\n }\n } else {\n params = ownRecord(options.params, \"Path values\");\n checkKeys(params, new Set(paramKeys), \"path values\");\n\n for (const key of paramKeys) {\n if (!has(params, key)) {\n throw new TypeError(`Missing path value: ${key}`);\n }\n }\n }\n\n const searchKeys = Object.keys(metadata.search).sort();\n let search: Record<string, unknown> = Object.create(null);\n\n if (searchKeys.length === 0) {\n if (has(options, \"search\")) {\n throw new TypeError(\"Route has no search declarations\");\n }\n } else {\n if (has(options, \"search\")) {\n search = ownRecord(options.search, \"Search values\");\n }\n\n validateSearchValues(metadata.search, search);\n }\n\n if (has(options, \"fragment\")) {\n if (typeof options.fragment !== \"string\" || !metadata.fragments.includes(options.fragment)) {\n throw new TypeError(\"Fragment must belong to this declaration\");\n }\n }\n\n // Check all cardinalities before invoking application stringifiers.\n for (const segment of metadata.segments) {\n if (segment.kind === \"catchall\" && !Array.isArray(params[segment.name])) {\n throw new TypeError(`Catchall requires an array: ${segment.name}`);\n }\n }\n\n const parts: string[] = [];\n\n for (const segment of metadata.segments) {\n if (segment.kind === \"static\") {\n parts.push(encode(segment.text));\n } else if (segment.kind === \"scalar\") {\n parts.push(stringify(metadata.params[segment.name], params[segment.name], true));\n } else {\n for (const value of params[segment.name] as readonly unknown[]) {\n parts.push(stringify(metadata.params[segment.name], value, true));\n }\n }\n }\n\n let url = `/${parts.join(\"/\")}`;\n const query: string[] = [];\n\n for (const key of searchKeys) {\n const codec = metadata.search[key];\n const optional = codecPresence(codec) === \"optional\";\n\n if (optional && !has(search, key)) {\n continue;\n }\n\n const value = search[key];\n\n if (optional && value === undefined) {\n continue;\n }\n\n query.push(`${encode(key)}=${stringify(codec, value, false)}`);\n }\n\n if (query.length > 0) {\n url += `?${query.join(\"&\")}`;\n }\n\n if (has(options, \"fragment\")) {\n url += `#${encode(options.fragment as string)}`;\n }\n\n return url;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":"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"}
|