@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 +40 -1
- package/dist/index.d.ts +40 -1
- package/dist/index.js +179 -0
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +173 -0
- package/dist/index.mjs.map +1 -1
- package/package.json +5 -1
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":"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","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
|
};
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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
|
}
|