@nextera.one/anchor-routing-core 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.mts CHANGED
@@ -97,6 +97,33 @@ interface DecodedAnchorKey {
97
97
  key: string;
98
98
  pathTokens: string[];
99
99
  }
100
+ type AnchorRoutingCase = 'page' | 'param' | 'dot' | 'intent';
101
+ type AnchorRoutingMode = 'registry' | 'direct';
102
+ type AnchorEscapeMode = 'percent';
103
+ type AnchorRegistryVisibility = 'public' | 'private';
104
+ interface AnchorRoutingSyntax {
105
+ anchorPrefix?: string;
106
+ pageCaseSeparator?: string;
107
+ paramCaseSeparator?: string;
108
+ dotCaseSeparator?: string;
109
+ intentCaseBinding?: string;
110
+ }
111
+ interface AnchorRoutingDeclaration {
112
+ anchorRouting: number;
113
+ name?: string;
114
+ sdk?: string;
115
+ cases: AnchorRoutingCase[];
116
+ primaryCase?: AnchorRoutingCase;
117
+ routingMode?: AnchorRoutingMode;
118
+ internalAnchorRouting?: boolean;
119
+ publicSeoUrls?: boolean;
120
+ syntax?: AnchorRoutingSyntax;
121
+ escapeMode?: AnchorEscapeMode;
122
+ registryVisibility?: AnchorRegistryVisibility;
123
+ resolverEndpoint?: string;
124
+ docs?: string;
125
+ playground?: string;
126
+ }
100
127
 
101
128
  declare function buildPageAnchor(page: string, section: string): string;
102
129
  declare function buildParamAnchor(key: string, args?: string[]): string;
@@ -113,6 +140,18 @@ declare const SAFE_LITERAL_CHARACTER: RegExp;
113
140
  declare function isReservedAnchorCharacter(character: string): boolean;
114
141
  declare function isHexDigit(character: string): boolean;
115
142
 
143
+ declare function parseAnchorRoutingTxt(text: string): AnchorRoutingDeclaration;
144
+ declare function serializeAnchorRoutingTxt(declaration: AnchorRoutingDeclaration): string;
145
+ declare function parseAnchorRoutingJson(json: string): AnchorRoutingDeclaration;
146
+ declare function serializeAnchorRoutingJson(declaration: AnchorRoutingDeclaration, pretty?: boolean): string;
147
+ type AnchorRoutingDiscoveryResult = {
148
+ declaration: AnchorRoutingDeclaration;
149
+ source: string;
150
+ format: 'json' | 'txt';
151
+ } | null;
152
+ declare function discoverAnchorRouting(baseUrl: string, fetchFn?: typeof fetch): Promise<AnchorRoutingDiscoveryResult>;
153
+ declare function createDefaultDeclaration(overrides?: Partial<AnchorRoutingDeclaration>): AnchorRoutingDeclaration;
154
+
116
155
  declare function escapeAnchorValue(input: string): string;
117
156
  declare function validateEncodedToken(rawToken: string, rawInput: string, mode?: string): void;
118
157
  declare function decodeAnchorToken(rawToken: string, rawInput: string, mode?: string): string;
