@nextera.one/anchor-routing-core 0.1.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/README.md +3 -0
- package/dist/index.d.mts +131 -0
- package/dist/index.d.ts +131 -0
- package/dist/index.js +826 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +773 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +36 -0
|
@@ -0,0 +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":[]}
|