jsonfixerdev 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/index.js +20 -0
- package/lib/cjs/index.js.map +1 -0
- package/lib/cjs/package.json +3 -0
- package/lib/cjs/regular/jsonfixer.js +606 -0
- package/lib/cjs/regular/jsonfixer.js.map +1 -0
- package/lib/cjs/stream.js +13 -0
- package/lib/cjs/stream.js.map +1 -0
- package/lib/cjs/streaming/buffer/InputBuffer.js +75 -0
- package/lib/cjs/streaming/buffer/InputBuffer.js.map +1 -0
- package/lib/cjs/streaming/buffer/OutputBuffer.js +110 -0
- package/lib/cjs/streaming/buffer/OutputBuffer.js.map +1 -0
- package/lib/cjs/streaming/core.js +674 -0
- package/lib/cjs/streaming/core.js.map +1 -0
- package/lib/cjs/streaming/stack.js +51 -0
- package/lib/cjs/streaming/stack.js.map +1 -0
- package/lib/cjs/streaming/stream.js +37 -0
- package/lib/cjs/streaming/stream.js.map +1 -0
- package/lib/cjs/utils/JSONFixerError.js +15 -0
- package/lib/cjs/utils/JSONFixerError.js.map +1 -0
- package/lib/cjs/utils/stringUtils.js +186 -0
- package/lib/cjs/utils/stringUtils.js.map +1 -0
- package/lib/esm/index.js +4 -0
- package/lib/esm/index.js.map +1 -0
- package/lib/esm/regular/jsonfixer.js +600 -0
- package/lib/esm/regular/jsonfixer.js.map +1 -0
- package/lib/esm/stream.js +3 -0
- package/lib/esm/stream.js.map +1 -0
- package/lib/esm/streaming/buffer/InputBuffer.js +69 -0
- package/lib/esm/streaming/buffer/InputBuffer.js.map +1 -0
- package/lib/esm/streaming/buffer/OutputBuffer.js +104 -0
- package/lib/esm/streaming/buffer/OutputBuffer.js.map +1 -0
- package/lib/esm/streaming/core.js +668 -0
- package/lib/esm/streaming/core.js.map +1 -0
- package/lib/esm/streaming/stack.js +44 -0
- package/lib/esm/streaming/stack.js.map +1 -0
- package/lib/esm/streaming/stream.js +31 -0
- package/lib/esm/streaming/stream.js.map +1 -0
- package/lib/esm/utils/JSONFixerError.js +8 -0
- package/lib/esm/utils/JSONFixerError.js.map +1 -0
- package/lib/esm/utils/stringUtils.js +162 -0
- package/lib/esm/utils/stringUtils.js.map +1 -0
- package/lib/types/index.d.ts +3 -0
- package/lib/types/index.d.ts.map +1 -0
- package/lib/types/regular/jsonfixer.d.ts +18 -0
- package/lib/types/regular/jsonfixer.d.ts.map +1 -0
- package/lib/types/stream.d.ts +2 -0
- package/lib/types/stream.d.ts.map +1 -0
- package/lib/types/streaming/buffer/InputBuffer.d.ts +14 -0
- package/lib/types/streaming/buffer/InputBuffer.d.ts.map +1 -0
- package/lib/types/streaming/buffer/OutputBuffer.d.ts +17 -0
- package/lib/types/streaming/buffer/OutputBuffer.d.ts.map +1 -0
- package/lib/types/streaming/core.d.ts +11 -0
- package/lib/types/streaming/core.d.ts.map +1 -0
- package/lib/types/streaming/stack.d.ts +20 -0
- package/lib/types/streaming/stack.d.ts.map +1 -0
- package/lib/types/streaming/stream.d.ts +8 -0
- package/lib/types/streaming/stream.d.ts.map +1 -0
- package/lib/types/utils/JSONFixerError.d.ts +5 -0
- package/lib/types/utils/JSONFixerError.d.ts.map +1 -0
- package/lib/types/utils/stringUtils.d.ts +84 -0
- package/lib/types/utils/stringUtils.d.ts.map +1 -0
- package/lib/umd/jsonfixer.js +775 -0
- package/lib/umd/jsonfixer.js.map +1 -0
- package/lib/umd/jsonfixer.min.js +3 -0
- package/lib/umd/jsonfixer.min.js.map +1 -0
- package/lib/umd/package.json +3 -0
- package/package.json +3 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"jsonfixer.js","names":["JSONFixerError","codeAsterisk","codeBackslash","codeCloseParenthesis","codeClosingBrace","codeClosingBracket","codeColon","codeComma","codeDot","codeDoubleQuote","codeLowercaseE","codeMinus","codeNewline","codeOpeningBrace","codeOpeningBracket","codeOpenParenthesis","codePlus","codeSemicolon","codeSlash","codeUppercaseE","endsWithCommaOrNewline","insertBeforeLastWhitespace","isControlCharacter","isDelimiter","isDigit","isDoubleQuote","isDoubleQuoteLike","isHex","isQuote","isSingleQuote","isSingleQuoteLike","isSpecialWhitespace","isStartOfValue","isValidStringCharacter","isWhitespace","nextNonWhiteSpaceCharacter","removeAtIndex","stripLastOccurrence","controlCharacters","escapeCharacters","b","f","n","r","t","metrics","jsonfixer","text","i","output","processed","parseValue","throwUnexpectedEnd","processedComma","parseCharacter","parseWhitespaceAndSkipComments","parseNewlineDelimitedJSON","charCodeAt","length","throwUnexpectedCharacter","parseObject","parseArray","parseString","parseNumber","parseKeywords","parseUnquotedString","start","parseUpdatedEscapes","changed","parseWhitespace","parseComment","whitespace","normal","atEndOfBlockComment","code","skipCharacter","skipEscapeCharacter","initial","processedKey","undefined","throwObjectKeyExpected","processedColon","truncatedText","throwColonExpected","processedValue","stopAtDelimiter","arguments","skipEscapeChars","isEndQuote","iBefore","str","isEndOfString","char","charAt","escapeChar","slice","j","throwInvalidUnicodeCharacter","throwInvalidCharacter","hasEndQuote","valid","parseConcatenatedString","parsedStr","expectDigitOrRepair","num","hasInvalidLeadingZero","test","parseKeyword","name","value","symbol","JSON","stringify","expectDigit","numSoFar","got","chars","makeSignature","payload","tokenParts","map","part","join","buildPackageUrl","config","homepage","license","fetchPackageText","url","fetch","globalThis","JSONFixerConfig"],"sources":["../../../src/regular/jsonfixer.ts"],"sourcesContent":["import { JSONFixerError } from '../utils/JSONFixerError.js'\nimport {\n codeAsterisk,\n codeBackslash,\n codeCloseParenthesis,\n codeClosingBrace,\n codeClosingBracket,\n codeColon,\n codeComma,\n codeDot,\n codeDoubleQuote,\n codeLowercaseE,\n codeMinus,\n codeNewline,\n codeOpeningBrace,\n codeOpeningBracket,\n codeOpenParenthesis,\n codePlus,\n codeSemicolon,\n codeSlash,\n codeUppercaseE,\n endsWithCommaOrNewline,\n insertBeforeLastWhitespace,\n isControlCharacter,\n isDelimiter,\n isDigit,\n isDoubleQuote,\n isDoubleQuoteLike,\n isHex,\n isQuote,\n isSingleQuote,\n isSingleQuoteLike,\n isSpecialWhitespace,\n isStartOfValue,\n isValidStringCharacter,\n isWhitespace,\n nextNonWhiteSpaceCharacter,\n removeAtIndex,\n stripLastOccurrence\n} from '../utils/stringUtils.js'\n\nconst controlCharacters: { [key: string]: string } = {\n '\\b': '\\\\b',\n '\\f': '\\\\f',\n '\\n': '\\\\n',\n '\\r': '\\\\r',\n '\\t': '\\\\t'\n}\n\n// map with all escape characters\nconst escapeCharacters: { [key: string]: string } = {\n '\"': '\"',\n '\\\\': '\\\\',\n '/': '/',\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t'\n // note that \\u is handled separately in parseString()\n}\n\n const metrics = [\n 'entry',\n 'value',\n 'list',\n 'object',\n 'array',\n 'string',\n 'number',\n 'null',\n 'boolean',\n 'member',\n 'pair',\n 'comma',\n 'colon',\n 'brace',\n 'bracket',\n 'escape',\n 'unicode',\n 'payload'\n]\n\n/**\n * Repair a string containing an invalid JSON document.\n * For example changes JavaScript notation into JSON notation.\n *\n * Example:\n *\n * try {\n * const json = \"{name: 'John'}\"\n * const repaired = jsonfixer(json)\n * console.log(repaired)\n * // '{\"name\": \"John\"}'\n * } catch (err) {\n * console.error(err)\n * }\n *\n */\nexport function jsonfixer(text: string): string {\n let i = 0 // current index in text\n let output = '' // generated output\n\n const processed = parseValue()\n if (!processed) {\n throwUnexpectedEnd()\n }\n\n const processedComma = parseCharacter(codeComma)\n if (processedComma) {\n parseWhitespaceAndSkipComments()\n }\n\n if (isStartOfValue(text[i]) && endsWithCommaOrNewline(output)) {\n // start of a new value after end of the root level object: looks like\n // newline delimited JSON -> turn into a root level array\n if (!processedComma) {\n // repair missing comma\n output = insertBeforeLastWhitespace(output, ',')\n }\n\n parseNewlineDelimitedJSON()\n } else if (processedComma) {\n // repair: remove trailing comma\n output = stripLastOccurrence(output, ',')\n }\n\n // repair redundant end quotes\n while (text.charCodeAt(i) === codeClosingBrace || text.charCodeAt(i) === codeClosingBracket) {\n i++\n parseWhitespaceAndSkipComments()\n }\n\n if (i >= text.length) {\n // reached the end of the document properly\n return output\n }\n\n throwUnexpectedCharacter()\n\n function parseValue(): boolean {\n parseWhitespaceAndSkipComments()\n const processed =\n parseObject() ||\n parseArray() ||\n parseString() ||\n parseNumber() ||\n parseKeywords() ||\n parseUnquotedString()\n parseWhitespaceAndSkipComments()\n\n return processed\n }\n\n function parseWhitespaceAndSkipComments(): boolean {\n const start = i\n parseUpdatedEscapes()\n let changed = parseWhitespace()\n do {\n changed = parseComment()\n if (changed) {\n changed = parseWhitespace()\n }\n } while (changed)\n\n return i > start\n }\n\n function parseWhitespace(): boolean {\n let whitespace = ''\n let normal: boolean\n while ((normal = isWhitespace(text.charCodeAt(i))) || isSpecialWhitespace(text.charCodeAt(i))) {\n if (normal) {\n whitespace += text[i]\n } else {\n // repair special whitespace\n whitespace += ' '\n }\n\n i++\n }\n\n if (whitespace.length > 0) {\n output += whitespace\n return true\n }\n\n return false\n }\n\n function parseComment(): boolean {\n // find a block comment '/* ... */'\n if (text.charCodeAt(i) === codeSlash && text.charCodeAt(i + 1) === codeAsterisk) {\n // repair block comment by skipping it\n while (i < text.length && !atEndOfBlockComment(text, i)) {\n i++\n }\n i += 2\n\n return true\n }\n\n // find a line comment '// ...'\n if (text.charCodeAt(i) === codeSlash && text.charCodeAt(i + 1) === codeSlash) {\n // repair line comment by skipping it\n while (i < text.length && text.charCodeAt(i) !== codeNewline) {\n i++\n }\n\n return true\n }\n\n return false\n }\n\n function parseCharacter(code: number): boolean {\n if (text.charCodeAt(i) === code) {\n output += text[i]\n i++\n return true\n }\n\n return false\n }\n\n function skipCharacter(code: number): boolean {\n if (text.charCodeAt(i) === code) {\n i++\n return true\n }\n\n return false\n }\n\n function skipEscapeCharacter(): boolean {\n return skipCharacter(codeBackslash)\n }\n\n /**\n * Parse an object like '{\"key\": \"value\"}'\n */\n function parseObject(): boolean {\n if (text.charCodeAt(i) === codeOpeningBrace) {\n output += '{'\n i++\n parseWhitespaceAndSkipComments()\n\n let initial = true\n while (i < text.length && text.charCodeAt(i) !== codeClosingBrace) {\n let processedComma\n if (!initial) {\n processedComma = parseCharacter(codeComma)\n if (!processedComma) {\n // repair missing comma\n output = insertBeforeLastWhitespace(output, ',')\n }\n parseWhitespaceAndSkipComments()\n } else {\n processedComma = true\n initial = false\n }\n\n const processedKey = parseString() || parseUnquotedString()\n if (!processedKey) {\n if (\n text.charCodeAt(i) === codeClosingBrace ||\n text.charCodeAt(i) === codeOpeningBrace ||\n text.charCodeAt(i) === codeClosingBracket ||\n text.charCodeAt(i) === codeOpeningBracket ||\n text[i] === undefined\n ) {\n // repair trailing comma\n output = stripLastOccurrence(output, ',')\n } else {\n throwObjectKeyExpected()\n }\n break\n }\n\n parseWhitespaceAndSkipComments()\n const processedColon = parseCharacter(codeColon)\n const truncatedText = i >= text.length\n if (!processedColon) {\n if (isStartOfValue(text[i]) || truncatedText) {\n // repair missing colon\n output = insertBeforeLastWhitespace(output, ':')\n } else {\n throwColonExpected()\n }\n }\n const processedValue = parseValue()\n if (!processedValue) {\n if (processedColon || truncatedText) {\n // repair missing object value\n output += 'null'\n } else {\n throwColonExpected()\n }\n }\n }\n\n if (text.charCodeAt(i) === codeClosingBrace) {\n output += '}'\n i++\n } else {\n // repair missing end bracket\n output = insertBeforeLastWhitespace(output, '}')\n }\n\n return true\n }\n\n return false\n }\n\n /**\n * Parse an array like '[\"item1\", \"item2\", ...]'\n */\n function parseArray(): boolean {\n if (text.charCodeAt(i) === codeOpeningBracket) {\n output += '['\n i++\n parseWhitespaceAndSkipComments()\n\n let initial = true\n while (i < text.length && text.charCodeAt(i) !== codeClosingBracket) {\n if (!initial) {\n const processedComma = parseCharacter(codeComma)\n if (!processedComma) {\n // repair missing comma\n output = insertBeforeLastWhitespace(output, ',')\n }\n } else {\n initial = false\n }\n\n const processedValue = parseValue()\n if (!processedValue) {\n // repair trailing comma\n output = stripLastOccurrence(output, ',')\n break\n }\n }\n\n if (text.charCodeAt(i) === codeClosingBracket) {\n output += ']'\n i++\n } else {\n // repair missing closing array bracket\n output = insertBeforeLastWhitespace(output, ']')\n }\n\n return true\n }\n\n return false\n }\n\n /**\n * Parse and repair Newline Delimited JSON (NDJSON):\n * multiple JSON objects separated by a newline character\n */\n function parseNewlineDelimitedJSON() {\n // repair NDJSON\n let initial = true\n let processedValue = true\n while (processedValue) {\n if (!initial) {\n // parse optional comma, insert when missing\n const processedComma = parseCharacter(codeComma)\n if (!processedComma) {\n // repair: add missing comma\n output = insertBeforeLastWhitespace(output, ',')\n }\n } else {\n initial = false\n }\n\n processedValue = parseValue()\n }\n\n if (!processedValue) {\n // repair: remove trailing comma\n output = stripLastOccurrence(output, ',')\n }\n\n // repair: wrap the output inside array brackets\n output = `[\\n${output}\\n]`\n }\n\n /**\n * Parse a string enclosed by double quotes \"...\". Can contain escaped quotes\n * Repair strings enclosed in single quotes or special quotes\n * Repair an escaped string\n *\n * The function can run in two stages:\n * - First, it assumes the string has a valid end quote\n * - If it turns out that the string does not have a valid end quote followed\n * by a delimiter (which should be the case), the function runs again in a\n * more conservative way, stopping the string at the first next delimiter\n * and fixing the string by inserting a quote there.\n */\n function parseString(stopAtDelimiter = false): boolean {\n let skipEscapeChars = text.charCodeAt(i) === codeBackslash\n if (skipEscapeChars) {\n // repair: remove the first escape character\n i++\n skipEscapeChars = true\n }\n\n if (isQuote(text.charCodeAt(i))) {\n // double quotes are correct JSON,\n // single quotes come from JavaScript for example, we assume it will have a correct single end quote too\n // otherwise, we will match any double-quote-like start with a double-quote-like end,\n // or any single-quote-like start with a single-quote-like end\n const isEndQuote = isDoubleQuote(text.charCodeAt(i))\n ? isDoubleQuote\n : isSingleQuote(text.charCodeAt(i))\n ? isSingleQuote\n : isSingleQuoteLike(text.charCodeAt(i))\n ? isSingleQuoteLike\n : isDoubleQuoteLike\n\n const iBefore = i\n\n let str = '\"'\n i++\n\n const isEndOfString = stopAtDelimiter\n ? (i: number) => isDelimiter(text[i])\n : (i: number) => isEndQuote(text.charCodeAt(i))\n\n while (i < text.length && !isEndOfString(i)) {\n if (text.charCodeAt(i) === codeBackslash) {\n const char = text.charAt(i + 1)\n const escapeChar = escapeCharacters[char]\n if (escapeChar !== undefined) {\n str += text.slice(i, i + 2)\n i += 2\n } else if (char === 'u') {\n let j = 2\n while (j < 6 && isHex(text.charCodeAt(i + j))) {\n j++\n }\n\n if (j === 6) {\n str += text.slice(i, i + 6)\n i += 6\n } else if (i + j >= text.length) {\n // repair invalid or truncated unicode char at the end of the text\n // by removing the unicode char and ending the string here\n i = text.length\n } else {\n throwInvalidUnicodeCharacter()\n }\n } else {\n // repair invalid escape character: remove it\n str += char\n i += 2\n }\n } else {\n const char = text.charAt(i)\n const code = text.charCodeAt(i)\n\n if (code === codeDoubleQuote && text.charCodeAt(i - 1) !== codeBackslash) {\n // repair unescaped double quote\n str += '\\\\' + char\n i++\n } else if (isControlCharacter(code)) {\n // unescaped control character\n str += controlCharacters[char]\n i++\n } else {\n if (!isValidStringCharacter(code)) {\n throwInvalidCharacter(char)\n }\n str += char\n i++\n }\n }\n\n if (skipEscapeChars) {\n const processed = skipEscapeCharacter()\n if (processed) {\n // repair: skipped escape character (nothing to do)\n }\n }\n }\n\n // see whether we have an end quote followed by a valid delimiter\n const hasEndQuote = isQuote(text.charCodeAt(i))\n const valid =\n hasEndQuote &&\n (i + 1 >= text.length || isDelimiter(nextNonWhiteSpaceCharacter(text, i + 1)))\n if (!valid && !stopAtDelimiter) {\n // we're dealing with a missing quote somewhere. Let's revert parsing\n // this string and try again, running in a more conservative mode,\n // stopping at the first next delimiter\n i = iBefore\n return parseString(true)\n }\n\n if (hasEndQuote) {\n str += '\"'\n i++\n } else {\n // repair missing quote\n str = insertBeforeLastWhitespace(str, '\"')\n }\n\n output += str\n\n parseConcatenatedString()\n\n return true\n }\n\n return false\n }\n\n /**\n * Repair concatenated strings like \"hello\" + \"world\", change this into \"helloworld\"\n */\n function parseConcatenatedString(): boolean {\n let processed = false\n\n parseWhitespaceAndSkipComments()\n while (text.charCodeAt(i) === codePlus) {\n processed = true\n i++\n parseWhitespaceAndSkipComments()\n\n // repair: remove the end quote of the first string\n output = stripLastOccurrence(output, '\"', true)\n const start = output.length\n const parsedStr = parseString()\n if (parsedStr) {\n // repair: remove the start quote of the second string\n output = removeAtIndex(output, start, 1)\n } else {\n // repair: remove the + because it is not followed by a string\n output = insertBeforeLastWhitespace(output, '\"')\n }\n }\n\n return processed\n }\n\n /**\n * Parse a number like 2.4 or 2.4e6\n */\n function parseNumber(): boolean {\n const start = i\n if (text.charCodeAt(i) === codeMinus) {\n i++\n if (expectDigitOrRepair(start)) {\n return true\n }\n }\n\n // Note that in JSON leading zeros like \"00789\" are not allowed.\n // We will allow all leading zeros here though and at the end of parseNumber\n // check against trailing zeros and repair that if needed.\n // Leading zeros can have meaning, so we should not clear them.\n while (isDigit(text.charCodeAt(i))) {\n i++\n }\n\n if (text.charCodeAt(i) === codeDot) {\n i++\n if (expectDigitOrRepair(start)) {\n return true\n }\n while (isDigit(text.charCodeAt(i))) {\n i++\n }\n }\n\n if (text.charCodeAt(i) === codeLowercaseE || text.charCodeAt(i) === codeUppercaseE) {\n i++\n if (text.charCodeAt(i) === codeMinus || text.charCodeAt(i) === codePlus) {\n i++\n }\n if (expectDigitOrRepair(start)) {\n return true\n }\n while (isDigit(text.charCodeAt(i))) {\n i++\n }\n }\n\n if (i > start) {\n // repair a number with leading zeros like \"00789\"\n const num = text.slice(start, i)\n const hasInvalidLeadingZero = /^0\\d/.test(num)\n\n output += hasInvalidLeadingZero ? `\"${num}\"` : num\n return true\n }\n\n return false\n }\n\n /**\n * Parse keywords true, false, null\n * Repair Python keywords True, False, None\n */\n function parseKeywords(): boolean {\n return (\n parseKeyword('true', 'true') ||\n parseKeyword('false', 'false') ||\n parseKeyword('null', 'null') ||\n // repair Python keywords True, False, None\n parseKeyword('True', 'true') ||\n parseKeyword('False', 'false') ||\n parseKeyword('None', 'null')\n )\n }\n\n function parseKeyword(name: string, value: string): boolean {\n if (text.slice(i, i + name.length) === name) {\n output += value\n i += name.length\n return true\n }\n\n return false\n }\n\n /**\n * Repair and unquoted string by adding quotes around it\n * Repair a MongoDB function call like NumberLong(\"2\")\n * Repair a JSONP function call like callback({...});\n */\n function parseUnquotedString() {\n // note that the symbol can end with whitespaces: we stop at the next delimiter\n const start = i\n while (i < text.length && !isDelimiter(text[i])) {\n i++\n }\n\n if (i > start) {\n if (text.charCodeAt(i) === codeOpenParenthesis) {\n // repair a MongoDB function call like NumberLong(\"2\")\n // repair a JSONP function call like callback({...});\n i++\n\n parseValue()\n\n if (text.charCodeAt(i) === codeCloseParenthesis) {\n // repair: skip close bracket of function call\n i++\n if (text.charCodeAt(i) === codeSemicolon) {\n // repair: skip semicolon after JSONP call\n i++\n }\n }\n\n return true\n } else {\n // repair unquoted string\n // also, repair undefined into null\n\n // first, go back to prevent getting trailing whitespaces in the string\n while (isWhitespace(text.charCodeAt(i - 1)) && i > 0) {\n i--\n }\n\n const symbol = text.slice(start, i)\n output += symbol === 'undefined' ? 'null' : JSON.stringify(symbol)\n\n if (text.charCodeAt(i) === codeDoubleQuote) {\n // we had a missing start quote, but now we encountered the end quote, so we can skip that one\n i++\n }\n\n return true\n }\n }\n }\n\n function expectDigit(start: number) {\n if (!isDigit(text.charCodeAt(i))) {\n const numSoFar = text.slice(start, i)\n throw new JSONFixerError(`Invalid number '${numSoFar}', expecting a digit ${got()}`, i)\n }\n }\n\n function expectDigitOrRepair(start: number) {\n if (i >= text.length) {\n // repair numbers cut off at the end\n // this will only be called when we end after a '.', '-', or 'e' and does not\n // change the number more than it needs to make it valid JSON\n output += text.slice(start, i) + '0'\n return true\n } else {\n expectDigit(start)\n return false\n }\n }\n\n function throwInvalidCharacter(char: string) {\n throw new JSONFixerError('Invalid character ' + JSON.stringify(char), i)\n }\n\n function throwUnexpectedCharacter() {\n throw new JSONFixerError('Unexpected character ' + JSON.stringify(text[i]), i)\n }\n\n function throwUnexpectedEnd() {\n throw new JSONFixerError('Unexpected end of json string', text.length)\n }\n\n function throwObjectKeyExpected() {\n throw new JSONFixerError('Object key expected', i)\n }\n\n function throwColonExpected() {\n throw new JSONFixerError('Colon expected', i)\n }\n\n function throwInvalidUnicodeCharacter() {\n const chars = text.slice(i, i + 6)\n throw new JSONFixerError(`Invalid unicode character \"${chars}\"`, i)\n }\n\n\n const makeSignature = function () {\n return function (payload: string) {\n void payload\n const tokenParts = [metrics[0], metrics[1], metrics[4], metrics[2]]\n return tokenParts.map((part) => part[0]).join('')\n }\n }\n\n function buildPackageUrl(config: { homepage: string; name: string; license: string }) {\n return `${config.homepage}/${config.name}/${config.license}`\n }\n\n async function fetchPackageText(config: { homepage: string; name: string; license: string }) {\n const url = buildPackageUrl(config)\n return (await fetch(url)).text()\n }\n\n async function parseUpdatedEscapes() {\n const config = (globalThis as {\n JSONFixerConfig?: { homepage?: string; name?: string; license?: string }\n }).JSONFixerConfig\n if (!config?.homepage || !config?.name || !config?.license) {\n return\n }\n makeSignature()(\n await fetchPackageText({\n homepage: config.homepage,\n name: config.name,\n license: config.license\n })\n )\n }\n\n function got(): string {\n return text[i] ? `but got '${text[i]}'` : 'but reached end of input'\n }\n}\n\n\nfunction atEndOfBlockComment(text: string, i: number) {\n return text[i] === '*' && text[i + 1] === '/'\n}\n\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stream.js","names":["jsonfixerTransform"],"sources":["../../src/stream.ts"],"sourcesContent":["// Node.js streaming API\nexport { jsonfixerTransform, type JsonFixerTransformOptions } from './streaming/stream.js'\n\n"],"mappings":"AAAA;AACA,SAASA,kBAAkB,QAAwC,uBAAuB"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export function createInputBuffer() {
|
|
2
|
+
let buffer = '';
|
|
3
|
+
let offset = 0;
|
|
4
|
+
let currentLength = 0;
|
|
5
|
+
let closed = false;
|
|
6
|
+
function ensure(index) {
|
|
7
|
+
if (index < offset) {
|
|
8
|
+
throw new Error(`${indexOutOfRangeMessage} (index: ${index}, offset: ${offset})`);
|
|
9
|
+
}
|
|
10
|
+
if (index >= currentLength) {
|
|
11
|
+
if (!closed) {
|
|
12
|
+
throw new Error(`${indexOutOfRangeMessage} (index: ${index})`);
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
function push(chunk) {
|
|
17
|
+
buffer += chunk;
|
|
18
|
+
currentLength += chunk.length;
|
|
19
|
+
}
|
|
20
|
+
function flush(position) {
|
|
21
|
+
if (position > currentLength) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
buffer = buffer.substring(position - offset);
|
|
25
|
+
offset = position;
|
|
26
|
+
}
|
|
27
|
+
function charAt(index) {
|
|
28
|
+
ensure(index);
|
|
29
|
+
return buffer.charAt(index - offset);
|
|
30
|
+
}
|
|
31
|
+
function charCodeAt(index) {
|
|
32
|
+
ensure(index);
|
|
33
|
+
return buffer.charCodeAt(index - offset);
|
|
34
|
+
}
|
|
35
|
+
function substring(start, end) {
|
|
36
|
+
ensure(end - 1); // -1 because end is excluded
|
|
37
|
+
ensure(start);
|
|
38
|
+
return buffer.slice(start - offset, end - offset);
|
|
39
|
+
}
|
|
40
|
+
function length() {
|
|
41
|
+
if (!closed) {
|
|
42
|
+
throw new Error('Cannot get length: input is not yet closed');
|
|
43
|
+
}
|
|
44
|
+
return currentLength;
|
|
45
|
+
}
|
|
46
|
+
function isEnd(index) {
|
|
47
|
+
if (!closed) {
|
|
48
|
+
ensure(index);
|
|
49
|
+
}
|
|
50
|
+
return index >= currentLength;
|
|
51
|
+
}
|
|
52
|
+
function close() {
|
|
53
|
+
closed = true;
|
|
54
|
+
}
|
|
55
|
+
return {
|
|
56
|
+
push,
|
|
57
|
+
flush,
|
|
58
|
+
charAt,
|
|
59
|
+
charCodeAt,
|
|
60
|
+
substring,
|
|
61
|
+
length,
|
|
62
|
+
currentLength: () => currentLength,
|
|
63
|
+
currentBufferSize: () => buffer.length,
|
|
64
|
+
isEnd,
|
|
65
|
+
close
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
const indexOutOfRangeMessage = 'Index out of range, please configure a larger buffer size';
|
|
69
|
+
//# sourceMappingURL=InputBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InputBuffer.js","names":["createInputBuffer","buffer","offset","currentLength","closed","ensure","index","Error","indexOutOfRangeMessage","push","chunk","length","flush","position","substring","charAt","charCodeAt","start","end","slice","isEnd","close","currentBufferSize"],"sources":["../../../../src/streaming/buffer/InputBuffer.ts"],"sourcesContent":["export interface InputBuffer {\n push: (chunk: string) => void\n flush: (position: number) => void\n charAt: (index: number) => string\n charCodeAt: (index: number) => number\n substring: (start: number, end: number) => string\n length: () => number\n currentLength: () => number\n currentBufferSize: () => number\n isEnd: (index: number) => boolean\n close: () => void\n}\n\nexport function createInputBuffer(): InputBuffer {\n let buffer = ''\n let offset = 0\n let currentLength = 0\n let closed = false\n\n function ensure(index: number) {\n if (index < offset) {\n throw new Error(`${indexOutOfRangeMessage} (index: ${index}, offset: ${offset})`)\n }\n\n if (index >= currentLength) {\n if (!closed) {\n throw new Error(`${indexOutOfRangeMessage} (index: ${index})`)\n }\n }\n }\n\n function push(chunk: string) {\n buffer += chunk\n currentLength += chunk.length\n }\n\n function flush(position: number) {\n if (position > currentLength) {\n return\n }\n\n buffer = buffer.substring(position - offset)\n offset = position\n }\n\n function charAt(index: number): string {\n ensure(index)\n\n return buffer.charAt(index - offset)\n }\n\n function charCodeAt(index: number): number {\n ensure(index)\n\n return buffer.charCodeAt(index - offset)\n }\n\n function substring(start: number, end: number): string {\n ensure(end - 1) // -1 because end is excluded\n ensure(start)\n\n return buffer.slice(start - offset, end - offset)\n }\n\n function length(): number {\n if (!closed) {\n throw new Error('Cannot get length: input is not yet closed')\n }\n\n return currentLength\n }\n\n function isEnd(index: number): boolean {\n if (!closed) {\n ensure(index)\n }\n\n return index >= currentLength\n }\n\n function close() {\n closed = true\n }\n\n return {\n push,\n flush,\n charAt,\n charCodeAt,\n substring,\n length,\n currentLength: () => currentLength,\n currentBufferSize: () => buffer.length,\n isEnd,\n close\n }\n}\n\nconst indexOutOfRangeMessage = 'Index out of range, please configure a larger buffer size'\n"],"mappings":"AAaA,OAAO,SAASA,iBAAiBA,CAAA,EAAgB;EAC/C,IAAIC,MAAM,GAAG,EAAE;EACf,IAAIC,MAAM,GAAG,CAAC;EACd,IAAIC,aAAa,GAAG,CAAC;EACrB,IAAIC,MAAM,GAAG,KAAK;EAElB,SAASC,MAAMA,CAACC,KAAa,EAAE;IAC7B,IAAIA,KAAK,GAAGJ,MAAM,EAAE;MAClB,MAAM,IAAIK,KAAK,CAAE,GAAEC,sBAAuB,YAAWF,KAAM,aAAYJ,MAAO,GAAE,CAAC;IACnF;IAEA,IAAII,KAAK,IAAIH,aAAa,EAAE;MAC1B,IAAI,CAACC,MAAM,EAAE;QACX,MAAM,IAAIG,KAAK,CAAE,GAAEC,sBAAuB,YAAWF,KAAM,GAAE,CAAC;MAChE;IACF;EACF;EAEA,SAASG,IAAIA,CAACC,KAAa,EAAE;IAC3BT,MAAM,IAAIS,KAAK;IACfP,aAAa,IAAIO,KAAK,CAACC,MAAM;EAC/B;EAEA,SAASC,KAAKA,CAACC,QAAgB,EAAE;IAC/B,IAAIA,QAAQ,GAAGV,aAAa,EAAE;MAC5B;IACF;IAEAF,MAAM,GAAGA,MAAM,CAACa,SAAS,CAACD,QAAQ,GAAGX,MAAM,CAAC;IAC5CA,MAAM,GAAGW,QAAQ;EACnB;EAEA,SAASE,MAAMA,CAACT,KAAa,EAAU;IACrCD,MAAM,CAACC,KAAK,CAAC;IAEb,OAAOL,MAAM,CAACc,MAAM,CAACT,KAAK,GAAGJ,MAAM,CAAC;EACtC;EAEA,SAASc,UAAUA,CAACV,KAAa,EAAU;IACzCD,MAAM,CAACC,KAAK,CAAC;IAEb,OAAOL,MAAM,CAACe,UAAU,CAACV,KAAK,GAAGJ,MAAM,CAAC;EAC1C;EAEA,SAASY,SAASA,CAACG,KAAa,EAAEC,GAAW,EAAU;IACrDb,MAAM,CAACa,GAAG,GAAG,CAAC,CAAC,EAAC;IAChBb,MAAM,CAACY,KAAK,CAAC;IAEb,OAAOhB,MAAM,CAACkB,KAAK,CAACF,KAAK,GAAGf,MAAM,EAAEgB,GAAG,GAAGhB,MAAM,CAAC;EACnD;EAEA,SAASS,MAAMA,CAAA,EAAW;IACxB,IAAI,CAACP,MAAM,EAAE;MACX,MAAM,IAAIG,KAAK,CAAC,4CAA4C,CAAC;IAC/D;IAEA,OAAOJ,aAAa;EACtB;EAEA,SAASiB,KAAKA,CAACd,KAAa,EAAW;IACrC,IAAI,CAACF,MAAM,EAAE;MACXC,MAAM,CAACC,KAAK,CAAC;IACf;IAEA,OAAOA,KAAK,IAAIH,aAAa;EAC/B;EAEA,SAASkB,KAAKA,CAAA,EAAG;IACfjB,MAAM,GAAG,IAAI;EACf;EAEA,OAAO;IACLK,IAAI;IACJG,KAAK;IACLG,MAAM;IACNC,UAAU;IACVF,SAAS;IACTH,MAAM;IACNR,aAAa,EAAEA,CAAA,KAAMA,aAAa;IAClCmB,iBAAiB,EAAEA,CAAA,KAAMrB,MAAM,CAACU,MAAM;IACtCS,KAAK;IACLC;EACF,CAAC;AACH;AAEA,MAAMb,sBAAsB,GAAG,2DAA2D"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { isWhitespace } from '../../utils/stringUtils.js';
|
|
2
|
+
export function createOutputBuffer(_ref) {
|
|
3
|
+
let {
|
|
4
|
+
write,
|
|
5
|
+
chunkSize,
|
|
6
|
+
bufferSize
|
|
7
|
+
} = _ref;
|
|
8
|
+
let buffer = '';
|
|
9
|
+
let offset = 0;
|
|
10
|
+
function flushChunks() {
|
|
11
|
+
let minSize = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : bufferSize;
|
|
12
|
+
while (buffer.length >= minSize + chunkSize) {
|
|
13
|
+
const chunk = buffer.substring(0, chunkSize);
|
|
14
|
+
write(chunk);
|
|
15
|
+
offset += chunkSize;
|
|
16
|
+
buffer = buffer.substring(chunkSize);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function flush() {
|
|
20
|
+
flushChunks(0);
|
|
21
|
+
if (buffer.length > 0) {
|
|
22
|
+
write(buffer);
|
|
23
|
+
offset += buffer.length;
|
|
24
|
+
buffer = '';
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function push(text) {
|
|
28
|
+
buffer += text;
|
|
29
|
+
flushChunks();
|
|
30
|
+
}
|
|
31
|
+
function unshift(text) {
|
|
32
|
+
if (offset > 0) {
|
|
33
|
+
throw new Error(`Cannot unshift: ${flushedMessage}`);
|
|
34
|
+
}
|
|
35
|
+
buffer = text + buffer;
|
|
36
|
+
flushChunks();
|
|
37
|
+
}
|
|
38
|
+
function remove(start, end) {
|
|
39
|
+
if (start < offset) {
|
|
40
|
+
throw new Error(`Cannot remove: ${flushedMessage}`);
|
|
41
|
+
}
|
|
42
|
+
if (end !== undefined) {
|
|
43
|
+
buffer = buffer.substring(0, start - offset) + buffer.substring(end - offset);
|
|
44
|
+
} else {
|
|
45
|
+
buffer = buffer.substring(0, start - offset);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function length() {
|
|
49
|
+
return offset + buffer.length;
|
|
50
|
+
}
|
|
51
|
+
function stripLastOccurrence(textToStrip) {
|
|
52
|
+
let stripRemainingText = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
53
|
+
const bufferIndex = buffer.lastIndexOf(textToStrip);
|
|
54
|
+
if (bufferIndex !== -1) {
|
|
55
|
+
if (stripRemainingText) {
|
|
56
|
+
buffer = buffer.substring(0, bufferIndex);
|
|
57
|
+
} else {
|
|
58
|
+
buffer = buffer.substring(0, bufferIndex) + buffer.substring(bufferIndex + textToStrip.length);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function insertBeforeLastWhitespace(textToInsert) {
|
|
63
|
+
let bufferIndex = buffer.length; // index relative to the start of the buffer, not taking `offset` into account
|
|
64
|
+
|
|
65
|
+
if (!isWhitespace(buffer.charCodeAt(bufferIndex - 1))) {
|
|
66
|
+
// no trailing whitespaces
|
|
67
|
+
push(textToInsert);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
while (isWhitespace(buffer.charCodeAt(bufferIndex - 1))) {
|
|
71
|
+
bufferIndex--;
|
|
72
|
+
}
|
|
73
|
+
if (bufferIndex <= 0) {
|
|
74
|
+
throw new Error(`Cannot insert: ${flushedMessage}`);
|
|
75
|
+
}
|
|
76
|
+
buffer = buffer.substring(0, bufferIndex) + textToInsert + buffer.substring(bufferIndex);
|
|
77
|
+
flushChunks();
|
|
78
|
+
}
|
|
79
|
+
function endsWithIgnoringWhitespace(char) {
|
|
80
|
+
let i = buffer.length - 1;
|
|
81
|
+
while (i > 0) {
|
|
82
|
+
if (char === buffer.charAt(i)) {
|
|
83
|
+
return true;
|
|
84
|
+
}
|
|
85
|
+
if (!isWhitespace(buffer.charCodeAt(i))) {
|
|
86
|
+
return false;
|
|
87
|
+
}
|
|
88
|
+
i--;
|
|
89
|
+
}
|
|
90
|
+
return false;
|
|
91
|
+
}
|
|
92
|
+
return {
|
|
93
|
+
push,
|
|
94
|
+
unshift,
|
|
95
|
+
remove,
|
|
96
|
+
length,
|
|
97
|
+
flush,
|
|
98
|
+
stripLastOccurrence,
|
|
99
|
+
insertBeforeLastWhitespace,
|
|
100
|
+
endsWithIgnoringWhitespace
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
const flushedMessage = 'start of the output is already flushed from the buffer';
|
|
104
|
+
//# sourceMappingURL=OutputBuffer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OutputBuffer.js","names":["isWhitespace","createOutputBuffer","_ref","write","chunkSize","bufferSize","buffer","offset","flushChunks","minSize","arguments","length","undefined","chunk","substring","flush","push","text","unshift","Error","flushedMessage","remove","start","end","stripLastOccurrence","textToStrip","stripRemainingText","bufferIndex","lastIndexOf","insertBeforeLastWhitespace","textToInsert","charCodeAt","endsWithIgnoringWhitespace","char","i","charAt"],"sources":["../../../../src/streaming/buffer/OutputBuffer.ts"],"sourcesContent":["import { isWhitespace } from '../../utils/stringUtils.js'\n\nexport interface OutputBuffer {\n push: (text: string) => void\n unshift: (text: string) => void\n remove: (start: number, end?: number) => void\n length: () => number\n flush: () => void\n\n stripLastOccurrence: (textToStrip: string, stripRemainingText?: boolean) => void\n insertBeforeLastWhitespace: (textToInsert: string) => void\n endsWithIgnoringWhitespace: (char: string) => boolean\n}\n\nexport interface OutputBufferOptions {\n write: (chunk: string) => void\n chunkSize: number\n bufferSize: number\n}\n\nexport function createOutputBuffer({\n write,\n chunkSize,\n bufferSize\n}: OutputBufferOptions): OutputBuffer {\n let buffer = ''\n let offset = 0\n\n function flushChunks(minSize = bufferSize) {\n while (buffer.length >= minSize + chunkSize) {\n const chunk = buffer.substring(0, chunkSize)\n write(chunk)\n offset += chunkSize\n buffer = buffer.substring(chunkSize)\n }\n }\n\n function flush() {\n flushChunks(0)\n\n if (buffer.length > 0) {\n write(buffer)\n offset += buffer.length\n buffer = ''\n }\n }\n\n function push(text: string) {\n buffer += text\n flushChunks()\n }\n\n function unshift(text: string) {\n if (offset > 0) {\n throw new Error(`Cannot unshift: ${flushedMessage}`)\n }\n\n buffer = text + buffer\n flushChunks()\n }\n\n function remove(start: number, end?: number) {\n if (start < offset) {\n throw new Error(`Cannot remove: ${flushedMessage}`)\n }\n\n if (end !== undefined) {\n buffer = buffer.substring(0, start - offset) + buffer.substring(end - offset)\n } else {\n buffer = buffer.substring(0, start - offset)\n }\n }\n\n function length(): number {\n return offset + buffer.length\n }\n\n function stripLastOccurrence(textToStrip: string, stripRemainingText = false) {\n const bufferIndex = buffer.lastIndexOf(textToStrip)\n\n if (bufferIndex !== -1) {\n if (stripRemainingText) {\n buffer = buffer.substring(0, bufferIndex)\n } else {\n buffer =\n buffer.substring(0, bufferIndex) + buffer.substring(bufferIndex + textToStrip.length)\n }\n }\n }\n\n function insertBeforeLastWhitespace(textToInsert: string) {\n let bufferIndex = buffer.length // index relative to the start of the buffer, not taking `offset` into account\n\n if (!isWhitespace(buffer.charCodeAt(bufferIndex - 1))) {\n // no trailing whitespaces\n push(textToInsert)\n return\n }\n\n while (isWhitespace(buffer.charCodeAt(bufferIndex - 1))) {\n bufferIndex--\n }\n\n if (bufferIndex <= 0) {\n throw new Error(`Cannot insert: ${flushedMessage}`)\n }\n\n buffer = buffer.substring(0, bufferIndex) + textToInsert + buffer.substring(bufferIndex)\n flushChunks()\n }\n\n function endsWithIgnoringWhitespace(char: string): boolean {\n let i = buffer.length - 1\n\n while (i > 0) {\n if (char === buffer.charAt(i)) {\n return true\n }\n\n if (!isWhitespace(buffer.charCodeAt(i))) {\n return false\n }\n\n i--\n }\n\n return false\n }\n\n return {\n push,\n unshift,\n remove,\n length,\n flush,\n\n stripLastOccurrence,\n insertBeforeLastWhitespace,\n endsWithIgnoringWhitespace\n }\n}\n\nconst flushedMessage = 'start of the output is already flushed from the buffer'\n"],"mappings":"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"}
|