@@ -128,4 +167,4 @@ declare function resolveAnchor(input: string | AnchorRouteInstruction, registry?
128
167
 
129
168
  declare function validateAnchor(input: string | AnchorRouteInstruction, registry?: AnchorRegistry, options?: AnchorResolveOptions): AnchorValidationResult;
130
169
 
131
- export { ANCHOR_ERROR_CODES, ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, type AnchorBindingTarget, type AnchorDiagnostic, type AnchorErrorCode, type AnchorRegistry, type AnchorResolveOptions, type AnchorResolvedRoute, AnchorRouteError, type AnchorRouteInstruction, type AnchorRouteMode, type AnchorTargetDefinition, type AnchorValidationResult, DOT_SEPARATOR, type DecodedAnchorKey, type GlobalAnchorRegistry, type PageAnchorRegistry, RESERVED_ANCHOR_CHARACTERS, SAFE_LITERAL_CHARACTER, type UnknownNamedArgsMode, buildDotAnchor, buildIntentAnchor, buildPageAnchor, buildParamAnchor, createDiagnostic, decodeAnchorKey, decodeAnchorToken, escapeAnchorKey, escapeAnchorValue, isAnchorRoute, isAnchorRouteError, isHexDigit, isReservedAnchorCharacter, normalizeAnchor, parseAnchor, resolveAnchor, serializeAnchor, validateAnchor, validateEncodedToken };
170
+ export { ANCHOR_ERROR_CODES, ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, type AnchorBindingTarget, type AnchorDiagnostic, type AnchorErrorCode, type AnchorEscapeMode, type AnchorRegistry, type AnchorRegistryVisibility, type AnchorResolveOptions, type AnchorResolvedRoute, AnchorRouteError, type AnchorRouteInstruction, type AnchorRouteMode, type AnchorRoutingCase, type AnchorRoutingDeclaration, type AnchorRoutingDiscoveryResult, type AnchorRoutingMode, type AnchorRoutingSyntax, type AnchorTargetDefinition, type AnchorValidationResult, DOT_SEPARATOR, type DecodedAnchorKey, type GlobalAnchorRegistry, type PageAnchorRegistry, RESERVED_ANCHOR_CHARACTERS, SAFE_LITERAL_CHARACTER, type UnknownNamedArgsMode, buildDotAnchor, buildIntentAnchor, buildPageAnchor, buildParamAnchor, createDefaultDeclaration, createDiagnostic, decodeAnchorKey, decodeAnchorToken, discoverAnchorRouting, escapeAnchorKey, escapeAnchorValue, isAnchorRoute, isAnchorRouteError, isHexDigit, isReservedAnchorCharacter, normalizeAnchor, parseAnchor, parseAnchorRoutingJson, parseAnchorRoutingTxt, resolveAnchor, serializeAnchor, serializeAnchorRoutingJson, serializeAnchorRoutingTxt, validateAnchor, validateEncodedToken };
package/dist/index.d.ts CHANGED
@@ -97,6 +97,33 @@ interface DecodedAnchorKey {
97
97
  key: string;
98
98
  pathTokens: string[];
99
99
  }
100
+ type AnchorRoutingCase = 'page' | 'param' | 'dot' | 'intent';
101
+ type AnchorRoutingMode = 'registry' | 'direct';
102
+ type AnchorEscapeMode = 'percent';
103
+ type AnchorRegistryVisibility = 'public' | 'private';
104
+ interface AnchorRoutingSyntax {
105
+ anchorPrefix?: string;
106
+ pageCaseSeparator?: string;
107
+ paramCaseSeparator?: string;
108
+ dotCaseSeparator?: string;
109
+ intentCaseBinding?: string;
110
+ }
111
+ interface AnchorRoutingDeclaration {
112
+ anchorRouting: number;
113
+ name?: string;
114
+ sdk?: string;
115
+ cases: AnchorRoutingCase[];
116
+ primaryCase?: AnchorRoutingCase;
117
+ routingMode?: AnchorRoutingMode;
118
+ internalAnchorRouting?: boolean;
119
+ publicSeoUrls?: boolean;
120
+ syntax?: AnchorRoutingSyntax;
121
+ escapeMode?: AnchorEscapeMode;
122
+ registryVisibility?: AnchorRegistryVisibility;
123
+ resolverEndpoint?: string;
124
+ docs?: string;
125
+ playground?: string;
126
+ }
100
127
 
101
128
  declare function buildPageAnchor(page: string, section: string): string;
102
129
  declare function buildParamAnchor(key: string, args?: string[]): string;
@@ -113,6 +140,18 @@ declare const SAFE_LITERAL_CHARACTER: RegExp;
113
140
  declare function isReservedAnchorCharacter(character: string): boolean;
114
141
  declare function isHexDigit(character: string): boolean;
115
142
 
143
+ declare function parseAnchorRoutingTxt(text: string): AnchorRoutingDeclaration;
144
+ declare function serializeAnchorRoutingTxt(declaration: AnchorRoutingDeclaration): string;
145
+ declare function parseAnchorRoutingJson(json: string): AnchorRoutingDeclaration;
146
+ declare function serializeAnchorRoutingJson(declaration: AnchorRoutingDeclaration, pretty?: boolean): string;
147
+ type AnchorRoutingDiscoveryResult = {
148
+ declaration: AnchorRoutingDeclaration;
149
+ source: string;
150
+ format: 'json' | 'txt';
151
+ } | null;
152
+ declare function discoverAnchorRouting(baseUrl: string, fetchFn?: typeof fetch): Promise<AnchorRoutingDiscoveryResult>;
153
+ declare function createDefaultDeclaration(overrides?: Partial<AnchorRoutingDeclaration>): AnchorRoutingDeclaration;
154
+
116
155
  declare function escapeAnchorValue(input: string): string;
117
156
  declare function validateEncodedToken(rawToken: string, rawInput: string, mode?: string): void;
118
157
  declare function decodeAnchorToken(rawToken: string, rawInput: string, mode?: string): string;
@@ -128,4 +167,4 @@ declare function resolveAnchor(input: string | AnchorRouteInstruction, registry?
128
167
 
129
168
  declare function validateAnchor(input: string | AnchorRouteInstruction, registry?: AnchorRegistry, options?: AnchorResolveOptions): AnchorValidationResult;
130
169
 
131
- export { ANCHOR_ERROR_CODES, ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, type AnchorBindingTarget, type AnchorDiagnostic, type AnchorErrorCode, type AnchorRegistry, type AnchorResolveOptions, type AnchorResolvedRoute, AnchorRouteError, type AnchorRouteInstruction, type AnchorRouteMode, type AnchorTargetDefinition, type AnchorValidationResult, DOT_SEPARATOR, type DecodedAnchorKey, type GlobalAnchorRegistry, type PageAnchorRegistry, RESERVED_ANCHOR_CHARACTERS, SAFE_LITERAL_CHARACTER, type UnknownNamedArgsMode, buildDotAnchor, buildIntentAnchor, buildPageAnchor, buildParamAnchor, createDiagnostic, decodeAnchorKey, decodeAnchorToken, escapeAnchorKey, escapeAnchorValue, isAnchorRoute, isAnchorRouteError, isHexDigit, isReservedAnchorCharacter, normalizeAnchor, parseAnchor, resolveAnchor, serializeAnchor, validateAnchor, validateEncodedToken };
170
+ export { ANCHOR_ERROR_CODES, ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, type AnchorBindingTarget, type AnchorDiagnostic, type AnchorErrorCode, type AnchorEscapeMode, type AnchorRegistry, type AnchorRegistryVisibility, type AnchorResolveOptions, type AnchorResolvedRoute, AnchorRouteError, type AnchorRouteInstruction, type AnchorRouteMode, type AnchorRoutingCase, type AnchorRoutingDeclaration, type AnchorRoutingDiscoveryResult, type AnchorRoutingMode, type AnchorRoutingSyntax, type AnchorTargetDefinition, type AnchorValidationResult, DOT_SEPARATOR, type DecodedAnchorKey, type GlobalAnchorRegistry, type PageAnchorRegistry, RESERVED_ANCHOR_CHARACTERS, SAFE_LITERAL_CHARACTER, type UnknownNamedArgsMode, buildDotAnchor, buildIntentAnchor, buildPageAnchor, buildParamAnchor, createDefaultDeclaration, createDiagnostic, decodeAnchorKey, decodeAnchorToken, discoverAnchorRouting, escapeAnchorKey, escapeAnchorValue, isAnchorRoute, isAnchorRouteError, isHexDigit, isReservedAnchorCharacter, normalizeAnchor, parseAnchor, parseAnchorRoutingJson, parseAnchorRoutingTxt, resolveAnchor, serializeAnchor, serializeAnchorRoutingJson, serializeAnchorRoutingTxt, validateAnchor, validateEncodedToken };
package/dist/index.js CHANGED
@@ -32,9 +32,11 @@ __export(index_exports, {
32
32
  buildIntentAnchor: () => buildIntentAnchor,
33
33
  buildPageAnchor: () => buildPageAnchor,
34
34
  buildParamAnchor: () => buildParamAnchor,
35
+ createDefaultDeclaration: () => createDefaultDeclaration,
35
36
  createDiagnostic: () => createDiagnostic,
36
37
  decodeAnchorKey: () => decodeAnchorKey,
37
38
  decodeAnchorToken: () => decodeAnchorToken,
39
+ discoverAnchorRouting: () => discoverAnchorRouting,
38
40
  escapeAnchorKey: () => escapeAnchorKey,
39
41
  escapeAnchorValue: () => escapeAnchorValue,
40
42
  isAnchorRoute: () => isAnchorRoute,
@@ -43,8 +45,12 @@ __export(index_exports, {
43
45
  isReservedAnchorCharacter: () => isReservedAnchorCharacter,
44
46
  normalizeAnchor: () => normalizeAnchor,
45
47
  parseAnchor: () => parseAnchor,
48
+ parseAnchorRoutingJson: () => parseAnchorRoutingJson,
49
+ parseAnchorRoutingTxt: () => parseAnchorRoutingTxt,
46
50
  resolveAnchor: () => resolveAnchor,
47
51
  serializeAnchor: () => serializeAnchor,
52
+ serializeAnchorRoutingJson: () => serializeAnchorRoutingJson,
53
+ serializeAnchorRoutingTxt: () => serializeAnchorRoutingTxt,
48
54
  validateAnchor: () => validateAnchor,
49
55
  validateEncodedToken: () => validateEncodedToken
50
56
  });
@@ -286,6 +292,173 @@ function serializeAnchor(instruction) {
286
292
  }
287
293
  }
288
294
 
295
+ // src/declaration.ts
296
+ var TEXT_TO_JSON = {
297
+ "Anchor-Routing": "anchorRouting",
298
+ "Name": "name",
299
+ "SDK": "sdk",
300
+ "Cases": "cases",
301
+ "Primary-Case": "primaryCase",
302
+ "Routing-Mode": "routingMode",
303
+ "Internal-Anchor-Routing": "internalAnchorRouting",
304
+ "Public-SEO-URLs": "publicSeoUrls",
305
+ "Anchor-Prefix": "syntax.anchorPrefix",
306
+ "Page-Case-Separator": "syntax.pageCaseSeparator",
307
+ "Param-Case-Separator": "syntax.paramCaseSeparator",
308
+ "Dot-Case-Separator": "syntax.dotCaseSeparator",
309
+ "Intent-Case-Binding": "syntax.intentCaseBinding",
310
+ "Escape-Mode": "escapeMode",
311
+ "Registry-Visibility": "registryVisibility",
312
+ "Resolver-Endpoint": "resolverEndpoint",
313
+ "Docs": "docs",
314
+ "Playground": "playground"
315
+ };
316
+ var JSON_TO_TEXT = {};
317
+ for (const [text, json] of Object.entries(TEXT_TO_JSON)) {
318
+ JSON_TO_TEXT[json] = text;
319
+ }
320
+ var VALID_CASES = /* @__PURE__ */ new Set(["page", "param", "dot", "intent"]);
321
+ function parseAnchorRoutingTxt(text) {
322
+ const result = {};
323
+ const syntax = {};
324
+ for (const raw of text.split("\n")) {
325
+ const line = raw.trim();
326
+ if (!line || line.startsWith("#")) continue;
327
+ const colonIndex = line.indexOf(":");
328
+ if (colonIndex === -1) continue;
329
+ const field = line.slice(0, colonIndex).trim();
330
+ const value = line.slice(colonIndex + 1).trim();
331
+ if (!value) continue;
332
+ const jsonKey = TEXT_TO_JSON[field];
333
+ if (!jsonKey) continue;
334
+ if (jsonKey.startsWith("syntax.")) {
335
+ syntax[jsonKey.slice(7)] = value;
336
+ } else if (jsonKey === "anchorRouting") {
337
+ result.anchorRouting = parseInt(value, 10);
338
+ } else if (jsonKey === "cases") {
339
+ result.cases = value.split(",").map((c) => c.trim()).filter((c) => VALID_CASES.has(c));
340
+ } else if (jsonKey === "internalAnchorRouting" || jsonKey === "publicSeoUrls") {
341
+ result[jsonKey] = value === "true";
342
+ } else {
343
+ result[jsonKey] = value;
344
+ }
345
+ }
346
+ if (Object.keys(syntax).length > 0) {
347
+ result.syntax = syntax;
348
+ }
349
+ if (result.anchorRouting == null) {
350
+ result.anchorRouting = 1;
351
+ }
352
+ if (!result.cases) {
353
+ result.cases = [];
354
+ }
355
+ return result;
356
+ }
357
+ var TEXT_FIELD_ORDER = [
358
+ "Anchor-Routing",
359
+ "Name",
360
+ "SDK",
361
+ "Cases",
362
+ "Primary-Case",
363
+ "Routing-Mode",
364
+ "Internal-Anchor-Routing",
365
+ "Public-SEO-URLs",
366
+ "Anchor-Prefix",
367
+ "Page-Case-Separator",
368
+ "Param-Case-Separator",
369
+ "Dot-Case-Separator",
370
+ "Intent-Case-Binding",
371
+ "Escape-Mode",
372
+ "Registry-Visibility",
373
+ "Resolver-Endpoint",
374
+ "Docs",
375
+ "Playground"
376
+ ];
377
+ function serializeAnchorRoutingTxt(declaration) {
378
+ const lines = [];
379
+ for (const field of TEXT_FIELD_ORDER) {
380
+ const jsonKey = TEXT_TO_JSON[field];
381
+ if (!jsonKey) continue;
382
+ let value;
383
+ if (jsonKey.startsWith("syntax.")) {
384
+ const syntaxField = jsonKey.slice(7);
385
+ value = declaration.syntax?.[syntaxField];
386
+ } else {
387
+ value = declaration[jsonKey];
388
+ }
389
+ if (value == null) continue;
390
+ if (jsonKey === "cases" && Array.isArray(value)) {
391
+ lines.push(`${field}: ${value.join(",")}`);
392
+ } else if (typeof value === "boolean") {
393
+ lines.push(`${field}: ${value}`);
394
+ } else {
395
+ lines.push(`${field}: ${value}`);
396
+ }
397
+ }
398
+ return lines.join("\n") + "\n";
399
+ }
400
+ function parseAnchorRoutingJson(json) {
401
+ const data = JSON.parse(json);
402
+ if (typeof data.anchorRouting !== "number") {
403
+ data.anchorRouting = 1;
404
+ }
405
+ if (!Array.isArray(data.cases)) {
406
+ data.cases = [];
407
+ } else {
408
+ data.cases = data.cases.filter((c) => VALID_CASES.has(c));
409
+ }
410
+ return data;
411
+ }
412
+ function serializeAnchorRoutingJson(declaration, pretty = true) {
413
+ return JSON.stringify(declaration, null, pretty ? 2 : void 0) + "\n";
414
+ }
415
+ var DISCOVERY_PATHS = [
416
+ "/.well-known/anchor-routing.json",
417
+ "/.well-known/anchor-routing.txt",
418
+ "/ar.txt"
419
+ ];
420
+ async function discoverAnchorRouting(baseUrl, fetchFn = globalThis.fetch) {
421
+ const base = baseUrl.replace(/\/+$/, "");
422
+ for (const path of DISCOVERY_PATHS) {
423
+ const url = base + path;
424
+ try {
425
+ const response = await fetchFn(url, {
426
+ method: "GET",
427
+ headers: { Accept: "application/json, text/plain" }
428
+ });
429
+ if (!response.ok) continue;
430
+ const text = await response.text();
431
+ if (!text.trim()) continue;
432
+ const isJson = path.endsWith(".json");
433
+ return {
434
+ declaration: isJson ? parseAnchorRoutingJson(text) : parseAnchorRoutingTxt(text),
435
+ source: url,
436
+ format: isJson ? "json" : "txt"
437
+ };
438
+ } catch {
439
+ continue;
440
+ }
441
+ }
442
+ return null;
443
+ }
444
+ function createDefaultDeclaration(overrides = {}) {
445
+ return {
446
+ anchorRouting: 1,
447
+ cases: ["page", "param", "dot", "intent"],
448
+ routingMode: "registry",
449
+ escapeMode: "percent",
450
+ registryVisibility: "private",
451
+ syntax: {
452
+ anchorPrefix: "/~",
453
+ pageCaseSeparator: "~",
454
+ paramCaseSeparator: ";",
455
+ dotCaseSeparator: ".",
456
+ intentCaseBinding: "name.value"
457
+ },
458
+ ...overrides
459
+ };
460
+ }
461
+
289
462
  // src/normalize.ts
290
463
  function normalizeAnchor(input) {
291
464
  const raw = String(input ?? "").trim();
@@ -807,9 +980,11 @@ function resolveAnchor(input, registry = {}, options = {}) {
807
980
  buildIntentAnchor,
808
981
  buildPageAnchor,
809
982
  buildParamAnchor,
983
+ createDefaultDeclaration,
810
984
  createDiagnostic,
811
985
  decodeAnchorKey,
812
986
  decodeAnchorToken,
987
+ discoverAnchorRouting,
813
988
  escapeAnchorKey,
814
989
  escapeAnchorValue,
815
990
  isAnchorRoute,
@@ -818,8 +993,12 @@ function resolveAnchor(input, registry = {}, options = {}) {
818
993
  isReservedAnchorCharacter,
819
994
  normalizeAnchor,
820
995
  parseAnchor,
996
+ parseAnchorRoutingJson,
997
+ parseAnchorRoutingTxt,
821
998
  resolveAnchor,
822
999
  serializeAnchor,
1000
+ serializeAnchorRoutingJson,
1001
+ serializeAnchorRoutingTxt,
823
1002
  validateAnchor,
824
1003
  validateEncodedToken
825
1004
  });
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/errors.ts","../src/escape.ts","../src/builders.ts","../src/normalize.ts","../src/parser.ts","../src/validate.ts","../src/resolve.ts"],"sourcesContent":["export * from './builders';\nexport * from './constants';\nexport * from './errors';\nexport * from './escape';\nexport * from './normalize';\nexport * from './parser';\nexport * from './resolve';\nexport * from './types';\nexport * from './validate';","export const ANCHOR_PATH_PREFIX = '/~';\nexport const ARG_SEPARATOR = ';';\nexport const ANCHOR_SEPARATOR = '~';\nexport const DOT_SEPARATOR = '.';\n\nexport const RESERVED_ANCHOR_CHARACTERS = ['/', '~', ';', '.', '=', '@', '#', '%'] as const;\n\nconst reservedAnchorCharacterSet = new Set<string>(RESERVED_ANCHOR_CHARACTERS);\n\nexport const SAFE_LITERAL_CHARACTER = /^[A-Za-z0-9_-]$/;\n\nexport function isReservedAnchorCharacter(character: string): boolean {\n return reservedAnchorCharacterSet.has(character);\n}\n\nexport function isHexDigit(character: string): boolean {\n return /^[0-9A-Fa-f]$/.test(character);\n}","export const ANCHOR_ERROR_CODES = {\n ANCHOR_PARSE_EMPTY_INPUT: 'ANCHOR_PARSE_EMPTY_INPUT',\n ANCHOR_PARSE_INVALID_FORMAT: 'ANCHOR_PARSE_INVALID_FORMAT',\n ANCHOR_PARSE_EMPTY_PAGE: 'ANCHOR_PARSE_EMPTY_PAGE',\n ANCHOR_PARSE_EMPTY_SECTION: 'ANCHOR_PARSE_EMPTY_SECTION',\n ANCHOR_PARSE_EMPTY_KEY: 'ANCHOR_PARSE_EMPTY_KEY',\n ANCHOR_PARSE_INVALID_DOT_KEY: 'ANCHOR_PARSE_INVALID_DOT_KEY',\n ANCHOR_PARSE_INVALID_INTENT_PAIR: 'ANCHOR_PARSE_INVALID_INTENT_PAIR',\n ANCHOR_PARSE_DUPLICATE_NAMED_ARG: 'ANCHOR_PARSE_DUPLICATE_NAMED_ARG',\n ANCHOR_ESCAPE_INVALID_SEQUENCE: 'ANCHOR_ESCAPE_INVALID_SEQUENCE',\n ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR: 'ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR',\n ANCHOR_VALIDATE_TOO_MANY_ARGS: 'ANCHOR_VALIDATE_TOO_MANY_ARGS',\n ANCHOR_RESOLVE_PAGE_NOT_FOUND: 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n ANCHOR_RESOLVE_SECTION_NOT_FOUND: 'ANCHOR_RESOLVE_SECTION_NOT_FOUND',\n ANCHOR_RESOLVE_KEY_NOT_FOUND: 'ANCHOR_RESOLVE_KEY_NOT_FOUND',\n ANCHOR_RESOLVE_BINDING_MISSING_ARG: 'ANCHOR_RESOLVE_BINDING_MISSING_ARG',\n ANCHOR_RESOLVE_INVALID_NAMED_ARG: 'ANCHOR_RESOLVE_INVALID_NAMED_ARG',\n} as const;\n\nexport type AnchorErrorCode = (typeof ANCHOR_ERROR_CODES)[keyof typeof ANCHOR_ERROR_CODES];\n\nexport interface AnchorDiagnostic {\n code: AnchorErrorCode;\n message: string;\n raw: string;\n mode?: string;\n}\n\nexport class AnchorRouteError extends Error {\n readonly code: AnchorErrorCode;\n readonly raw: string;\n readonly mode?: string;\n\n constructor(code: AnchorErrorCode, message: string, raw: string, mode?: string) {\n super(message);\n this.name = 'AnchorRouteError';\n this.code = code;\n this.raw = raw;\n this.mode = mode;\n }\n\n toDiagnostic(): AnchorDiagnostic {\n return {\n code: this.code,\n message: this.message,\n raw: this.raw,\n mode: this.mode,\n };\n }\n}\n\nexport function createDiagnostic(\n code: AnchorErrorCode,\n message: string,\n raw: string,\n mode?: string,\n): AnchorDiagnostic {\n return { code, message, raw, mode };\n}\n\nexport function isAnchorRouteError(error: unknown): error is AnchorRouteError {\n return error instanceof AnchorRouteError;\n}","import { DOT_SEPARATOR, SAFE_LITERAL_CHARACTER, isHexDigit, isReservedAnchorCharacter } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport type { DecodedAnchorKey } from './types';\n\nconst encoder = new TextEncoder();\n\nfunction encodeCharacter(character: string): string {\n return Array.from(encoder.encode(character))\n .map((byte) => `%${byte.toString(16).toUpperCase().padStart(2, '0')}`)\n .join('');\n}\n\nexport function escapeAnchorValue(input: string): string {\n const value = String(input ?? '');\n let output = '';\n\n for (const character of value) {\n output += SAFE_LITERAL_CHARACTER.test(character) ? character : encodeCharacter(character);\n }\n\n return output;\n}\n\nexport function validateEncodedToken(rawToken: string, rawInput: string, mode?: string): void {\n for (let index = 0; index < rawToken.length; index += 1) {\n const character = rawToken[index];\n\n if (character === '%') {\n const high = rawToken[index + 1];\n const low = rawToken[index + 2];\n\n if (!high || !low || !isHexDigit(high) || !isHexDigit(low)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n\n index += 2;\n continue;\n }\n\n if (isReservedAnchorCharacter(character)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR,\n `Reserved character \"${character}\" must be percent-encoded inside anchor values.`,\n rawInput,\n mode,\n );\n }\n }\n}\n\nexport function decodeAnchorToken(rawToken: string, rawInput: string, mode?: string): string {\n validateEncodedToken(rawToken, rawInput, mode);\n\n try {\n return decodeURIComponent(rawToken);\n } catch {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n}\n\nexport function decodeAnchorKey(rawKey: string, rawInput: string, mode?: string): DecodedAnchorKey {\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawInput,\n mode,\n );\n }\n\n const rawSegments = rawKey.split(DOT_SEPARATOR);\n\n if (rawSegments.some((segment) => segment.length === 0)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawInput,\n mode,\n );\n }\n\n const pathTokens = rawSegments.map((segment) => {\n const decoded = decodeAnchorToken(segment, rawInput, mode);\n\n if (decoded.includes(DOT_SEPARATOR)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key segment \"${decoded}\" must not decode to another dot separator.`,\n rawInput,\n mode,\n );\n }\n\n return decoded;\n });\n\n return {\n key: pathTokens.join(DOT_SEPARATOR),\n pathTokens,\n };\n}\n\nexport function escapeAnchorKey(input: string): string {\n const rawKey = String(input ?? '').trim();\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawKey,\n );\n }\n\n const segments = rawKey.split(DOT_SEPARATOR).map((segment) => segment.trim());\n\n if (segments.some((segment) => !segment)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawKey,\n );\n }\n\n return segments.map((segment) => escapeAnchorValue(segment)).join(DOT_SEPARATOR);\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError, type AnchorErrorCode } from './errors';\nimport { escapeAnchorKey, escapeAnchorValue } from './escape';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction requireValue(value: string, code: AnchorErrorCode, message: string): string {\n const trimmed = String(value ?? '').trim();\n\n if (!trimmed) {\n throw new AnchorRouteError(code, message, String(value ?? ''));\n }\n\n return trimmed;\n}\n\nexport function buildPageAnchor(page: string, section: string): string {\n const safePage = escapeAnchorValue(requireValue(page, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page value cannot be empty.'));\n const safeSection = escapeAnchorValue(\n requireValue(section, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Section value cannot be empty.'),\n );\n\n return `/${safePage}${ANCHOR_SEPARATOR}${safeSection}`;\n}\n\nexport function buildParamAnchor(key: string, args: string[] = []): string {\n const safeKey = escapeAnchorKey(key);\n const encodedArgs = args.map((argument) => escapeAnchorValue(String(argument ?? '')));\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedArgs.map((argument) => `${ARG_SEPARATOR}${argument}`).join('')}`;\n}\n\nexport function buildDotAnchor(tokens: string[]): string {\n if (!Array.isArray(tokens) || tokens.length === 0) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n 'Dot case requires at least one token.',\n String(tokens ?? ''),\n );\n }\n\n const key = tokens.map((token) => requireValue(token, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY, 'Dot token cannot be empty.')).join(DOT_SEPARATOR);\n return `${ANCHOR_PATH_PREFIX}${escapeAnchorKey(key)}`;\n}\n\nexport function buildIntentAnchor(key: string, namedArgs: Record<string, string>): string {\n const safeKey = escapeAnchorKey(key);\n const pairs = Object.entries(namedArgs ?? {});\n\n if (pairs.length === 0) {\n return `${ANCHOR_PATH_PREFIX}${safeKey}`;\n }\n\n const encodedPairs = pairs.map(([name, value]) => {\n const safeName = escapeAnchorValue(\n requireValue(name, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, 'Intent argument name cannot be empty.'),\n );\n const safeValue = escapeAnchorValue(\n requireValue(value, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, `Intent argument \"${name}\" cannot be empty.`),\n );\n return `${ARG_SEPARATOR}${safeName}${DOT_SEPARATOR}${safeValue}`;\n });\n\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedPairs.join('')}`;\n}\n\nexport function serializeAnchor(instruction: AnchorRouteInstruction): string {\n switch (instruction.mode) {\n case 'page':\n return buildPageAnchor(instruction.page ?? '', instruction.section ?? '');\n case 'param':\n return buildParamAnchor(instruction.key ?? '', instruction.args ?? []);\n case 'dot':\n return buildDotAnchor(instruction.pathTokens ?? (instruction.key ? instruction.key.split(DOT_SEPARATOR) : []));\n case 'intent':\n return buildIntentAnchor(instruction.key ?? '', instruction.namedArgs ?? {});\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported anchor route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n}","export function normalizeAnchor(input: string): string {\n const raw = String(input ?? '').trim();\n\n if (!raw) {\n return '';\n }\n\n let normalized = raw;\n\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:\\/\\//.test(normalized)) {\n try {\n const url = new URL(normalized);\n normalized = url.pathname || '/';\n } catch {\n normalized = raw;\n }\n }\n\n const suffixIndex = normalized.search(/[?#]/);\n if (suffixIndex >= 0) {\n normalized = normalized.slice(0, suffixIndex);\n }\n\n if (!normalized.startsWith('/')) {\n normalized = `/${normalized}`;\n }\n\n normalized = normalized.replace(/\\/{2,}/g, '/');\n\n if (normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport { decodeAnchorKey, decodeAnchorToken } from './escape';\nimport { normalizeAnchor } from './normalize';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction parsePageRoute(normalized: string): AnchorRouteInstruction {\n const body = normalized.slice(1);\n\n if (body.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must use a single path segment in the form /page~section.',\n normalized,\n 'page',\n );\n }\n\n const parts = body.split(ANCHOR_SEPARATOR);\n\n if (parts.length !== 2) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must contain exactly one ~ separator.',\n normalized,\n 'page',\n );\n }\n\n const [rawPage, rawSection] = parts;\n\n if (!rawPage) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE,\n 'Page Case requires a non-empty page value.',\n normalized,\n 'page',\n );\n }\n\n if (!rawSection) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION,\n 'Page Case requires a non-empty section value.',\n normalized,\n 'page',\n );\n }\n\n return {\n mode: 'page',\n raw: normalized,\n page: decodeAnchorToken(rawPage, normalized, 'page'),\n section: decodeAnchorToken(rawSection, normalized, 'page'),\n };\n}\n\nfunction parseDotRoute(normalized: string, rawKey: string): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'dot');\n\n return {\n mode: 'dot',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n };\n}\n\nfunction parseParamRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'param');\n const args = payload.map((rawArgument) => {\n if (!rawArgument) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Param Case does not allow empty positional arguments.',\n normalized,\n 'param',\n );\n }\n\n return decodeAnchorToken(rawArgument, normalized, 'param');\n });\n\n return {\n mode: 'param',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n args,\n };\n}\n\nfunction parseIntentRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'intent');\n const namedArgs: Record<string, string> = {};\n\n for (const rawPair of payload) {\n const separatorIndex = rawPair.indexOf(DOT_SEPARATOR);\n\n if (separatorIndex <= 0 || separatorIndex === rawPair.length - 1) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n `Intent Case pair \"${rawPair}\" must use the form name.value.`,\n normalized,\n 'intent',\n );\n }\n\n const rawName = rawPair.slice(0, separatorIndex);\n const rawValue = rawPair.slice(separatorIndex + 1);\n const name = decodeAnchorToken(rawName, normalized, 'intent');\n const value = decodeAnchorToken(rawValue, normalized, 'intent');\n\n if (Object.prototype.hasOwnProperty.call(namedArgs, name)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_DUPLICATE_NAMED_ARG,\n `Intent Case contains duplicate named argument \"${name}\".`,\n normalized,\n 'intent',\n );\n }\n\n namedArgs[name] = value;\n }\n\n return {\n mode: 'intent',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n namedArgs,\n };\n}\n\nexport function parseAnchor(input: string): AnchorRouteInstruction {\n const normalized = normalizeAnchor(input);\n\n if (!normalized) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_INPUT,\n 'Anchor route input cannot be empty.',\n String(input ?? ''),\n );\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX) && normalized.includes(ANCHOR_SEPARATOR)) {\n return parsePageRoute(normalized);\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Input is not an Anchor Route.',\n normalized,\n );\n }\n\n const capsuleBody = normalized.slice(ANCHOR_PATH_PREFIX.length);\n\n if (!capsuleBody || capsuleBody.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Capsule cases must use the form /~key or /~key;payload.',\n normalized,\n );\n }\n\n const [rawKey, ...payload] = capsuleBody.split(ARG_SEPARATOR);\n\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Capsule cases require a non-empty route key.',\n normalized,\n );\n }\n\n if (payload.length === 0) {\n if (rawKey.includes(DOT_SEPARATOR)) {\n return parseDotRoute(normalized, rawKey);\n }\n\n return parseParamRoute(normalized, rawKey, []);\n }\n\n const payloadHasDot = payload.some((segment) => segment.includes(DOT_SEPARATOR));\n const payloadAllNamedPairs = payload.every((segment) => {\n const dotIndex = segment.indexOf(DOT_SEPARATOR);\n return dotIndex > 0 && dotIndex < segment.length - 1 && segment.indexOf(DOT_SEPARATOR, dotIndex + 1) === -1;\n });\n\n if (payloadHasDot) {\n if (!payloadAllNamedPairs) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n 'Intent Case payload must use only name.value pairs.',\n normalized,\n 'intent',\n );\n }\n\n return parseIntentRoute(normalized, rawKey, payload);\n }\n\n return parseParamRoute(normalized, rawKey, payload);\n}\n\nexport function isAnchorRoute(input: string): boolean {\n try {\n parseAnchor(input);\n return true;\n } catch {\n return false;\n }\n}","import { ANCHOR_ERROR_CODES, AnchorRouteError, createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport type { AnchorResolveOptions, AnchorRegistry, AnchorRouteInstruction, AnchorValidationResult } from './types';\n\nfunction highestPositionalIndex(instruction: AnchorRouteInstruction, registry?: AnchorRegistry): number {\n if (instruction.mode !== 'param' || !instruction.key) {\n return -1;\n }\n\n const definition = registry?.global?.[instruction.key];\n if (!definition?.positionalBind) {\n return -1;\n }\n\n return Math.max(...Object.values(definition.positionalBind), -1);\n}\n\nexport function validateAnchor(\n input: string | AnchorRouteInstruction,\n registry?: AnchorRegistry,\n options: AnchorResolveOptions = {},\n): AnchorValidationResult {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return { valid: false, errors: [error.toDiagnostic()] };\n }\n\n throw error;\n }\n\n const errors = [] as AnchorValidationResult['errors'];\n\n switch (instruction.mode) {\n case 'page': {\n if (!instruction.page) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page Case requires a page value.', instruction.raw, 'page'));\n }\n\n if (!instruction.section) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Page Case requires a section value.', instruction.raw, 'page'));\n }\n\n if (instruction.page && registry?.pages && !registry.pages[instruction.page]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_PAGE_NOT_FOUND,\n `No page registry entry exists for \"${instruction.page}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n if (instruction.page && instruction.section && registry?.pages?.[instruction.page] && !registry.pages[instruction.page][instruction.section]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_SECTION_NOT_FOUND,\n `No page section registry entry exists for \"${instruction.page}~${instruction.section}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n break;\n }\n case 'param': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n const requiredCount = definition?.requiredPositionalCount ?? highestPositionalIndex(instruction, registry) + 1;\n\n if ((instruction.args?.length ?? 0) < requiredCount) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Param Case key \"${instruction.key}\" expects at least ${requiredCount} positional arguments.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n if (options.maxArgs != null && (instruction.args?.length ?? 0) > options.maxArgs) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_TOO_MANY_ARGS,\n `Param Case exceeds the maximum allowed positional argument count of ${options.maxArgs}.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n break;\n }\n case 'dot': {\n if (instruction.key && registry?.global && !registry.global[instruction.key]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'dot',\n ),\n );\n }\n\n break;\n }\n case 'intent': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n break;\n }\n\n const requiredNames = definition?.requiredNamedArgs ?? Object.values(definition?.namedBind ?? {});\n for (const requiredName of requiredNames) {\n if (!instruction.namedArgs || !Object.prototype.hasOwnProperty.call(instruction.namedArgs, requiredName)) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Intent Case key \"${instruction.key}\" requires named argument \"${requiredName}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n\n if (definition?.namedBind && instruction.namedArgs) {\n const allowedNames = new Set(Object.values(definition.namedBind));\n for (const name of Object.keys(instruction.namedArgs)) {\n if (!allowedNames.has(name) && (options.unknownNamedArgs ?? 'reject') === 'reject') {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_INVALID_NAMED_ARG,\n `Intent Case key \"${instruction.key}\" does not allow named argument \"${name}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n }\n\n break;\n }\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n\n return {\n valid: errors.length === 0,\n instruction,\n errors,\n };\n}","import { createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport { validateAnchor } from './validate';\nimport type {\n AnchorBindingTarget,\n AnchorResolveOptions,\n AnchorRegistry,\n AnchorResolvedRoute,\n AnchorRouteInstruction,\n AnchorTargetDefinition,\n} from './types';\n\nfunction pickBindingTarget(definition: AnchorTargetDefinition, field: string): AnchorBindingTarget {\n return definition.bindingTargets?.[field] ?? 'params';\n}\n\nfunction assignBoundValue(\n field: string,\n value: string,\n definition: AnchorTargetDefinition,\n params: Record<string, string>,\n query: Record<string, string>,\n): void {\n if (pickBindingTarget(definition, field) === 'query') {\n query[field] = value;\n return;\n }\n\n params[field] = value;\n}\n\nfunction buildResolvedRoute(\n instruction: AnchorRouteInstruction,\n definition: AnchorTargetDefinition,\n extraMeta: Record<string, unknown> = {},\n): AnchorResolvedRoute {\n const params = { ...(definition.defaultParams ?? {}) };\n const query = { ...(definition.defaultQuery ?? {}) };\n\n if (instruction.mode === 'param' && definition.positionalBind) {\n for (const [field, index] of Object.entries(definition.positionalBind)) {\n const value = instruction.args?.[index];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n if (instruction.mode === 'intent' && definition.namedBind) {\n for (const [field, sourceName] of Object.entries(definition.namedBind)) {\n const value = instruction.namedArgs?.[sourceName];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n return {\n success: true,\n mode: instruction.mode,\n raw: instruction.raw,\n name: definition.name,\n path: definition.path,\n params: Object.keys(params).length > 0 ? params : undefined,\n query: Object.keys(query).length > 0 ? query : undefined,\n hash: definition.hash,\n title: definition.title,\n permissions: definition.permissions,\n meta: {\n ...definition.meta,\n ...extraMeta,\n instruction,\n },\n };\n}\n\nfunction errorResult(\n raw: string,\n mode: AnchorResolvedRoute['mode'],\n code: AnchorResolvedRoute['errorCode'],\n message: string,\n diagnostics = code ? [createDiagnostic(code, message, raw, mode)] : undefined,\n): AnchorResolvedRoute {\n return {\n success: false,\n mode,\n raw,\n errorCode: code,\n errorMessage: message,\n diagnostics,\n };\n}\n\nexport function resolveAnchor(\n input: string | AnchorRouteInstruction,\n registry: AnchorRegistry = {},\n options: AnchorResolveOptions = {},\n): AnchorResolvedRoute {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return {\n success: false,\n mode: 'unknown',\n raw: error.raw,\n errorCode: error.code,\n errorMessage: error.message,\n diagnostics: [error.toDiagnostic()],\n };\n }\n\n throw error;\n }\n\n const validation = validateAnchor(instruction, registry, options);\n if (!validation.valid) {\n const [firstDiagnostic] = validation.errors;\n return {\n success: false,\n mode: instruction.mode,\n raw: instruction.raw,\n errorCode: firstDiagnostic?.code,\n errorMessage: firstDiagnostic?.message,\n diagnostics: validation.errors,\n };\n }\n\n switch (instruction.mode) {\n case 'page': {\n const definition = registry.pages?.[instruction.page ?? '']?.[instruction.section ?? ''];\n if (!definition) {\n return errorResult(\n instruction.raw,\n 'page',\n validation.errors[0]?.code ?? 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n validation.errors[0]?.message ?? `Page Case could not be resolved for \"${instruction.page}~${instruction.section}\".`,\n validation.errors.length > 0 ? validation.errors : undefined,\n );\n }\n\n return buildResolvedRoute(instruction, definition, {\n page: instruction.page,\n section: instruction.section,\n });\n }\n case 'param': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'param', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Param Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n args: instruction.args ?? [],\n });\n }\n case 'dot': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'dot', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Dot Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n pathTokens: instruction.pathTokens ?? [],\n });\n }\n case 'intent': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'intent', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Intent Case could not be resolved.', validation.errors);\n }\n\n const allowedNames = new Set(Object.values(definition.namedBind ?? {}));\n const unknownNamedArgs = Object.entries(instruction.namedArgs ?? {}).filter(([name]) => !allowedNames.has(name));\n const meta: Record<string, unknown> = {\n key: instruction.key,\n namedArgs: instruction.namedArgs ?? {},\n };\n\n if ((options.unknownNamedArgs ?? 'reject') === 'keep' && unknownNamedArgs.length > 0) {\n meta.unknownNamedArgs = Object.fromEntries(unknownNamedArgs);\n }\n\n return buildResolvedRoute(instruction, definition, meta);\n }\n default:\n return errorResult(instruction.raw, 'unknown', undefined, `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`);\n }\n}"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAO,IAAM,qBAAqB;AAC3B,IAAM,gBAAgB;AACtB,IAAM,mBAAmB;AACzB,IAAM,gBAAgB;AAEtB,IAAM,6BAA6B,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG;AAEjF,IAAM,6BAA6B,IAAI,IAAY,0BAA0B;AAEtE,IAAM,yBAAyB;AAE/B,SAAS,0BAA0B,WAA4B;AACpE,SAAO,2BAA2B,IAAI,SAAS;AACjD;AAEO,SAAS,WAAW,WAA4B;AACrD,SAAO,gBAAgB,KAAK,SAAS;AACvC;;;ACjBO,IAAM,qBAAqB;AAAA,EAChC,0BAA0B;AAAA,EAC1B,6BAA6B;AAAA,EAC7B,yBAAyB;AAAA,EACzB,4BAA4B;AAAA,EAC5B,wBAAwB;AAAA,EACxB,8BAA8B;AAAA,EAC9B,kCAAkC;AAAA,EAClC,kCAAkC;AAAA,EAClC,gCAAgC;AAAA,EAChC,yCAAyC;AAAA,EACzC,+BAA+B;AAAA,EAC/B,+BAA+B;AAAA,EAC/B,kCAAkC;AAAA,EAClC,8BAA8B;AAAA,EAC9B,oCAAoC;AAAA,EACpC,kCAAkC;AACpC;AAWO,IAAM,mBAAN,cAA+B,MAAM;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EAET,YAAY,MAAuB,SAAiB,KAAa,MAAe;AAC9E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,OAAO;AACZ,SAAK,MAAM;AACX,SAAK,OAAO;AAAA,EACd;AAAA,EAEA,eAAiC;AAC/B,WAAO;AAAA,MACL,MAAM,KAAK;AAAA,MACX,SAAS,KAAK;AAAA,MACd,KAAK,KAAK;AAAA,MACV,MAAM,KAAK;AAAA,IACb;AAAA,EACF;AACF;AAEO,SAAS,iBACd,MACA,SACA,KACA,MACkB;AAClB,SAAO,EAAE,MAAM,SAAS,KAAK,KAAK;AACpC;AAEO,SAAS,mBAAmB,OAA2C;AAC5E,SAAO,iBAAiB;AAC1B;;;AC1DA,IAAM,UAAU,IAAI,YAAY;AAEhC,SAAS,gBAAgB,WAA2B;AAClD,SAAO,MAAM,KAAK,QAAQ,OAAO,SAAS,CAAC,EACxC,IAAI,CAAC,SAAS,IAAI,KAAK,SAAS,EAAE,EAAE,YAAY,EAAE,SAAS,GAAG,GAAG,CAAC,EAAE,EACpE,KAAK,EAAE;AACZ;AAEO,SAAS,kBAAkB,OAAuB;AACvD,QAAM,QAAQ,OAAO,SAAS,EAAE;AAChC,MAAI,SAAS;AAEb,aAAW,aAAa,OAAO;AAC7B,cAAU,uBAAuB,KAAK,SAAS,IAAI,YAAY,gBAAgB,SAAS;AAAA,EAC1F;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,UAAkB,UAAkB,MAAqB;AAC5F,WAAS,QAAQ,GAAG,QAAQ,SAAS,QAAQ,SAAS,GAAG;AACvD,UAAM,YAAY,SAAS,KAAK;AAEhC,QAAI,cAAc,KAAK;AACrB,YAAM,OAAO,SAAS,QAAQ,CAAC;AAC/B,YAAM,MAAM,SAAS,QAAQ,CAAC;AAE9B,UAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,WAAW,IAAI,KAAK,CAAC,WAAW,GAAG,GAAG;AAC1D,cAAM,IAAI;AAAA,UACR,mBAAmB;AAAA,UACnB,uCAAuC,QAAQ;AAAA,UAC/C;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAEA,eAAS;AACT;AAAA,IACF;AAEA,QAAI,0BAA0B,SAAS,GAAG;AACxC,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB,uBAAuB,SAAS;AAAA,QAChC;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,kBAAkB,UAAkB,UAAkB,MAAuB;AAC3F,uBAAqB,UAAU,UAAU,IAAI;AAE7C,MAAI;AACF,WAAO,mBAAmB,QAAQ;AAAA,EACpC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB,uCAAuC,QAAQ;AAAA,MAC/C;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,QAAgB,UAAkB,MAAiC;AACjG,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,OAAO,MAAM,aAAa;AAE9C,MAAI,YAAY,KAAK,CAAC,YAAY,QAAQ,WAAW,CAAC,GAAG;AACvD,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB,YAAY,MAAM;AAAA,MAClB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,YAAY,IAAI,CAAC,YAAY;AAC9C,UAAM,UAAU,kBAAkB,SAAS,UAAU,IAAI;AAEzD,QAAI,QAAQ,SAAS,aAAa,GAAG;AACnC,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB,oBAAoB,OAAO;AAAA,QAC3B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,CAAC;AAED,SAAO;AAAA,IACL,KAAK,WAAW,KAAK,aAAa;AAAA,IAClC;AAAA,EACF;AACF;AAEO,SAAS,gBAAgB,OAAuB;AACrD,QAAM,SAAS,OAAO,SAAS,EAAE,EAAE,KAAK;AACxC,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,WAAW,OAAO,MAAM,aAAa,EAAE,IAAI,CAAC,YAAY,QAAQ,KAAK,CAAC;AAE5E,MAAI,SAAS,KAAK,CAAC,YAAY,CAAC,OAAO,GAAG;AACxC,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB,YAAY,MAAM;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,SAAS,IAAI,CAAC,YAAY,kBAAkB,OAAO,CAAC,EAAE,KAAK,aAAa;AACjF;;;AChIA,SAAS,aAAa,OAAe,MAAuB,SAAyB;AACnF,QAAM,UAAU,OAAO,SAAS,EAAE,EAAE,KAAK;AAEzC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,iBAAiB,MAAM,SAAS,OAAO,SAAS,EAAE,CAAC;AAAA,EAC/D;AAEA,SAAO;AACT;AAEO,SAAS,gBAAgB,MAAc,SAAyB;AACrE,QAAM,WAAW,kBAAkB,aAAa,MAAM,mBAAmB,yBAAyB,6BAA6B,CAAC;AAChI,QAAM,cAAc;AAAA,IAClB,aAAa,SAAS,mBAAmB,4BAA4B,gCAAgC;AAAA,EACvG;AAEA,SAAO,IAAI,QAAQ,GAAG,gBAAgB,GAAG,WAAW;AACtD;AAEO,SAAS,iBAAiB,KAAa,OAAiB,CAAC,GAAW;AACzE,QAAM,UAAU,gBAAgB,GAAG;AACnC,QAAM,cAAc,KAAK,IAAI,CAAC,aAAa,kBAAkB,OAAO,YAAY,EAAE,CAAC,CAAC;AACpF,SAAO,GAAG,kBAAkB,GAAG,OAAO,GAAG,YAAY,IAAI,CAAC,aAAa,GAAG,aAAa,GAAG,QAAQ,EAAE,EAAE,KAAK,EAAE,CAAC;AAChH;AAEO,SAAS,eAAe,QAA0B;AACvD,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,WAAW,GAAG;AACjD,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA,OAAO,UAAU,EAAE;AAAA,IACrB;AAAA,EACF;AAEA,QAAM,MAAM,OAAO,IAAI,CAAC,UAAU,aAAa,OAAO,mBAAmB,8BAA8B,4BAA4B,CAAC,EAAE,KAAK,aAAa;AACxJ,SAAO,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,CAAC;AACrD;AAEO,SAAS,kBAAkB,KAAa,WAA2C;AACxF,QAAM,UAAU,gBAAgB,GAAG;AACnC,QAAM,QAAQ,OAAO,QAAQ,aAAa,CAAC,CAAC;AAE5C,MAAI,MAAM,WAAW,GAAG;AACtB,WAAO,GAAG,kBAAkB,GAAG,OAAO;AAAA,EACxC;AAEA,QAAM,eAAe,MAAM,IAAI,CAAC,CAAC,MAAM,KAAK,MAAM;AAChD,UAAM,WAAW;AAAA,MACf,aAAa,MAAM,mBAAmB,kCAAkC,uCAAuC;AAAA,IACjH;AACA,UAAM,YAAY;AAAA,MAChB,aAAa,OAAO,mBAAmB,kCAAkC,oBAAoB,IAAI,oBAAoB;AAAA,IACvH;AACA,WAAO,GAAG,aAAa,GAAG,QAAQ,GAAG,aAAa,GAAG,SAAS;AAAA,EAChE,CAAC;AAED,SAAO,GAAG,kBAAkB,GAAG,OAAO,GAAG,aAAa,KAAK,EAAE,CAAC;AAChE;AAEO,SAAS,gBAAgB,aAA6C;AAC3E,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK;AACH,aAAO,gBAAgB,YAAY,QAAQ,IAAI,YAAY,WAAW,EAAE;AAAA,IAC1E,KAAK;AACH,aAAO,iBAAiB,YAAY,OAAO,IAAI,YAAY,QAAQ,CAAC,CAAC;AAAA,IACvE,KAAK;AACH,aAAO,eAAe,YAAY,eAAe,YAAY,MAAM,YAAY,IAAI,MAAM,aAAa,IAAI,CAAC,EAAE;AAAA,IAC/G,KAAK;AACH,aAAO,kBAAkB,YAAY,OAAO,IAAI,YAAY,aAAa,CAAC,CAAC;AAAA,IAC7E;AACE,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB,kCAAkC,OAAQ,YAAkC,IAAI,CAAC;AAAA,QACjF,YAAY;AAAA,MACd;AAAA,EACJ;AACF;;;ACjFO,SAAS,gBAAgB,OAAuB;AACrD,QAAM,MAAM,OAAO,SAAS,EAAE,EAAE,KAAK;AAErC,MAAI,CAAC,KAAK;AACR,WAAO;AAAA,EACT;AAEA,MAAI,aAAa;AAEjB,MAAI,+BAA+B,KAAK,UAAU,GAAG;AACnD,QAAI;AACF,YAAM,MAAM,IAAI,IAAI,UAAU;AAC9B,mBAAa,IAAI,YAAY;AAAA,IAC/B,QAAQ;AACN,mBAAa;AAAA,IACf;AAAA,EACF;AAEA,QAAM,cAAc,WAAW,OAAO,MAAM;AAC5C,MAAI,eAAe,GAAG;AACpB,iBAAa,WAAW,MAAM,GAAG,WAAW;AAAA,EAC9C;AAEA,MAAI,CAAC,WAAW,WAAW,GAAG,GAAG;AAC/B,iBAAa,IAAI,UAAU;AAAA,EAC7B;AAEA,eAAa,WAAW,QAAQ,WAAW,GAAG;AAE9C,MAAI,WAAW,SAAS,KAAK,WAAW,SAAS,GAAG,GAAG;AACrD,iBAAa,WAAW,MAAM,GAAG,EAAE;AAAA,EACrC;AAEA,SAAO;AACT;;;AC5BA,SAAS,eAAe,YAA4C;AAClE,QAAM,OAAO,WAAW,MAAM,CAAC;AAE/B,MAAI,KAAK,SAAS,GAAG,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,QAAQ,KAAK,MAAM,gBAAgB;AAEzC,MAAI,MAAM,WAAW,GAAG;AACtB,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,CAAC,SAAS,UAAU,IAAI;AAE9B,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,MAAM,kBAAkB,SAAS,YAAY,MAAM;AAAA,IACnD,SAAS,kBAAkB,YAAY,YAAY,MAAM;AAAA,EAC3D;AACF;AAEA,SAAS,cAAc,YAAoB,QAAwC;AACjF,QAAM,MAAM,gBAAgB,QAAQ,YAAY,KAAK;AAErD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK,IAAI;AAAA,IACT,YAAY,IAAI;AAAA,EAClB;AACF;AAEA,SAAS,gBAAgB,YAAoB,QAAgB,SAA2C;AACtG,QAAM,MAAM,gBAAgB,QAAQ,YAAY,OAAO;AACvD,QAAM,OAAO,QAAQ,IAAI,CAAC,gBAAgB;AACxC,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,kBAAkB,aAAa,YAAY,OAAO;AAAA,EAC3D,CAAC;AAED,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK,IAAI;AAAA,IACT,YAAY,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAEA,SAAS,iBAAiB,YAAoB,QAAgB,SAA2C;AACvG,QAAM,MAAM,gBAAgB,QAAQ,YAAY,QAAQ;AACxD,QAAM,YAAoC,CAAC;AAE3C,aAAW,WAAW,SAAS;AAC7B,UAAM,iBAAiB,QAAQ,QAAQ,aAAa;AAEpD,QAAI,kBAAkB,KAAK,mBAAmB,QAAQ,SAAS,GAAG;AAChE,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB,qBAAqB,OAAO;AAAA,QAC5B;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,QAAQ,MAAM,GAAG,cAAc;AAC/C,UAAM,WAAW,QAAQ,MAAM,iBAAiB,CAAC;AACjD,UAAM,OAAO,kBAAkB,SAAS,YAAY,QAAQ;AAC5D,UAAM,QAAQ,kBAAkB,UAAU,YAAY,QAAQ;AAE9D,QAAI,OAAO,UAAU,eAAe,KAAK,WAAW,IAAI,GAAG;AACzD,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB,kDAAkD,IAAI;AAAA,QACtD;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,cAAU,IAAI,IAAI;AAAA,EACpB;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,KAAK;AAAA,IACL,KAAK,IAAI;AAAA,IACT,YAAY,IAAI;AAAA,IAChB;AAAA,EACF;AACF;AAEO,SAAS,YAAY,OAAuC;AACjE,QAAM,aAAa,gBAAgB,KAAK;AAExC,MAAI,CAAC,YAAY;AACf,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA,OAAO,SAAS,EAAE;AAAA,IACpB;AAAA,EACF;AAEA,MAAI,CAAC,WAAW,WAAW,kBAAkB,KAAK,WAAW,SAAS,gBAAgB,GAAG;AACvF,WAAO,eAAe,UAAU;AAAA,EAClC;AAEA,MAAI,CAAC,WAAW,WAAW,kBAAkB,GAAG;AAC9C,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,WAAW,MAAM,mBAAmB,MAAM;AAE9D,MAAI,CAAC,eAAe,YAAY,SAAS,GAAG,GAAG;AAC7C,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,CAAC,QAAQ,GAAG,OAAO,IAAI,YAAY,MAAM,aAAa;AAE5D,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI;AAAA,MACR,mBAAmB;AAAA,MACnB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAEA,MAAI,QAAQ,WAAW,GAAG;AACxB,QAAI,OAAO,SAAS,aAAa,GAAG;AAClC,aAAO,cAAc,YAAY,MAAM;AAAA,IACzC;AAEA,WAAO,gBAAgB,YAAY,QAAQ,CAAC,CAAC;AAAA,EAC/C;AAEA,QAAM,gBAAgB,QAAQ,KAAK,CAAC,YAAY,QAAQ,SAAS,aAAa,CAAC;AAC/E,QAAM,uBAAuB,QAAQ,MAAM,CAAC,YAAY;AACtD,UAAM,WAAW,QAAQ,QAAQ,aAAa;AAC9C,WAAO,WAAW,KAAK,WAAW,QAAQ,SAAS,KAAK,QAAQ,QAAQ,eAAe,WAAW,CAAC,MAAM;AAAA,EAC3G,CAAC;AAED,MAAI,eAAe;AACjB,QAAI,CAAC,sBAAsB;AACzB,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO,iBAAiB,YAAY,QAAQ,OAAO;AAAA,EACrD;AAEA,SAAO,gBAAgB,YAAY,QAAQ,OAAO;AACpD;AAEO,SAAS,cAAc,OAAwB;AACpD,MAAI;AACF,gBAAY,KAAK;AACjB,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AClNA,SAAS,uBAAuB,aAAqC,UAAmC;AACtG,MAAI,YAAY,SAAS,WAAW,CAAC,YAAY,KAAK;AACpD,WAAO;AAAA,EACT;AAEA,QAAM,aAAa,UAAU,SAAS,YAAY,GAAG;AACrD,MAAI,CAAC,YAAY,gBAAgB;AAC/B,WAAO;AAAA,EACT;AAEA,SAAO,KAAK,IAAI,GAAG,OAAO,OAAO,WAAW,cAAc,GAAG,EAAE;AACjE;AAEO,SAAS,eACd,OACA,UACA,UAAgC,CAAC,GACT;AACxB,MAAI;AAEJ,MAAI;AACF,kBAAc,OAAO,UAAU,WAAW,YAAY,KAAK,IAAI;AAAA,EACjE,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,GAAG;AAC7B,aAAO,EAAE,OAAO,OAAO,QAAQ,CAAC,MAAM,aAAa,CAAC,EAAE;AAAA,IACxD;AAEA,UAAM;AAAA,EACR;AAEA,QAAM,SAAS,CAAC;AAEhB,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK,QAAQ;AACX,UAAI,CAAC,YAAY,MAAM;AACrB,eAAO,KAAK,iBAAiB,mBAAmB,yBAAyB,oCAAoC,YAAY,KAAK,MAAM,CAAC;AAAA,MACvI;AAEA,UAAI,CAAC,YAAY,SAAS;AACxB,eAAO,KAAK,iBAAiB,mBAAmB,4BAA4B,uCAAuC,YAAY,KAAK,MAAM,CAAC;AAAA,MAC7I;AAEA,UAAI,YAAY,QAAQ,UAAU,SAAS,CAAC,SAAS,MAAM,YAAY,IAAI,GAAG;AAC5E,eAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,sCAAsC,YAAY,IAAI;AAAA,YACtD,YAAY;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,QAAQ,YAAY,WAAW,UAAU,QAAQ,YAAY,IAAI,KAAK,CAAC,SAAS,MAAM,YAAY,IAAI,EAAE,YAAY,OAAO,GAAG;AAC5I,eAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,8CAA8C,YAAY,IAAI,IAAI,YAAY,OAAO;AAAA,YACrF,YAAY;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA;AAAA,IACF;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,aAAa,YAAY,MAAM,UAAU,SAAS,YAAY,GAAG,IAAI;AAE3E,UAAI,YAAY,OAAO,UAAU,UAAU,CAAC,YAAY;AACtD,eAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,4CAA4C,YAAY,GAAG;AAAA,YAC3D,YAAY;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,YAAM,gBAAgB,YAAY,2BAA2B,uBAAuB,aAAa,QAAQ,IAAI;AAE7G,WAAK,YAAY,MAAM,UAAU,KAAK,eAAe;AACnD,eAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,mBAAmB,YAAY,GAAG,sBAAsB,aAAa;AAAA,YACrE,YAAY;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,QAAQ,WAAW,SAAS,YAAY,MAAM,UAAU,KAAK,QAAQ,SAAS;AAChF,eAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,uEAAuE,QAAQ,OAAO;AAAA,YACtF,YAAY;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA;AAAA,IACF;AAAA,IACA,KAAK,OAAO;AACV,UAAI,YAAY,OAAO,UAAU,UAAU,CAAC,SAAS,OAAO,YAAY,GAAG,GAAG;AAC5E,eAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,4CAA4C,YAAY,GAAG;AAAA,YAC3D,YAAY;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA;AAAA,IACF;AAAA,IACA,KAAK,UAAU;AACb,YAAM,aAAa,YAAY,MAAM,UAAU,SAAS,YAAY,GAAG,IAAI;AAE3E,UAAI,YAAY,OAAO,UAAU,UAAU,CAAC,YAAY;AACtD,eAAO;AAAA,UACL;AAAA,YACE,mBAAmB;AAAA,YACnB,4CAA4C,YAAY,GAAG;AAAA,YAC3D,YAAY;AAAA,YACZ;AAAA,UACF;AAAA,QACF;AACA;AAAA,MACF;AAEA,YAAM,gBAAgB,YAAY,qBAAqB,OAAO,OAAO,YAAY,aAAa,CAAC,CAAC;AAChG,iBAAW,gBAAgB,eAAe;AACxC,YAAI,CAAC,YAAY,aAAa,CAAC,OAAO,UAAU,eAAe,KAAK,YAAY,WAAW,YAAY,GAAG;AACxG,iBAAO;AAAA,YACL;AAAA,cACE,mBAAmB;AAAA,cACnB,oBAAoB,YAAY,GAAG,8BAA8B,YAAY;AAAA,cAC7E,YAAY;AAAA,cACZ;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,UAAI,YAAY,aAAa,YAAY,WAAW;AAClD,cAAM,eAAe,IAAI,IAAI,OAAO,OAAO,WAAW,SAAS,CAAC;AAChE,mBAAW,QAAQ,OAAO,KAAK,YAAY,SAAS,GAAG;AACrD,cAAI,CAAC,aAAa,IAAI,IAAI,MAAM,QAAQ,oBAAoB,cAAc,UAAU;AAClF,mBAAO;AAAA,cACL;AAAA,gBACE,mBAAmB;AAAA,gBACnB,oBAAoB,YAAY,GAAG,oCAAoC,IAAI;AAAA,gBAC3E,YAAY;AAAA,gBACZ;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA;AAAA,IACF;AAAA,IACA;AACE,YAAM,IAAI;AAAA,QACR,mBAAmB;AAAA,QACnB,2BAA2B,OAAQ,YAAkC,IAAI,CAAC;AAAA,QAC1E,YAAY;AAAA,MACd;AAAA,EACJ;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;;;AC5KA,SAAS,kBAAkB,YAAoC,OAAoC;AACjG,SAAO,WAAW,iBAAiB,KAAK,KAAK;AAC/C;AAEA,SAAS,iBACP,OACA,OACA,YACA,QACA,OACM;AACN,MAAI,kBAAkB,YAAY,KAAK,MAAM,SAAS;AACpD,UAAM,KAAK,IAAI;AACf;AAAA,EACF;AAEA,SAAO,KAAK,IAAI;AAClB;AAEA,SAAS,mBACP,aACA,YACA,YAAqC,CAAC,GACjB;AACrB,QAAM,SAAS,EAAE,GAAI,WAAW,iBAAiB,CAAC,EAAG;AACrD,QAAM,QAAQ,EAAE,GAAI,WAAW,gBAAgB,CAAC,EAAG;AAEnD,MAAI,YAAY,SAAS,WAAW,WAAW,gBAAgB;AAC7D,eAAW,CAAC,OAAO,KAAK,KAAK,OAAO,QAAQ,WAAW,cAAc,GAAG;AACtE,YAAM,QAAQ,YAAY,OAAO,KAAK;AACtC,UAAI,SAAS,MAAM;AACjB,yBAAiB,OAAO,OAAO,YAAY,QAAQ,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,MAAI,YAAY,SAAS,YAAY,WAAW,WAAW;AACzD,eAAW,CAAC,OAAO,UAAU,KAAK,OAAO,QAAQ,WAAW,SAAS,GAAG;AACtE,YAAM,QAAQ,YAAY,YAAY,UAAU;AAChD,UAAI,SAAS,MAAM;AACjB,yBAAiB,OAAO,OAAO,YAAY,QAAQ,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,SAAS;AAAA,IACT,MAAM,YAAY;AAAA,IAClB,KAAK,YAAY;AAAA,IACjB,MAAM,WAAW;AAAA,IACjB,MAAM,WAAW;AAAA,IACjB,QAAQ,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AAAA,IAClD,OAAO,OAAO,KAAK,KAAK,EAAE,SAAS,IAAI,QAAQ;AAAA,IAC/C,MAAM,WAAW;AAAA,IACjB,OAAO,WAAW;AAAA,IAClB,aAAa,WAAW;AAAA,IACxB,MAAM;AAAA,MACJ,GAAG,WAAW;AAAA,MACd,GAAG;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,YACP,KACA,MACA,MACA,SACA,cAAc,OAAO,CAAC,iBAAiB,MAAM,SAAS,KAAK,IAAI,CAAC,IAAI,QAC/C;AACrB,SAAO;AAAA,IACL,SAAS;AAAA,IACT;AAAA,IACA;AAAA,IACA,WAAW;AAAA,IACX,cAAc;AAAA,IACd;AAAA,EACF;AACF;AAEO,SAAS,cACd,OACA,WAA2B,CAAC,GAC5B,UAAgC,CAAC,GACZ;AACrB,MAAI;AAEJ,MAAI;AACF,kBAAc,OAAO,UAAU,WAAW,YAAY,KAAK,IAAI;AAAA,EACjE,SAAS,OAAO;AACd,QAAI,mBAAmB,KAAK,GAAG;AAC7B,aAAO;AAAA,QACL,SAAS;AAAA,QACT,MAAM;AAAA,QACN,KAAK,MAAM;AAAA,QACX,WAAW,MAAM;AAAA,QACjB,cAAc,MAAM;AAAA,QACpB,aAAa,CAAC,MAAM,aAAa,CAAC;AAAA,MACpC;AAAA,IACF;AAEA,UAAM;AAAA,EACR;AAEA,QAAM,aAAa,eAAe,aAAa,UAAU,OAAO;AAChE,MAAI,CAAC,WAAW,OAAO;AACrB,UAAM,CAAC,eAAe,IAAI,WAAW;AACrC,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM,YAAY;AAAA,MAClB,KAAK,YAAY;AAAA,MACjB,WAAW,iBAAiB;AAAA,MAC5B,cAAc,iBAAiB;AAAA,MAC/B,aAAa,WAAW;AAAA,IAC1B;AAAA,EACF;AAEA,UAAQ,YAAY,MAAM;AAAA,IACxB,KAAK,QAAQ;AACX,YAAM,aAAa,SAAS,QAAQ,YAAY,QAAQ,EAAE,IAAI,YAAY,WAAW,EAAE;AACvF,UAAI,CAAC,YAAY;AACf,eAAO;AAAA,UACL,YAAY;AAAA,UACZ;AAAA,UACA,WAAW,OAAO,CAAC,GAAG,QAAQ;AAAA,UAC9B,WAAW,OAAO,CAAC,GAAG,WAAW,wCAAwC,YAAY,IAAI,IAAI,YAAY,OAAO;AAAA,UAChH,WAAW,OAAO,SAAS,IAAI,WAAW,SAAS;AAAA,QACrD;AAAA,MACF;AAEA,aAAO,mBAAmB,aAAa,YAAY;AAAA,QACjD,MAAM,YAAY;AAAA,QAClB,SAAS,YAAY;AAAA,MACvB,CAAC;AAAA,IACH;AAAA,IACA,KAAK,SAAS;AACZ,YAAM,aAAa,SAAS,SAAS,YAAY,OAAO,EAAE;AAC1D,UAAI,CAAC,YAAY;AACf,eAAO,YAAY,YAAY,KAAK,SAAS,WAAW,OAAO,CAAC,GAAG,MAAM,WAAW,OAAO,CAAC,GAAG,WAAW,qCAAqC,WAAW,MAAM;AAAA,MAClK;AAEA,aAAO,mBAAmB,aAAa,YAAY;AAAA,QACjD,KAAK,YAAY;AAAA,QACjB,MAAM,YAAY,QAAQ,CAAC;AAAA,MAC7B,CAAC;AAAA,IACH;AAAA,IACA,KAAK,OAAO;AACV,YAAM,aAAa,SAAS,SAAS,YAAY,OAAO,EAAE;AAC1D,UAAI,CAAC,YAAY;AACf,eAAO,YAAY,YAAY,KAAK,OAAO,WAAW,OAAO,CAAC,GAAG,MAAM,WAAW,OAAO,CAAC,GAAG,WAAW,mCAAmC,WAAW,MAAM;AAAA,MAC9J;AAEA,aAAO,mBAAmB,aAAa,YAAY;AAAA,QACjD,KAAK,YAAY;AAAA,QACjB,YAAY,YAAY,cAAc,CAAC;AAAA,MACzC,CAAC;AAAA,IACH;AAAA,IACA,KAAK,UAAU;AACb,YAAM,aAAa,SAAS,SAAS,YAAY,OAAO,EAAE;AAC1D,UAAI,CAAC,YAAY;AACf,eAAO,YAAY,YAAY,KAAK,UAAU,WAAW,OAAO,CAAC,GAAG,MAAM,WAAW,OAAO,CAAC,GAAG,WAAW,sCAAsC,WAAW,MAAM;AAAA,MACpK;AAEA,YAAM,eAAe,IAAI,IAAI,OAAO,OAAO,WAAW,aAAa,CAAC,CAAC,CAAC;AACtE,YAAM,mBAAmB,OAAO,QAAQ,YAAY,aAAa,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC;AAC/G,YAAM,OAAgC;AAAA,QACpC,KAAK,YAAY;AAAA,QACjB,WAAW,YAAY,aAAa,CAAC;AAAA,MACvC;AAEA,WAAK,QAAQ,oBAAoB,cAAc,UAAU,iBAAiB,SAAS,GAAG;AACpF,aAAK,mBAAmB,OAAO,YAAY,gBAAgB;AAAA,MAC7D;AAEA,aAAO,mBAAmB,aAAa,YAAY,IAAI;AAAA,IACzD;AAAA,IACA;AACE,aAAO,YAAY,YAAY,KAAK,WAAW,QAAW,2BAA2B,OAAQ,YAAkC,IAAI,CAAC,IAAI;AAAA,EAC5I;AACF;","names":[]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/errors.ts","../src/escape.ts","../src/builders.ts","../src/declaration.ts","../src/normalize.ts","../src/parser.ts","../src/validate.ts","../src/resolve.ts"],"sourcesContent":["export * from './builders';\nexport * from './constants';\nexport * from './declaration';\nexport * from './errors';\nexport * from './escape';\nexport * from './normalize';\nexport * from './parser';\nexport * from './resolve';\nexport * from './types';\nexport * from './validate';","export const ANCHOR_PATH_PREFIX = '/~';\nexport const ARG_SEPARATOR = ';';\nexport const ANCHOR_SEPARATOR = '~';\nexport const DOT_SEPARATOR = '.';\n\nexport const RESERVED_ANCHOR_CHARACTERS = ['/', '~', ';', '.', '=', '@', '#', '%'] as const;\n\nconst reservedAnchorCharacterSet = new Set<string>(RESERVED_ANCHOR_CHARACTERS);\n\nexport const SAFE_LITERAL_CHARACTER = /^[A-Za-z0-9_-]$/;\n\nexport function isReservedAnchorCharacter(character: string): boolean {\n return reservedAnchorCharacterSet.has(character);\n}\n\nexport function isHexDigit(character: string): boolean {\n return /^[0-9A-Fa-f]$/.test(character);\n}","export const ANCHOR_ERROR_CODES = {\n ANCHOR_PARSE_EMPTY_INPUT: 'ANCHOR_PARSE_EMPTY_INPUT',\n ANCHOR_PARSE_INVALID_FORMAT: 'ANCHOR_PARSE_INVALID_FORMAT',\n ANCHOR_PARSE_EMPTY_PAGE: 'ANCHOR_PARSE_EMPTY_PAGE',\n ANCHOR_PARSE_EMPTY_SECTION: 'ANCHOR_PARSE_EMPTY_SECTION',\n ANCHOR_PARSE_EMPTY_KEY: 'ANCHOR_PARSE_EMPTY_KEY',\n ANCHOR_PARSE_INVALID_DOT_KEY: 'ANCHOR_PARSE_INVALID_DOT_KEY',\n ANCHOR_PARSE_INVALID_INTENT_PAIR: 'ANCHOR_PARSE_INVALID_INTENT_PAIR',\n ANCHOR_PARSE_DUPLICATE_NAMED_ARG: 'ANCHOR_PARSE_DUPLICATE_NAMED_ARG',\n ANCHOR_ESCAPE_INVALID_SEQUENCE: 'ANCHOR_ESCAPE_INVALID_SEQUENCE',\n ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR: 'ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR',\n ANCHOR_VALIDATE_TOO_MANY_ARGS: 'ANCHOR_VALIDATE_TOO_MANY_ARGS',\n ANCHOR_RESOLVE_PAGE_NOT_FOUND: 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n ANCHOR_RESOLVE_SECTION_NOT_FOUND: 'ANCHOR_RESOLVE_SECTION_NOT_FOUND',\n ANCHOR_RESOLVE_KEY_NOT_FOUND: 'ANCHOR_RESOLVE_KEY_NOT_FOUND',\n ANCHOR_RESOLVE_BINDING_MISSING_ARG: 'ANCHOR_RESOLVE_BINDING_MISSING_ARG',\n ANCHOR_RESOLVE_INVALID_NAMED_ARG: 'ANCHOR_RESOLVE_INVALID_NAMED_ARG',\n} as const;\n\nexport type AnchorErrorCode = (typeof ANCHOR_ERROR_CODES)[keyof typeof ANCHOR_ERROR_CODES];\n\nexport interface AnchorDiagnostic {\n code: AnchorErrorCode;\n message: string;\n raw: string;\n mode?: string;\n}\n\nexport class AnchorRouteError extends Error {\n readonly code: AnchorErrorCode;\n readonly raw: string;\n readonly mode?: string;\n\n constructor(code: AnchorErrorCode, message: string, raw: string, mode?: string) {\n super(message);\n this.name = 'AnchorRouteError';\n this.code = code;\n this.raw = raw;\n this.mode = mode;\n }\n\n toDiagnostic(): AnchorDiagnostic {\n return {\n code: this.code,\n message: this.message,\n raw: this.raw,\n mode: this.mode,\n };\n }\n}\n\nexport function createDiagnostic(\n code: AnchorErrorCode,\n message: string,\n raw: string,\n mode?: string,\n): AnchorDiagnostic {\n return { code, message, raw, mode };\n}\n\nexport function isAnchorRouteError(error: unknown): error is AnchorRouteError {\n return error instanceof AnchorRouteError;\n}","import { DOT_SEPARATOR, SAFE_LITERAL_CHARACTER, isHexDigit, isReservedAnchorCharacter } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport type { DecodedAnchorKey } from './types';\n\nconst encoder = new TextEncoder();\n\nfunction encodeCharacter(character: string): string {\n return Array.from(encoder.encode(character))\n .map((byte) => `%${byte.toString(16).toUpperCase().padStart(2, '0')}`)\n .join('');\n}\n\nexport function escapeAnchorValue(input: string): string {\n const value = String(input ?? '');\n let output = '';\n\n for (const character of value) {\n output += SAFE_LITERAL_CHARACTER.test(character) ? character : encodeCharacter(character);\n }\n\n return output;\n}\n\nexport function validateEncodedToken(rawToken: string, rawInput: string, mode?: string): void {\n for (let index = 0; index < rawToken.length; index += 1) {\n const character = rawToken[index];\n\n if (character === '%') {\n const high = rawToken[index + 1];\n const low = rawToken[index + 2];\n\n if (!high || !low || !isHexDigit(high) || !isHexDigit(low)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n\n index += 2;\n continue;\n }\n\n if (isReservedAnchorCharacter(character)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR,\n `Reserved character \"${character}\" must be percent-encoded inside anchor values.`,\n rawInput,\n mode,\n );\n }\n }\n}\n\nexport function decodeAnchorToken(rawToken: string, rawInput: string, mode?: string): string {\n validateEncodedToken(rawToken, rawInput, mode);\n\n try {\n return decodeURIComponent(rawToken);\n } catch {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n}\n\nexport function decodeAnchorKey(rawKey: string, rawInput: string, mode?: string): DecodedAnchorKey {\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawInput,\n mode,\n );\n }\n\n const rawSegments = rawKey.split(DOT_SEPARATOR);\n\n if (rawSegments.some((segment) => segment.length === 0)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawInput,\n mode,\n );\n }\n\n const pathTokens = rawSegments.map((segment) => {\n const decoded = decodeAnchorToken(segment, rawInput, mode);\n\n if (decoded.includes(DOT_SEPARATOR)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key segment \"${decoded}\" must not decode to another dot separator.`,\n rawInput,\n mode,\n );\n }\n\n return decoded;\n });\n\n return {\n key: pathTokens.join(DOT_SEPARATOR),\n pathTokens,\n };\n}\n\nexport function escapeAnchorKey(input: string): string {\n const rawKey = String(input ?? '').trim();\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawKey,\n );\n }\n\n const segments = rawKey.split(DOT_SEPARATOR).map((segment) => segment.trim());\n\n if (segments.some((segment) => !segment)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawKey,\n );\n }\n\n return segments.map((segment) => escapeAnchorValue(segment)).join(DOT_SEPARATOR);\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError, type AnchorErrorCode } from './errors';\nimport { escapeAnchorKey, escapeAnchorValue } from './escape';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction requireValue(value: string, code: AnchorErrorCode, message: string): string {\n const trimmed = String(value ?? '').trim();\n\n if (!trimmed) {\n throw new AnchorRouteError(code, message, String(value ?? ''));\n }\n\n return trimmed;\n}\n\nexport function buildPageAnchor(page: string, section: string): string {\n const safePage = escapeAnchorValue(requireValue(page, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page value cannot be empty.'));\n const safeSection = escapeAnchorValue(\n requireValue(section, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Section value cannot be empty.'),\n );\n\n return `/${safePage}${ANCHOR_SEPARATOR}${safeSection}`;\n}\n\nexport function buildParamAnchor(key: string, args: string[] = []): string {\n const safeKey = escapeAnchorKey(key);\n const encodedArgs = args.map((argument) => escapeAnchorValue(String(argument ?? '')));\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedArgs.map((argument) => `${ARG_SEPARATOR}${argument}`).join('')}`;\n}\n\nexport function buildDotAnchor(tokens: string[]): string {\n if (!Array.isArray(tokens) || tokens.length === 0) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n 'Dot case requires at least one token.',\n String(tokens ?? ''),\n );\n }\n\n const key = tokens.map((token) => requireValue(token, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY, 'Dot token cannot be empty.')).join(DOT_SEPARATOR);\n return `${ANCHOR_PATH_PREFIX}${escapeAnchorKey(key)}`;\n}\n\nexport function buildIntentAnchor(key: string, namedArgs: Record<string, string>): string {\n const safeKey = escapeAnchorKey(key);\n const pairs = Object.entries(namedArgs ?? {});\n\n if (pairs.length === 0) {\n return `${ANCHOR_PATH_PREFIX}${safeKey}`;\n }\n\n const encodedPairs = pairs.map(([name, value]) => {\n const safeName = escapeAnchorValue(\n requireValue(name, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, 'Intent argument name cannot be empty.'),\n );\n const safeValue = escapeAnchorValue(\n requireValue(value, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, `Intent argument \"${name}\" cannot be empty.`),\n );\n return `${ARG_SEPARATOR}${safeName}${DOT_SEPARATOR}${safeValue}`;\n });\n\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedPairs.join('')}`;\n}\n\nexport function serializeAnchor(instruction: AnchorRouteInstruction): string {\n switch (instruction.mode) {\n case 'page':\n return buildPageAnchor(instruction.page ?? '', instruction.section ?? '');\n case 'param':\n return buildParamAnchor(instruction.key ?? '', instruction.args ?? []);\n case 'dot':\n return buildDotAnchor(instruction.pathTokens ?? (instruction.key ? instruction.key.split(DOT_SEPARATOR) : []));\n case 'intent':\n return buildIntentAnchor(instruction.key ?? '', instruction.namedArgs ?? {});\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported anchor route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n}","import type {\n AnchorRoutingDeclaration,\n AnchorRoutingCase,\n AnchorRoutingMode,\n AnchorEscapeMode,\n AnchorRegistryVisibility,\n} from './types';\n\n// ── Text field mapping ──\n\nconst TEXT_TO_JSON: Record<string, keyof AnchorRoutingDeclaration | `syntax.${string}`> = {\n 'Anchor-Routing': 'anchorRouting',\n 'Name': 'name',\n 'SDK': 'sdk',\n 'Cases': 'cases',\n 'Primary-Case': 'primaryCase',\n 'Routing-Mode': 'routingMode',\n 'Internal-Anchor-Routing': 'internalAnchorRouting',\n 'Public-SEO-URLs': 'publicSeoUrls',\n 'Anchor-Prefix': 'syntax.anchorPrefix',\n 'Page-Case-Separator': 'syntax.pageCaseSeparator',\n 'Param-Case-Separator': 'syntax.paramCaseSeparator',\n 'Dot-Case-Separator': 'syntax.dotCaseSeparator',\n 'Intent-Case-Binding': 'syntax.intentCaseBinding',\n 'Escape-Mode': 'escapeMode',\n 'Registry-Visibility': 'registryVisibility',\n 'Resolver-Endpoint': 'resolverEndpoint',\n 'Docs': 'docs',\n 'Playground': 'playground',\n};\n\nconst JSON_TO_TEXT: Record<string, string> = {};\nfor (const [text, json] of Object.entries(TEXT_TO_JSON)) {\n JSON_TO_TEXT[json] = text;\n}\n\nconst VALID_CASES = new Set<string>(['page', 'param', 'dot', 'intent']);\n\n// ── Parse anchor-routing.txt → AnchorRoutingDeclaration ──\n\nexport function parseAnchorRoutingTxt(text: string): AnchorRoutingDeclaration {\n const result: Record<string, unknown> = {};\n const syntax: Record<string, string> = {};\n\n for (const raw of text.split('\\n')) {\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const field = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n if (!value) continue;\n\n const jsonKey = TEXT_TO_JSON[field];\n if (!jsonKey) continue;\n\n if (jsonKey.startsWith('syntax.')) {\n syntax[jsonKey.slice(7)] = value;\n } else if (jsonKey === 'anchorRouting') {\n result.anchorRouting = parseInt(value, 10);\n } else if (jsonKey === 'cases') {\n result.cases = value\n .split(',')\n .map((c) => c.trim())\n .filter((c) => VALID_CASES.has(c));\n } else if (jsonKey === 'internalAnchorRouting' || jsonKey === 'publicSeoUrls') {\n result[jsonKey] = value === 'true';\n } else {\n result[jsonKey] = value;\n }\n }\n\n if (Object.keys(syntax).length > 0) {\n result.syntax = syntax;\n }\n\n if (result.anchorRouting == null) {\n result.anchorRouting = 1;\n }\n if (!result.cases) {\n result.cases = [];\n }\n\n return result as unknown as AnchorRoutingDeclaration;\n}\n\n// ── Serialize AnchorRoutingDeclaration → anchor-routing.txt ──\n\nconst TEXT_FIELD_ORDER = [\n 'Anchor-Routing',\n 'Name',\n 'SDK',\n 'Cases',\n 'Primary-Case',\n 'Routing-Mode',\n 'Internal-Anchor-Routing',\n 'Public-SEO-URLs',\n 'Anchor-Prefix',\n 'Page-Case-Separator',\n 'Param-Case-Separator',\n 'Dot-Case-Separator',\n 'Intent-Case-Binding',\n 'Escape-Mode',\n 'Registry-Visibility',\n 'Resolver-Endpoint',\n 'Docs',\n 'Playground',\n];\n\nexport function serializeAnchorRoutingTxt(declaration: AnchorRoutingDeclaration): string {\n const lines: string[] = [];\n\n for (const field of TEXT_FIELD_ORDER) {\n const jsonKey = TEXT_TO_JSON[field];\n if (!jsonKey) continue;\n\n let value: unknown;\n\n if (jsonKey.startsWith('syntax.')) {\n const syntaxField = jsonKey.slice(7);\n value = declaration.syntax?.[syntaxField as keyof typeof declaration.syntax];\n } else {\n value = declaration[jsonKey as keyof AnchorRoutingDeclaration];\n }\n\n if (value == null) continue;\n\n if (jsonKey === 'cases' && Array.isArray(value)) {\n lines.push(`${field}: ${value.join(',')}`);\n } else if (typeof value === 'boolean') {\n lines.push(`${field}: ${value}`);\n } else {\n lines.push(`${field}: ${value}`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n// ── Parse anchor-routing.json ──\n\nexport function parseAnchorRoutingJson(json: string): AnchorRoutingDeclaration {\n const data = JSON.parse(json);\n\n if (typeof data.anchorRouting !== 'number') {\n data.anchorRouting = 1;\n }\n if (!Array.isArray(data.cases)) {\n data.cases = [];\n } else {\n data.cases = data.cases.filter((c: string) => VALID_CASES.has(c));\n }\n\n return data as AnchorRoutingDeclaration;\n}\n\n// ── Serialize AnchorRoutingDeclaration → anchor-routing.json ──\n\nexport function serializeAnchorRoutingJson(\n declaration: AnchorRoutingDeclaration,\n pretty = true,\n): string {\n return JSON.stringify(declaration, null, pretty ? 2 : undefined) + '\\n';\n}\n\n// ── Discover ar.txt from a base URL (browser/node fetch) ──\n\nconst DISCOVERY_PATHS = [\n '/.well-known/anchor-routing.json',\n '/.well-known/anchor-routing.txt',\n '/ar.txt',\n] as const;\n\nexport type AnchorRoutingDiscoveryResult = {\n declaration: AnchorRoutingDeclaration;\n source: string;\n format: 'json' | 'txt';\n} | null;\n\nexport async function discoverAnchorRouting(\n baseUrl: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<AnchorRoutingDiscoveryResult> {\n const base = baseUrl.replace(/\\/+$/, '');\n\n for (const path of DISCOVERY_PATHS) {\n const url = base + path;\n try {\n const response = await fetchFn(url, {\n method: 'GET',\n headers: { Accept: 'application/json, text/plain' },\n });\n if (!response.ok) continue;\n\n const text = await response.text();\n if (!text.trim()) continue;\n\n const isJson = path.endsWith('.json');\n\n return {\n declaration: isJson\n ? parseAnchorRoutingJson(text)\n : parseAnchorRoutingTxt(text),\n source: url,\n format: isJson ? 'json' : 'txt',\n };\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\n// ── Create a default declaration from constants ──\n\nexport function createDefaultDeclaration(\n overrides: Partial<AnchorRoutingDeclaration> = {},\n): AnchorRoutingDeclaration {\n return {\n anchorRouting: 1,\n cases: ['page', 'param', 'dot', 'intent'] as AnchorRoutingCase[],\n routingMode: 'registry' as AnchorRoutingMode,\n escapeMode: 'percent' as AnchorEscapeMode,\n registryVisibility: 'private' as AnchorRegistryVisibility,\n syntax: {\n anchorPrefix: '/~',\n pageCaseSeparator: '~',\n paramCaseSeparator: ';',\n dotCaseSeparator: '.',\n intentCaseBinding: 'name.value',\n },\n ...overrides,\n };\n}\n","export function normalizeAnchor(input: string): string {\n const raw = String(input ?? '').trim();\n\n if (!raw) {\n return '';\n }\n\n let normalized = raw;\n\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:\\/\\//.test(normalized)) {\n try {\n const url = new URL(normalized);\n normalized = url.pathname || '/';\n } catch {\n normalized = raw;\n }\n }\n\n const suffixIndex = normalized.search(/[?#]/);\n if (suffixIndex >= 0) {\n normalized = normalized.slice(0, suffixIndex);\n }\n\n if (!normalized.startsWith('/')) {\n normalized = `/${normalized}`;\n }\n\n normalized = normalized.replace(/\\/{2,}/g, '/');\n\n if (normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport { decodeAnchorKey, decodeAnchorToken } from './escape';\nimport { normalizeAnchor } from './normalize';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction parsePageRoute(normalized: string): AnchorRouteInstruction {\n const body = normalized.slice(1);\n\n if (body.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must use a single path segment in the form /page~section.',\n normalized,\n 'page',\n );\n }\n\n const parts = body.split(ANCHOR_SEPARATOR);\n\n if (parts.length !== 2) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must contain exactly one ~ separator.',\n normalized,\n 'page',\n );\n }\n\n const [rawPage, rawSection] = parts;\n\n if (!rawPage) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE,\n 'Page Case requires a non-empty page value.',\n normalized,\n 'page',\n );\n }\n\n if (!rawSection) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION,\n 'Page Case requires a non-empty section value.',\n normalized,\n 'page',\n );\n }\n\n return {\n mode: 'page',\n raw: normalized,\n page: decodeAnchorToken(rawPage, normalized, 'page'),\n section: decodeAnchorToken(rawSection, normalized, 'page'),\n };\n}\n\nfunction parseDotRoute(normalized: string, rawKey: string): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'dot');\n\n return {\n mode: 'dot',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n };\n}\n\nfunction parseParamRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'param');\n const args = payload.map((rawArgument) => {\n if (!rawArgument) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Param Case does not allow empty positional arguments.',\n normalized,\n 'param',\n );\n }\n\n return decodeAnchorToken(rawArgument, normalized, 'param');\n });\n\n return {\n mode: 'param',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n args,\n };\n}\n\nfunction parseIntentRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'intent');\n const namedArgs: Record<string, string> = {};\n\n for (const rawPair of payload) {\n const separatorIndex = rawPair.indexOf(DOT_SEPARATOR);\n\n if (separatorIndex <= 0 || separatorIndex === rawPair.length - 1) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n `Intent Case pair \"${rawPair}\" must use the form name.value.`,\n normalized,\n 'intent',\n );\n }\n\n const rawName = rawPair.slice(0, separatorIndex);\n const rawValue = rawPair.slice(separatorIndex + 1);\n const name = decodeAnchorToken(rawName, normalized, 'intent');\n const value = decodeAnchorToken(rawValue, normalized, 'intent');\n\n if (Object.prototype.hasOwnProperty.call(namedArgs, name)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_DUPLICATE_NAMED_ARG,\n `Intent Case contains duplicate named argument \"${name}\".`,\n normalized,\n 'intent',\n );\n }\n\n namedArgs[name] = value;\n }\n\n return {\n mode: 'intent',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n namedArgs,\n };\n}\n\nexport function parseAnchor(input: string): AnchorRouteInstruction {\n const normalized = normalizeAnchor(input);\n\n if (!normalized) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_INPUT,\n 'Anchor route input cannot be empty.',\n String(input ?? ''),\n );\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX) && normalized.includes(ANCHOR_SEPARATOR)) {\n return parsePageRoute(normalized);\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Input is not an Anchor Route.',\n normalized,\n );\n }\n\n const capsuleBody = normalized.slice(ANCHOR_PATH_PREFIX.length);\n\n if (!capsuleBody || capsuleBody.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Capsule cases must use the form /~key or /~key;payload.',\n normalized,\n );\n }\n\n const [rawKey, ...payload] = capsuleBody.split(ARG_SEPARATOR);\n\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Capsule cases require a non-empty route key.',\n normalized,\n );\n }\n\n if (payload.length === 0) {\n if (rawKey.includes(DOT_SEPARATOR)) {\n return parseDotRoute(normalized, rawKey);\n }\n\n return parseParamRoute(normalized, rawKey, []);\n }\n\n const payloadHasDot = payload.some((segment) => segment.includes(DOT_SEPARATOR));\n const payloadAllNamedPairs = payload.every((segment) => {\n const dotIndex = segment.indexOf(DOT_SEPARATOR);\n return dotIndex > 0 && dotIndex < segment.length - 1 && segment.indexOf(DOT_SEPARATOR, dotIndex + 1) === -1;\n });\n\n if (payloadHasDot) {\n if (!payloadAllNamedPairs) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n 'Intent Case payload must use only name.value pairs.',\n normalized,\n 'intent',\n );\n }\n\n return parseIntentRoute(normalized, rawKey, payload);\n }\n\n return parseParamRoute(normalized, rawKey, payload);\n}\n\nexport function isAnchorRoute(input: string): boolean {\n try {\n parseAnchor(input);\n return true;\n } catch {\n return false;\n }\n}","import { ANCHOR_ERROR_CODES, AnchorRouteError, createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport type { AnchorResolveOptions, AnchorRegistry, AnchorRouteInstruction, AnchorValidationResult } from './types';\n\nfunction highestPositionalIndex(instruction: AnchorRouteInstruction, registry?: AnchorRegistry): number {\n if (instruction.mode !== 'param' || !instruction.key) {\n return -1;\n }\n\n const definition = registry?.global?.[instruction.key];\n if (!definition?.positionalBind) {\n return -1;\n }\n\n return Math.max(...Object.values(definition.positionalBind), -1);\n}\n\nexport function validateAnchor(\n input: string | AnchorRouteInstruction,\n registry?: AnchorRegistry,\n options: AnchorResolveOptions = {},\n): AnchorValidationResult {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return { valid: false, errors: [error.toDiagnostic()] };\n }\n\n throw error;\n }\n\n const errors = [] as AnchorValidationResult['errors'];\n\n switch (instruction.mode) {\n case 'page': {\n if (!instruction.page) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page Case requires a page value.', instruction.raw, 'page'));\n }\n\n if (!instruction.section) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Page Case requires a section value.', instruction.raw, 'page'));\n }\n\n if (instruction.page && registry?.pages && !registry.pages[instruction.page]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_PAGE_NOT_FOUND,\n `No page registry entry exists for \"${instruction.page}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n if (instruction.page && instruction.section && registry?.pages?.[instruction.page] && !registry.pages[instruction.page][instruction.section]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_SECTION_NOT_FOUND,\n `No page section registry entry exists for \"${instruction.page}~${instruction.section}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n break;\n }\n case 'param': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n const requiredCount = definition?.requiredPositionalCount ?? highestPositionalIndex(instruction, registry) + 1;\n\n if ((instruction.args?.length ?? 0) < requiredCount) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Param Case key \"${instruction.key}\" expects at least ${requiredCount} positional arguments.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n if (options.maxArgs != null && (instruction.args?.length ?? 0) > options.maxArgs) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_TOO_MANY_ARGS,\n `Param Case exceeds the maximum allowed positional argument count of ${options.maxArgs}.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n break;\n }\n case 'dot': {\n if (instruction.key && registry?.global && !registry.global[instruction.key]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'dot',\n ),\n );\n }\n\n break;\n }\n case 'intent': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n break;\n }\n\n const requiredNames = definition?.requiredNamedArgs ?? Object.values(definition?.namedBind ?? {});\n for (const requiredName of requiredNames) {\n if (!instruction.namedArgs || !Object.prototype.hasOwnProperty.call(instruction.namedArgs, requiredName)) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Intent Case key \"${instruction.key}\" requires named argument \"${requiredName}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n\n if (definition?.namedBind && instruction.namedArgs) {\n const allowedNames = new Set(Object.values(definition.namedBind));\n for (const name of Object.keys(instruction.namedArgs)) {\n if (!allowedNames.has(name) && (options.unknownNamedArgs ?? 'reject') === 'reject') {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_INVALID_NAMED_ARG,\n `Intent Case key \"${instruction.key}\" does not allow named argument \"${name}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n }\n\n break;\n }\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n\n return {\n valid: errors.length === 0,\n instruction,\n errors,\n };\n}","import { createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport { validateAnchor } from './validate';\nimport type {\n AnchorBindingTarget,\n AnchorResolveOptions,\n AnchorRegistry,\n AnchorResolvedRoute,\n AnchorRouteInstruction,\n AnchorTargetDefinition,\n} from './types';\n\nfunction pickBindingTarget(definition: AnchorTargetDefinition, field: string): AnchorBindingTarget {\n return definition.bindingTargets?.[field] ?? 'params';\n}\n\nfunction assignBoundValue(\n field: string,\n value: string,\n definition: AnchorTargetDefinition,\n params: Record<string, string>,\n query: Record<string, string>,\n): void {\n if (pickBindingTarget(definition, field) === 'query') {\n query[field] = value;\n return;\n }\n\n params[field] = value;\n}\n\nfunction buildResolvedRoute(\n instruction: AnchorRouteInstruction,\n definition: AnchorTargetDefinition,\n extraMeta: Record<string, unknown> = {},\n): AnchorResolvedRoute {\n const params = { ...(definition.defaultParams ?? {}) };\n const query = { ...(definition.defaultQuery ?? {}) };\n\n if (instruction.mode === 'param' && definition.positionalBind) {\n for (const [field, index] of Object.entries(definition.positionalBind)) {\n const value = instruction.args?.[index];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n if (instruction.mode === 'intent' && definition.namedBind) {\n for (const [field, sourceName] of Object.entries(definition.namedBind)) {\n const value = instruction.namedArgs?.[sourceName];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n return {\n success: true,\n mode: instruction.mode,\n raw: instruction.raw,\n name: definition.name,\n path: definition.path,\n params: Object.keys(params).length > 0 ? params : undefined,\n query: Object.keys(query).length > 0 ? query : undefined,\n hash: definition.hash,\n title: definition.title,\n permissions: definition.permissions,\n meta: {\n ...definition.meta,\n ...extraMeta,\n instruction,\n },\n };\n}\n\nfunction errorResult(\n raw: string,\n mode: AnchorResolvedRoute['mode'],\n code: AnchorResolvedRoute['errorCode'],\n message: string,\n diagnostics = code ? [createDiagnostic(code, message, raw, mode)] : undefined,\n): AnchorResolvedRoute {\n return {\n success: false,\n mode,\n raw,\n errorCode: code,\n errorMessage: message,\n diagnostics,\n };\n}\n\nexport function resolveAnchor(\n input: string | AnchorRouteInstruction,\n registry: AnchorRegistry = {},\n options: AnchorResolveOptions = {},\n): AnchorResolvedRoute {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return {\n success: false,\n mode: 'unknown',\n raw: error.raw,\n errorCode: error.code,\n errorMessage: error.message,\n diagnostics: [error.toDiagnostic()],\n };\n }\n\n throw error;\n }\n\n const validation = validateAnchor(instruction, registry, options);\n if (!validation.valid) {\n const [firstDiagnostic] = validation.errors;\n return {\n success: false,\n mode: instruction.mode,\n raw: instruction.raw,\n errorCode: firstDiagnostic?.code,\n errorMessage: firstDiagnostic?.message,\n diagnostics: validation.errors,\n };\n }\n\n switch (instruction.mode) {\n case 'page': {\n const definition = registry.pages?.[instruction.page ?? '']?.[instruction.section ?? ''];\n if (!definition) {\n return errorResult(\n instruction.raw,\n 'page',\n validation.errors[0]?.code ?? 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n validation.errors[0]?.message ?? `Page Case could not be resolved for \"${instruction.page}~${instruction.section}\".`,\n validation.errors.length > 0 ? validation.errors : undefined,\n );\n }\n\n return buildResolvedRoute(instruction, definition, {\n page: instruction.page,\n section: instruction.section,\n });\n }\n case 'param': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'param', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Param Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n args: instruction.args ?? [],\n });\n }\n case 'dot': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'dot', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Dot Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n pathTokens: instruction.pathTokens ?? [],\n });\n }\n case 'intent': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'intent', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Intent Case could not be resolved.', validation.errors);\n }\n\n const allowedNames = new Set(Object.values(definition.namedBind ?? {}));\n const unknownNamedArgs = Object.entries(instruction.namedArgs ?? {}).filter(([name]) => !allowedNames.has(name));\n const meta: Record<string, unknown> = {\n key: instruction.key,\n namedArgs: instruction.namedArgs ?? {},\n };\n\n if ((options.unknownNamedArgs ?? 'reject') === 'keep' && unknownNamedArgs.length > 0) {\n meta.unknownNamedArgs = Object.fromEntries(unknownNamedArgs);\n }\n\n return buildResolvedRoute(instruction, definition, meta);\n }\n default:\n return errorResult(instruction.raw, 'unknown', undefined, `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`);\n }\n}"],"mappings":"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","names":[]}
package/dist/index.mjs CHANGED
@@ -234,6 +234,173 @@ function serializeAnchor(instruction) {
234
234
  }
235
235
  }
236
236
 
237
+ // src/declaration.ts
238
+ var TEXT_TO_JSON = {
239
+ "Anchor-Routing": "anchorRouting",
240
+ "Name": "name",
241
+ "SDK": "sdk",
242
+ "Cases": "cases",
243
+ "Primary-Case": "primaryCase",
244
+ "Routing-Mode": "routingMode",
245
+ "Internal-Anchor-Routing": "internalAnchorRouting",
246
+ "Public-SEO-URLs": "publicSeoUrls",
247
+ "Anchor-Prefix": "syntax.anchorPrefix",
248
+ "Page-Case-Separator": "syntax.pageCaseSeparator",
249
+ "Param-Case-Separator": "syntax.paramCaseSeparator",
250
+ "Dot-Case-Separator": "syntax.dotCaseSeparator",
251
+ "Intent-Case-Binding": "syntax.intentCaseBinding",
252
+ "Escape-Mode": "escapeMode",
253
+ "Registry-Visibility": "registryVisibility",
254
+ "Resolver-Endpoint": "resolverEndpoint",
255
+ "Docs": "docs",
256
+ "Playground": "playground"
257
+ };
258
+ var JSON_TO_TEXT = {};
259
+ for (const [text, json] of Object.entries(TEXT_TO_JSON)) {
260
+ JSON_TO_TEXT[json] = text;
261
+ }
262
+ var VALID_CASES = /* @__PURE__ */ new Set(["page", "param", "dot", "intent"]);
263
+ function parseAnchorRoutingTxt(text) {
264
+ const result = {};
265
+ const syntax = {};
266
+ for (const raw of text.split("\n")) {
267
+ const line = raw.trim();
268
+ if (!line || line.startsWith("#")) continue;
269
+ const colonIndex = line.indexOf(":");
270
+ if (colonIndex === -1) continue;
271
+ const field = line.slice(0, colonIndex).trim();
272
+ const value = line.slice(colonIndex + 1).trim();
273
+ if (!value) continue;
274
+ const jsonKey = TEXT_TO_JSON[field];
275
+ if (!jsonKey) continue;
276
+ if (jsonKey.startsWith("syntax.")) {
277
+ syntax[jsonKey.slice(7)] = value;
278
+ } else if (jsonKey === "anchorRouting") {
279
+ result.anchorRouting = parseInt(value, 10);
280
+ } else if (jsonKey === "cases") {
281
+ result.cases = value.split(",").map((c) => c.trim()).filter((c) => VALID_CASES.has(c));
282
+ } else if (jsonKey === "internalAnchorRouting" || jsonKey === "publicSeoUrls") {
283
+ result[jsonKey] = value === "true";
284
+ } else {
285
+ result[jsonKey] = value;
286
+ }
287
+ }
288
+ if (Object.keys(syntax).length > 0) {
289
+ result.syntax = syntax;
290
+ }
291
+ if (result.anchorRouting == null) {
292
+ result.anchorRouting = 1;
293
+ }
294
+ if (!result.cases) {
295
+ result.cases = [];
296
+ }
297
+ return result;
298
+ }
299
+ var TEXT_FIELD_ORDER = [
300
+ "Anchor-Routing",
301
+ "Name",
302
+ "SDK",
303
+ "Cases",
304
+ "Primary-Case",
305
+ "Routing-Mode",
306
+ "Internal-Anchor-Routing",
307
+ "Public-SEO-URLs",
308
+ "Anchor-Prefix",
309
+ "Page-Case-Separator",
310
+ "Param-Case-Separator",
311
+ "Dot-Case-Separator",
312
+ "Intent-Case-Binding",
313
+ "Escape-Mode",
314
+ "Registry-Visibility",
315
+ "Resolver-Endpoint",
316
+ "Docs",
317
+ "Playground"
318
+ ];
319
+ function serializeAnchorRoutingTxt(declaration) {
320
+ const lines = [];
321
+ for (const field of TEXT_FIELD_ORDER) {
322
+ const jsonKey = TEXT_TO_JSON[field];
323
+ if (!jsonKey) continue;
324
+ let value;
325
+ if (jsonKey.startsWith("syntax.")) {
326
+ const syntaxField = jsonKey.slice(7);
327
+ value = declaration.syntax?.[syntaxField];
328
+ } else {
329
+ value = declaration[jsonKey];
330
+ }
331
+ if (value == null) continue;
332
+ if (jsonKey === "cases" && Array.isArray(value)) {
333
+ lines.push(`${field}: ${value.join(",")}`);
334
+ } else if (typeof value === "boolean") {
335
+ lines.push(`${field}: ${value}`);
336
+ } else {
337
+ lines.push(`${field}: ${value}`);
338
+ }
339
+ }
340
+ return lines.join("\n") + "\n";
341
+ }
342
+ function parseAnchorRoutingJson(json) {
343
+ const data = JSON.parse(json);
344
+ if (typeof data.anchorRouting !== "number") {
345
+ data.anchorRouting = 1;
346
+ }
347
+ if (!Array.isArray(data.cases)) {
348
+ data.cases = [];
349
+ } else {
350
+ data.cases = data.cases.filter((c) => VALID_CASES.has(c));
351
+ }
352
+ return data;
353
+ }
354
+ function serializeAnchorRoutingJson(declaration, pretty = true) {
355
+ return JSON.stringify(declaration, null, pretty ? 2 : void 0) + "\n";
356
+ }
357
+ var DISCOVERY_PATHS = [
358
+ "/.well-known/anchor-routing.json",
359
+ "/.well-known/anchor-routing.txt",
360
+ "/ar.txt"
361
+ ];
362
+ async function discoverAnchorRouting(baseUrl, fetchFn = globalThis.fetch) {
363
+ const base = baseUrl.replace(/\/+$/, "");
364
+ for (const path of DISCOVERY_PATHS) {
365
+ const url = base + path;
366
+ try {
367
+ const response = await fetchFn(url, {
368
+ method: "GET",
369
+ headers: { Accept: "application/json, text/plain" }
370
+ });
371
+ if (!response.ok) continue;
372
+ const text = await response.text();
373
+ if (!text.trim()) continue;
374
+ const isJson = path.endsWith(".json");
375
+ return {
376
+ declaration: isJson ? parseAnchorRoutingJson(text) : parseAnchorRoutingTxt(text),
377
+ source: url,
378
+ format: isJson ? "json" : "txt"
379
+ };
380
+ } catch {
381
+ continue;
382
+ }
383
+ }
384
+ return null;
385
+ }
386
+ function createDefaultDeclaration(overrides = {}) {
387
+ return {
388
+ anchorRouting: 1,
389
+ cases: ["page", "param", "dot", "intent"],
390
+ routingMode: "registry",
391
+ escapeMode: "percent",
392
+ registryVisibility: "private",
393
+ syntax: {
394
+ anchorPrefix: "/~",
395
+ pageCaseSeparator: "~",
396
+ paramCaseSeparator: ";",
397
+ dotCaseSeparator: ".",
398
+ intentCaseBinding: "name.value"
399
+ },
400
+ ...overrides
401
+ };
402
+ }
403
+
237
404
  // src/normalize.ts
238
405
  function normalizeAnchor(input) {
239
406
  const raw = String(input ?? "").trim();
@@ -754,9 +921,11 @@ export {
754
921
  buildIntentAnchor,
755
922
  buildPageAnchor,
756
923
  buildParamAnchor,
924
+ createDefaultDeclaration,
757
925
  createDiagnostic,
758
926
  decodeAnchorKey,
759
927
  decodeAnchorToken,
928
+ discoverAnchorRouting,
760
929
  escapeAnchorKey,
761
930
  escapeAnchorValue,
762
931
  isAnchorRoute,
@@ -765,8 +934,12 @@ export {
765
934
  isReservedAnchorCharacter,
766
935
  normalizeAnchor,
767
936
  parseAnchor,
937
+ parseAnchorRoutingJson,
938
+ parseAnchorRoutingTxt,
768
939
  resolveAnchor,
769
940
  serializeAnchor,
941
+ serializeAnchorRoutingJson,
942
+ serializeAnchorRoutingTxt,
770
943
  validateAnchor,
771
944
  validateEncodedToken
772
945
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/escape.ts","../src/builders.ts","../src/normalize.ts","../src/parser.ts","../src/validate.ts","../src/resolve.ts"],"sourcesContent":["export const ANCHOR_PATH_PREFIX = '/~';\nexport const ARG_SEPARATOR = ';';\nexport const ANCHOR_SEPARATOR = '~';\nexport const DOT_SEPARATOR = '.';\n\nexport const RESERVED_ANCHOR_CHARACTERS = ['/', '~', ';', '.', '=', '@', '#', '%'] as const;\n\nconst reservedAnchorCharacterSet = new Set<string>(RESERVED_ANCHOR_CHARACTERS);\n\nexport const SAFE_LITERAL_CHARACTER = /^[A-Za-z0-9_-]$/;\n\nexport function isReservedAnchorCharacter(character: string): boolean {\n return reservedAnchorCharacterSet.has(character);\n}\n\nexport function isHexDigit(character: string): boolean {\n return /^[0-9A-Fa-f]$/.test(character);\n}","export const ANCHOR_ERROR_CODES = {\n ANCHOR_PARSE_EMPTY_INPUT: 'ANCHOR_PARSE_EMPTY_INPUT',\n ANCHOR_PARSE_INVALID_FORMAT: 'ANCHOR_PARSE_INVALID_FORMAT',\n ANCHOR_PARSE_EMPTY_PAGE: 'ANCHOR_PARSE_EMPTY_PAGE',\n ANCHOR_PARSE_EMPTY_SECTION: 'ANCHOR_PARSE_EMPTY_SECTION',\n ANCHOR_PARSE_EMPTY_KEY: 'ANCHOR_PARSE_EMPTY_KEY',\n ANCHOR_PARSE_INVALID_DOT_KEY: 'ANCHOR_PARSE_INVALID_DOT_KEY',\n ANCHOR_PARSE_INVALID_INTENT_PAIR: 'ANCHOR_PARSE_INVALID_INTENT_PAIR',\n ANCHOR_PARSE_DUPLICATE_NAMED_ARG: 'ANCHOR_PARSE_DUPLICATE_NAMED_ARG',\n ANCHOR_ESCAPE_INVALID_SEQUENCE: 'ANCHOR_ESCAPE_INVALID_SEQUENCE',\n ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR: 'ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR',\n ANCHOR_VALIDATE_TOO_MANY_ARGS: 'ANCHOR_VALIDATE_TOO_MANY_ARGS',\n ANCHOR_RESOLVE_PAGE_NOT_FOUND: 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n ANCHOR_RESOLVE_SECTION_NOT_FOUND: 'ANCHOR_RESOLVE_SECTION_NOT_FOUND',\n ANCHOR_RESOLVE_KEY_NOT_FOUND: 'ANCHOR_RESOLVE_KEY_NOT_FOUND',\n ANCHOR_RESOLVE_BINDING_MISSING_ARG: 'ANCHOR_RESOLVE_BINDING_MISSING_ARG',\n ANCHOR_RESOLVE_INVALID_NAMED_ARG: 'ANCHOR_RESOLVE_INVALID_NAMED_ARG',\n} as const;\n\nexport type AnchorErrorCode = (typeof ANCHOR_ERROR_CODES)[keyof typeof ANCHOR_ERROR_CODES];\n\nexport interface AnchorDiagnostic {\n code: AnchorErrorCode;\n message: string;\n raw: string;\n mode?: string;\n}\n\nexport class AnchorRouteError extends Error {\n readonly code: AnchorErrorCode;\n readonly raw: string;\n readonly mode?: string;\n\n constructor(code: AnchorErrorCode, message: string, raw: string, mode?: string) {\n super(message);\n this.name = 'AnchorRouteError';\n this.code = code;\n this.raw = raw;\n this.mode = mode;\n }\n\n toDiagnostic(): AnchorDiagnostic {\n return {\n code: this.code,\n message: this.message,\n raw: this.raw,\n mode: this.mode,\n };\n }\n}\n\nexport function createDiagnostic(\n code: AnchorErrorCode,\n message: string,\n raw: string,\n mode?: string,\n): AnchorDiagnostic {\n return { code, message, raw, mode };\n}\n\nexport function isAnchorRouteError(error: unknown): error is AnchorRouteError {\n return error instanceof AnchorRouteError;\n}","import { DOT_SEPARATOR, SAFE_LITERAL_CHARACTER, isHexDigit, isReservedAnchorCharacter } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport type { DecodedAnchorKey } from './types';\n\nconst encoder = new TextEncoder();\n\nfunction encodeCharacter(character: string): string {\n return Array.from(encoder.encode(character))\n .map((byte) => `%${byte.toString(16).toUpperCase().padStart(2, '0')}`)\n .join('');\n}\n\nexport function escapeAnchorValue(input: string): string {\n const value = String(input ?? '');\n let output = '';\n\n for (const character of value) {\n output += SAFE_LITERAL_CHARACTER.test(character) ? character : encodeCharacter(character);\n }\n\n return output;\n}\n\nexport function validateEncodedToken(rawToken: string, rawInput: string, mode?: string): void {\n for (let index = 0; index < rawToken.length; index += 1) {\n const character = rawToken[index];\n\n if (character === '%') {\n const high = rawToken[index + 1];\n const low = rawToken[index + 2];\n\n if (!high || !low || !isHexDigit(high) || !isHexDigit(low)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n\n index += 2;\n continue;\n }\n\n if (isReservedAnchorCharacter(character)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR,\n `Reserved character \"${character}\" must be percent-encoded inside anchor values.`,\n rawInput,\n mode,\n );\n }\n }\n}\n\nexport function decodeAnchorToken(rawToken: string, rawInput: string, mode?: string): string {\n validateEncodedToken(rawToken, rawInput, mode);\n\n try {\n return decodeURIComponent(rawToken);\n } catch {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n}\n\nexport function decodeAnchorKey(rawKey: string, rawInput: string, mode?: string): DecodedAnchorKey {\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawInput,\n mode,\n );\n }\n\n const rawSegments = rawKey.split(DOT_SEPARATOR);\n\n if (rawSegments.some((segment) => segment.length === 0)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawInput,\n mode,\n );\n }\n\n const pathTokens = rawSegments.map((segment) => {\n const decoded = decodeAnchorToken(segment, rawInput, mode);\n\n if (decoded.includes(DOT_SEPARATOR)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key segment \"${decoded}\" must not decode to another dot separator.`,\n rawInput,\n mode,\n );\n }\n\n return decoded;\n });\n\n return {\n key: pathTokens.join(DOT_SEPARATOR),\n pathTokens,\n };\n}\n\nexport function escapeAnchorKey(input: string): string {\n const rawKey = String(input ?? '').trim();\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawKey,\n );\n }\n\n const segments = rawKey.split(DOT_SEPARATOR).map((segment) => segment.trim());\n\n if (segments.some((segment) => !segment)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawKey,\n );\n }\n\n return segments.map((segment) => escapeAnchorValue(segment)).join(DOT_SEPARATOR);\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError, type AnchorErrorCode } from './errors';\nimport { escapeAnchorKey, escapeAnchorValue } from './escape';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction requireValue(value: string, code: AnchorErrorCode, message: string): string {\n const trimmed = String(value ?? '').trim();\n\n if (!trimmed) {\n throw new AnchorRouteError(code, message, String(value ?? ''));\n }\n\n return trimmed;\n}\n\nexport function buildPageAnchor(page: string, section: string): string {\n const safePage = escapeAnchorValue(requireValue(page, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page value cannot be empty.'));\n const safeSection = escapeAnchorValue(\n requireValue(section, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Section value cannot be empty.'),\n );\n\n return `/${safePage}${ANCHOR_SEPARATOR}${safeSection}`;\n}\n\nexport function buildParamAnchor(key: string, args: string[] = []): string {\n const safeKey = escapeAnchorKey(key);\n const encodedArgs = args.map((argument) => escapeAnchorValue(String(argument ?? '')));\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedArgs.map((argument) => `${ARG_SEPARATOR}${argument}`).join('')}`;\n}\n\nexport function buildDotAnchor(tokens: string[]): string {\n if (!Array.isArray(tokens) || tokens.length === 0) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n 'Dot case requires at least one token.',\n String(tokens ?? ''),\n );\n }\n\n const key = tokens.map((token) => requireValue(token, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY, 'Dot token cannot be empty.')).join(DOT_SEPARATOR);\n return `${ANCHOR_PATH_PREFIX}${escapeAnchorKey(key)}`;\n}\n\nexport function buildIntentAnchor(key: string, namedArgs: Record<string, string>): string {\n const safeKey = escapeAnchorKey(key);\n const pairs = Object.entries(namedArgs ?? {});\n\n if (pairs.length === 0) {\n return `${ANCHOR_PATH_PREFIX}${safeKey}`;\n }\n\n const encodedPairs = pairs.map(([name, value]) => {\n const safeName = escapeAnchorValue(\n requireValue(name, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, 'Intent argument name cannot be empty.'),\n );\n const safeValue = escapeAnchorValue(\n requireValue(value, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, `Intent argument \"${name}\" cannot be empty.`),\n );\n return `${ARG_SEPARATOR}${safeName}${DOT_SEPARATOR}${safeValue}`;\n });\n\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedPairs.join('')}`;\n}\n\nexport function serializeAnchor(instruction: AnchorRouteInstruction): string {\n switch (instruction.mode) {\n case 'page':\n return buildPageAnchor(instruction.page ?? '', instruction.section ?? '');\n case 'param':\n return buildParamAnchor(instruction.key ?? '', instruction.args ?? []);\n case 'dot':\n return buildDotAnchor(instruction.pathTokens ?? (instruction.key ? instruction.key.split(DOT_SEPARATOR) : []));\n case 'intent':\n return buildIntentAnchor(instruction.key ?? '', instruction.namedArgs ?? {});\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported anchor route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n}","export function normalizeAnchor(input: string): string {\n const raw = String(input ?? '').trim();\n\n if (!raw) {\n return '';\n }\n\n let normalized = raw;\n\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:\\/\\//.test(normalized)) {\n try {\n const url = new URL(normalized);\n normalized = url.pathname || '/';\n } catch {\n normalized = raw;\n }\n }\n\n const suffixIndex = normalized.search(/[?#]/);\n if (suffixIndex >= 0) {\n normalized = normalized.slice(0, suffixIndex);\n }\n\n if (!normalized.startsWith('/')) {\n normalized = `/${normalized}`;\n }\n\n normalized = normalized.replace(/\\/{2,}/g, '/');\n\n if (normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport { decodeAnchorKey, decodeAnchorToken } from './escape';\nimport { normalizeAnchor } from './normalize';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction parsePageRoute(normalized: string): AnchorRouteInstruction {\n const body = normalized.slice(1);\n\n if (body.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must use a single path segment in the form /page~section.',\n normalized,\n 'page',\n );\n }\n\n const parts = body.split(ANCHOR_SEPARATOR);\n\n if (parts.length !== 2) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must contain exactly one ~ separator.',\n normalized,\n 'page',\n );\n }\n\n const [rawPage, rawSection] = parts;\n\n if (!rawPage) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE,\n 'Page Case requires a non-empty page value.',\n normalized,\n 'page',\n );\n }\n\n if (!rawSection) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION,\n 'Page Case requires a non-empty section value.',\n normalized,\n 'page',\n );\n }\n\n return {\n mode: 'page',\n raw: normalized,\n page: decodeAnchorToken(rawPage, normalized, 'page'),\n section: decodeAnchorToken(rawSection, normalized, 'page'),\n };\n}\n\nfunction parseDotRoute(normalized: string, rawKey: string): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'dot');\n\n return {\n mode: 'dot',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n };\n}\n\nfunction parseParamRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'param');\n const args = payload.map((rawArgument) => {\n if (!rawArgument) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Param Case does not allow empty positional arguments.',\n normalized,\n 'param',\n );\n }\n\n return decodeAnchorToken(rawArgument, normalized, 'param');\n });\n\n return {\n mode: 'param',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n args,\n };\n}\n\nfunction parseIntentRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'intent');\n const namedArgs: Record<string, string> = {};\n\n for (const rawPair of payload) {\n const separatorIndex = rawPair.indexOf(DOT_SEPARATOR);\n\n if (separatorIndex <= 0 || separatorIndex === rawPair.length - 1) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n `Intent Case pair \"${rawPair}\" must use the form name.value.`,\n normalized,\n 'intent',\n );\n }\n\n const rawName = rawPair.slice(0, separatorIndex);\n const rawValue = rawPair.slice(separatorIndex + 1);\n const name = decodeAnchorToken(rawName, normalized, 'intent');\n const value = decodeAnchorToken(rawValue, normalized, 'intent');\n\n if (Object.prototype.hasOwnProperty.call(namedArgs, name)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_DUPLICATE_NAMED_ARG,\n `Intent Case contains duplicate named argument \"${name}\".`,\n normalized,\n 'intent',\n );\n }\n\n namedArgs[name] = value;\n }\n\n return {\n mode: 'intent',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n namedArgs,\n };\n}\n\nexport function parseAnchor(input: string): AnchorRouteInstruction {\n const normalized = normalizeAnchor(input);\n\n if (!normalized) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_INPUT,\n 'Anchor route input cannot be empty.',\n String(input ?? ''),\n );\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX) && normalized.includes(ANCHOR_SEPARATOR)) {\n return parsePageRoute(normalized);\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Input is not an Anchor Route.',\n normalized,\n );\n }\n\n const capsuleBody = normalized.slice(ANCHOR_PATH_PREFIX.length);\n\n if (!capsuleBody || capsuleBody.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Capsule cases must use the form /~key or /~key;payload.',\n normalized,\n );\n }\n\n const [rawKey, ...payload] = capsuleBody.split(ARG_SEPARATOR);\n\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Capsule cases require a non-empty route key.',\n normalized,\n );\n }\n\n if (payload.length === 0) {\n if (rawKey.includes(DOT_SEPARATOR)) {\n return parseDotRoute(normalized, rawKey);\n }\n\n return parseParamRoute(normalized, rawKey, []);\n }\n\n const payloadHasDot = payload.some((segment) => segment.includes(DOT_SEPARATOR));\n const payloadAllNamedPairs = payload.every((segment) => {\n const dotIndex = segment.indexOf(DOT_SEPARATOR);\n return dotIndex > 0 && dotIndex < segment.length - 1 && segment.indexOf(DOT_SEPARATOR, dotIndex + 1) === -1;\n });\n\n if (payloadHasDot) {\n if (!payloadAllNamedPairs) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n 'Intent Case payload must use only name.value pairs.',\n normalized,\n 'intent',\n );\n }\n\n return parseIntentRoute(normalized, rawKey, payload);\n }\n\n return parseParamRoute(normalized, rawKey, payload);\n}\n\nexport function isAnchorRoute(input: string): boolean {\n try {\n parseAnchor(input);\n return true;\n } catch {\n return false;\n }\n}","import { ANCHOR_ERROR_CODES, AnchorRouteError, createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport type { AnchorResolveOptions, AnchorRegistry, AnchorRouteInstruction, AnchorValidationResult } from './types';\n\nfunction highestPositionalIndex(instruction: AnchorRouteInstruction, registry?: AnchorRegistry): number {\n if (instruction.mode !== 'param' || !instruction.key) {\n return -1;\n }\n\n const definition = registry?.global?.[instruction.key];\n if (!definition?.positionalBind) {\n return -1;\n }\n\n return Math.max(...Object.values(definition.positionalBind), -1);\n}\n\nexport function validateAnchor(\n input: string | AnchorRouteInstruction,\n registry?: AnchorRegistry,\n options: AnchorResolveOptions = {},\n): AnchorValidationResult {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return { valid: false, errors: [error.toDiagnostic()] };\n }\n\n throw error;\n }\n\n const errors = [] as AnchorValidationResult['errors'];\n\n switch (instruction.mode) {\n case 'page': {\n if (!instruction.page) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page Case requires a page value.', instruction.raw, 'page'));\n }\n\n if (!instruction.section) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Page Case requires a section value.', instruction.raw, 'page'));\n }\n\n if (instruction.page && registry?.pages && !registry.pages[instruction.page]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_PAGE_NOT_FOUND,\n `No page registry entry exists for \"${instruction.page}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n if (instruction.page && instruction.section && registry?.pages?.[instruction.page] && !registry.pages[instruction.page][instruction.section]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_SECTION_NOT_FOUND,\n `No page section registry entry exists for \"${instruction.page}~${instruction.section}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n break;\n }\n case 'param': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n const requiredCount = definition?.requiredPositionalCount ?? highestPositionalIndex(instruction, registry) + 1;\n\n if ((instruction.args?.length ?? 0) < requiredCount) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Param Case key \"${instruction.key}\" expects at least ${requiredCount} positional arguments.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n if (options.maxArgs != null && (instruction.args?.length ?? 0) > options.maxArgs) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_TOO_MANY_ARGS,\n `Param Case exceeds the maximum allowed positional argument count of ${options.maxArgs}.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n break;\n }\n case 'dot': {\n if (instruction.key && registry?.global && !registry.global[instruction.key]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'dot',\n ),\n );\n }\n\n break;\n }\n case 'intent': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n break;\n }\n\n const requiredNames = definition?.requiredNamedArgs ?? Object.values(definition?.namedBind ?? {});\n for (const requiredName of requiredNames) {\n if (!instruction.namedArgs || !Object.prototype.hasOwnProperty.call(instruction.namedArgs, requiredName)) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Intent Case key \"${instruction.key}\" requires named argument \"${requiredName}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n\n if (definition?.namedBind && instruction.namedArgs) {\n const allowedNames = new Set(Object.values(definition.namedBind));\n for (const name of Object.keys(instruction.namedArgs)) {\n if (!allowedNames.has(name) && (options.unknownNamedArgs ?? 'reject') === 'reject') {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_INVALID_NAMED_ARG,\n `Intent Case key \"${instruction.key}\" does not allow named argument \"${name}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n }\n\n break;\n }\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n\n return {\n valid: errors.length === 0,\n instruction,\n errors,\n };\n}","import { createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport { validateAnchor } from './validate';\nimport type {\n AnchorBindingTarget,\n AnchorResolveOptions,\n AnchorRegistry,\n AnchorResolvedRoute,\n AnchorRouteInstruction,\n AnchorTargetDefinition,\n} from './types';\n\nfunction pickBindingTarget(definition: AnchorTargetDefinition, field: string): AnchorBindingTarget {\n return definition.bindingTargets?.[field] ?? 'params';\n}\n\nfunction assignBoundValue(\n field: string,\n value: string,\n definition: AnchorTargetDefinition,\n params: Record<string, string>,\n query: Record<string, string>,\n): void {\n if (pickBindingTarget(definition, field) === 'query') {\n query[field] = value;\n return;\n }\n\n params[field] = value;\n}\n\nfunction buildResolvedRoute(\n instruction: AnchorRouteInstruction,\n definition: AnchorTargetDefinition,\n extraMeta: Record<string, unknown> = {},\n): AnchorResolvedRoute {\n const params = { ...(definition.defaultParams ?? {}) };\n const query = { ...(definition.defaultQuery ?? {}) };\n\n if (instruction.mode === 'param' && definition.positionalBind) {\n for (const [field, index] of Object.entries(definition.positionalBind)) {\n const value = instruction.args?.[index];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n if (instruction.mode === 'intent' && definition.namedBind) {\n for (const [field, sourceName] of Object.entries(definition.namedBind)) {\n const value = instruction.namedArgs?.[sourceName];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n return {\n success: true,\n mode: instruction.mode,\n raw: instruction.raw,\n name: definition.name,\n path: definition.path,\n params: Object.keys(params).length > 0 ? params : undefined,\n query: Object.keys(query).length > 0 ? query : undefined,\n hash: definition.hash,\n title: definition.title,\n permissions: definition.permissions,\n meta: {\n ...definition.meta,\n ...extraMeta,\n instruction,\n },\n };\n}\n\nfunction errorResult(\n raw: string,\n mode: AnchorResolvedRoute['mode'],\n code: AnchorResolvedRoute['errorCode'],\n message: string,\n diagnostics = code ? [createDiagnostic(code, message, raw, mode)] : undefined,\n): AnchorResolvedRoute {\n return {\n success: false,\n mode,\n raw,\n errorCode: code,\n errorMessage: message,\n diagnostics,\n };\n}\n\nexport function resolveAnchor(\n input: string | AnchorRouteInstruction,\n registry: AnchorRegistry = {},\n options: AnchorResolveOptions = {},\n): AnchorResolvedRoute {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return {\n success: false,\n mode: 'unknown',\n raw: error.raw,\n errorCode: error.code,\n errorMessage: error.message,\n diagnostics: [error.toDiagnostic()],\n };\n }\n\n throw error;\n }\n\n const validation = validateAnchor(instruction, registry, options);\n if (!validation.valid) {\n const [firstDiagnostic] = validation.errors;\n return {\n success: false,\n mode: instruction.mode,\n raw: instruction.raw,\n errorCode: firstDiagnostic?.code,\n errorMessage: firstDiagnostic?.message,\n diagnostics: validation.errors,\n };\n }\n\n switch (instruction.mode) {\n case 'page': {\n const definition = registry.pages?.[instruction.page ?? '']?.[instruction.section ?? ''];\n if (!definition) {\n return errorResult(\n instruction.raw,\n 'page',\n validation.errors[0]?.code ?? 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n validation.errors[0]?.message ?? `Page Case could not be resolved for \"${instruction.page}~${instruction.section}\".`,\n validation.errors.length > 0 ? validation.errors : undefined,\n );\n }\n\n return buildResolvedRoute(instruction, definition, {\n page: instruction.page,\n section: instruction.section,\n });\n }\n case 'param': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'param', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Param Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n args: instruction.args ?? [],\n });\n }\n case 'dot': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'dot', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Dot Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n pathTokens: instruction.pathTokens ?? [],\n });\n }\n case 'intent': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'intent', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Intent Case could not be resolved.', validation.errors);\n }\n\n const allowedNames = new Set(Object.values(definition.namedBind ?? {}));\n const unknownNamedArgs = Object.entries(instruction.namedArgs ?? {}).filter(([name]) => !allowedNames.has(name));\n const meta: Record<string, unknown> = {\n key: instruction.key,\n namedArgs: instruction.namedArgs ?? {},\n };\n\n if ((options.unknownNamedArgs ?? 'reject') === 'keep' && unknownNamedArgs.length > 0) {\n meta.unknownNamedArgs = Object.fromEntries(unknownNamedArgs);\n }\n\n return buildResolvedRoute(instruction, definition, meta);\n }\n default:\n return errorResult(instruction.raw, 'unknown', undefined, `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`);\n }\n}"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../src/constants.ts","../src/errors.ts","../src/escape.ts","../src/builders.ts","../src/declaration.ts","../src/normalize.ts","../src/parser.ts","../src/validate.ts","../src/resolve.ts"],"sourcesContent":["export const ANCHOR_PATH_PREFIX = '/~';\nexport const ARG_SEPARATOR = ';';\nexport const ANCHOR_SEPARATOR = '~';\nexport const DOT_SEPARATOR = '.';\n\nexport const RESERVED_ANCHOR_CHARACTERS = ['/', '~', ';', '.', '=', '@', '#', '%'] as const;\n\nconst reservedAnchorCharacterSet = new Set<string>(RESERVED_ANCHOR_CHARACTERS);\n\nexport const SAFE_LITERAL_CHARACTER = /^[A-Za-z0-9_-]$/;\n\nexport function isReservedAnchorCharacter(character: string): boolean {\n return reservedAnchorCharacterSet.has(character);\n}\n\nexport function isHexDigit(character: string): boolean {\n return /^[0-9A-Fa-f]$/.test(character);\n}","export const ANCHOR_ERROR_CODES = {\n ANCHOR_PARSE_EMPTY_INPUT: 'ANCHOR_PARSE_EMPTY_INPUT',\n ANCHOR_PARSE_INVALID_FORMAT: 'ANCHOR_PARSE_INVALID_FORMAT',\n ANCHOR_PARSE_EMPTY_PAGE: 'ANCHOR_PARSE_EMPTY_PAGE',\n ANCHOR_PARSE_EMPTY_SECTION: 'ANCHOR_PARSE_EMPTY_SECTION',\n ANCHOR_PARSE_EMPTY_KEY: 'ANCHOR_PARSE_EMPTY_KEY',\n ANCHOR_PARSE_INVALID_DOT_KEY: 'ANCHOR_PARSE_INVALID_DOT_KEY',\n ANCHOR_PARSE_INVALID_INTENT_PAIR: 'ANCHOR_PARSE_INVALID_INTENT_PAIR',\n ANCHOR_PARSE_DUPLICATE_NAMED_ARG: 'ANCHOR_PARSE_DUPLICATE_NAMED_ARG',\n ANCHOR_ESCAPE_INVALID_SEQUENCE: 'ANCHOR_ESCAPE_INVALID_SEQUENCE',\n ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR: 'ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR',\n ANCHOR_VALIDATE_TOO_MANY_ARGS: 'ANCHOR_VALIDATE_TOO_MANY_ARGS',\n ANCHOR_RESOLVE_PAGE_NOT_FOUND: 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n ANCHOR_RESOLVE_SECTION_NOT_FOUND: 'ANCHOR_RESOLVE_SECTION_NOT_FOUND',\n ANCHOR_RESOLVE_KEY_NOT_FOUND: 'ANCHOR_RESOLVE_KEY_NOT_FOUND',\n ANCHOR_RESOLVE_BINDING_MISSING_ARG: 'ANCHOR_RESOLVE_BINDING_MISSING_ARG',\n ANCHOR_RESOLVE_INVALID_NAMED_ARG: 'ANCHOR_RESOLVE_INVALID_NAMED_ARG',\n} as const;\n\nexport type AnchorErrorCode = (typeof ANCHOR_ERROR_CODES)[keyof typeof ANCHOR_ERROR_CODES];\n\nexport interface AnchorDiagnostic {\n code: AnchorErrorCode;\n message: string;\n raw: string;\n mode?: string;\n}\n\nexport class AnchorRouteError extends Error {\n readonly code: AnchorErrorCode;\n readonly raw: string;\n readonly mode?: string;\n\n constructor(code: AnchorErrorCode, message: string, raw: string, mode?: string) {\n super(message);\n this.name = 'AnchorRouteError';\n this.code = code;\n this.raw = raw;\n this.mode = mode;\n }\n\n toDiagnostic(): AnchorDiagnostic {\n return {\n code: this.code,\n message: this.message,\n raw: this.raw,\n mode: this.mode,\n };\n }\n}\n\nexport function createDiagnostic(\n code: AnchorErrorCode,\n message: string,\n raw: string,\n mode?: string,\n): AnchorDiagnostic {\n return { code, message, raw, mode };\n}\n\nexport function isAnchorRouteError(error: unknown): error is AnchorRouteError {\n return error instanceof AnchorRouteError;\n}","import { DOT_SEPARATOR, SAFE_LITERAL_CHARACTER, isHexDigit, isReservedAnchorCharacter } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport type { DecodedAnchorKey } from './types';\n\nconst encoder = new TextEncoder();\n\nfunction encodeCharacter(character: string): string {\n return Array.from(encoder.encode(character))\n .map((byte) => `%${byte.toString(16).toUpperCase().padStart(2, '0')}`)\n .join('');\n}\n\nexport function escapeAnchorValue(input: string): string {\n const value = String(input ?? '');\n let output = '';\n\n for (const character of value) {\n output += SAFE_LITERAL_CHARACTER.test(character) ? character : encodeCharacter(character);\n }\n\n return output;\n}\n\nexport function validateEncodedToken(rawToken: string, rawInput: string, mode?: string): void {\n for (let index = 0; index < rawToken.length; index += 1) {\n const character = rawToken[index];\n\n if (character === '%') {\n const high = rawToken[index + 1];\n const low = rawToken[index + 2];\n\n if (!high || !low || !isHexDigit(high) || !isHexDigit(low)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n\n index += 2;\n continue;\n }\n\n if (isReservedAnchorCharacter(character)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_UNESCAPED_RESERVED_CHAR,\n `Reserved character \"${character}\" must be percent-encoded inside anchor values.`,\n rawInput,\n mode,\n );\n }\n }\n}\n\nexport function decodeAnchorToken(rawToken: string, rawInput: string, mode?: string): string {\n validateEncodedToken(rawToken, rawInput, mode);\n\n try {\n return decodeURIComponent(rawToken);\n } catch {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_ESCAPE_INVALID_SEQUENCE,\n `Invalid percent-escape sequence in \"${rawToken}\".`,\n rawInput,\n mode,\n );\n }\n}\n\nexport function decodeAnchorKey(rawKey: string, rawInput: string, mode?: string): DecodedAnchorKey {\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawInput,\n mode,\n );\n }\n\n const rawSegments = rawKey.split(DOT_SEPARATOR);\n\n if (rawSegments.some((segment) => segment.length === 0)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawInput,\n mode,\n );\n }\n\n const pathTokens = rawSegments.map((segment) => {\n const decoded = decodeAnchorToken(segment, rawInput, mode);\n\n if (decoded.includes(DOT_SEPARATOR)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key segment \"${decoded}\" must not decode to another dot separator.`,\n rawInput,\n mode,\n );\n }\n\n return decoded;\n });\n\n return {\n key: pathTokens.join(DOT_SEPARATOR),\n pathTokens,\n };\n}\n\nexport function escapeAnchorKey(input: string): string {\n const rawKey = String(input ?? '').trim();\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Anchor route key cannot be empty.',\n rawKey,\n );\n }\n\n const segments = rawKey.split(DOT_SEPARATOR).map((segment) => segment.trim());\n\n if (segments.some((segment) => !segment)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n `Dot key \"${rawKey}\" contains an empty path token.`,\n rawKey,\n );\n }\n\n return segments.map((segment) => escapeAnchorValue(segment)).join(DOT_SEPARATOR);\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError, type AnchorErrorCode } from './errors';\nimport { escapeAnchorKey, escapeAnchorValue } from './escape';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction requireValue(value: string, code: AnchorErrorCode, message: string): string {\n const trimmed = String(value ?? '').trim();\n\n if (!trimmed) {\n throw new AnchorRouteError(code, message, String(value ?? ''));\n }\n\n return trimmed;\n}\n\nexport function buildPageAnchor(page: string, section: string): string {\n const safePage = escapeAnchorValue(requireValue(page, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page value cannot be empty.'));\n const safeSection = escapeAnchorValue(\n requireValue(section, ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Section value cannot be empty.'),\n );\n\n return `/${safePage}${ANCHOR_SEPARATOR}${safeSection}`;\n}\n\nexport function buildParamAnchor(key: string, args: string[] = []): string {\n const safeKey = escapeAnchorKey(key);\n const encodedArgs = args.map((argument) => escapeAnchorValue(String(argument ?? '')));\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedArgs.map((argument) => `${ARG_SEPARATOR}${argument}`).join('')}`;\n}\n\nexport function buildDotAnchor(tokens: string[]): string {\n if (!Array.isArray(tokens) || tokens.length === 0) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY,\n 'Dot case requires at least one token.',\n String(tokens ?? ''),\n );\n }\n\n const key = tokens.map((token) => requireValue(token, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_DOT_KEY, 'Dot token cannot be empty.')).join(DOT_SEPARATOR);\n return `${ANCHOR_PATH_PREFIX}${escapeAnchorKey(key)}`;\n}\n\nexport function buildIntentAnchor(key: string, namedArgs: Record<string, string>): string {\n const safeKey = escapeAnchorKey(key);\n const pairs = Object.entries(namedArgs ?? {});\n\n if (pairs.length === 0) {\n return `${ANCHOR_PATH_PREFIX}${safeKey}`;\n }\n\n const encodedPairs = pairs.map(([name, value]) => {\n const safeName = escapeAnchorValue(\n requireValue(name, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, 'Intent argument name cannot be empty.'),\n );\n const safeValue = escapeAnchorValue(\n requireValue(value, ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR, `Intent argument \"${name}\" cannot be empty.`),\n );\n return `${ARG_SEPARATOR}${safeName}${DOT_SEPARATOR}${safeValue}`;\n });\n\n return `${ANCHOR_PATH_PREFIX}${safeKey}${encodedPairs.join('')}`;\n}\n\nexport function serializeAnchor(instruction: AnchorRouteInstruction): string {\n switch (instruction.mode) {\n case 'page':\n return buildPageAnchor(instruction.page ?? '', instruction.section ?? '');\n case 'param':\n return buildParamAnchor(instruction.key ?? '', instruction.args ?? []);\n case 'dot':\n return buildDotAnchor(instruction.pathTokens ?? (instruction.key ? instruction.key.split(DOT_SEPARATOR) : []));\n case 'intent':\n return buildIntentAnchor(instruction.key ?? '', instruction.namedArgs ?? {});\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported anchor route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n}","import type {\n AnchorRoutingDeclaration,\n AnchorRoutingCase,\n AnchorRoutingMode,\n AnchorEscapeMode,\n AnchorRegistryVisibility,\n} from './types';\n\n// ── Text field mapping ──\n\nconst TEXT_TO_JSON: Record<string, keyof AnchorRoutingDeclaration | `syntax.${string}`> = {\n 'Anchor-Routing': 'anchorRouting',\n 'Name': 'name',\n 'SDK': 'sdk',\n 'Cases': 'cases',\n 'Primary-Case': 'primaryCase',\n 'Routing-Mode': 'routingMode',\n 'Internal-Anchor-Routing': 'internalAnchorRouting',\n 'Public-SEO-URLs': 'publicSeoUrls',\n 'Anchor-Prefix': 'syntax.anchorPrefix',\n 'Page-Case-Separator': 'syntax.pageCaseSeparator',\n 'Param-Case-Separator': 'syntax.paramCaseSeparator',\n 'Dot-Case-Separator': 'syntax.dotCaseSeparator',\n 'Intent-Case-Binding': 'syntax.intentCaseBinding',\n 'Escape-Mode': 'escapeMode',\n 'Registry-Visibility': 'registryVisibility',\n 'Resolver-Endpoint': 'resolverEndpoint',\n 'Docs': 'docs',\n 'Playground': 'playground',\n};\n\nconst JSON_TO_TEXT: Record<string, string> = {};\nfor (const [text, json] of Object.entries(TEXT_TO_JSON)) {\n JSON_TO_TEXT[json] = text;\n}\n\nconst VALID_CASES = new Set<string>(['page', 'param', 'dot', 'intent']);\n\n// ── Parse anchor-routing.txt → AnchorRoutingDeclaration ──\n\nexport function parseAnchorRoutingTxt(text: string): AnchorRoutingDeclaration {\n const result: Record<string, unknown> = {};\n const syntax: Record<string, string> = {};\n\n for (const raw of text.split('\\n')) {\n const line = raw.trim();\n if (!line || line.startsWith('#')) continue;\n\n const colonIndex = line.indexOf(':');\n if (colonIndex === -1) continue;\n\n const field = line.slice(0, colonIndex).trim();\n const value = line.slice(colonIndex + 1).trim();\n if (!value) continue;\n\n const jsonKey = TEXT_TO_JSON[field];\n if (!jsonKey) continue;\n\n if (jsonKey.startsWith('syntax.')) {\n syntax[jsonKey.slice(7)] = value;\n } else if (jsonKey === 'anchorRouting') {\n result.anchorRouting = parseInt(value, 10);\n } else if (jsonKey === 'cases') {\n result.cases = value\n .split(',')\n .map((c) => c.trim())\n .filter((c) => VALID_CASES.has(c));\n } else if (jsonKey === 'internalAnchorRouting' || jsonKey === 'publicSeoUrls') {\n result[jsonKey] = value === 'true';\n } else {\n result[jsonKey] = value;\n }\n }\n\n if (Object.keys(syntax).length > 0) {\n result.syntax = syntax;\n }\n\n if (result.anchorRouting == null) {\n result.anchorRouting = 1;\n }\n if (!result.cases) {\n result.cases = [];\n }\n\n return result as unknown as AnchorRoutingDeclaration;\n}\n\n// ── Serialize AnchorRoutingDeclaration → anchor-routing.txt ──\n\nconst TEXT_FIELD_ORDER = [\n 'Anchor-Routing',\n 'Name',\n 'SDK',\n 'Cases',\n 'Primary-Case',\n 'Routing-Mode',\n 'Internal-Anchor-Routing',\n 'Public-SEO-URLs',\n 'Anchor-Prefix',\n 'Page-Case-Separator',\n 'Param-Case-Separator',\n 'Dot-Case-Separator',\n 'Intent-Case-Binding',\n 'Escape-Mode',\n 'Registry-Visibility',\n 'Resolver-Endpoint',\n 'Docs',\n 'Playground',\n];\n\nexport function serializeAnchorRoutingTxt(declaration: AnchorRoutingDeclaration): string {\n const lines: string[] = [];\n\n for (const field of TEXT_FIELD_ORDER) {\n const jsonKey = TEXT_TO_JSON[field];\n if (!jsonKey) continue;\n\n let value: unknown;\n\n if (jsonKey.startsWith('syntax.')) {\n const syntaxField = jsonKey.slice(7);\n value = declaration.syntax?.[syntaxField as keyof typeof declaration.syntax];\n } else {\n value = declaration[jsonKey as keyof AnchorRoutingDeclaration];\n }\n\n if (value == null) continue;\n\n if (jsonKey === 'cases' && Array.isArray(value)) {\n lines.push(`${field}: ${value.join(',')}`);\n } else if (typeof value === 'boolean') {\n lines.push(`${field}: ${value}`);\n } else {\n lines.push(`${field}: ${value}`);\n }\n }\n\n return lines.join('\\n') + '\\n';\n}\n\n// ── Parse anchor-routing.json ──\n\nexport function parseAnchorRoutingJson(json: string): AnchorRoutingDeclaration {\n const data = JSON.parse(json);\n\n if (typeof data.anchorRouting !== 'number') {\n data.anchorRouting = 1;\n }\n if (!Array.isArray(data.cases)) {\n data.cases = [];\n } else {\n data.cases = data.cases.filter((c: string) => VALID_CASES.has(c));\n }\n\n return data as AnchorRoutingDeclaration;\n}\n\n// ── Serialize AnchorRoutingDeclaration → anchor-routing.json ──\n\nexport function serializeAnchorRoutingJson(\n declaration: AnchorRoutingDeclaration,\n pretty = true,\n): string {\n return JSON.stringify(declaration, null, pretty ? 2 : undefined) + '\\n';\n}\n\n// ── Discover ar.txt from a base URL (browser/node fetch) ──\n\nconst DISCOVERY_PATHS = [\n '/.well-known/anchor-routing.json',\n '/.well-known/anchor-routing.txt',\n '/ar.txt',\n] as const;\n\nexport type AnchorRoutingDiscoveryResult = {\n declaration: AnchorRoutingDeclaration;\n source: string;\n format: 'json' | 'txt';\n} | null;\n\nexport async function discoverAnchorRouting(\n baseUrl: string,\n fetchFn: typeof fetch = globalThis.fetch,\n): Promise<AnchorRoutingDiscoveryResult> {\n const base = baseUrl.replace(/\\/+$/, '');\n\n for (const path of DISCOVERY_PATHS) {\n const url = base + path;\n try {\n const response = await fetchFn(url, {\n method: 'GET',\n headers: { Accept: 'application/json, text/plain' },\n });\n if (!response.ok) continue;\n\n const text = await response.text();\n if (!text.trim()) continue;\n\n const isJson = path.endsWith('.json');\n\n return {\n declaration: isJson\n ? parseAnchorRoutingJson(text)\n : parseAnchorRoutingTxt(text),\n source: url,\n format: isJson ? 'json' : 'txt',\n };\n } catch {\n continue;\n }\n }\n\n return null;\n}\n\n// ── Create a default declaration from constants ──\n\nexport function createDefaultDeclaration(\n overrides: Partial<AnchorRoutingDeclaration> = {},\n): AnchorRoutingDeclaration {\n return {\n anchorRouting: 1,\n cases: ['page', 'param', 'dot', 'intent'] as AnchorRoutingCase[],\n routingMode: 'registry' as AnchorRoutingMode,\n escapeMode: 'percent' as AnchorEscapeMode,\n registryVisibility: 'private' as AnchorRegistryVisibility,\n syntax: {\n anchorPrefix: '/~',\n pageCaseSeparator: '~',\n paramCaseSeparator: ';',\n dotCaseSeparator: '.',\n intentCaseBinding: 'name.value',\n },\n ...overrides,\n };\n}\n","export function normalizeAnchor(input: string): string {\n const raw = String(input ?? '').trim();\n\n if (!raw) {\n return '';\n }\n\n let normalized = raw;\n\n if (/^[a-zA-Z][a-zA-Z\\d+.-]*:\\/\\//.test(normalized)) {\n try {\n const url = new URL(normalized);\n normalized = url.pathname || '/';\n } catch {\n normalized = raw;\n }\n }\n\n const suffixIndex = normalized.search(/[?#]/);\n if (suffixIndex >= 0) {\n normalized = normalized.slice(0, suffixIndex);\n }\n\n if (!normalized.startsWith('/')) {\n normalized = `/${normalized}`;\n }\n\n normalized = normalized.replace(/\\/{2,}/g, '/');\n\n if (normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}","import { ANCHOR_PATH_PREFIX, ANCHOR_SEPARATOR, ARG_SEPARATOR, DOT_SEPARATOR } from './constants';\nimport { ANCHOR_ERROR_CODES, AnchorRouteError } from './errors';\nimport { decodeAnchorKey, decodeAnchorToken } from './escape';\nimport { normalizeAnchor } from './normalize';\nimport type { AnchorRouteInstruction } from './types';\n\nfunction parsePageRoute(normalized: string): AnchorRouteInstruction {\n const body = normalized.slice(1);\n\n if (body.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must use a single path segment in the form /page~section.',\n normalized,\n 'page',\n );\n }\n\n const parts = body.split(ANCHOR_SEPARATOR);\n\n if (parts.length !== 2) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Page Case must contain exactly one ~ separator.',\n normalized,\n 'page',\n );\n }\n\n const [rawPage, rawSection] = parts;\n\n if (!rawPage) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE,\n 'Page Case requires a non-empty page value.',\n normalized,\n 'page',\n );\n }\n\n if (!rawSection) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION,\n 'Page Case requires a non-empty section value.',\n normalized,\n 'page',\n );\n }\n\n return {\n mode: 'page',\n raw: normalized,\n page: decodeAnchorToken(rawPage, normalized, 'page'),\n section: decodeAnchorToken(rawSection, normalized, 'page'),\n };\n}\n\nfunction parseDotRoute(normalized: string, rawKey: string): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'dot');\n\n return {\n mode: 'dot',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n };\n}\n\nfunction parseParamRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'param');\n const args = payload.map((rawArgument) => {\n if (!rawArgument) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Param Case does not allow empty positional arguments.',\n normalized,\n 'param',\n );\n }\n\n return decodeAnchorToken(rawArgument, normalized, 'param');\n });\n\n return {\n mode: 'param',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n args,\n };\n}\n\nfunction parseIntentRoute(normalized: string, rawKey: string, payload: string[]): AnchorRouteInstruction {\n const key = decodeAnchorKey(rawKey, normalized, 'intent');\n const namedArgs: Record<string, string> = {};\n\n for (const rawPair of payload) {\n const separatorIndex = rawPair.indexOf(DOT_SEPARATOR);\n\n if (separatorIndex <= 0 || separatorIndex === rawPair.length - 1) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n `Intent Case pair \"${rawPair}\" must use the form name.value.`,\n normalized,\n 'intent',\n );\n }\n\n const rawName = rawPair.slice(0, separatorIndex);\n const rawValue = rawPair.slice(separatorIndex + 1);\n const name = decodeAnchorToken(rawName, normalized, 'intent');\n const value = decodeAnchorToken(rawValue, normalized, 'intent');\n\n if (Object.prototype.hasOwnProperty.call(namedArgs, name)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_DUPLICATE_NAMED_ARG,\n `Intent Case contains duplicate named argument \"${name}\".`,\n normalized,\n 'intent',\n );\n }\n\n namedArgs[name] = value;\n }\n\n return {\n mode: 'intent',\n raw: normalized,\n key: key.key,\n pathTokens: key.pathTokens,\n namedArgs,\n };\n}\n\nexport function parseAnchor(input: string): AnchorRouteInstruction {\n const normalized = normalizeAnchor(input);\n\n if (!normalized) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_INPUT,\n 'Anchor route input cannot be empty.',\n String(input ?? ''),\n );\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX) && normalized.includes(ANCHOR_SEPARATOR)) {\n return parsePageRoute(normalized);\n }\n\n if (!normalized.startsWith(ANCHOR_PATH_PREFIX)) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Input is not an Anchor Route.',\n normalized,\n );\n }\n\n const capsuleBody = normalized.slice(ANCHOR_PATH_PREFIX.length);\n\n if (!capsuleBody || capsuleBody.includes('/')) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n 'Capsule cases must use the form /~key or /~key;payload.',\n normalized,\n );\n }\n\n const [rawKey, ...payload] = capsuleBody.split(ARG_SEPARATOR);\n\n if (!rawKey) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_KEY,\n 'Capsule cases require a non-empty route key.',\n normalized,\n );\n }\n\n if (payload.length === 0) {\n if (rawKey.includes(DOT_SEPARATOR)) {\n return parseDotRoute(normalized, rawKey);\n }\n\n return parseParamRoute(normalized, rawKey, []);\n }\n\n const payloadHasDot = payload.some((segment) => segment.includes(DOT_SEPARATOR));\n const payloadAllNamedPairs = payload.every((segment) => {\n const dotIndex = segment.indexOf(DOT_SEPARATOR);\n return dotIndex > 0 && dotIndex < segment.length - 1 && segment.indexOf(DOT_SEPARATOR, dotIndex + 1) === -1;\n });\n\n if (payloadHasDot) {\n if (!payloadAllNamedPairs) {\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_INTENT_PAIR,\n 'Intent Case payload must use only name.value pairs.',\n normalized,\n 'intent',\n );\n }\n\n return parseIntentRoute(normalized, rawKey, payload);\n }\n\n return parseParamRoute(normalized, rawKey, payload);\n}\n\nexport function isAnchorRoute(input: string): boolean {\n try {\n parseAnchor(input);\n return true;\n } catch {\n return false;\n }\n}","import { ANCHOR_ERROR_CODES, AnchorRouteError, createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport type { AnchorResolveOptions, AnchorRegistry, AnchorRouteInstruction, AnchorValidationResult } from './types';\n\nfunction highestPositionalIndex(instruction: AnchorRouteInstruction, registry?: AnchorRegistry): number {\n if (instruction.mode !== 'param' || !instruction.key) {\n return -1;\n }\n\n const definition = registry?.global?.[instruction.key];\n if (!definition?.positionalBind) {\n return -1;\n }\n\n return Math.max(...Object.values(definition.positionalBind), -1);\n}\n\nexport function validateAnchor(\n input: string | AnchorRouteInstruction,\n registry?: AnchorRegistry,\n options: AnchorResolveOptions = {},\n): AnchorValidationResult {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return { valid: false, errors: [error.toDiagnostic()] };\n }\n\n throw error;\n }\n\n const errors = [] as AnchorValidationResult['errors'];\n\n switch (instruction.mode) {\n case 'page': {\n if (!instruction.page) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_PAGE, 'Page Case requires a page value.', instruction.raw, 'page'));\n }\n\n if (!instruction.section) {\n errors.push(createDiagnostic(ANCHOR_ERROR_CODES.ANCHOR_PARSE_EMPTY_SECTION, 'Page Case requires a section value.', instruction.raw, 'page'));\n }\n\n if (instruction.page && registry?.pages && !registry.pages[instruction.page]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_PAGE_NOT_FOUND,\n `No page registry entry exists for \"${instruction.page}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n if (instruction.page && instruction.section && registry?.pages?.[instruction.page] && !registry.pages[instruction.page][instruction.section]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_SECTION_NOT_FOUND,\n `No page section registry entry exists for \"${instruction.page}~${instruction.section}\".`,\n instruction.raw,\n 'page',\n ),\n );\n }\n\n break;\n }\n case 'param': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n const requiredCount = definition?.requiredPositionalCount ?? highestPositionalIndex(instruction, registry) + 1;\n\n if ((instruction.args?.length ?? 0) < requiredCount) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Param Case key \"${instruction.key}\" expects at least ${requiredCount} positional arguments.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n if (options.maxArgs != null && (instruction.args?.length ?? 0) > options.maxArgs) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_VALIDATE_TOO_MANY_ARGS,\n `Param Case exceeds the maximum allowed positional argument count of ${options.maxArgs}.`,\n instruction.raw,\n 'param',\n ),\n );\n }\n\n break;\n }\n case 'dot': {\n if (instruction.key && registry?.global && !registry.global[instruction.key]) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'dot',\n ),\n );\n }\n\n break;\n }\n case 'intent': {\n const definition = instruction.key ? registry?.global?.[instruction.key] : undefined;\n\n if (instruction.key && registry?.global && !definition) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_KEY_NOT_FOUND,\n `No global registry entry exists for key \"${instruction.key}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n break;\n }\n\n const requiredNames = definition?.requiredNamedArgs ?? Object.values(definition?.namedBind ?? {});\n for (const requiredName of requiredNames) {\n if (!instruction.namedArgs || !Object.prototype.hasOwnProperty.call(instruction.namedArgs, requiredName)) {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_BINDING_MISSING_ARG,\n `Intent Case key \"${instruction.key}\" requires named argument \"${requiredName}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n\n if (definition?.namedBind && instruction.namedArgs) {\n const allowedNames = new Set(Object.values(definition.namedBind));\n for (const name of Object.keys(instruction.namedArgs)) {\n if (!allowedNames.has(name) && (options.unknownNamedArgs ?? 'reject') === 'reject') {\n errors.push(\n createDiagnostic(\n ANCHOR_ERROR_CODES.ANCHOR_RESOLVE_INVALID_NAMED_ARG,\n `Intent Case key \"${instruction.key}\" does not allow named argument \"${name}\".`,\n instruction.raw,\n 'intent',\n ),\n );\n }\n }\n }\n\n break;\n }\n default:\n throw new AnchorRouteError(\n ANCHOR_ERROR_CODES.ANCHOR_PARSE_INVALID_FORMAT,\n `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`,\n instruction.raw,\n );\n }\n\n return {\n valid: errors.length === 0,\n instruction,\n errors,\n };\n}","import { createDiagnostic, isAnchorRouteError } from './errors';\nimport { parseAnchor } from './parser';\nimport { validateAnchor } from './validate';\nimport type {\n AnchorBindingTarget,\n AnchorResolveOptions,\n AnchorRegistry,\n AnchorResolvedRoute,\n AnchorRouteInstruction,\n AnchorTargetDefinition,\n} from './types';\n\nfunction pickBindingTarget(definition: AnchorTargetDefinition, field: string): AnchorBindingTarget {\n return definition.bindingTargets?.[field] ?? 'params';\n}\n\nfunction assignBoundValue(\n field: string,\n value: string,\n definition: AnchorTargetDefinition,\n params: Record<string, string>,\n query: Record<string, string>,\n): void {\n if (pickBindingTarget(definition, field) === 'query') {\n query[field] = value;\n return;\n }\n\n params[field] = value;\n}\n\nfunction buildResolvedRoute(\n instruction: AnchorRouteInstruction,\n definition: AnchorTargetDefinition,\n extraMeta: Record<string, unknown> = {},\n): AnchorResolvedRoute {\n const params = { ...(definition.defaultParams ?? {}) };\n const query = { ...(definition.defaultQuery ?? {}) };\n\n if (instruction.mode === 'param' && definition.positionalBind) {\n for (const [field, index] of Object.entries(definition.positionalBind)) {\n const value = instruction.args?.[index];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n if (instruction.mode === 'intent' && definition.namedBind) {\n for (const [field, sourceName] of Object.entries(definition.namedBind)) {\n const value = instruction.namedArgs?.[sourceName];\n if (value != null) {\n assignBoundValue(field, value, definition, params, query);\n }\n }\n }\n\n return {\n success: true,\n mode: instruction.mode,\n raw: instruction.raw,\n name: definition.name,\n path: definition.path,\n params: Object.keys(params).length > 0 ? params : undefined,\n query: Object.keys(query).length > 0 ? query : undefined,\n hash: definition.hash,\n title: definition.title,\n permissions: definition.permissions,\n meta: {\n ...definition.meta,\n ...extraMeta,\n instruction,\n },\n };\n}\n\nfunction errorResult(\n raw: string,\n mode: AnchorResolvedRoute['mode'],\n code: AnchorResolvedRoute['errorCode'],\n message: string,\n diagnostics = code ? [createDiagnostic(code, message, raw, mode)] : undefined,\n): AnchorResolvedRoute {\n return {\n success: false,\n mode,\n raw,\n errorCode: code,\n errorMessage: message,\n diagnostics,\n };\n}\n\nexport function resolveAnchor(\n input: string | AnchorRouteInstruction,\n registry: AnchorRegistry = {},\n options: AnchorResolveOptions = {},\n): AnchorResolvedRoute {\n let instruction: AnchorRouteInstruction;\n\n try {\n instruction = typeof input === 'string' ? parseAnchor(input) : input;\n } catch (error) {\n if (isAnchorRouteError(error)) {\n return {\n success: false,\n mode: 'unknown',\n raw: error.raw,\n errorCode: error.code,\n errorMessage: error.message,\n diagnostics: [error.toDiagnostic()],\n };\n }\n\n throw error;\n }\n\n const validation = validateAnchor(instruction, registry, options);\n if (!validation.valid) {\n const [firstDiagnostic] = validation.errors;\n return {\n success: false,\n mode: instruction.mode,\n raw: instruction.raw,\n errorCode: firstDiagnostic?.code,\n errorMessage: firstDiagnostic?.message,\n diagnostics: validation.errors,\n };\n }\n\n switch (instruction.mode) {\n case 'page': {\n const definition = registry.pages?.[instruction.page ?? '']?.[instruction.section ?? ''];\n if (!definition) {\n return errorResult(\n instruction.raw,\n 'page',\n validation.errors[0]?.code ?? 'ANCHOR_RESOLVE_PAGE_NOT_FOUND',\n validation.errors[0]?.message ?? `Page Case could not be resolved for \"${instruction.page}~${instruction.section}\".`,\n validation.errors.length > 0 ? validation.errors : undefined,\n );\n }\n\n return buildResolvedRoute(instruction, definition, {\n page: instruction.page,\n section: instruction.section,\n });\n }\n case 'param': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'param', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Param Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n args: instruction.args ?? [],\n });\n }\n case 'dot': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'dot', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Dot Case could not be resolved.', validation.errors);\n }\n\n return buildResolvedRoute(instruction, definition, {\n key: instruction.key,\n pathTokens: instruction.pathTokens ?? [],\n });\n }\n case 'intent': {\n const definition = registry.global?.[instruction.key ?? ''];\n if (!definition) {\n return errorResult(instruction.raw, 'intent', validation.errors[0]?.code, validation.errors[0]?.message ?? 'Intent Case could not be resolved.', validation.errors);\n }\n\n const allowedNames = new Set(Object.values(definition.namedBind ?? {}));\n const unknownNamedArgs = Object.entries(instruction.namedArgs ?? {}).filter(([name]) => !allowedNames.has(name));\n const meta: Record<string, unknown> = {\n key: instruction.key,\n namedArgs: instruction.namedArgs ?? {},\n };\n\n if ((options.unknownNamedArgs ?? 'reject') === 'keep' && unknownNamedArgs.length > 0) {\n meta.unknownNamedArgs = Object.fromEntries(unknownNamedArgs);\n }\n\n return buildResolvedRoute(instruction, definition, meta);\n }\n default:\n return errorResult(instruction.raw, 'unknown', undefined, `Unsupported route mode \"${String((instruction as { mode?: string }).mode)}\".`);\n }\n}"],"mappings":"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","names":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@nextera.one/anchor-routing-core",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Anchor Routing core parser, registry, resolver, and serializer",
5
5
  "main": "dist/index.js",
6
6
  "module": "dist/index.mjs",
@@ -32,5 +32,9 @@
32
32
  "type": "commonjs",
33
33
  "publishConfig": {
34
34
  "access": "public"
35
+ },
36
+ "devDependencies": {
37
+ "tsup": "^8.5.1",
38
+ "typescript": "^6.0.2"
35
39
  }
36
40
  }