@loozo/angular-router 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Typed route declarations, codecs, URLs and navigation on top of Angular’s native router. Static generation supplies route configuration, typed destinations and route handles without introducing a second router. Angular owns matching, activation, guards, resolvers, redirects, history and stability.
4
4
 
5
- This is an experimental implementation. The reviewed rebuild passed all 126 cases in the approved acceptance copy, plus source review and native consumer/build/browser checks. It is not yet broadly battle-tested. Version `0.0.1` is experimental and MIT-licensed.
5
+ This is an experimental implementation. The reviewed rebuild passed all 126 cases in the approved acceptance copy, plus source review and native consumer/build/browser checks. It is not yet broadly battle-tested. Version `0.0.2` is experimental and MIT-licensed.
6
6
 
7
7
  ```ts
8
8
  import {
@@ -32,6 +32,10 @@ Paths are decoded authored text. `$id` consumes one logical value (repeated loca
32
32
 
33
33
  Route membership is per physical package instance. Routes and owned containers are shallow-frozen; application codecs, callbacks/providers and opaque values retain identity and are not recursively frozen. `Route<Path, Params, Search, Resolvers = {}>` has readonly optional input/data witnesses. Callback inputs infer effective params/search, except matching guards see only local positional params. Local data unwraps Promise/Observable outputs and excludes RedirectCommand.
34
34
 
35
+ - [Public contract](SPEC.md)
36
+ - [Consumer example](../../examples/angular-router/)
37
+ - [Handwritten SSR/hydration proof](../../examples/angular-router/ssr-proof/README.md)
38
+
35
39
  ## Commands
36
40
 
37
41
  Prerequisites: Node 24.21.0, pnpm 12.9.1, ordinary workspace installation. Run installation from the workspace with `pnpm_config_pm_on_fail=error pnpm_config_verify_deps_before_run=error pnpm install --frozen-lockfile`.
@@ -43,11 +47,14 @@ pnpm run build # NodeNext tsc + native ng-packagr primary/_core/
43
47
  pnpm run check # no-fix source formatting/lint checks
44
48
  pnpm run typecheck # strict source check, no output
45
49
  pnpm run typecheck:consumers # strict NodeNext and ESNext/Bundler against actual APF
46
- pnpm run test:root # durable public-root runtime regressions; plain Node
50
+ pnpm run test # public-root runtime + published/generated documentation regressions
51
+ pnpm run test:root # public-root runtime regressions; plain Node
52
+ pnpm run test:docs # TSDoc coverage in published declarations and generated examples
47
53
  pnpm run test:application /absolute/task-owned/absent-evidence-directory
48
54
  pnpm run test:navigation /absolute/task-owned/absent-evidence-directory
49
55
  pnpm run test:lifecycle /absolute/task-owned/absent-evidence-directory
50
56
  pnpm run test:ssr /absolute/task-owned/absent-evidence-directory
57
+ pnpm run test:filesystem /absolute/task-owned/absent-evidence-directory
51
58
  node tests/packed.mjs /absolute/task-owned/fresh-evidence-directory
52
59
  ```
53
60
 
@@ -55,14 +62,14 @@ Build cleans/emits only package `node/`, then ng-packagr cleans/emits `dist/` an
55
62
 
56
63
  ## Authored application → native Angular
57
64
 
58
- The application installs `routes` from `generated/routes.generated.js` with native `provideRouter`. The companion targets in `consumer/angular.json` generate only exact-name marked artifacts and delegate directly to the official application/dev-server targets. Source candidates are native tsconfig roots intersected with configured scans; analysis never imports/evaluates app modules. Definitions/pages remain application-owned. `_generated` is internal generator coupling, not a supported graph API.
65
+ The application installs `routes` from `generated/routes.generated.js` with native `provideRouter`. The companion targets in `examples/angular-router/angular.json` generate only exact-name marked artifacts and delegate directly to the official application/dev-server targets. Source candidates are native tsconfig roots intersected with configured scans; analysis never imports/evaluates app modules. Definitions/pages remain application-owned. Each companion requires exactly one `scanDirectories` entry, including in explicit-authoring mode. `_generated` is internal generator coupling, not a supported graph API.
59
66
 
