@bcts/dcbor-parse 1.0.0-alpha.13

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs","names":["token","#source","#position","#tokenStart","#tokenEnd","#skipWhitespaceAndComments","#tryMatchKeyword","#tryMatchDateLiteral","#tryMatchTagValueOrNumber","#tryMatchTagName","#tryMatchString","#tryMatchByteStringHex","#tryMatchByteStringBase64","#tryMatchKnownValue","#tryMatchUR","#tryMatchPunctuation","PE","keywords: [string, Token][]","#matchLiteral","#isIdentifierChar","DCborDate","UR","PE","token","KnownValue","KNOWN_VALUES","items: Cbor[]","CborMap","result: Cbor[]","CborMap"],"sources":["../src/error.ts","../src/token.ts","../src/parse.ts","../src/compose.ts"],"sourcesContent":["/**\n * @bcts/dcbor-parse - Error types\n *\n * This is a 1:1 TypeScript port of bc-dcbor-parse-rust error.rs\n *\n * @module dcbor-parse/error\n */\n\nimport type { Token } from \"./token\";\n\n/**\n * Represents a span (range) in the source string.\n *\n * Corresponds to the Rust `logos::Span` type.\n */\nexport interface Span {\n readonly start: number;\n readonly end: number;\n}\n\n/**\n * Creates a span with the given start and end positions.\n */\nexport function span(start: number, end: number): Span {\n return { start, end };\n}\n\n/**\n * Creates a default (empty) span.\n */\nexport function defaultSpan(): Span {\n return { start: 0, end: 0 };\n}\n\n/**\n * Parse error types.\n *\n * Corresponds to the Rust `Error` enum in error.rs\n */\nexport type ParseError =\n | { readonly type: \"EmptyInput\" }\n | { readonly type: \"UnexpectedEndOfInput\" }\n | { readonly type: \"ExtraData\"; readonly span: Span }\n | { readonly type: \"UnexpectedToken\"; readonly token: Token; readonly span: Span }\n | { readonly type: \"UnrecognizedToken\"; readonly span: Span }\n | { readonly type: \"ExpectedComma\"; readonly span: Span }\n | { readonly type: \"ExpectedColon\"; readonly span: Span }\n | { readonly type: \"UnmatchedParentheses\"; readonly span: Span }\n | { readonly type: \"UnmatchedBraces\"; readonly span: Span }\n | { readonly type: \"ExpectedMapKey\"; readonly span: Span }\n | { readonly type: \"InvalidTagValue\"; readonly value: string; readonly span: Span }\n | { readonly type: \"UnknownTagName\"; readonly name: string; readonly span: Span }\n | { readonly type: \"InvalidHexString\"; readonly span: Span }\n | { readonly type: \"InvalidBase64String\"; readonly span: Span }\n | { readonly type: \"UnknownUrType\"; readonly urType: string; readonly span: Span }\n | { readonly type: \"InvalidUr\"; readonly message: string; readonly span: Span }\n | { readonly type: \"InvalidKnownValue\"; readonly value: string; readonly span: Span }\n | { readonly type: \"UnknownKnownValueName\"; readonly name: string; readonly span: Span }\n | { readonly type: \"InvalidDateString\"; readonly dateString: string; readonly span: Span }\n | { readonly type: \"DuplicateMapKey\"; readonly span: Span };\n\n// Error constructors (lowercase to differentiate from the type)\nexport const parseError = {\n emptyInput(): ParseError {\n return { type: \"EmptyInput\" };\n },\n\n unexpectedEndOfInput(): ParseError {\n return { type: \"UnexpectedEndOfInput\" };\n },\n\n extraData(span: Span): ParseError {\n return { type: \"ExtraData\", span };\n },\n\n unexpectedToken(token: Token, span: Span): ParseError {\n return { type: \"UnexpectedToken\", token, span };\n },\n\n unrecognizedToken(span: Span): ParseError {\n return { type: \"UnrecognizedToken\", span };\n },\n\n expectedComma(span: Span): ParseError {\n return { type: \"ExpectedComma\", span };\n },\n\n expectedColon(span: Span): ParseError {\n return { type: \"ExpectedColon\", span };\n },\n\n unmatchedParentheses(span: Span): ParseError {\n return { type: \"UnmatchedParentheses\", span };\n },\n\n unmatchedBraces(span: Span): ParseError {\n return { type: \"UnmatchedBraces\", span };\n },\n\n expectedMapKey(span: Span): ParseError {\n return { type: \"ExpectedMapKey\", span };\n },\n\n invalidTagValue(value: string, span: Span): ParseError {\n return { type: \"InvalidTagValue\", value, span };\n },\n\n unknownTagName(name: string, span: Span): ParseError {\n return { type: \"UnknownTagName\", name, span };\n },\n\n invalidHexString(span: Span): ParseError {\n return { type: \"InvalidHexString\", span };\n },\n\n invalidBase64String(span: Span): ParseError {\n return { type: \"InvalidBase64String\", span };\n },\n\n unknownUrType(urType: string, span: Span): ParseError {\n return { type: \"UnknownUrType\", urType, span };\n },\n\n invalidUr(message: string, span: Span): ParseError {\n return { type: \"InvalidUr\", message, span };\n },\n\n invalidKnownValue(value: string, span: Span): ParseError {\n return { type: \"InvalidKnownValue\", value, span };\n },\n\n unknownKnownValueName(name: string, span: Span): ParseError {\n return { type: \"UnknownKnownValueName\", name, span };\n },\n\n invalidDateString(dateString: string, span: Span): ParseError {\n return { type: \"InvalidDateString\", dateString, span };\n },\n\n duplicateMapKey(span: Span): ParseError {\n return { type: \"DuplicateMapKey\", span };\n },\n};\n\n/**\n * Checks if an error is the default unrecognized token error.\n *\n * Corresponds to Rust `Error::is_default()`\n */\nexport function isDefaultError(error: ParseError): boolean {\n return error.type === \"UnrecognizedToken\";\n}\n\n/**\n * Gets the error message for a parse error.\n *\n * Corresponds to Rust's `Display` implementation for `Error`\n */\nexport function errorMessage(error: ParseError): string {\n switch (error.type) {\n case \"EmptyInput\":\n return \"Empty input\";\n case \"UnexpectedEndOfInput\":\n return \"Unexpected end of input\";\n case \"ExtraData\":\n return \"Extra data at end of input\";\n case \"UnexpectedToken\":\n return `Unexpected token ${tokenDebugString(error.token)}`;\n case \"UnrecognizedToken\":\n return \"Unrecognized token\";\n case \"ExpectedComma\":\n return \"Expected comma\";\n case \"ExpectedColon\":\n return \"Expected colon\";\n case \"UnmatchedParentheses\":\n return \"Unmatched parentheses\";\n case \"UnmatchedBraces\":\n return \"Unmatched braces\";\n case \"ExpectedMapKey\":\n return \"Expected map key\";\n case \"InvalidTagValue\":\n return `Invalid tag value '${error.value}'`;\n case \"UnknownTagName\":\n return `Unknown tag name '${error.name}'`;\n case \"InvalidHexString\":\n return \"Invalid hex string\";\n case \"InvalidBase64String\":\n return \"Invalid base64 string\";\n case \"UnknownUrType\":\n return `Unknown UR type '${error.urType}'`;\n case \"InvalidUr\":\n return `Invalid UR '${error.message}'`;\n case \"InvalidKnownValue\":\n return `Invalid known value '${error.value}'`;\n case \"UnknownKnownValueName\":\n return `Unknown known value name '${error.name}'`;\n case \"InvalidDateString\":\n return `Invalid date string '${error.dateString}'`;\n case \"DuplicateMapKey\":\n return \"Duplicate map key\";\n }\n}\n\n/**\n * Gets the span for a parse error, if applicable.\n */\nexport function errorSpan(error: ParseError): Span | undefined {\n switch (error.type) {\n case \"EmptyInput\":\n case \"UnexpectedEndOfInput\":\n return undefined;\n case \"ExtraData\":\n case \"UnexpectedToken\":\n case \"UnrecognizedToken\":\n case \"ExpectedComma\":\n case \"ExpectedColon\":\n case \"UnmatchedParentheses\":\n case \"UnmatchedBraces\":\n case \"ExpectedMapKey\":\n case \"InvalidTagValue\":\n case \"UnknownTagName\":\n case \"InvalidHexString\":\n case \"InvalidBase64String\":\n case \"UnknownUrType\":\n case \"InvalidUr\":\n case \"InvalidKnownValue\":\n case \"UnknownKnownValueName\":\n case \"InvalidDateString\":\n case \"DuplicateMapKey\":\n return error.span;\n }\n}\n\n/**\n * Formats an error message with source context, line number, and caret.\n *\n * Corresponds to Rust `Error::format_message()`\n */\nfunction formatMessage(message: string, source: string, range: Span): string {\n const start = range.start;\n const end = range.end;\n\n // Walk through the characters up to `start` to find line number and line start offset\n let lineNumber = 1;\n let lineStart = 0;\n\n for (let idx = 0; idx < source.length && idx < start; idx++) {\n if (source[idx] === \"\\n\") {\n lineNumber++;\n lineStart = idx + 1;\n }\n }\n\n // Grab the exact line text (or empty if out of bounds)\n const lines = source.split(\"\\n\");\n const line = lines[lineNumber - 1] ?? \"\";\n\n // Column is byte-offset into that line\n const column = Math.max(0, start - lineStart);\n\n // Underline at least one caret, even for zero-width spans\n const underlineLen = Math.max(1, end - start);\n const caret = \" \".repeat(column) + \"^\".repeat(underlineLen);\n\n return `line ${lineNumber}: ${message}\\n${line}\\n${caret}`;\n}\n\n/**\n * Gets the full error message with source context.\n *\n * Corresponds to Rust `Error::full_message()`\n */\nexport function fullErrorMessage(error: ParseError, source: string): string {\n const message = errorMessage(error);\n\n switch (error.type) {\n case \"EmptyInput\":\n return formatMessage(message, source, defaultSpan());\n case \"UnexpectedEndOfInput\":\n return formatMessage(message, source, span(source.length, source.length));\n case \"ExtraData\":\n case \"UnexpectedToken\":\n case \"UnrecognizedToken\":\n case \"ExpectedComma\":\n case \"ExpectedColon\":\n case \"UnmatchedParentheses\":\n case \"UnmatchedBraces\":\n case \"ExpectedMapKey\":\n case \"InvalidTagValue\":\n case \"UnknownTagName\":\n case \"InvalidHexString\":\n case \"InvalidBase64String\":\n case \"UnknownUrType\":\n case \"InvalidUr\":\n case \"InvalidKnownValue\":\n case \"UnknownKnownValueName\":\n case \"InvalidDateString\":\n case \"DuplicateMapKey\":\n return formatMessage(message, source, error.span);\n }\n}\n\n/**\n * Creates a default parse error (UnrecognizedToken with empty span).\n *\n * Corresponds to Rust `Error::default()`\n */\nexport function defaultParseError(): ParseError {\n return parseError.unrecognizedToken(defaultSpan());\n}\n\n/**\n * Result type for parse operations.\n *\n * Corresponds to Rust `Result<T, Error>`\n */\nexport type ParseResult<T> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: ParseError };\n\n/**\n * Creates a successful result.\n */\nexport function ok<T>(value: T): ParseResult<T> {\n return { ok: true, value };\n}\n\n/**\n * Creates an error result.\n */\nexport function err<T>(error: ParseError): ParseResult<T> {\n return { ok: false, error };\n}\n\n/**\n * Checks if a result is successful.\n */\nexport function isOk<T>(result: ParseResult<T>): result is { ok: true; value: T } {\n return result.ok;\n}\n\n/**\n * Checks if a result is an error.\n */\nexport function isErr<T>(result: ParseResult<T>): result is { ok: false; error: ParseError } {\n return !result.ok;\n}\n\n/**\n * Unwraps a result, throwing if it's an error.\n */\nexport function unwrap<T>(result: ParseResult<T>): T {\n if (result.ok) {\n return result.value;\n }\n throw new Error(errorMessage(result.error));\n}\n\n/**\n * Unwraps a result error, throwing if it's successful.\n */\nexport function unwrapErr<T>(result: ParseResult<T>): ParseError {\n if (!result.ok) {\n return result.error;\n }\n throw new Error(\"Called unwrapErr on an Ok result\");\n}\n\n// Helper function to get debug string for a token (forward declaration resolved at runtime)\nfunction tokenDebugString(token: Token): string {\n // Simple debug representation\n return JSON.stringify(token);\n}\n","/**\n * @bcts/dcbor-parse - Token types and Lexer\n *\n * This is a 1:1 TypeScript port of bc-dcbor-parse-rust token.rs\n *\n * @module dcbor-parse/token\n */\n\nimport { type CborDate, CborDate as DCborDate } from \"@bcts/dcbor\";\nimport { UR } from \"@bcts/uniform-resources\";\nimport { type Span, span, parseError as PE, type ParseResult, ok, err } from \"./error\";\n\n/**\n * Token types produced by the lexer.\n *\n * Corresponds to the Rust `Token` enum in token.rs\n */\nexport type Token =\n | { readonly type: \"Bool\"; readonly value: boolean }\n | { readonly type: \"BraceOpen\" }\n | { readonly type: \"BraceClose\" }\n | { readonly type: \"BracketOpen\" }\n | { readonly type: \"BracketClose\" }\n | { readonly type: \"ParenthesisOpen\" }\n | { readonly type: \"ParenthesisClose\" }\n | { readonly type: \"Colon\" }\n | { readonly type: \"Comma\" }\n | { readonly type: \"Null\" }\n | { readonly type: \"NaN\" }\n | { readonly type: \"Infinity\" }\n | { readonly type: \"NegInfinity\" }\n | { readonly type: \"ByteStringHex\"; readonly value: Uint8Array }\n | { readonly type: \"ByteStringBase64\"; readonly value: Uint8Array }\n | { readonly type: \"DateLiteral\"; readonly value: CborDate }\n | { readonly type: \"Number\"; readonly value: number }\n | { readonly type: \"String\"; readonly value: string }\n | { readonly type: \"TagValue\"; readonly value: number }\n | { readonly type: \"TagName\"; readonly value: string }\n | { readonly type: \"KnownValueNumber\"; readonly value: number }\n | { readonly type: \"KnownValueName\"; readonly value: string }\n | { readonly type: \"Unit\" }\n | { readonly type: \"UR\"; readonly value: UR };\n\n// Token constructors (lowercase to differentiate from the type)\nexport const token = {\n bool(value: boolean): Token {\n return { type: \"Bool\", value };\n },\n braceOpen(): Token {\n return { type: \"BraceOpen\" };\n },\n braceClose(): Token {\n return { type: \"BraceClose\" };\n },\n bracketOpen(): Token {\n return { type: \"BracketOpen\" };\n },\n bracketClose(): Token {\n return { type: \"BracketClose\" };\n },\n parenthesisOpen(): Token {\n return { type: \"ParenthesisOpen\" };\n },\n parenthesisClose(): Token {\n return { type: \"ParenthesisClose\" };\n },\n colon(): Token {\n return { type: \"Colon\" };\n },\n comma(): Token {\n return { type: \"Comma\" };\n },\n null(): Token {\n return { type: \"Null\" };\n },\n nan(): Token {\n return { type: \"NaN\" };\n },\n infinity(): Token {\n return { type: \"Infinity\" };\n },\n negInfinity(): Token {\n return { type: \"NegInfinity\" };\n },\n byteStringHex(value: Uint8Array): Token {\n return { type: \"ByteStringHex\", value };\n },\n byteStringBase64(value: Uint8Array): Token {\n return { type: \"ByteStringBase64\", value };\n },\n dateLiteral(value: CborDate): Token {\n return { type: \"DateLiteral\", value };\n },\n number(value: number): Token {\n return { type: \"Number\", value };\n },\n string(value: string): Token {\n return { type: \"String\", value };\n },\n tagValue(value: number): Token {\n return { type: \"TagValue\", value };\n },\n tagName(value: string): Token {\n return { type: \"TagName\", value };\n },\n knownValueNumber(value: number): Token {\n return { type: \"KnownValueNumber\", value };\n },\n knownValueName(value: string): Token {\n return { type: \"KnownValueName\", value };\n },\n unit(): Token {\n return { type: \"Unit\" };\n },\n ur(value: UR): Token {\n return { type: \"UR\", value };\n },\n};\n\n/**\n * Lexer for dCBOR diagnostic notation.\n *\n * Corresponds to the Rust `logos::Lexer` used in parse.rs\n */\nexport class Lexer {\n readonly #source: string;\n #position: number;\n #tokenStart: number;\n #tokenEnd: number;\n\n constructor(source: string) {\n this.#source = source;\n this.#position = 0;\n this.#tokenStart = 0;\n this.#tokenEnd = 0;\n }\n\n /**\n * Gets the current span (position range of the last token).\n */\n span(): Span {\n return span(this.#tokenStart, this.#tokenEnd);\n }\n\n /**\n * Gets the slice of source corresponding to the last token.\n */\n slice(): string {\n return this.#source.slice(this.#tokenStart, this.#tokenEnd);\n }\n\n /**\n * Gets the next token, or undefined if at end of input.\n * Returns a Result to handle lexing errors.\n */\n next(): ParseResult<Token> | undefined {\n this.#skipWhitespaceAndComments();\n\n if (this.#position >= this.#source.length) {\n return undefined;\n }\n\n this.#tokenStart = this.#position;\n\n // Try to match tokens in order of specificity\n const result =\n this.#tryMatchKeyword() ??\n this.#tryMatchDateLiteral() ??\n this.#tryMatchTagValueOrNumber() ??\n this.#tryMatchTagName() ??\n this.#tryMatchString() ??\n this.#tryMatchByteStringHex() ??\n this.#tryMatchByteStringBase64() ??\n this.#tryMatchKnownValue() ??\n this.#tryMatchUR() ??\n this.#tryMatchPunctuation();\n\n if (result === undefined) {\n // Unrecognized token - consume one character\n this.#position++;\n this.#tokenEnd = this.#position;\n return err(PE.unrecognizedToken(this.span()));\n }\n\n return result;\n }\n\n #skipWhitespaceAndComments(): void {\n while (this.#position < this.#source.length) {\n const ch = this.#source[this.#position];\n\n // Skip whitespace\n if (ch === \" \" || ch === \"\\t\" || ch === \"\\r\" || ch === \"\\n\" || ch === \"\\f\") {\n this.#position++;\n continue;\n }\n\n // Skip inline comments: /.../ (not preceded by another /)\n if (\n ch === \"/\" &&\n this.#position + 1 < this.#source.length &&\n this.#source[this.#position + 1] !== \"/\"\n ) {\n this.#position++; // Skip opening /\n while (this.#position < this.#source.length && this.#source[this.#position] !== \"/\") {\n this.#position++;\n }\n if (this.#position < this.#source.length) {\n this.#position++; // Skip closing /\n }\n continue;\n }\n\n // Skip end-of-line comments: #...\n if (ch === \"#\") {\n while (this.#position < this.#source.length && this.#source[this.#position] !== \"\\n\") {\n this.#position++;\n }\n continue;\n }\n\n break;\n }\n }\n\n #tryMatchKeyword(): ParseResult<Token> | undefined {\n const keywords: [string, Token][] = [\n [\"true\", token.bool(true)],\n [\"false\", token.bool(false)],\n [\"null\", token.null()],\n [\"NaN\", token.nan()],\n [\"Infinity\", token.infinity()],\n [\"-Infinity\", token.negInfinity()],\n [\"Unit\", token.unit()],\n ];\n\n for (const [keyword, tok] of keywords) {\n if (this.#matchLiteral(keyword)) {\n // Make sure it's not part of a longer identifier\n const nextChar = this.#source[this.#position];\n if (nextChar === undefined || !this.#isIdentifierChar(nextChar)) {\n this.#tokenEnd = this.#position;\n return ok(tok);\n }\n // Reset position if it was a partial match\n this.#position = this.#tokenStart;\n }\n }\n\n return undefined;\n }\n\n #tryMatchDateLiteral(): ParseResult<Token> | undefined {\n // ISO-8601 date: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS...\n const dateRegex = /^\\d{4}-\\d{2}-\\d{2}(?:T\\d{2}:\\d{2}:\\d{2}(?:\\.\\d+)?(?:Z|[+-]\\d{2}:\\d{2})?)?/;\n const remaining = this.#source.slice(this.#position);\n const match = dateRegex.exec(remaining);\n\n if (match !== null) {\n const dateStr = match[0];\n this.#position += dateStr.length;\n this.#tokenEnd = this.#position;\n\n // Validate date components before parsing to match Rust's strict behavior\n if (!isValidDateString(dateStr)) {\n return err(PE.invalidDateString(dateStr, this.span()));\n }\n\n try {\n const date = DCborDate.fromString(dateStr);\n return ok(token.dateLiteral(date));\n } catch {\n return err(PE.invalidDateString(dateStr, this.span()));\n }\n }\n\n return undefined;\n }\n\n #tryMatchTagValueOrNumber(): ParseResult<Token> | undefined {\n // Check for tag value: integer followed by (\n // Or just a number\n const numberRegex = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?/;\n const remaining = this.#source.slice(this.#position);\n const match = numberRegex.exec(remaining);\n\n if (match !== null) {\n const numStr = match[0];\n const nextChar = this.#source[this.#position + numStr.length];\n\n // Check if this is a tag value (integer followed by parenthesis)\n if (\n nextChar === \"(\" &&\n !numStr.includes(\".\") &&\n !numStr.includes(\"e\") &&\n !numStr.includes(\"E\") &&\n !numStr.startsWith(\"-\")\n ) {\n // It's a tag value\n this.#position += numStr.length + 1; // Include the (\n this.#tokenEnd = this.#position;\n\n const tagValue = parseInt(numStr, 10);\n if (!Number.isSafeInteger(tagValue) || tagValue < 0) {\n return err(\n PE.invalidTagValue(numStr, span(this.#tokenStart, this.#tokenStart + numStr.length)),\n );\n }\n\n return ok(token.tagValue(tagValue));\n }\n\n // It's a regular number\n this.#position += numStr.length;\n this.#tokenEnd = this.#position;\n\n const num = parseFloat(numStr);\n return ok(token.number(num));\n }\n\n return undefined;\n }\n\n #tryMatchTagName(): ParseResult<Token> | undefined {\n // Tag name: identifier followed by (\n const tagNameRegex = /^[a-zA-Z_][a-zA-Z0-9_-]*\\(/;\n const remaining = this.#source.slice(this.#position);\n const match = tagNameRegex.exec(remaining);\n\n if (match !== null) {\n const fullMatch = match[0];\n const name = fullMatch.slice(0, -1); // Remove trailing (\n this.#position += fullMatch.length;\n this.#tokenEnd = this.#position;\n\n return ok(token.tagName(name));\n }\n\n return undefined;\n }\n\n #tryMatchString(): ParseResult<Token> | undefined {\n if (this.#source[this.#position] !== '\"') {\n return undefined;\n }\n\n // JavaScript-style string with escape sequences\n // eslint-disable-next-line no-control-regex\n const stringRegex = /^\"([^\"\\\\\\x00-\\x1F]|\\\\([\"\\\\bnfrt/]|u[a-fA-F0-9]{4}))*\"/;\n const remaining = this.#source.slice(this.#position);\n const match = stringRegex.exec(remaining);\n\n if (match !== null) {\n const fullMatch = match[0];\n this.#position += fullMatch.length;\n this.#tokenEnd = this.#position;\n\n // Return the full string including quotes\n return ok(token.string(fullMatch));\n }\n\n // Invalid string - try to find where it ends for better error reporting\n this.#position++;\n while (this.#position < this.#source.length) {\n const ch = this.#source[this.#position];\n if (ch === '\"' || ch === \"\\n\") {\n if (ch === '\"') this.#position++;\n break;\n }\n if (ch === \"\\\\\") {\n this.#position += 2;\n } else {\n this.#position++;\n }\n }\n this.#tokenEnd = this.#position;\n return err(PE.unrecognizedToken(this.span()));\n }\n\n #tryMatchByteStringHex(): ParseResult<Token> | undefined {\n // h'...'\n if (!this.#matchLiteral(\"h'\")) {\n return undefined;\n }\n\n const hexRegex = /^[0-9a-fA-F]*/;\n const remaining = this.#source.slice(this.#position);\n const match = hexRegex.exec(remaining);\n const hexPart = match !== null ? match[0] : \"\";\n\n this.#position += hexPart.length;\n\n if (this.#source[this.#position] !== \"'\") {\n this.#tokenEnd = this.#position;\n return err(PE.invalidHexString(this.span()));\n }\n\n this.#position++; // Skip closing '\n this.#tokenEnd = this.#position;\n\n // Check that hex string has even length\n if (hexPart.length % 2 !== 0) {\n return err(PE.invalidHexString(this.span()));\n }\n\n // Decode hex\n const bytes = hexToBytes(hexPart);\n return ok(token.byteStringHex(bytes));\n }\n\n #tryMatchByteStringBase64(): ParseResult<Token> | undefined {\n // b64'...'\n if (!this.#matchLiteral(\"b64'\")) {\n return undefined;\n }\n\n const base64Regex = /^[A-Za-z0-9+/=]*/;\n const remaining = this.#source.slice(this.#position);\n const match = base64Regex.exec(remaining);\n const base64Part = match !== null ? match[0] : \"\";\n\n this.#position += base64Part.length;\n\n if (this.#source[this.#position] !== \"'\") {\n this.#tokenEnd = this.#position;\n return err(PE.invalidBase64String(this.span()));\n }\n\n this.#position++; // Skip closing '\n this.#tokenEnd = this.#position;\n\n // Check minimum length requirement (2 characters)\n if (base64Part.length < 2) {\n return err(PE.invalidBase64String(this.span()));\n }\n\n // Decode base64\n try {\n const bytes = base64ToBytes(base64Part);\n return ok(token.byteStringBase64(bytes));\n } catch {\n return err(PE.invalidBase64String(this.span()));\n }\n }\n\n #tryMatchKnownValue(): ParseResult<Token> | undefined {\n if (this.#source[this.#position] !== \"'\") {\n return undefined;\n }\n\n // Check for empty string '' (Unit)\n if (this.#source[this.#position + 1] === \"'\") {\n this.#position += 2;\n this.#tokenEnd = this.#position;\n return ok(token.knownValueName(\"\"));\n }\n\n // Check for numeric known value: '0' or '[1-9][0-9]*'\n const numericRegex = /^'(0|[1-9][0-9]*)'/;\n const remaining = this.#source.slice(this.#position);\n let match = numericRegex.exec(remaining);\n\n if (match !== null) {\n const fullMatch = match[0];\n const numStr = match[1];\n this.#position += fullMatch.length;\n this.#tokenEnd = this.#position;\n\n const value = parseInt(numStr, 10);\n if (!Number.isSafeInteger(value) || value < 0) {\n return err(PE.invalidKnownValue(numStr, span(this.#tokenStart + 1, this.#tokenEnd - 1)));\n }\n\n return ok(token.knownValueNumber(value));\n }\n\n // Check for named known value: '[a-zA-Z_][a-zA-Z0-9_-]*'\n const nameRegex = /^'([a-zA-Z_][a-zA-Z0-9_-]*)'/;\n match = nameRegex.exec(remaining);\n\n if (match !== null) {\n const fullMatch = match[0];\n const name = match[1];\n this.#position += fullMatch.length;\n this.#tokenEnd = this.#position;\n\n return ok(token.knownValueName(name));\n }\n\n // Invalid known value\n this.#position++;\n while (this.#position < this.#source.length && this.#source[this.#position] !== \"'\") {\n this.#position++;\n }\n if (this.#position < this.#source.length) {\n this.#position++;\n }\n this.#tokenEnd = this.#position;\n return err(PE.unrecognizedToken(this.span()));\n }\n\n #tryMatchUR(): ParseResult<Token> | undefined {\n // ur:type/data\n const urRegex = /^ur:([a-zA-Z0-9][a-zA-Z0-9-]*)\\/([a-zA-Z]{8,})/;\n const remaining = this.#source.slice(this.#position);\n const match = urRegex.exec(remaining);\n\n if (match !== null) {\n const fullMatch = match[0];\n this.#position += fullMatch.length;\n this.#tokenEnd = this.#position;\n\n try {\n const ur = UR.fromURString(fullMatch);\n return ok(token.ur(ur));\n } catch (e) {\n const errorMsg = e instanceof Error ? e.message : String(e);\n return err(PE.invalidUr(errorMsg, this.span()));\n }\n }\n\n return undefined;\n }\n\n #tryMatchPunctuation(): ParseResult<Token> | undefined {\n const ch = this.#source[this.#position];\n\n const punctuation: Record<string, Token> = {\n \"{\": token.braceOpen(),\n \"}\": token.braceClose(),\n \"[\": token.bracketOpen(),\n \"]\": token.bracketClose(),\n \"(\": token.parenthesisOpen(),\n \")\": token.parenthesisClose(),\n \":\": token.colon(),\n \",\": token.comma(),\n };\n\n const matched = punctuation[ch];\n if (matched !== undefined) {\n this.#position++;\n this.#tokenEnd = this.#position;\n return ok(matched);\n }\n\n return undefined;\n }\n\n #matchLiteral(literal: string): boolean {\n if (this.#source.slice(this.#position, this.#position + literal.length) === literal) {\n this.#position += literal.length;\n return true;\n }\n return false;\n }\n\n #isIdentifierChar(ch: string): boolean {\n return /[a-zA-Z0-9_-]/.test(ch);\n }\n}\n\n/**\n * Converts a hex string to bytes.\n */\nfunction hexToBytes(hex: string): Uint8Array {\n const bytes = new Uint8Array(hex.length / 2);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = parseInt(hex.slice(i * 2, i * 2 + 2), 16);\n }\n return bytes;\n}\n\n/**\n * Converts a base64 string to bytes with strict validation.\n * Rejects base64 strings with invalid padding (matches Rust's base64 crate behavior).\n */\nfunction base64ToBytes(base64: string): Uint8Array {\n // Validate base64 padding strictly (Rust's base64 crate requires proper padding)\n const expectedPadding = (4 - (base64.replace(/=/g, \"\").length % 4)) % 4;\n const paddingMatch = /=+$/.exec(base64);\n const actualPadding = paddingMatch !== null ? paddingMatch[0].length : 0;\n\n // If there should be padding but there isn't, or padding is wrong length\n if (expectedPadding !== actualPadding) {\n throw new Error(\"Invalid base64 padding\");\n }\n\n // Use built-in atob for base64 decoding\n const binaryString = atob(base64);\n const bytes = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n bytes[i] = binaryString.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Validates a date string has valid month/day values.\n * JavaScript Date is lenient and accepts invalid dates like 2023-02-30,\n * but Rust's Date::from_string rejects them.\n */\nfunction isValidDateString(dateStr: string): boolean {\n // Extract date components\n const dateMatch = /^(\\d{4})-(\\d{2})-(\\d{2})/.exec(dateStr);\n if (dateMatch === null) return false;\n\n const year = parseInt(dateMatch[1], 10);\n const month = parseInt(dateMatch[2], 10);\n const day = parseInt(dateMatch[3], 10);\n\n // Validate month (1-12)\n if (month < 1 || month > 12) return false;\n\n // Validate day (1-N where N depends on month)\n if (day < 1) return false;\n\n // Days in each month (non-leap year)\n const daysInMonth = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];\n\n // Adjust for leap year\n const isLeapYear = (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0;\n if (isLeapYear && month === 2) {\n if (day > 29) return false;\n } else {\n if (day > daysInMonth[month - 1]) return false;\n }\n\n // If there's a time component, validate it\n const timeMatch = /T(\\d{2}):(\\d{2}):(\\d{2})/.exec(dateStr);\n if (timeMatch !== null) {\n const hour = parseInt(timeMatch[1], 10);\n const minute = parseInt(timeMatch[2], 10);\n const second = parseInt(timeMatch[3], 10);\n\n if (hour < 0 || hour > 23) return false;\n if (minute < 0 || minute > 59) return false;\n if (second < 0 || second > 59) return false;\n }\n\n return true;\n}\n","/**\n * @bcts/dcbor-parse - Parse module\n *\n * This is a 1:1 TypeScript port of bc-dcbor-parse-rust parse.rs\n *\n * @module dcbor-parse/parse\n */\n\nimport { type Cbor, cbor, CborMap, getGlobalTagsStore } from \"@bcts/dcbor\";\nimport { KnownValue, KNOWN_VALUES } from \"@bcts/known-values\";\nimport type { UR } from \"@bcts/uniform-resources\";\nimport {\n type Span,\n span,\n parseError as PE,\n type ParseResult,\n ok,\n err,\n isDefaultError,\n} from \"./error\";\nimport { type Token, Lexer } from \"./token\";\n\n/**\n * Parses a dCBOR item from a string input.\n *\n * This function takes a string slice containing a dCBOR diagnostic notation\n * encoded value and attempts to parse it into a `Cbor` object. If the input\n * contains extra tokens after a valid item, an error is returned.\n *\n * @param src - A string containing the dCBOR-encoded data.\n * @returns `Ok(Cbor)` if parsing is successful and the input contains exactly one\n * valid dCBOR item, which itself might be an atomic value like a number or\n * string, or a complex value like an array or map.\n * `Err(ParseError)` if parsing fails or if extra tokens are found after the item.\n *\n * @example\n * ```typescript\n * const result = parseDcborItem(\"[1, 2, 3]\");\n * if (result.ok) {\n * console.log(result.value.toDiagnostic()); // \"[1, 2, 3]\"\n * }\n * ```\n */\nexport function parseDcborItem(src: string): ParseResult<Cbor> {\n const lexer = new Lexer(src);\n const firstTokenResult = expectToken(lexer);\n\n if (!firstTokenResult.ok) {\n if (firstTokenResult.error.type === \"UnexpectedEndOfInput\") {\n return err(PE.emptyInput());\n }\n return firstTokenResult;\n }\n\n const parseResult = parseItemToken(firstTokenResult.value, lexer);\n if (!parseResult.ok) {\n return parseResult;\n }\n\n // Check for extra data\n const nextToken = lexer.next();\n if (nextToken !== undefined) {\n return err(PE.extraData(lexer.span()));\n }\n\n return parseResult;\n}\n\n/**\n * Parses a dCBOR item from the beginning of a string and returns the parsed\n * `Cbor` along with the number of bytes consumed.\n *\n * Unlike `parseDcborItem`, this function succeeds even if additional\n * characters follow the first item. The returned index points to the first\n * unparsed character after skipping any trailing whitespace or comments.\n *\n * @param src - A string containing the dCBOR-encoded data.\n * @returns `Ok([Cbor, number])` with the parsed item and bytes consumed.\n *\n * @example\n * ```typescript\n * const result = parseDcborItemPartial(\"true )\");\n * if (result.ok) {\n * const [cbor, used] = result.value;\n * console.log(cbor.toDiagnostic()); // \"true\"\n * console.log(used); // 5\n * }\n * ```\n */\nexport function parseDcborItemPartial(src: string): ParseResult<[Cbor, number]> {\n const lexer = new Lexer(src);\n const firstTokenResult = expectToken(lexer);\n\n if (!firstTokenResult.ok) {\n if (firstTokenResult.error.type === \"UnexpectedEndOfInput\") {\n return err(PE.emptyInput());\n }\n return firstTokenResult;\n }\n\n const parseResult = parseItemToken(firstTokenResult.value, lexer);\n if (!parseResult.ok) {\n return parseResult;\n }\n\n // Determine consumed bytes\n const nextToken = lexer.next();\n const consumed = nextToken !== undefined ? lexer.span().start : src.length;\n\n return ok([parseResult.value, consumed]);\n}\n\n// === Private Functions ===\n\nfunction parseItem(lexer: Lexer): ParseResult<Cbor> {\n const tokenResult = expectToken(lexer);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n return parseItemToken(tokenResult.value, lexer);\n}\n\nfunction expectToken(lexer: Lexer): ParseResult<Token> {\n const spanBefore = lexer.span();\n const result = lexer.next();\n\n if (result === undefined) {\n return err(PE.unexpectedEndOfInput());\n }\n\n if (!result.ok) {\n if (isDefaultError(result.error)) {\n return err(PE.unrecognizedToken(spanBefore));\n }\n return result;\n }\n\n return result;\n}\n\nfunction parseItemToken(token: Token, lexer: Lexer): ParseResult<Cbor> {\n switch (token.type) {\n case \"Bool\":\n return ok(cbor(token.value));\n\n case \"Null\":\n return ok(cbor(null));\n\n case \"ByteStringHex\":\n return ok(cbor(token.value));\n\n case \"ByteStringBase64\":\n return ok(cbor(token.value));\n\n case \"DateLiteral\":\n return ok(cbor(token.value));\n\n case \"Number\":\n return ok(cbor(token.value));\n\n case \"NaN\":\n return ok(cbor(Number.NaN));\n\n case \"Infinity\":\n return ok(cbor(Number.POSITIVE_INFINITY));\n\n case \"NegInfinity\":\n return ok(cbor(Number.NEGATIVE_INFINITY));\n\n case \"String\":\n return parseString(token.value, lexer.span());\n\n case \"UR\":\n return parseUr(token.value, lexer.span());\n\n case \"TagValue\":\n return parseNumberTag(token.value, lexer);\n\n case \"TagName\":\n return parseNameTag(token.value, lexer);\n\n case \"KnownValueNumber\":\n return ok(new KnownValue(token.value).taggedCbor());\n\n case \"KnownValueName\": {\n // Empty string means Unit (value 0)\n if (token.value === \"\") {\n return ok(new KnownValue(0).taggedCbor());\n }\n\n const knownValue = knownValueForName(token.value);\n if (knownValue !== undefined) {\n return ok(knownValue.taggedCbor());\n }\n const tokenSpan = lexer.span();\n return err(\n PE.unknownKnownValueName(token.value, span(tokenSpan.start + 1, tokenSpan.end - 1)),\n );\n }\n\n case \"Unit\":\n return ok(new KnownValue(0).taggedCbor());\n\n case \"BracketOpen\":\n return parseArray(lexer);\n\n case \"BraceOpen\":\n return parseMap(lexer);\n\n // Syntactic tokens that cannot start an item\n case \"BraceClose\":\n case \"BracketClose\":\n case \"ParenthesisOpen\":\n case \"ParenthesisClose\":\n case \"Colon\":\n case \"Comma\":\n return err(PE.unexpectedToken(token, lexer.span()));\n }\n}\n\nfunction parseString(s: string, tokenSpan: Span): ParseResult<Cbor> {\n if (s.startsWith('\"') && s.endsWith('\"')) {\n // Remove quotes and return the inner string\n const inner = s.slice(1, -1);\n return ok(cbor(inner));\n }\n return err(PE.unrecognizedToken(tokenSpan));\n}\n\nfunction tagForName(name: string): number | bigint | undefined {\n return getGlobalTagsStore().tagForName(name)?.value;\n}\n\nfunction knownValueForName(name: string): KnownValue | undefined {\n return KNOWN_VALUES.get().knownValueNamed(name);\n}\n\nfunction parseUr(ur: UR, tokenSpan: Span): ParseResult<Cbor> {\n const urType = ur.urTypeStr();\n const tag = tagForName(urType);\n\n if (tag !== undefined) {\n return ok(cbor({ tag, value: ur.cbor() }));\n }\n\n return err(\n PE.unknownUrType(urType, span(tokenSpan.start + 3, tokenSpan.start + 3 + urType.length)),\n );\n}\n\nfunction parseNumberTag(tagValue: number, lexer: Lexer): ParseResult<Cbor> {\n const itemResult = parseItem(lexer);\n if (!itemResult.ok) {\n return itemResult;\n }\n\n const closeResult = expectToken(lexer);\n if (!closeResult.ok) {\n if (closeResult.error.type === \"UnexpectedEndOfInput\") {\n return err(PE.unmatchedParentheses(lexer.span()));\n }\n return closeResult;\n }\n\n if (closeResult.value.type === \"ParenthesisClose\") {\n return ok(cbor({ tag: tagValue, value: itemResult.value }));\n }\n\n return err(PE.unmatchedParentheses(lexer.span()));\n}\n\nfunction parseNameTag(name: string, lexer: Lexer): ParseResult<Cbor> {\n const tagSpan = span(lexer.span().start, lexer.span().end - 1);\n\n const itemResult = parseItem(lexer);\n if (!itemResult.ok) {\n return itemResult;\n }\n\n const closeResult = expectToken(lexer);\n if (!closeResult.ok) {\n return closeResult;\n }\n\n if (closeResult.value.type === \"ParenthesisClose\") {\n const tag = tagForName(name);\n if (tag !== undefined) {\n return ok(cbor({ tag, value: itemResult.value }));\n }\n return err(PE.unknownTagName(name, tagSpan));\n }\n\n return err(PE.unmatchedParentheses(lexer.span()));\n}\n\nfunction parseArray(lexer: Lexer): ParseResult<Cbor> {\n const items: Cbor[] = [];\n let awaitsComma = false;\n let awaitsItem = false;\n\n while (true) {\n const tokenResult = expectToken(lexer);\n if (!tokenResult.ok) {\n return tokenResult;\n }\n\n const token = tokenResult.value;\n\n // Handle closing bracket\n if (token.type === \"BracketClose\" && !awaitsItem) {\n return ok(cbor(items));\n }\n\n // Handle comma\n if (token.type === \"Comma\" && awaitsComma) {\n awaitsItem = true;\n awaitsComma = false;\n continue;\n }\n\n // Expect an item when not awaiting comma\n if (awaitsComma) {\n return err(PE.expectedComma(lexer.span()));\n }\n\n // Parse the item\n const itemResult = parseItemToken(token, lexer);\n if (!itemResult.ok) {\n return itemResult;\n }\n\n items.push(itemResult.value);\n awaitsItem = false;\n awaitsComma = true;\n }\n}\n\nfunction parseMap(lexer: Lexer): ParseResult<Cbor> {\n const map = new CborMap();\n let awaitsComma = false;\n let awaitsKey = false;\n\n while (true) {\n const tokenResult = expectToken(lexer);\n if (!tokenResult.ok) {\n if (tokenResult.error.type === \"UnexpectedEndOfInput\") {\n return err(PE.unmatchedBraces(lexer.span()));\n }\n return tokenResult;\n }\n\n const token = tokenResult.value;\n\n // Handle closing brace\n if (token.type === \"BraceClose\" && !awaitsKey) {\n return ok(cbor(map));\n }\n\n // Handle comma\n if (token.type === \"Comma\" && awaitsComma) {\n awaitsKey = true;\n awaitsComma = false;\n continue;\n }\n\n // Expect a key when not awaiting comma\n if (awaitsComma) {\n return err(PE.expectedComma(lexer.span()));\n }\n\n // Parse the key\n const keyResult = parseItemToken(token, lexer);\n if (!keyResult.ok) {\n return keyResult;\n }\n\n const key = keyResult.value;\n const keySpan = lexer.span();\n\n // Check for duplicate key\n if (map.has(key)) {\n return err(PE.duplicateMapKey(keySpan));\n }\n\n // Expect colon\n const colonResult = expectToken(lexer);\n if (!colonResult.ok) {\n return colonResult;\n }\n\n if (colonResult.value.type !== \"Colon\") {\n return err(PE.expectedColon(lexer.span()));\n }\n\n // Parse the value\n const valueResult = parseItem(lexer);\n if (!valueResult.ok) {\n if (valueResult.error.type === \"UnexpectedToken\") {\n const unexpectedToken = (valueResult.error as { token: Token }).token;\n if (unexpectedToken.type === \"BraceClose\") {\n return err(PE.expectedMapKey(lexer.span()));\n }\n }\n return valueResult;\n }\n\n map.set(key, valueResult.value);\n awaitsKey = false;\n awaitsComma = true;\n }\n}\n","/**\n * @bcts/dcbor-parse - Compose module\n *\n * This is a 1:1 TypeScript port of bc-dcbor-parse-rust compose.rs\n *\n * @module dcbor-parse/compose\n */\n\nimport { type Cbor, cbor, CborMap } from \"@bcts/dcbor\";\nimport type { ParseError } from \"./error\";\nimport { parseDcborItem } from \"./parse\";\n\n/**\n * Compose error types.\n *\n * Corresponds to the Rust `Error` enum in compose.rs\n */\nexport type ComposeError =\n | { readonly type: \"OddMapLength\" }\n | { readonly type: \"DuplicateMapKey\" }\n | { readonly type: \"ParseError\"; readonly error: ParseError };\n\n// ComposeError constructors (lowercase to differentiate from the type)\nexport const composeError = {\n oddMapLength(): ComposeError {\n return { type: \"OddMapLength\" };\n },\n\n duplicateMapKey(): ComposeError {\n return { type: \"DuplicateMapKey\" };\n },\n\n parseError(error: ParseError): ComposeError {\n return { type: \"ParseError\", error };\n },\n};\n\n/**\n * Gets the error message for a compose error.\n */\nexport function composeErrorMessage(error: ComposeError): string {\n switch (error.type) {\n case \"OddMapLength\":\n return \"Invalid odd map length\";\n case \"DuplicateMapKey\":\n return \"Duplicate map key\";\n case \"ParseError\":\n return `Invalid CBOR item: ${error.error.type}`;\n }\n}\n\n/**\n * Result type for compose operations.\n *\n * Corresponds to Rust `Result<T, Error>`\n */\nexport type ComposeResult<T> =\n | { readonly ok: true; readonly value: T }\n | { readonly ok: false; readonly error: ComposeError };\n\n/**\n * Creates a successful compose result.\n */\nexport function composeOk<T>(value: T): ComposeResult<T> {\n return { ok: true, value };\n}\n\n/**\n * Creates an error compose result.\n */\nexport function composeErr<T>(error: ComposeError): ComposeResult<T> {\n return { ok: false, error };\n}\n\n/**\n * Composes a dCBOR array from a slice of string slices, and returns a CBOR\n * object representing the array.\n *\n * Each string slice is parsed as a dCBOR item.\n *\n * @param array - Array of strings, each representing a dCBOR item\n * @returns A CBOR array containing all parsed items\n *\n * @example\n * ```typescript\n * const result = composeDcborArray([\"1\", \"2\", \"3\"]);\n * if (result.ok) {\n * console.log(result.value.toDiagnostic()); // \"[1, 2, 3]\"\n * }\n * ```\n */\nexport function composeDcborArray(array: readonly string[]): ComposeResult<Cbor> {\n const result: Cbor[] = [];\n\n for (const item of array) {\n const parseResult = parseDcborItem(item);\n if (!parseResult.ok) {\n return composeErr(composeError.parseError(parseResult.error));\n }\n result.push(parseResult.value);\n }\n\n return composeOk(cbor(result));\n}\n\n/**\n * Composes a dCBOR map from a slice of string slices, and returns a CBOR\n * object representing the map.\n *\n * The length of the slice must be even, as each key must have a corresponding\n * value.\n *\n * Each string slice is parsed as a dCBOR item.\n *\n * @param array - Array of strings representing key-value pairs in alternating order\n * @returns A CBOR map containing all parsed key-value pairs\n *\n * @example\n * ```typescript\n * const result = composeDcborMap([\"1\", \"2\", \"3\", \"4\"]);\n * if (result.ok) {\n * console.log(result.value.toDiagnostic()); // \"{1: 2, 3: 4}\"\n * }\n * ```\n */\nexport function composeDcborMap(array: readonly string[]): ComposeResult<Cbor> {\n if (array.length % 2 !== 0) {\n return composeErr(composeError.oddMapLength());\n }\n\n const map = new CborMap();\n\n for (let i = 0; i < array.length; i += 2) {\n const keyStr = array[i];\n const valueStr = array[i + 1];\n\n const keyResult = parseDcborItem(keyStr);\n if (!keyResult.ok) {\n return composeErr(composeError.parseError(keyResult.error));\n }\n\n const valueResult = parseDcborItem(valueStr);\n if (!valueResult.ok) {\n return composeErr(composeError.parseError(valueResult.error));\n }\n\n // Check for duplicate key\n if (map.has(keyResult.value)) {\n return composeErr(composeError.duplicateMapKey());\n }\n\n map.set(keyResult.value, valueResult.value);\n }\n\n return composeOk(cbor(map));\n}\n"],"mappings":"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"}
@@ -0,0 +1,433 @@
1
+ import { Cbor, CborDate } from "@bcts/dcbor";
2
+ import { UR } from "@bcts/uniform-resources";
3
+
4
+ //#region src/token.d.ts
5
+
6
+ /**
7
+ * Token types produced by the lexer.
8
+ *
9
+ * Corresponds to the Rust `Token` enum in token.rs
10
+ */
11
+ type Token = {
12
+ readonly type: "Bool";
13
+ readonly value: boolean;
14
+ } | {
15
+ readonly type: "BraceOpen";
16
+ } | {
17
+ readonly type: "BraceClose";
18
+ } | {
19
+ readonly type: "BracketOpen";
20
+ } | {
21
+ readonly type: "BracketClose";
22
+ } | {
23
+ readonly type: "ParenthesisOpen";
24
+ } | {
25
+ readonly type: "ParenthesisClose";
26
+ } | {
27
+ readonly type: "Colon";
28
+ } | {
29
+ readonly type: "Comma";
30
+ } | {
31
+ readonly type: "Null";
32
+ } | {
33
+ readonly type: "NaN";
34
+ } | {
35
+ readonly type: "Infinity";
36
+ } | {
37
+ readonly type: "NegInfinity";
38
+ } | {
39
+ readonly type: "ByteStringHex";
40
+ readonly value: Uint8Array;
41
+ } | {
42
+ readonly type: "ByteStringBase64";
43
+ readonly value: Uint8Array;
44
+ } | {
45
+ readonly type: "DateLiteral";
46
+ readonly value: CborDate;
47
+ } | {
48
+ readonly type: "Number";
49
+ readonly value: number;
50
+ } | {
51
+ readonly type: "String";
52
+ readonly value: string;
53
+ } | {
54
+ readonly type: "TagValue";
55
+ readonly value: number;
56
+ } | {
57
+ readonly type: "TagName";
58
+ readonly value: string;
59
+ } | {
60
+ readonly type: "KnownValueNumber";
61
+ readonly value: number;
62
+ } | {
63
+ readonly type: "KnownValueName";
64
+ readonly value: string;
65
+ } | {
66
+ readonly type: "Unit";
67
+ } | {
68
+ readonly type: "UR";
69
+ readonly value: UR;
70
+ };
71
+ declare const token: {
72
+ bool(value: boolean): Token;
73
+ braceOpen(): Token;
74
+ braceClose(): Token;
75
+ bracketOpen(): Token;
76
+ bracketClose(): Token;
77
+ parenthesisOpen(): Token;
78
+ parenthesisClose(): Token;
79
+ colon(): Token;
80
+ comma(): Token;
81
+ null(): Token;
82
+ nan(): Token;
83
+ infinity(): Token;
84
+ negInfinity(): Token;
85
+ byteStringHex(value: Uint8Array): Token;
86
+ byteStringBase64(value: Uint8Array): Token;
87
+ dateLiteral(value: CborDate): Token;
88
+ number(value: number): Token;
89
+ string(value: string): Token;
90
+ tagValue(value: number): Token;
91
+ tagName(value: string): Token;
92
+ knownValueNumber(value: number): Token;
93
+ knownValueName(value: string): Token;
94
+ unit(): Token;
95
+ ur(value: UR): Token;
96
+ };
97
+ /**
98
+ * Lexer for dCBOR diagnostic notation.
99
+ *
100
+ * Corresponds to the Rust `logos::Lexer` used in parse.rs
101
+ */
102
+ declare class Lexer {
103
+ #private;
104
+ constructor(source: string);
105
+ /**
106
+ * Gets the current span (position range of the last token).
107
+ */
108
+ span(): Span;
109
+ /**
110
+ * Gets the slice of source corresponding to the last token.
111
+ */
112
+ slice(): string;
113
+ /**
114
+ * Gets the next token, or undefined if at end of input.
115
+ * Returns a Result to handle lexing errors.
116
+ */
117
+ next(): ParseResult<Token> | undefined;
118
+ }
119
+ //#endregion
120
+ //#region src/error.d.ts
121
+ /**
122
+ * Represents a span (range) in the source string.
123
+ *
124
+ * Corresponds to the Rust `logos::Span` type.
125
+ */
126
+ interface Span {
127
+ readonly start: number;
128
+ readonly end: number;
129
+ }
130
+ /**
131
+ * Creates a span with the given start and end positions.
132
+ */
133
+ declare function span(start: number, end: number): Span;
134
+ /**
135
+ * Creates a default (empty) span.
136
+ */
137
+ declare function defaultSpan(): Span;
138
+ /**
139
+ * Parse error types.
140
+ *
141
+ * Corresponds to the Rust `Error` enum in error.rs
142
+ */
143
+ type ParseError = {
144
+ readonly type: "EmptyInput";
145
+ } | {
146
+ readonly type: "UnexpectedEndOfInput";
147
+ } | {
148
+ readonly type: "ExtraData";
149
+ readonly span: Span;
150
+ } | {
151
+ readonly type: "UnexpectedToken";
152
+ readonly token: Token;
153
+ readonly span: Span;
154
+ } | {
155
+ readonly type: "UnrecognizedToken";
156
+ readonly span: Span;
157
+ } | {
158
+ readonly type: "ExpectedComma";
159
+ readonly span: Span;
160
+ } | {
161
+ readonly type: "ExpectedColon";
162
+ readonly span: Span;
163
+ } | {
164
+ readonly type: "UnmatchedParentheses";
165
+ readonly span: Span;
166
+ } | {
167
+ readonly type: "UnmatchedBraces";
168
+ readonly span: Span;
169
+ } | {
170
+ readonly type: "ExpectedMapKey";
171
+ readonly span: Span;
172
+ } | {
173
+ readonly type: "InvalidTagValue";
174
+ readonly value: string;
175
+ readonly span: Span;
176
+ } | {
177
+ readonly type: "UnknownTagName";
178
+ readonly name: string;
179
+ readonly span: Span;
180
+ } | {
181
+ readonly type: "InvalidHexString";
182
+ readonly span: Span;
183
+ } | {
184
+ readonly type: "InvalidBase64String";
185
+ readonly span: Span;
186
+ } | {
187
+ readonly type: "UnknownUrType";
188
+ readonly urType: string;
189
+ readonly span: Span;
190
+ } | {
191
+ readonly type: "InvalidUr";
192
+ readonly message: string;
193
+ readonly span: Span;
194
+ } | {
195
+ readonly type: "InvalidKnownValue";
196
+ readonly value: string;
197
+ readonly span: Span;
198
+ } | {
199
+ readonly type: "UnknownKnownValueName";
200
+ readonly name: string;
201
+ readonly span: Span;
202
+ } | {
203
+ readonly type: "InvalidDateString";
204
+ readonly dateString: string;
205
+ readonly span: Span;
206
+ } | {
207
+ readonly type: "DuplicateMapKey";
208
+ readonly span: Span;
209
+ };
210
+ declare const parseError: {
211
+ emptyInput(): ParseError;
212
+ unexpectedEndOfInput(): ParseError;
213
+ extraData(span: Span): ParseError;
214
+ unexpectedToken(token: Token, span: Span): ParseError;
215
+ unrecognizedToken(span: Span): ParseError;
216
+ expectedComma(span: Span): ParseError;
217
+ expectedColon(span: Span): ParseError;
218
+ unmatchedParentheses(span: Span): ParseError;
219
+ unmatchedBraces(span: Span): ParseError;
220
+ expectedMapKey(span: Span): ParseError;
221
+ invalidTagValue(value: string, span: Span): ParseError;
222
+ unknownTagName(name: string, span: Span): ParseError;
223
+ invalidHexString(span: Span): ParseError;
224
+ invalidBase64String(span: Span): ParseError;
225
+ unknownUrType(urType: string, span: Span): ParseError;
226
+ invalidUr(message: string, span: Span): ParseError;
227
+ invalidKnownValue(value: string, span: Span): ParseError;
228
+ unknownKnownValueName(name: string, span: Span): ParseError;
229
+ invalidDateString(dateString: string, span: Span): ParseError;
230
+ duplicateMapKey(span: Span): ParseError;
231
+ };
232
+ /**
233
+ * Checks if an error is the default unrecognized token error.
234
+ *
235
+ * Corresponds to Rust `Error::is_default()`
236
+ */
237
+ declare function isDefaultError(error: ParseError): boolean;
238
+ /**
239
+ * Gets the error message for a parse error.
240
+ *
241
+ * Corresponds to Rust's `Display` implementation for `Error`
242
+ */
243
+ declare function errorMessage(error: ParseError): string;
244
+ /**
245
+ * Gets the span for a parse error, if applicable.
246
+ */
247
+ declare function errorSpan(error: ParseError): Span | undefined;
248
+ /**
249
+ * Gets the full error message with source context.
250
+ *
251
+ * Corresponds to Rust `Error::full_message()`
252
+ */
253
+ declare function fullErrorMessage(error: ParseError, source: string): string;
254
+ /**
255
+ * Creates a default parse error (UnrecognizedToken with empty span).
256
+ *
257
+ * Corresponds to Rust `Error::default()`
258
+ */
259
+ declare function defaultParseError(): ParseError;
260
+ /**
261
+ * Result type for parse operations.
262
+ *
263
+ * Corresponds to Rust `Result<T, Error>`
264
+ */
265
+ type ParseResult<T> = {
266
+ readonly ok: true;
267
+ readonly value: T;
268
+ } | {
269
+ readonly ok: false;
270
+ readonly error: ParseError;
271
+ };
272
+ /**
273
+ * Creates a successful result.
274
+ */
275
+ declare function ok<T>(value: T): ParseResult<T>;
276
+ /**
277
+ * Creates an error result.
278
+ */
279
+ declare function err<T>(error: ParseError): ParseResult<T>;
280
+ /**
281
+ * Checks if a result is successful.
282
+ */
283
+ declare function isOk<T>(result: ParseResult<T>): result is {
284
+ ok: true;
285
+ value: T;
286
+ };
287
+ /**
288
+ * Checks if a result is an error.
289
+ */
290
+ declare function isErr<T>(result: ParseResult<T>): result is {
291
+ ok: false;
292
+ error: ParseError;
293
+ };
294
+ /**
295
+ * Unwraps a result, throwing if it's an error.
296
+ */
297
+ declare function unwrap<T>(result: ParseResult<T>): T;
298
+ /**
299
+ * Unwraps a result error, throwing if it's successful.
300
+ */
301
+ declare function unwrapErr<T>(result: ParseResult<T>): ParseError;
302
+ //#endregion
303
+ //#region src/parse.d.ts
304
+ /**
305
+ * Parses a dCBOR item from a string input.
306
+ *
307
+ * This function takes a string slice containing a dCBOR diagnostic notation
308
+ * encoded value and attempts to parse it into a `Cbor` object. If the input
309
+ * contains extra tokens after a valid item, an error is returned.
310
+ *
311
+ * @param src - A string containing the dCBOR-encoded data.
312
+ * @returns `Ok(Cbor)` if parsing is successful and the input contains exactly one
313
+ * valid dCBOR item, which itself might be an atomic value like a number or
314
+ * string, or a complex value like an array or map.
315
+ * `Err(ParseError)` if parsing fails or if extra tokens are found after the item.
316
+ *
317
+ * @example
318
+ * ```typescript
319
+ * const result = parseDcborItem("[1, 2, 3]");
320
+ * if (result.ok) {
321
+ * console.log(result.value.toDiagnostic()); // "[1, 2, 3]"
322
+ * }
323
+ * ```
324
+ */
325
+ declare function parseDcborItem(src: string): ParseResult<Cbor>;
326
+ /**
327
+ * Parses a dCBOR item from the beginning of a string and returns the parsed
328
+ * `Cbor` along with the number of bytes consumed.
329
+ *
330
+ * Unlike `parseDcborItem`, this function succeeds even if additional
331
+ * characters follow the first item. The returned index points to the first
332
+ * unparsed character after skipping any trailing whitespace or comments.
333
+ *
334
+ * @param src - A string containing the dCBOR-encoded data.
335
+ * @returns `Ok([Cbor, number])` with the parsed item and bytes consumed.
336
+ *
337
+ * @example
338
+ * ```typescript
339
+ * const result = parseDcborItemPartial("true )");
340
+ * if (result.ok) {
341
+ * const [cbor, used] = result.value;
342
+ * console.log(cbor.toDiagnostic()); // "true"
343
+ * console.log(used); // 5
344
+ * }
345
+ * ```
346
+ */
347
+ declare function parseDcborItemPartial(src: string): ParseResult<[Cbor, number]>;
348
+ //#endregion
349
+ //#region src/compose.d.ts
350
+ /**
351
+ * Compose error types.
352
+ *
353
+ * Corresponds to the Rust `Error` enum in compose.rs
354
+ */
355
+ type ComposeError = {
356
+ readonly type: "OddMapLength";
357
+ } | {
358
+ readonly type: "DuplicateMapKey";
359
+ } | {
360
+ readonly type: "ParseError";
361
+ readonly error: ParseError;
362
+ };
363
+ declare const composeError: {
364
+ oddMapLength(): ComposeError;
365
+ duplicateMapKey(): ComposeError;
366
+ parseError(error: ParseError): ComposeError;
367
+ };
368
+ /**
369
+ * Gets the error message for a compose error.
370
+ */
371
+ declare function composeErrorMessage(error: ComposeError): string;
372
+ /**
373
+ * Result type for compose operations.
374
+ *
375
+ * Corresponds to Rust `Result<T, Error>`
376
+ */
377
+ type ComposeResult<T> = {
378
+ readonly ok: true;
379
+ readonly value: T;
380
+ } | {
381
+ readonly ok: false;
382
+ readonly error: ComposeError;
383
+ };
384
+ /**
385
+ * Creates a successful compose result.
386
+ */
387
+ declare function composeOk<T>(value: T): ComposeResult<T>;
388
+ /**
389
+ * Creates an error compose result.
390
+ */
391
+ declare function composeErr<T>(error: ComposeError): ComposeResult<T>;
392
+ /**
393
+ * Composes a dCBOR array from a slice of string slices, and returns a CBOR
394
+ * object representing the array.
395
+ *
396
+ * Each string slice is parsed as a dCBOR item.
397
+ *
398
+ * @param array - Array of strings, each representing a dCBOR item
399
+ * @returns A CBOR array containing all parsed items
400
+ *
401
+ * @example
402
+ * ```typescript
403
+ * const result = composeDcborArray(["1", "2", "3"]);
404
+ * if (result.ok) {
405
+ * console.log(result.value.toDiagnostic()); // "[1, 2, 3]"
406
+ * }
407
+ * ```
408
+ */
409
+ declare function composeDcborArray(array: readonly string[]): ComposeResult<Cbor>;
410
+ /**
411
+ * Composes a dCBOR map from a slice of string slices, and returns a CBOR
412
+ * object representing the map.
413
+ *
414
+ * The length of the slice must be even, as each key must have a corresponding
415
+ * value.
416
+ *
417
+ * Each string slice is parsed as a dCBOR item.
418
+ *
419
+ * @param array - Array of strings representing key-value pairs in alternating order
420
+ * @returns A CBOR map containing all parsed key-value pairs
421
+ *
422
+ * @example
423
+ * ```typescript
424
+ * const result = composeDcborMap(["1", "2", "3", "4"]);
425
+ * if (result.ok) {
426
+ * console.log(result.value.toDiagnostic()); // "{1: 2, 3: 4}"
427
+ * }
428
+ * ```
429
+ */
430
+ declare function composeDcborMap(array: readonly string[]): ComposeResult<Cbor>;
431
+ //#endregion
432
+ export { type ComposeError, type ComposeResult, Lexer, type ParseError, type ParseResult, type Span, type Token, composeDcborArray, composeDcborMap, composeErr, composeError, composeErrorMessage, composeOk, defaultParseError, defaultSpan, err, errorMessage, errorSpan, fullErrorMessage, isDefaultError, isErr, isOk, ok, parseDcborItem, parseDcborItemPartial, parseError, span, token, unwrap, unwrapErr };
433
+ //# sourceMappingURL=index.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../src/token.ts","../src/error.ts","../src/parse.ts","../src/compose.ts"],"sourcesContent":[],"mappings":"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"}