unicode-escaper 1.0.0 → 1.0.1

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,"sources":["../src/formats.ts","../src/filters.ts","../src/escape.ts","../src/unescape.ts","../src/utils.ts","../src/stream.browser.ts"],"names":["DEFAULT_OPTIONS","isAscii","isLatin1","isBmp","isHighSurrogate","isLowSurrogate","isSurrogate","toHex"],"mappings":"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","file":"index.browser.js","sourcesContent":["import type { EscapeFormat } from './types.js';\n\n/**\n * Converts a code point to a hex string with specified padding and case\n */\nfunction toHex(codePoint: number, minLength: number, uppercase: boolean): string {\n const hex = codePoint.toString(16);\n const padded = hex.padStart(minLength, '0');\n return uppercase ? padded.toUpperCase() : padded.toLowerCase();\n}\n\n/**\n * Converts a code point to surrogate pair if needed\n */\nfunction toSurrogatePair(codePoint: number): [number, number] {\n const offset = codePoint - 0x10000;\n const highSurrogate = 0xd800 + (offset >> 10);\n const lowSurrogate = 0xdc00 + (offset & 0x3ff);\n return [highSurrogate, lowSurrogate];\n}\n\n/**\n * Format escape functions - convert a code point to its escaped representation\n */\nexport const formatters: Record<EscapeFormat, (codePoint: number, uppercase: boolean) => string> = {\n /**\n * Unicode escape: \\uXXXX for BMP, surrogate pairs for non-BMP\n */\n unicode: (codePoint: number, uppercase: boolean): string => {\n if (codePoint <= 0xffff) {\n return `\\\\u${toHex(codePoint, 4, uppercase)}`;\n }\n // Non-BMP: use surrogate pairs\n const [high, low] = toSurrogatePair(codePoint);\n return `\\\\u${toHex(high, 4, uppercase)}\\\\u${toHex(low, 4, uppercase)}`;\n },\n\n /**\n * ES6 Unicode escape: \\u{XXXXX} - supports full Unicode range\n */\n 'unicode-es6': (codePoint: number, uppercase: boolean): string => {\n return `\\\\u{${toHex(codePoint, 1, uppercase)}}`;\n },\n\n /**\n * Hex escape: \\xNN - only valid for 0x00-0xFF\n */\n hex: (codePoint: number, uppercase: boolean): string => {\n if (codePoint > 0xff) {\n // Fall back to unicode format for characters outside hex range\n return formatters.unicode(codePoint, uppercase);\n }\n return `\\\\x${toHex(codePoint, 2, uppercase)}`;\n },\n\n /**\n * HTML hex entity: &#xNNNN;\n */\n 'html-hex': (codePoint: number, uppercase: boolean): string => {\n return `&#x${toHex(codePoint, 1, uppercase)};`;\n },\n\n /**\n * HTML decimal entity: &#NNNN;\n */\n 'html-decimal': (codePoint: number, _uppercase: boolean): string => {\n return `&#${codePoint};`;\n },\n\n /**\n * Code point notation: U+XXXX\n */\n codepoint: (codePoint: number, uppercase: boolean): string => {\n return `U+${toHex(codePoint, 4, uppercase)}`;\n },\n};\n\n/**\n * Regular expressions to match each escape format\n */\nexport const unescapePatterns: Record<EscapeFormat, RegExp> = {\n // Matches \\uXXXX including surrogate pairs\n unicode: /\\\\u([0-9A-Fa-f]{4})/g,\n\n // Matches \\u{X} to \\u{XXXXXX}\n 'unicode-es6': /\\\\u\\{([0-9A-Fa-f]{1,6})\\}/g,\n\n // Matches \\xNN\n hex: /\\\\x([0-9A-Fa-f]{2})/g,\n\n // Matches &#xNNNN;\n 'html-hex': /&#x([0-9A-Fa-f]+);/gi,\n\n // Matches &#NNNN;\n 'html-decimal': /&#(\\d+);/g,\n\n // Matches U+XXXX\n codepoint: /U\\+([0-9A-Fa-f]{4,6})/gi,\n};\n\n/**\n * Combined pattern that matches all escape formats\n */\nexport const combinedUnescapePattern =\n /\\\\u\\{([0-9A-Fa-f]{1,6})\\}|\\\\u([0-9A-Fa-f]{4})|\\\\x([0-9A-Fa-f]{2})|&#x([0-9A-Fa-f]+);|&#(\\d+);|U\\+([0-9A-Fa-f]{4,6})/gi;\n\n/**\n * Pattern to match surrogate pairs in unicode format\n */\nexport const surrogatePairPattern = /\\\\u([Dd][89AaBb][0-9A-Fa-f]{2})\\\\u([Dd][CcDdEeFf][0-9A-Fa-f]{2})/g;\n\n/**\n * Validates if a code point is valid Unicode\n */\nexport function isValidCodePoint(codePoint: number): boolean {\n return codePoint >= 0 && codePoint <= 0x10ffff;\n}\n\n/**\n * Validates if a code point is a valid surrogate\n */\nexport function isSurrogateCodePoint(codePoint: number): boolean {\n return codePoint >= 0xd800 && codePoint <= 0xdfff;\n}\n\n/**\n * Converts surrogate pair to code point\n */\nexport function surrogateToCodePoint(high: number, low: number): number {\n return ((high - 0xd800) << 10) + (low - 0xdc00) + 0x10000;\n}\n","import type { FilterFunction } from './types.js';\n\n/**\n * ASCII range: 0x00-0x7F\n */\nconst ASCII_MAX = 0x7f;\n\n/**\n * Latin-1 range: 0x00-0xFF\n */\nconst LATIN1_MAX = 0xff;\n\n/**\n * BMP range: 0x0000-0xFFFF\n */\nconst BMP_MAX = 0xffff;\n\n/**\n * Surrogate range\n */\nconst SURROGATE_HIGH_START = 0xd800;\nconst SURROGATE_HIGH_END = 0xdbff;\nconst SURROGATE_LOW_START = 0xdc00;\nconst SURROGATE_LOW_END = 0xdfff;\n\n/**\n * Returns true if the character is in the ASCII range (0x00-0x7F)\n */\nexport const isAscii: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint <= ASCII_MAX;\n};\n\n/**\n * Returns true if the character is NOT in the ASCII range\n */\nexport const isNotAscii: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint > ASCII_MAX;\n};\n\n/**\n * Returns true if the character is in the Latin-1 range (0x00-0xFF)\n */\nexport const isLatin1: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint <= LATIN1_MAX;\n};\n\n/**\n * Returns true if the character is NOT in the Latin-1 range\n */\nexport const isNotLatin1: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint > LATIN1_MAX;\n};\n\n/**\n * Returns true if the character is in the BMP (0x0000-0xFFFF)\n */\nexport const isBmp: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint <= BMP_MAX;\n};\n\n/**\n * Returns true if the character is NOT in the BMP (supplementary planes)\n */\nexport const isNotBmp: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint > BMP_MAX;\n};\n\n/**\n * Returns true if the character is a high surrogate (0xD800-0xDBFF)\n */\nexport const isHighSurrogate: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint >= SURROGATE_HIGH_START && codePoint <= SURROGATE_HIGH_END;\n};\n\n/**\n * Returns true if the character is a low surrogate (0xDC00-0xDFFF)\n */\nexport const isLowSurrogate: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint >= SURROGATE_LOW_START && codePoint <= SURROGATE_LOW_END;\n};\n\n/**\n * Returns true if the character is any surrogate (0xD800-0xDFFF)\n */\nexport const isSurrogate: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint >= SURROGATE_HIGH_START && codePoint <= SURROGATE_LOW_END;\n};\n\n/**\n * Returns true if the character is a printable ASCII character (0x20-0x7E)\n */\nexport const isPrintableAscii: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint >= 0x20 && codePoint <= 0x7e;\n};\n\n/**\n * Returns true if the character is NOT a printable ASCII character\n */\nexport const isNotPrintableAscii: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint < 0x20 || codePoint > 0x7e;\n};\n\n/**\n * Returns true if the character is a control character (0x00-0x1F or 0x7F)\n */\nexport const isControl: FilterFunction = (_char: string, codePoint: number): boolean => {\n return codePoint <= 0x1f || codePoint === 0x7f;\n};\n\n/**\n * Returns true if the character is a whitespace character\n */\nexport const isWhitespace: FilterFunction = (char: string, _codePoint: number): boolean => {\n return /\\s/.test(char);\n};\n\n/**\n * Creates a filter that matches characters within a specific range\n */\nexport function inRange(start: number, end: number): FilterFunction {\n return (_char: string, codePoint: number): boolean => {\n return codePoint >= start && codePoint <= end;\n };\n}\n\n/**\n * Creates a filter that matches characters outside a specific range\n */\nexport function notInRange(start: number, end: number): FilterFunction {\n return (_char: string, codePoint: number): boolean => {\n return codePoint < start || codePoint > end;\n };\n}\n\n/**\n * Creates a filter that matches any of the specified characters\n */\nexport function oneOf(chars: string): FilterFunction {\n const charSet = new Set([...chars]);\n return (char: string, _codePoint: number): boolean => {\n return charSet.has(char);\n };\n}\n\n/**\n * Creates a filter that matches none of the specified characters\n */\nexport function noneOf(chars: string): FilterFunction {\n const charSet = new Set([...chars]);\n return (char: string, _codePoint: number): boolean => {\n return !charSet.has(char);\n };\n}\n\n/**\n * Combines multiple filters with AND logic (all must return true)\n */\nexport function and(...filters: FilterFunction[]): FilterFunction {\n return (char: string, codePoint: number): boolean => {\n return filters.every((filter) => filter(char, codePoint));\n };\n}\n\n/**\n * Combines multiple filters with OR logic (any must return true)\n */\nexport function or(...filters: FilterFunction[]): FilterFunction {\n return (char: string, codePoint: number): boolean => {\n return filters.some((filter) => filter(char, codePoint));\n };\n}\n\n/**\n * Negates a filter\n */\nexport function not(filter: FilterFunction): FilterFunction {\n return (char: string, codePoint: number): boolean => {\n return !filter(char, codePoint);\n };\n}\n\n/**\n * Always returns true (escape all characters)\n */\nexport const all: FilterFunction = (): boolean => true;\n\n/**\n * Always returns false (escape no characters)\n */\nexport const none: FilterFunction = (): boolean => false;\n","import type { EscapeOptions, EscapeResult, FilterFunction } from './types.js';\nimport { formatters } from './formats.js';\nimport { isNotAscii, isNotLatin1 } from './filters.js';\n\n/**\n * Default options for escape function\n */\nconst DEFAULT_OPTIONS: Required<Omit<EscapeOptions, 'filter'>> = {\n format: 'unicode',\n preserveAscii: true,\n preserveLatin1: false,\n uppercase: true,\n};\n\n/**\n * Creates a filter based on preserve options\n */\nfunction createPreserveFilter(options: EscapeOptions): FilterFunction {\n const { preserveAscii = true, preserveLatin1 = false } = options;\n\n if (preserveLatin1) {\n // Escape only non-Latin-1 characters\n return isNotLatin1;\n }\n if (preserveAscii) {\n // Escape only non-ASCII characters\n return isNotAscii;\n }\n // Escape all characters\n return () => true;\n}\n\n/**\n * Escapes Unicode characters in a string according to the specified options\n *\n * @param input - The string to escape\n * @param options - Escape options\n * @returns The escaped string\n *\n * @example\n * ```ts\n * escape('Hello 世界')\n * // => 'Hello \\\\u4E16\\\\u754C'\n *\n * escape('Hello 世界', { format: 'unicode-es6' })\n * // => 'Hello \\\\u{4E16}\\\\u{754C}'\n *\n * escape('Café', { preserveAscii: true })\n * // => 'Caf\\\\u00E9'\n * ```\n */\nexport function escape(input: string, options: EscapeOptions = {}): string {\n if (typeof input !== 'string') {\n throw new TypeError(`Expected string, got ${typeof input}`);\n }\n\n if (input.length === 0) {\n return '';\n }\n\n const format = options.format ?? DEFAULT_OPTIONS.format;\n const uppercase = options.uppercase ?? DEFAULT_OPTIONS.uppercase;\n const formatter = formatters[format];\n\n if (!formatter) {\n throw new Error(`Unknown escape format: ${format}`);\n }\n\n // Determine which filter to use\n const filter = options.filter ?? createPreserveFilter(options);\n\n const result: string[] = [];\n\n // Iterate over code points (handles surrogate pairs correctly)\n for (const char of input) {\n const codePoint = char.codePointAt(0);\n\n if (codePoint === undefined) {\n // Should never happen, but handle gracefully\n result.push(char);\n continue;\n }\n\n if (filter(char, codePoint)) {\n // Escape this character\n result.push(formatter(codePoint, uppercase));\n } else {\n // Preserve this character\n result.push(char);\n }\n }\n\n return result.join('');\n}\n\n/**\n * Escapes Unicode characters and returns detailed information about the operation\n *\n * @param input - The string to escape\n * @param options - Escape options\n * @returns Object containing escaped string and statistics\n */\nexport function escapeWithInfo(input: string, options: EscapeOptions = {}): EscapeResult {\n if (typeof input !== 'string') {\n throw new TypeError(`Expected string, got ${typeof input}`);\n }\n\n if (input.length === 0) {\n return {\n escaped: '',\n escapedCount: 0,\n preservedCount: 0,\n totalCount: 0,\n };\n }\n\n const format = options.format ?? DEFAULT_OPTIONS.format;\n const uppercase = options.uppercase ?? DEFAULT_OPTIONS.uppercase;\n const formatter = formatters[format];\n\n if (!formatter) {\n throw new Error(`Unknown escape format: ${format}`);\n }\n\n const filter = options.filter ?? createPreserveFilter(options);\n\n const result: string[] = [];\n let escapedCount = 0;\n let preservedCount = 0;\n\n for (const char of input) {\n const codePoint = char.codePointAt(0);\n\n if (codePoint === undefined) {\n result.push(char);\n preservedCount++;\n continue;\n }\n\n if (filter(char, codePoint)) {\n result.push(formatter(codePoint, uppercase));\n escapedCount++;\n } else {\n result.push(char);\n preservedCount++;\n }\n }\n\n return {\n escaped: result.join(''),\n escapedCount,\n preservedCount,\n totalCount: escapedCount + preservedCount,\n };\n}\n\n/**\n * Convenience function: escape to \\uXXXX format\n */\nexport function escapeToUnicode(input: string, options: Omit<EscapeOptions, 'format'> = {}): string {\n return escape(input, { ...options, format: 'unicode' });\n}\n\n/**\n * Convenience function: escape to \\u{XXXXX} ES6 format\n */\nexport function escapeToUnicodeES6(input: string, options: Omit<EscapeOptions, 'format'> = {}): string {\n return escape(input, { ...options, format: 'unicode-es6' });\n}\n\n/**\n * Convenience function: escape to \\xNN format (falls back to \\uXXXX for non-Latin1)\n */\nexport function escapeToHex(input: string, options: Omit<EscapeOptions, 'format'> = {}): string {\n return escape(input, { ...options, format: 'hex' });\n}\n\n/**\n * Convenience function: escape to &#xNNNN; HTML hex entity format\n */\nexport function escapeToHtmlHex(input: string, options: Omit<EscapeOptions, 'format'> = {}): string {\n return escape(input, { ...options, format: 'html-hex' });\n}\n\n/**\n * Convenience function: escape to &#NNNN; HTML decimal entity format\n */\nexport function escapeToHtmlDecimal(input: string, options: Omit<EscapeOptions, 'format'> = {}): string {\n return escape(input, { ...options, format: 'html-decimal' });\n}\n\n/**\n * Convenience function: escape to U+XXXX code point format\n */\nexport function escapeToCodePoint(input: string, options: Omit<EscapeOptions, 'format'> = {}): string {\n return escape(input, { ...options, format: 'codepoint' });\n}\n\n/**\n * Escapes all characters in a string (ignores preserve options)\n */\nexport function escapeAll(input: string, options: Omit<EscapeOptions, 'filter' | 'preserveAscii' | 'preserveLatin1'> = {}): string {\n return escape(input, { ...options, filter: () => true });\n}\n\n/**\n * Escapes only non-printable and control characters\n */\nexport function escapeNonPrintable(input: string, options: Omit<EscapeOptions, 'filter'> = {}): string {\n return escape(input, {\n ...options,\n filter: (_char, codePoint) => {\n // Escape control characters and non-printable\n return codePoint < 0x20 || codePoint === 0x7f || codePoint > 0x7e;\n },\n });\n}\n","import type { EscapeFormat, UnescapeOptions } from './types.js';\nimport {\n unescapePatterns,\n combinedUnescapePattern,\n surrogatePairPattern,\n isValidCodePoint,\n isSurrogateCodePoint,\n surrogateToCodePoint,\n} from './formats.js';\n\n/**\n * Default options for unescape function\n */\nconst DEFAULT_OPTIONS: Required<UnescapeOptions> = {\n formats: ['unicode', 'unicode-es6', 'hex', 'html-hex', 'html-decimal', 'codepoint'],\n lenient: true,\n};\n\n/**\n * Converts a hex string to a code point, with validation\n */\nfunction hexToCodePoint(hex: string, lenient: boolean): number | null {\n const codePoint = parseInt(hex, 16);\n\n if (isNaN(codePoint)) {\n if (lenient) return null;\n throw new Error(`Invalid hex value: ${hex}`);\n }\n\n if (!isValidCodePoint(codePoint)) {\n if (lenient) return null;\n throw new Error(`Invalid code point: U+${hex.toUpperCase()}`);\n }\n\n return codePoint;\n}\n\n/**\n * Converts a decimal string to a code point, with validation\n */\nfunction decimalToCodePoint(decimal: string, lenient: boolean): number | null {\n const codePoint = parseInt(decimal, 10);\n\n if (isNaN(codePoint)) {\n if (lenient) return null;\n throw new Error(`Invalid decimal value: ${decimal}`);\n }\n\n if (!isValidCodePoint(codePoint)) {\n if (lenient) return null;\n throw new Error(`Invalid code point: ${codePoint}`);\n }\n\n return codePoint;\n}\n\n/**\n * Safely converts a code point to a character\n */\nfunction codePointToChar(codePoint: number): string {\n return String.fromCodePoint(codePoint);\n}\n\n/**\n * Unescapes Unicode escape sequences in a string\n *\n * @param input - The string containing escape sequences\n * @param options - Unescape options\n * @returns The unescaped string\n *\n * @example\n * ```ts\n * unescape('Hello \\\\u4E16\\\\u754C')\n * // => 'Hello 世界'\n *\n * unescape('Hello \\\\u{4E16}\\\\u{754C}')\n * // => 'Hello 世界'\n *\n * unescape('Caf&#xE9;')\n * // => 'Café'\n * ```\n */\nexport function unescape(input: string, options: UnescapeOptions = {}): string {\n if (typeof input !== 'string') {\n throw new TypeError(`Expected string, got ${typeof input}`);\n }\n\n if (input.length === 0) {\n return '';\n }\n\n const lenient = options.lenient ?? DEFAULT_OPTIONS.lenient;\n const formats = options.formats ?? DEFAULT_OPTIONS.formats;\n\n let result = input;\n\n // Handle surrogate pairs first (before individual \\uXXXX patterns)\n if (formats.includes('unicode')) {\n // Create new regex to avoid lastIndex issues with global flag\n const pairPattern = new RegExp(surrogatePairPattern.source, surrogatePairPattern.flags);\n result = result.replace(pairPattern, (match, highHex: string, lowHex: string) => {\n const high = hexToCodePoint(highHex, lenient);\n const low = hexToCodePoint(lowHex, lenient);\n\n if (high === null || low === null) {\n return match;\n }\n\n const codePoint = surrogateToCodePoint(high, low);\n return codePointToChar(codePoint);\n });\n }\n\n // Process each format\n for (const format of formats) {\n const pattern = unescapePatterns[format];\n if (!pattern) continue;\n\n // Create a new RegExp instance to reset lastIndex\n const regex = new RegExp(pattern.source, pattern.flags);\n\n result = result.replace(regex, (match, captured: string) => {\n let codePoint: number | null;\n\n if (format === 'html-decimal') {\n codePoint = decimalToCodePoint(captured, lenient);\n } else {\n codePoint = hexToCodePoint(captured, lenient);\n }\n\n if (codePoint === null) {\n return match;\n }\n\n // Don't convert standalone surrogates\n if (isSurrogateCodePoint(codePoint)) {\n if (lenient) {\n return match;\n }\n throw new Error(`Standalone surrogate not allowed: U+${codePoint.toString(16).toUpperCase()}`);\n }\n\n return codePointToChar(codePoint);\n });\n }\n\n return result;\n}\n\n/**\n * Unescapes only \\uXXXX format (with surrogate pair support)\n */\nexport function unescapeUnicode(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['unicode'] });\n}\n\n/**\n * Unescapes only \\u{XXXXX} ES6 format\n */\nexport function unescapeUnicodeES6(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['unicode-es6'] });\n}\n\n/**\n * Unescapes only \\xNN format\n */\nexport function unescapeHex(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['hex'] });\n}\n\n/**\n * Unescapes only &#xNNNN; HTML hex entity format\n */\nexport function unescapeHtmlHex(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['html-hex'] });\n}\n\n/**\n * Unescapes only &#NNNN; HTML decimal entity format\n */\nexport function unescapeHtmlDecimal(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['html-decimal'] });\n}\n\n/**\n * Unescapes only U+XXXX code point format\n */\nexport function unescapeCodePoint(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['codepoint'] });\n}\n\n/**\n * Unescapes all HTML entities (both hex and decimal)\n */\nexport function unescapeHtml(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['html-hex', 'html-decimal'] });\n}\n\n/**\n * Unescapes all JavaScript escape formats (\\uXXXX, \\u{XXXXX}, \\xNN)\n */\nexport function unescapeJs(input: string, options: Omit<UnescapeOptions, 'formats'> = {}): string {\n return unescape(input, { ...options, formats: ['unicode', 'unicode-es6', 'hex'] });\n}\n\n/**\n * Checks if a string contains any escape sequences\n */\nexport function hasEscapeSequences(input: string, formats?: EscapeFormat[]): boolean {\n if (typeof input !== 'string' || input.length === 0) {\n return false;\n }\n\n if (formats) {\n return formats.some((format) => {\n const pattern = unescapePatterns[format];\n if (!pattern) return false;\n // Create new regex to avoid lastIndex issues with global flag\n return new RegExp(pattern.source, pattern.flags.replace('g', '')).test(input);\n });\n }\n\n // Create new regex without 'g' flag to avoid lastIndex issues\n return new RegExp(combinedUnescapePattern.source, 'i').test(input);\n}\n\n/**\n * Counts the number of escape sequences in a string\n */\nexport function countEscapeSequences(input: string, formats?: EscapeFormat[]): number {\n if (typeof input !== 'string' || input.length === 0) {\n return 0;\n }\n\n let count = 0;\n\n if (formats) {\n for (const format of formats) {\n const pattern = unescapePatterns[format];\n if (!pattern) continue;\n const matches = input.match(new RegExp(pattern.source, pattern.flags));\n count += matches?.length ?? 0;\n }\n } else {\n const matches = input.match(new RegExp(combinedUnescapePattern.source, combinedUnescapePattern.flags));\n count = matches?.length ?? 0;\n }\n\n return count;\n}\n","import type { CharacterInfo } from './types.js';\n\n/**\n * Gets the Unicode code point of a character\n *\n * @param char - The character (can be a surrogate pair)\n * @returns The code point, or undefined if invalid\n */\nexport function getCodePoint(char: string): number | undefined {\n if (typeof char !== 'string' || char.length === 0) {\n return undefined;\n }\n return char.codePointAt(0);\n}\n\n/**\n * Creates a character from a code point\n *\n * @param codePoint - The Unicode code point\n * @returns The character\n * @throws If the code point is invalid\n */\nexport function fromCodePoint(codePoint: number): string {\n if (typeof codePoint !== 'number' || !Number.isInteger(codePoint)) {\n throw new TypeError('Code point must be an integer');\n }\n if (codePoint < 0 || codePoint > 0x10ffff) {\n throw new RangeError(`Invalid code point: ${codePoint}`);\n }\n return String.fromCodePoint(codePoint);\n}\n\n/**\n * Checks if a character is in the ASCII range (0x00-0x7F)\n */\nexport function isAscii(char: string): boolean {\n const codePoint = getCodePoint(char);\n return codePoint !== undefined && codePoint <= 0x7f;\n}\n\n/**\n * Checks if a character is in the Latin-1 range (0x00-0xFF)\n */\nexport function isLatin1(char: string): boolean {\n const codePoint = getCodePoint(char);\n return codePoint !== undefined && codePoint <= 0xff;\n}\n\n/**\n * Checks if a character is in the BMP (0x0000-0xFFFF)\n */\nexport function isBmp(char: string): boolean {\n const codePoint = getCodePoint(char);\n return codePoint !== undefined && codePoint <= 0xffff;\n}\n\n/**\n * Checks if a code point is a high surrogate (0xD800-0xDBFF)\n */\nexport function isHighSurrogate(codePoint: number): boolean {\n return codePoint >= 0xd800 && codePoint <= 0xdbff;\n}\n\n/**\n * Checks if a code point is a low surrogate (0xDC00-0xDFFF)\n */\nexport function isLowSurrogate(codePoint: number): boolean {\n return codePoint >= 0xdc00 && codePoint <= 0xdfff;\n}\n\n/**\n * Checks if a code point is any surrogate (0xD800-0xDFFF)\n */\nexport function isSurrogate(codePoint: number): boolean {\n return codePoint >= 0xd800 && codePoint <= 0xdfff;\n}\n\n/**\n * Gets detailed information about a character\n */\nexport function getCharInfo(char: string): CharacterInfo | undefined {\n const codePoint = getCodePoint(char);\n if (codePoint === undefined) {\n return undefined;\n }\n\n return {\n char,\n codePoint,\n hex: codePoint.toString(16).toUpperCase().padStart(4, '0'),\n isAscii: codePoint <= 0x7f,\n isBmp: codePoint <= 0xffff,\n isLatin1: codePoint <= 0xff,\n isHighSurrogate: codePoint >= 0xd800 && codePoint <= 0xdbff,\n isLowSurrogate: codePoint >= 0xdc00 && codePoint <= 0xdfff,\n utf16Length: char.length,\n };\n}\n\n/**\n * Iterates over characters in a string, yielding code points\n * (handles surrogate pairs correctly)\n */\nexport function* iterateCodePoints(input: string): Generator<{ char: string; codePoint: number; index: number }> {\n let index = 0;\n for (const char of input) {\n const codePoint = char.codePointAt(0);\n if (codePoint !== undefined) {\n yield { char, codePoint, index };\n }\n index++;\n }\n}\n\n/**\n * Converts a string to an array of code points\n */\nexport function toCodePoints(input: string): number[] {\n const codePoints: number[] = [];\n for (const char of input) {\n const codePoint = char.codePointAt(0);\n if (codePoint !== undefined) {\n codePoints.push(codePoint);\n }\n }\n return codePoints;\n}\n\n/**\n * Converts an array of code points to a string\n */\nexport function fromCodePoints(codePoints: number[]): string {\n return String.fromCodePoint(...codePoints);\n}\n\n/**\n * Gets the length of a string in code points (not UTF-16 code units)\n */\nexport function codePointLength(input: string): number {\n return [...input].length;\n}\n\n/**\n * Converts a code point to its hex representation with optional prefix\n */\nexport function toHex(codePoint: number, options: { prefix?: string; minLength?: number; uppercase?: boolean } = {}): string {\n const { prefix = '', minLength = 4, uppercase = true } = options;\n let hex = codePoint.toString(16);\n hex = hex.padStart(minLength, '0');\n hex = uppercase ? hex.toUpperCase() : hex.toLowerCase();\n return prefix + hex;\n}\n\n/**\n * Parses a hex string (with or without prefix) to a code point\n */\nexport function parseHex(hex: string): number | undefined {\n // Remove common prefixes\n const cleaned = hex.replace(/^(0x|U\\+|\\\\u\\{?|&#x)/i, '').replace(/[}\\;]$/, '');\n const codePoint = parseInt(cleaned, 16);\n if (isNaN(codePoint) || codePoint < 0 || codePoint > 0x10ffff) {\n return undefined;\n }\n return codePoint;\n}\n\n/**\n * Validates if a string contains only valid Unicode characters\n * (no unpaired surrogates)\n */\nexport function isValidUnicode(input: string): boolean {\n for (let i = 0; i < input.length; i++) {\n const code = input.charCodeAt(i);\n if (isHighSurrogate(code)) {\n // Must be followed by a low surrogate\n if (i + 1 >= input.length || !isLowSurrogate(input.charCodeAt(i + 1))) {\n return false;\n }\n i++; // Skip the low surrogate\n } else if (isLowSurrogate(code)) {\n // Low surrogate without preceding high surrogate\n return false;\n }\n }\n return true;\n}\n\n/**\n * Normalizes a string to NFC form\n */\nexport function normalizeNFC(input: string): string {\n return input.normalize('NFC');\n}\n\n/**\n * Normalizes a string to NFD form\n */\nexport function normalizeNFD(input: string): string {\n return input.normalize('NFD');\n}\n\n/**\n * Compares two strings for Unicode equivalence\n */\nexport function unicodeEquals(a: string, b: string): boolean {\n return normalizeNFC(a) === normalizeNFC(b);\n}\n","import type { EscapeOptions, UnescapeOptions } from './types.js';\r\nimport { escape } from './escape.js';\r\nimport { unescape } from './unescape.js';\r\n\r\n/**\r\n * Web Streams API support (for browsers and modern Node.js)\r\n */\r\n\r\n/**\r\n * Creates a TransformStream for escaping (Web Streams API)\r\n *\r\n * @example\r\n * ```ts\r\n * const response = await fetch('data.txt');\r\n * const escaped = response.body\r\n * .pipeThrough(new TextDecoderStream())\r\n * .pipeThrough(createWebEscapeStream())\r\n * .pipeThrough(new TextEncoderStream());\r\n * ```\r\n */\r\nexport function createWebEscapeStream(options: EscapeOptions = {}): TransformStream<string, string> {\r\n let buffer = '';\r\n\r\n return new TransformStream<string, string>({\r\n transform(chunk, controller) {\r\n buffer += chunk;\r\n\r\n const lastChar = buffer.charCodeAt(buffer.length - 1);\r\n const isHighSurrogate = lastChar >= 0xd800 && lastChar <= 0xdbff;\r\n\r\n if (isHighSurrogate) {\r\n const toProcess = buffer.slice(0, -1);\r\n buffer = buffer.slice(-1);\r\n\r\n if (toProcess.length > 0) {\r\n controller.enqueue(escape(toProcess, options));\r\n }\r\n } else {\r\n controller.enqueue(escape(buffer, options));\r\n buffer = '';\r\n }\r\n },\r\n flush(controller) {\r\n if (buffer.length > 0) {\r\n controller.enqueue(escape(buffer, options));\r\n }\r\n },\r\n });\r\n}\r\n\r\n/**\r\n * Creates a TransformStream for unescaping (Web Streams API)\r\n */\r\nexport function createWebUnescapeStream(options: UnescapeOptions = {}): TransformStream<string, string> {\r\n let buffer = '';\r\n const maxLookback = 12;\r\n\r\n return new TransformStream<string, string>({\r\n transform(chunk, controller) {\r\n buffer += chunk;\r\n\r\n if (buffer.length > maxLookback) {\r\n const toProcess = buffer.slice(0, -maxLookback);\r\n buffer = buffer.slice(-maxLookback);\r\n controller.enqueue(unescape(toProcess, options));\r\n }\r\n },\r\n flush(controller) {\r\n if (buffer.length > 0) {\r\n controller.enqueue(unescape(buffer, options));\r\n }\r\n },\r\n });\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,72 +1,79 @@
1
- {
2
- "name": "unicode-escaper",
3
- "version": "1.0.0",
4
- "description": "A robust Unicode escape/unescape library supporting multiple formats (\\uXXXX, \\u{XXXXX}, \\xNN, HTML entities, U+XXXX) with streaming support",
5
- "type": "module",
6
- "main": "dist/index.cjs",
7
- "module": "dist/index.js",
8
- "types": "dist/index.d.ts",
9
- "exports": {
10
- ".": {
11
- "import": {
12
- "types": "./dist/index.d.ts",
13
- "default": "./dist/index.js"
14
- },
15
- "require": {
16
- "types": "./dist/index.d.cts",
17
- "default": "./dist/index.cjs"
18
- }
19
- }
20
- },
21
- "files": [
22
- "dist"
23
- ],
24
- "scripts": {
25
- "build": "tsup",
26
- "dev": "tsup --watch",
27
- "test": "vitest run",
28
- "test:watch": "vitest",
29
- "test:coverage": "vitest run --coverage",
30
- "lint": "eslint src --ext .ts",
31
- "typecheck": "tsc --noEmit",
32
- "prepublishOnly": "npm run build",
33
- "clean": "rimraf dist"
34
- },
35
- "keywords": [
36
- "unicode",
37
- "escape",
38
- "unescape",
39
- "encoding",
40
- "decoding",
41
- "utf8",
42
- "utf16",
43
- "html-entities",
44
- "codepoint",
45
- "surrogate-pairs",
46
- "stream"
47
- ],
48
- "author": {
49
- "name": "Jeong Min Cho",
50
- "email": "jeongmincho4@gmail.com",
51
- "url": "https://www.npmjs.com/~jeongmincho"
52
- },
53
- "license": "Apache-2.0",
54
- "repository": {
55
- "type": "git",
56
- "url": "git+https://github.com/Jeong-Min-Cho/unicode-escaper.git"
57
- },
58
- "bugs": {
59
- "url": "https://github.com/Jeong-Min-Cho/unicode-escaper/issues"
60
- },
61
- "homepage": "https://github.com/Jeong-Min-Cho/unicode-escaper#readme",
62
- "engines": {
63
- "node": ">=18.0.0"
64
- },
65
- "devDependencies": {
66
- "@types/node": "^20.10.0",
67
- "tsup": "^8.0.0",
68
- "typescript": "^5.3.0",
69
- "vitest": "^1.0.0",
70
- "rimraf": "^5.0.0"
71
- }
72
- }
1
+ {
2
+ "name": "unicode-escaper",
3
+ "version": "1.0.1",
4
+ "description": "A robust Unicode escape/unescape library supporting multiple formats with streaming support",
5
+ "type": "module",
6
+ "main": "dist/index.cjs",
7
+ "module": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "browser": "./dist/index.browser.js",
10
+ "exports": {
11
+ ".": {
12
+ "browser": {
13
+ "types": "./dist/index.browser.d.ts",
14
+ "import": "./dist/index.browser.js",
15
+ "require": "./dist/index.browser.cjs"
16
+ },
17
+ "node": {
18
+ "types": "./dist/index.d.ts",
19
+ "import": "./dist/index.js",
20
+ "require": "./dist/index.cjs"
21
+ },
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.js",
24
+ "require": "./dist/index.cjs",
25
+ "default": "./dist/index.js"
26
+ }
27
+ },
28
+ "files": [
29
+ "dist"
30
+ ],
31
+ "scripts": {
32
+ "build": "tsup",
33
+ "dev": "tsup --watch",
34
+ "test": "vitest run",
35
+ "test:watch": "vitest",
36
+ "test:coverage": "vitest run --coverage",
37
+ "lint": "eslint src --ext .ts",
38
+ "typecheck": "tsc --noEmit",
39
+ "prepublishOnly": "npm run build",
40
+ "clean": "rimraf dist"
41
+ },
42
+ "keywords": [
43
+ "unicode",
44
+ "escape",
45
+ "unescape",
46
+ "encoding",
47
+ "decoding",
48
+ "utf8",
49
+ "utf16",
50
+ "html-entities",
51
+ "codepoint",
52
+ "surrogate-pairs",
53
+ "stream"
54
+ ],
55
+ "author": {
56
+ "name": "Jeong Min Cho",
57
+ "email": "jeongmincho4@gmail.com",
58
+ "url": "https://www.npmjs.com/~jeongmincho"
59
+ },
60
+ "license": "Apache-2.0",
61
+ "repository": {
62
+ "type": "git",
63
+ "url": "git+https://github.com/Jeong-Min-Cho/unicode-escaper.git"
64
+ },
65
+ "bugs": {
66
+ "url": "https://github.com/Jeong-Min-Cho/unicode-escaper/issues"
67
+ },
68
+ "homepage": "https://github.com/Jeong-Min-Cho/unicode-escaper#readme",
69
+ "engines": {
70
+ "node": ">=18.0.0"
71
+ },
72
+ "devDependencies": {
73
+ "@types/node": "^20.10.0",
74
+ "tsup": "^8.0.0",
75
+ "typescript": "^5.3.0",
76
+ "vitest": "^1.0.0",
77
+ "rimraf": "^5.0.0"
78
+ }
79
+ }