60
67
  From the workspace root, after package build:
61
68
 
62
69
  ```sh
63
- pnpm run consumer:build # development generation + official Angular build
64
- pnpm run consumer:check # read-only check:true before official Angular build
65
- pnpm run consumer:serve # ready watcher → generation → official dev-server
70
+ pnpm --filter @loozo/angular-router run example:build # generation + official Angular build
71
+ pnpm --filter @loozo/angular-router run example:check # read-only generation check + build
72
+ pnpm --filter @loozo/angular-router run example:serve # generation + official dev-server
66
73
  ```
67
74
 
68
75
  The colocated facade exports parameterless `injectRoute()` and an inert `destination`. Definition getters/reference construction avoid eager ESM binding reads. Normal lazy page imports are extensionless direct import promises; emitted `.js` is used only when native Bundler resolution needs it to preserve the discovered identity.
@@ -75,6 +82,28 @@ pnpm --filter @loozo/angular-router run test:application /absolute/task-owned/ab
75
82
 
76
83
  The evidence-directory argument is required and must not exist. This creates an owned consumer copy, checks concrete facade-factory provenance, literal module-reference preflight, native exact/wildcard ambient helpers, drift priority/nonwrites/byte-identical modes/nanosecond mtimes, and native watch/repair/stop. Its page.js.ts + named-only page.ts collision is built by real Angular and rendered in Chromium.
77
84
 
85
+ ## Opt-in filesystem definitions
86
+
87
+ Both companion targets accept `autoDefineRoutes: { filename?: string }`. Omit it for explicit authoring; `{}` enables editable `route.ts` seeds. A custom simple implementation `.ts` basename affects only new seeds: existing declarations are discovered by content/provenance, never renamed by this option. Declaration/generated filenames cannot collide.
88
+
89
+ ```json
90
+ {
91
+ "tsconfig": "tsconfig.routes.json",
92
+ "scanDirectories": ["src/routes"],
93
+ "outDirectory": "generated",
94
+ "delegateTarget": "proof:official",
95
+ "autoDefineRoutes": {}
96
+ }
97
+ ```
98
+
99
+ The scan root has path `""`. Plain directories contribute their basename, `+layout` contributes `""`, and `-helpers` is transparent (no record; descendants attach to the nearest included ancestor). Admitted pages/declarations and necessary included ancestors participate; unused helper/empty directories do not. Transparent directories cannot own pages or declarations with behavior. Editable files are never automatically deleted.
100
+
101
+ Seeds use ordinary `defineRoute`, default-imported parents and local `stringParam` codecs (per element for `$parts[]`). Moves/renames synchronize only the path literal, parent field/import and unambiguous local-param keys. An inline one-param rename preserves its exact codec expression. Opaque/ambiguous codec changes and stale parent imports with unrelated uses fail rather than guessing; callback/navigation input accesses are not renamed. All other authored expressions and bytes, including UTF-8 BOM and CRLF, are preserved; new static imports are appended at the complete module EOF boundary, retaining all existing statement/comment attachments, shebangs and triple-slash references. Native ESM import bindings are hoisted; new seed files still place their imports at the top. Removing an authored local codec requires explicit author repair. Parent imports/properties with directives in leading trivia, inside the removed syntax or in adjacent retained trivia up to the next actual token/EOF are not deleted: repair them explicitly before synchronization. This includes compiler-control pragmas (`@ts-check`/`@ts-nocheck`, triple-slash reference/AMD and JSX pragmas), which must not be activated by retaining a dormant comment at module start. Ordinary comments are retained when obsolete syntax is removed; adjacent trivia is validated only, never copied into the replacement or deleted.
102
+
103
+ The compiler overlays all planned seeds/patches and generated artifacts before publication. Native tsconfig membership/exclusions (including explicit files and wildcard includes through permitted external workspace-access aliases), source syntax/provenance, admitted declaration-file semantic diagnostics, tree/matching rules, application module references and filesystem/ownership checks must all pass before any source or generated write. Whole-program semantic, compiler option/global and Angular/template checks remain native build responsibilities: unrelated type errors may fail the delegate after valid source/generated changes have been published. `check: true` validates the same result, reports editable/generated drift and writes nothing. Byte-identical files retain nanosecond mtimes. Publication remains individual file writes, not a crash/concurrent-writer transaction. Alias substitution ends at the canonical workspace boundary: links inside it remain unsafe source/root suffixes even when they point back to the workspace itself.
104
+
105
+ `test:filesystem` uses fresh owned evidence, public Architect and native Angular builds/Chromium/dev-server to prove seeding, filename-independent discovery, structural moves, codec typing, conservative preflight nonwrites and watch/add/change/remove/repair/stop.
106
+
78
107
  ## Generated selection → native navigation
79
108
 
80
109
  ```ts
@@ -104,12 +133,12 @@ Each handle owns paired params/search visibility and independent local data, pro
104
133
 
105
134
  `test:lifecycle` uses actual Architect/Angular/Chromium and public Router/ApplicationRef/PendingTasks with asynchronous gates, a never-settling obsolete survivor, terminal-listener construction, own string/symbol data, nearest declaring-parent ancestry, injector destruction during task acquisition, same-URL skip reentry, iframe/host Promise guards/resolvers, and synchronous preserved-search failure with a later source rejection. Like the other public tests it requires a fresh absent evidence-directory argument.
106
135
 
107
- Full acceptance passed against the reviewed rebuild using the explicitly approved v2 copy. That copy corrects two fixture assumptions: an already-current native redirect resolves `false`, and the SSR route TypeScript program needs Node ambient types. Original inputs and earlier failed results remain preserved separately; this is not a claim that the unchanged original suite passed. The supplied handwritten home consumer remains unchanged.
136
+ The independent rebuild acceptance suite and its preserved results live outside this product repository. Full acceptance passed against the reviewed rebuild using the explicitly approved v2 copy. That copy corrects two fixture assumptions: an already-current native redirect resolves `false`, and the SSR route TypeScript program needs Node ambient types. Original inputs and earlier failed results remain preserved separately; this is not a claim that the unchanged original suite passed. The supplied handwritten home consumer remains unchanged.
108
137
 
109
138
  ## Native SSR and hydration proof
110
139
 
111
- `consumer/ssr-proof/` is a separate handwritten Angular application. Componentless team inputs, delayed item/score codecs (75 ms), local deterministic catalog resolution, a query/hash-dropping alias, and a resolver-free delayed handle page use genuine generated facades. Shared configuration uses native hydration with no HTTP transfer cache and no blocking initial navigation.
140
+ `examples/angular-router/ssr-proof/` is a separate handwritten Angular application. Componentless team inputs, delayed item/score codecs (75 ms), local deterministic catalog resolution, a query/hash-dropping alias, and a resolver-free delayed handle page use genuine generated facades. Shared configuration uses native hydration with no HTTP transfer cache and no blocking initial navigation.
112
141
 
113
142
  `test:ssr` copies that actual application into the required fresh absent evidence directory, runs ordinary Architect production builds and read-only generation checks, and checks strict native TypeScript/Angular templates. Built `AngularNodeAppEngine` + Node HTTP demonstrate native302, matched-position matrix isolation, concurrent request isolation and handle-only stability. Official dev-server + Chromium preserve exact original SSR document/element/text Nodes during hydration, then reuse the same component/DOM for typed alias and query-only SPA navigation. Native production metafile evidence checks browser closure and genuinely lazy page chunks. Servers/browser/Architect runs are stopped in `finally`; raw HTTP HTML/headers, logs, stats and observations remain inspectable.
114
143
 
115
- This is a bounded SSR/hydration proof, not cross-browser certification or exhaustive request/fault coverage. The Node entry is a loopback SSR HTTP proof server, not a production static-asset deployment server; use official companion serve for browser demonstration. See `consumer/ssr-proof/README.md`.
144
+ This is a bounded SSR/hydration proof, not cross-browser certification or exhaustive request/fault coverage. The Node entry is a loopback SSR HTTP proof server, not a production static-asset deployment server; use official companion serve for browser demonstration. See the [SSR proof README](../../examples/angular-router/ssr-proof/README.md).
@@ -10,6 +10,13 @@ function validateCodec(codec) {
10
10
  throw new TypeError("Codec must have callable parse and stringify methods");
11
11
  }
12
12
  }
13
+ /**
14
+ * Preserves strings verbatim, including empty strings and literal percent text.
15
+ *
16
+ * @remarks
17
+ * Empty, dot and dotdot values are valid codec values but cannot be serialized
18
+ * into path segments by URL creation. Search values may contain them.
19
+ */
13
20
  const stringParam = {
14
21
  parse(raw) {
15
22
  return raw;
@@ -21,6 +28,14 @@ const stringParam = {
21
28
  return value;
22
29
  },
23
30
  };
31
+ /**
32
+ * Parses nonblank text with JavaScript `Number` and requires a finite result.
33
+ *
34
+ * @remarks
35
+ * Whitespace around numbers, exponent notation and hexadecimal text are accepted.
36
+ * Blank text, NaN and infinities throw. Stringification requires a finite number
37
+ * and uses its JavaScript string representation (including `-0` becoming `"0"`).
38
+ */
24
39
  const numberParam = {
25
40
  parse(raw) {
26
41
  const value = Number(raw);
@@ -36,6 +51,10 @@ const numberParam = {
36
51
  return String(value);
37
52
  },
38
53
  };
54
+ /**
55
+ * Parses only lowercase `"true"` and `"false"`, and emits those same strings.
56
+ * Other representations and nonboolean values throw.
57
+ */
39
58
  const booleanParam = {
40
59
  parse(raw) {
41
60
  if (raw === "true") {
@@ -56,6 +75,20 @@ const booleanParam = {
56
75
  throw new Error("Expected a boolean");
57
76
  },
58
77
  };
78
+ /**
79
+ * Creates a case-sensitive string codec from a snapshotted list of members.
80
+ *
81
+ * @typeParam Values - The literal list from which the value union is inferred.
82
+ * @param values - Allowed decoded strings; an empty string is valid when listed.
83
+ * @returns A codec whose parser and stringifier reject nonmembers.
84
+ * @throws TypeError if the list or its entries are malformed.
85
+ *
86
+ * @example
87
+ * ```ts
88
+ * const tab = enumParam(["details", "reviews"]);
89
+ * tab.parse("reviews"); // "reviews"
90
+ * ```
91
+ */
59
92
  function enumParam(values) {
60
93
  if (!Array.isArray(values)) {
61
94
  throw new TypeError("Enum values must be a string list");
@@ -82,6 +115,21 @@ function enumParam(values) {
82
115
  },
83
116
  };
84
117
  }
118
+ /**
119
+ * Makes a search key optional without changing the handling of present values.
120
+ *
121
+ * @remarks
122
+ * Generated parsing omits absent keys; URL creation omits absent or `undefined`
123
+ * values. The wrapper's parser delegates present strings unchanged, preserving
124
+ * promises and failures. Its stringifier cannot serialize `undefined` directly.
125
+ * This wrapper is not a path codec. For optional nullable values, wrap
126
+ * {@link nullableSearchParam} with this function, not the other way around.
127
+ *
128
+ * @typeParam Value - The wrapped codec's logical value.
129
+ * @param codec - The codec used for present search values.
130
+ * @returns A search-only codec allowing omission.
131
+ * @throws TypeError if the codec lacks callable parse/stringify methods.
132
+ */
85
133
  function optionalSearchParam(codec) {
86
134
  validateCodec(codec);
87
135
  const wrapper = {
@@ -98,6 +146,26 @@ function optionalSearchParam(codec) {
98
146
  presence.set(wrapper, "optional");
99
147
  return wrapper;
100
148
  }
149
+ /**
150
+ * Adds explicit null to a search codec, represented by the decoded text `"null"`.
151
+ *
152
+ * @remarks
153
+ * The key remains required unless wrapped with {@link optionalSearchParam}.
154
+ * Non-null values delegate unchanged, including promise/failure identity. The
155
+ * text `"null"` is reserved by this wrapper even if the inner codec accepts it.
156
+ * This wrapper is not a path codec and cannot wrap an optional search codec.
157
+ *
158
+ * @typeParam Value - The wrapped codec's non-null logical value.
159
+ * @param codec - The codec used for values other than null.
160
+ * @returns A search-only codec accepting and serializing null.
161
+ * @throws TypeError if the codec is malformed or is an optional search wrapper.
162
+ *
163
+ * @example
164
+ * ```ts
165
+ * const score = optionalSearchParam(nullableSearchParam(numberParam));
166
+ * // Omission, null, and a present number remain distinct.
167
+ * ```
168
+ */
101
169
  function nullableSearchParam(codec) {
102
170
  validateCodec(codec);
103
171
  if (codecPresence(codec) === "optional") {
@@ -1 +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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"}
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":["/**\n * Converts one decoded path or search value to and from an application value.\n *\n * @remarks\n * Parsing may be asynchronous; stringification must be synchronous. Neither\n * method performs URL encoding. Codecs have no Angular injection-context\n * guarantee, and their returned objects are not recursively frozen.\n * For a terminal `$name[]` path, this codec applies to each element separately.\n *\n * @typeParam Value - The logical value, not a promise of that value.\n *\n * @example\n * ```ts\n * const dateParam: ParamCodec<Date> = {\n * parse: (raw) => new Date(raw),\n * stringify: (value) => value.toISOString(),\n * };\n * ```\n */\nexport interface ParamCodec<Value> {\n /**\n * Parses one already percent-decoded value; do not decode it again.\n *\n * @param raw - A single logical string from Angular's URL inputs.\n * @returns The logical value or a promise for it.\n * @throws An application error for invalid input; generated input parsing\n * reports throws and rejections as invalid path/search values with a cause.\n */\n parse(raw: string): Value | Promise<Value>;\n /**\n * Serializes one logical value without percent-encoding it.\n *\n * @param value - The application value to serialize.\n * @returns An unencoded string. Path output must not be empty, `.` or `..`.\n * @throws An application error when the value cannot be serialized.\n */\n stringify(value: Value): string;\n}\n\ndeclare const searchPresence: unique symbol;\n\n/** A search-only codec whose key may be omitted or supplied as `undefined`. */\nexport type OptionalCodec<Value> = ParamCodec<Value | undefined> & {\n readonly [searchPresence]: \"optional\";\n};\n/** A search-only codec that represents explicit `null` as the text `\"null\"`. */\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\n/**\n * Preserves strings verbatim, including empty strings and literal percent text.\n *\n * @remarks\n * Empty, dot and dotdot values are valid codec values but cannot be serialized\n * into path segments by URL creation. Search values may contain them.\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\n/**\n * Parses nonblank text with JavaScript `Number` and requires a finite result.\n *\n * @remarks\n * Whitespace around numbers, exponent notation and hexadecimal text are accepted.\n * Blank text, NaN and infinities throw. Stringification requires a finite number\n * and uses its JavaScript string representation (including `-0` becoming `\"0\"`).\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\n/**\n * Parses only lowercase `\"true\"` and `\"false\"`, and emits those same strings.\n * Other representations and nonboolean values throw.\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\n/**\n * Creates a case-sensitive string codec from a snapshotted list of members.\n *\n * @typeParam Values - The literal list from which the value union is inferred.\n * @param values - Allowed decoded strings; an empty string is valid when listed.\n * @returns A codec whose parser and stringifier reject nonmembers.\n * @throws TypeError if the list or its entries are malformed.\n *\n * @example\n * ```ts\n * const tab = enumParam([\"details\", \"reviews\"]);\n * tab.parse(\"reviews\"); // \"reviews\"\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\n/**\n * Makes a search key optional without changing the handling of present values.\n *\n * @remarks\n * Generated parsing omits absent keys; URL creation omits absent or `undefined`\n * values. The wrapper's parser delegates present strings unchanged, preserving\n * promises and failures. Its stringifier cannot serialize `undefined` directly.\n * This wrapper is not a path codec. For optional nullable values, wrap\n * {@link nullableSearchParam} with this function, not the other way around.\n *\n * @typeParam Value - The wrapped codec's logical value.\n * @param codec - The codec used for present search values.\n * @returns A search-only codec allowing omission.\n * @throws TypeError if the codec lacks callable parse/stringify methods.\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\n/**\n * Adds explicit null to a search codec, represented by the decoded text `\"null\"`.\n *\n * @remarks\n * The key remains required unless wrapped with {@link optionalSearchParam}.\n * Non-null values delegate unchanged, including promise/failure identity. The\n * text `\"null\"` is reserved by this wrapper even if the inner codec accepts it.\n * This wrapper is not a path codec and cannot wrap an optional search codec.\n *\n * @typeParam Value - The wrapped codec's non-null logical value.\n * @param codec - The codec used for values other than null.\n * @returns A search-only codec accepting and serializing null.\n * @throws TypeError if the codec is malformed or is an optional search wrapper.\n *\n * @example\n * ```ts\n * const score = optionalSearchParam(nullableSearchParam(numberParam));\n * // Omission, null, and a present number remain distinct.\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\n/**\n * Declares a nominal typed route without executing codecs or native callbacks.\n *\n * @remarks\n * Paths are decoded authored text, not URLs: use `\"\"` for root/pathless nodes,\n * `$name` for a scalar segment and terminal `$name[]` for a zero-or-more\n * catchall. Repeated local scalar names reuse one value. Leading/trailing or\n * repeated slashes, dot segments and Angular `:name`/wildcard notation are invalid.\n *\n * Parents compose effective params/search transitively, including through\n * pathless nodes. Children cannot redeclare ancestor-owned keys or have a\n * catchall parent. Fragment names belong only to this declaration.\n * The route and copied containers are shallow-frozen; application codecs,\n * callbacks, providers and opaque values retain identity and are not deep-frozen.\n *\n * For generation, author a direct default export of this call with a literal\n * path and inline config. Parent and redirect targets must be direct default\n * imports of admitted declarations. Angular owns activation and navigation;\n * declaration alone does not register a route with Angular.\n *\n * @param path - The literal local path, relative to the authored parent.\n * @param config - Local codecs, parent, fragments and supported native behavior.\n * Structural Angular options such as children, component and matcher are\n * generator-owned and cannot be overridden.\n * @returns A frozen route preserving inferred effective input and local data types.\n * @throws TypeError for invalid paths/configuration, missing or extra local\n * codecs, inherited key conflicts, or nongenuine parent/redirect routes.\n *\n * @example\n * ```ts\n * const product = defineRoute(\"products/$productId\", {\n * params: { productId: numberParam },\n * search: { tab: optionalSearchParam(enumParam([\"details\", \"reviews\"])) },\n * fragments: [\"summary\", \"reviews\"],\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\n/**\n * Synchronously serializes a route's explicit values into a root-relative URL.\n *\n * @remarks\n * Includes inherited path/search declarations, but only this route's fragment\n * names. Every effective path value and required search key must be supplied.\n * Optional-only search may be omitted; searchless/paramless routes forbid those\n * records. Catchalls require readonly arrays, including a valid empty array.\n * Values are never taken from a current navigation.\n *\n * Stringifies without calling parsers, guards, resolvers or redirects. Static\n * segments and logical values are component-encoded (also escaping parentheses),\n * so a dynamic slash becomes `%2F`. Search keys are globally sorted; optional\n * `undefined` values are omitted. An empty effective path produces `/`.\n * Redirect declarations serialize their source URL, not their redirect target.\n *\n * @param route - A genuine declaration from this physical package instance,\n * not a generated destination, spread/copy or structural lookalike.\n * @param values - Explicit destination-typed params, search and optional fragment.\n * Pass an empty object when the route needs no values.\n * @returns A root-relative URL string; this does not navigate or return a UrlTree.\n * @throws TypeError for invalid routes/records, missing or unknown keys,\n * undeclared fragments, nonarray catchalls, nonstring codec output, or empty/dot\n * path output. Application stringifier failures propagate unchanged.\n * @throws URIError for ill-formed Unicode in a serialized value.\n *\n * @example\n * ```ts\n * const product = defineRoute(\"products/$productId\", {\n * params: { productId: numberParam },\n * fragments: [\"summary\"],\n * });\n * createUrl(product, { params: { productId: 42 }, fragment: \"summary\" });\n * // /products/42#summary\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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"}