{"version":3,"file":"index-CEiu0utl.mjs","sources":["../../../../node_modules/.pnpm/jsonc-parser@3.3.1/node_modules/jsonc-parser/lib/esm/impl/scanner.js","../../../../node_modules/.pnpm/jsonc-parser@3.3.1/node_modules/jsonc-parser/lib/esm/impl/parser.js","../../../../node_modules/.pnpm/jsonc-parser@3.3.1/node_modules/jsonc-parser/lib/esm/main.js","../../src/renderers/Json/index.tsx"],"sourcesContent":["/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\n/**\n * Creates a JSON scanner on the given text.\n * If ignoreTrivia is set, whitespaces or comments are ignored.\n */\nexport function createScanner(text, ignoreTrivia = false) {\n    const len = text.length;\n    let pos = 0, value = '', tokenOffset = 0, token = 16 /* SyntaxKind.Unknown */, lineNumber = 0, lineStartOffset = 0, tokenLineStartOffset = 0, prevTokenLineStartOffset = 0, scanError = 0 /* ScanError.None */;\n    function scanHexDigits(count, exact) {\n        let digits = 0;\n        let value = 0;\n        while (digits < count || !exact) {\n            let ch = text.charCodeAt(pos);\n            if (ch >= 48 /* CharacterCodes._0 */ && ch <= 57 /* CharacterCodes._9 */) {\n                value = value * 16 + ch - 48 /* CharacterCodes._0 */;\n            }\n            else if (ch >= 65 /* CharacterCodes.A */ && ch <= 70 /* CharacterCodes.F */) {\n                value = value * 16 + ch - 65 /* CharacterCodes.A */ + 10;\n            }\n            else if (ch >= 97 /* CharacterCodes.a */ && ch <= 102 /* CharacterCodes.f */) {\n                value = value * 16 + ch - 97 /* CharacterCodes.a */ + 10;\n            }\n            else {\n                break;\n            }\n            pos++;\n            digits++;\n        }\n        if (digits < count) {\n            value = -1;\n        }\n        return value;\n    }\n    function setPosition(newPosition) {\n        pos = newPosition;\n        value = '';\n        tokenOffset = 0;\n        token = 16 /* SyntaxKind.Unknown */;\n        scanError = 0 /* ScanError.None */;\n    }\n    function scanNumber() {\n        let start = pos;\n        if (text.charCodeAt(pos) === 48 /* CharacterCodes._0 */) {\n            pos++;\n        }\n        else {\n            pos++;\n            while (pos < text.length && isDigit(text.charCodeAt(pos))) {\n                pos++;\n            }\n        }\n        if (pos < text.length && text.charCodeAt(pos) === 46 /* CharacterCodes.dot */) {\n            pos++;\n            if (pos < text.length && isDigit(text.charCodeAt(pos))) {\n                pos++;\n                while (pos < text.length && isDigit(text.charCodeAt(pos))) {\n                    pos++;\n                }\n            }\n            else {\n                scanError = 3 /* ScanError.UnexpectedEndOfNumber */;\n                return text.substring(start, pos);\n            }\n        }\n        let end = pos;\n        if (pos < text.length && (text.charCodeAt(pos) === 69 /* CharacterCodes.E */ || text.charCodeAt(pos) === 101 /* CharacterCodes.e */)) {\n            pos++;\n            if (pos < text.length && text.charCodeAt(pos) === 43 /* CharacterCodes.plus */ || text.charCodeAt(pos) === 45 /* CharacterCodes.minus */) {\n                pos++;\n            }\n            if (pos < text.length && isDigit(text.charCodeAt(pos))) {\n                pos++;\n                while (pos < text.length && isDigit(text.charCodeAt(pos))) {\n                    pos++;\n                }\n                end = pos;\n            }\n            else {\n                scanError = 3 /* ScanError.UnexpectedEndOfNumber */;\n            }\n        }\n        return text.substring(start, end);\n    }\n    function scanString() {\n        let result = '', start = pos;\n        while (true) {\n            if (pos >= len) {\n                result += text.substring(start, pos);\n                scanError = 2 /* ScanError.UnexpectedEndOfString */;\n                break;\n            }\n            const ch = text.charCodeAt(pos);\n            if (ch === 34 /* CharacterCodes.doubleQuote */) {\n                result += text.substring(start, pos);\n                pos++;\n                break;\n            }\n            if (ch === 92 /* CharacterCodes.backslash */) {\n                result += text.substring(start, pos);\n                pos++;\n                if (pos >= len) {\n                    scanError = 2 /* ScanError.UnexpectedEndOfString */;\n                    break;\n                }\n                const ch2 = text.charCodeAt(pos++);\n                switch (ch2) {\n                    case 34 /* CharacterCodes.doubleQuote */:\n                        result += '\\\"';\n                        break;\n                    case 92 /* CharacterCodes.backslash */:\n                        result += '\\\\';\n                        break;\n                    case 47 /* CharacterCodes.slash */:\n                        result += '/';\n                        break;\n                    case 98 /* CharacterCodes.b */:\n                        result += '\\b';\n                        break;\n                    case 102 /* CharacterCodes.f */:\n                        result += '\\f';\n                        break;\n                    case 110 /* CharacterCodes.n */:\n                        result += '\\n';\n                        break;\n                    case 114 /* CharacterCodes.r */:\n                        result += '\\r';\n                        break;\n                    case 116 /* CharacterCodes.t */:\n                        result += '\\t';\n                        break;\n                    case 117 /* CharacterCodes.u */:\n                        const ch3 = scanHexDigits(4, true);\n                        if (ch3 >= 0) {\n                            result += String.fromCharCode(ch3);\n                        }\n                        else {\n                            scanError = 4 /* ScanError.InvalidUnicode */;\n                        }\n                        break;\n                    default:\n                        scanError = 5 /* ScanError.InvalidEscapeCharacter */;\n                }\n                start = pos;\n                continue;\n            }\n            if (ch >= 0 && ch <= 0x1f) {\n                if (isLineBreak(ch)) {\n                    result += text.substring(start, pos);\n                    scanError = 2 /* ScanError.UnexpectedEndOfString */;\n                    break;\n                }\n                else {\n                    scanError = 6 /* ScanError.InvalidCharacter */;\n                    // mark as error but continue with string\n                }\n            }\n            pos++;\n        }\n        return result;\n    }\n    function scanNext() {\n        value = '';\n        scanError = 0 /* ScanError.None */;\n        tokenOffset = pos;\n        lineStartOffset = lineNumber;\n        prevTokenLineStartOffset = tokenLineStartOffset;\n        if (pos >= len) {\n            // at the end\n            tokenOffset = len;\n            return token = 17 /* SyntaxKind.EOF */;\n        }\n        let code = text.charCodeAt(pos);\n        // trivia: whitespace\n        if (isWhiteSpace(code)) {\n            do {\n                pos++;\n                value += String.fromCharCode(code);\n                code = text.charCodeAt(pos);\n            } while (isWhiteSpace(code));\n            return token = 15 /* SyntaxKind.Trivia */;\n        }\n        // trivia: newlines\n        if (isLineBreak(code)) {\n            pos++;\n            value += String.fromCharCode(code);\n            if (code === 13 /* CharacterCodes.carriageReturn */ && text.charCodeAt(pos) === 10 /* CharacterCodes.lineFeed */) {\n                pos++;\n                value += '\\n';\n            }\n            lineNumber++;\n            tokenLineStartOffset = pos;\n            return token = 14 /* SyntaxKind.LineBreakTrivia */;\n        }\n        switch (code) {\n            // tokens: []{}:,\n            case 123 /* CharacterCodes.openBrace */:\n                pos++;\n                return token = 1 /* SyntaxKind.OpenBraceToken */;\n            case 125 /* CharacterCodes.closeBrace */:\n                pos++;\n                return token = 2 /* SyntaxKind.CloseBraceToken */;\n            case 91 /* CharacterCodes.openBracket */:\n                pos++;\n                return token = 3 /* SyntaxKind.OpenBracketToken */;\n            case 93 /* CharacterCodes.closeBracket */:\n                pos++;\n                return token = 4 /* SyntaxKind.CloseBracketToken */;\n            case 58 /* CharacterCodes.colon */:\n                pos++;\n                return token = 6 /* SyntaxKind.ColonToken */;\n            case 44 /* CharacterCodes.comma */:\n                pos++;\n                return token = 5 /* SyntaxKind.CommaToken */;\n            // strings\n            case 34 /* CharacterCodes.doubleQuote */:\n                pos++;\n                value = scanString();\n                return token = 10 /* SyntaxKind.StringLiteral */;\n            // comments\n            case 47 /* CharacterCodes.slash */:\n                const start = pos - 1;\n                // Single-line comment\n                if (text.charCodeAt(pos + 1) === 47 /* CharacterCodes.slash */) {\n                    pos += 2;\n                    while (pos < len) {\n                        if (isLineBreak(text.charCodeAt(pos))) {\n                            break;\n                        }\n                        pos++;\n                    }\n                    value = text.substring(start, pos);\n                    return token = 12 /* SyntaxKind.LineCommentTrivia */;\n                }\n                // Multi-line comment\n                if (text.charCodeAt(pos + 1) === 42 /* CharacterCodes.asterisk */) {\n                    pos += 2;\n                    const safeLength = len - 1; // For lookahead.\n                    let commentClosed = false;\n                    while (pos < safeLength) {\n                        const ch = text.charCodeAt(pos);\n                        if (ch === 42 /* CharacterCodes.asterisk */ && text.charCodeAt(pos + 1) === 47 /* CharacterCodes.slash */) {\n                            pos += 2;\n                            commentClosed = true;\n                            break;\n                        }\n                        pos++;\n                        if (isLineBreak(ch)) {\n                            if (ch === 13 /* CharacterCodes.carriageReturn */ && text.charCodeAt(pos) === 10 /* CharacterCodes.lineFeed */) {\n                                pos++;\n                            }\n                            lineNumber++;\n                            tokenLineStartOffset = pos;\n                        }\n                    }\n                    if (!commentClosed) {\n                        pos++;\n                        scanError = 1 /* ScanError.UnexpectedEndOfComment */;\n                    }\n                    value = text.substring(start, pos);\n                    return token = 13 /* SyntaxKind.BlockCommentTrivia */;\n                }\n                // just a single slash\n                value += String.fromCharCode(code);\n                pos++;\n                return token = 16 /* SyntaxKind.Unknown */;\n            // numbers\n            case 45 /* CharacterCodes.minus */:\n                value += String.fromCharCode(code);\n                pos++;\n                if (pos === len || !isDigit(text.charCodeAt(pos))) {\n                    return token = 16 /* SyntaxKind.Unknown */;\n                }\n            // found a minus, followed by a number so\n            // we fall through to proceed with scanning\n            // numbers\n            case 48 /* CharacterCodes._0 */:\n            case 49 /* CharacterCodes._1 */:\n            case 50 /* CharacterCodes._2 */:\n            case 51 /* CharacterCodes._3 */:\n            case 52 /* CharacterCodes._4 */:\n            case 53 /* CharacterCodes._5 */:\n            case 54 /* CharacterCodes._6 */:\n            case 55 /* CharacterCodes._7 */:\n            case 56 /* CharacterCodes._8 */:\n            case 57 /* CharacterCodes._9 */:\n                value += scanNumber();\n                return token = 11 /* SyntaxKind.NumericLiteral */;\n            // literals and unknown symbols\n            default:\n                // is a literal? Read the full word.\n                while (pos < len && isUnknownContentCharacter(code)) {\n                    pos++;\n                    code = text.charCodeAt(pos);\n                }\n                if (tokenOffset !== pos) {\n                    value = text.substring(tokenOffset, pos);\n                    // keywords: true, false, null\n                    switch (value) {\n                        case 'true': return token = 8 /* SyntaxKind.TrueKeyword */;\n                        case 'false': return token = 9 /* SyntaxKind.FalseKeyword */;\n                        case 'null': return token = 7 /* SyntaxKind.NullKeyword */;\n                    }\n                    return token = 16 /* SyntaxKind.Unknown */;\n                }\n                // some\n                value += String.fromCharCode(code);\n                pos++;\n                return token = 16 /* SyntaxKind.Unknown */;\n        }\n    }\n    function isUnknownContentCharacter(code) {\n        if (isWhiteSpace(code) || isLineBreak(code)) {\n            return false;\n        }\n        switch (code) {\n            case 125 /* CharacterCodes.closeBrace */:\n            case 93 /* CharacterCodes.closeBracket */:\n            case 123 /* CharacterCodes.openBrace */:\n            case 91 /* CharacterCodes.openBracket */:\n            case 34 /* CharacterCodes.doubleQuote */:\n            case 58 /* CharacterCodes.colon */:\n            case 44 /* CharacterCodes.comma */:\n            case 47 /* CharacterCodes.slash */:\n                return false;\n        }\n        return true;\n    }\n    function scanNextNonTrivia() {\n        let result;\n        do {\n            result = scanNext();\n        } while (result >= 12 /* SyntaxKind.LineCommentTrivia */ && result <= 15 /* SyntaxKind.Trivia */);\n        return result;\n    }\n    return {\n        setPosition: setPosition,\n        getPosition: () => pos,\n        scan: ignoreTrivia ? scanNextNonTrivia : scanNext,\n        getToken: () => token,\n        getTokenValue: () => value,\n        getTokenOffset: () => tokenOffset,\n        getTokenLength: () => pos - tokenOffset,\n        getTokenStartLine: () => lineStartOffset,\n        getTokenStartCharacter: () => tokenOffset - prevTokenLineStartOffset,\n        getTokenError: () => scanError,\n    };\n}\nfunction isWhiteSpace(ch) {\n    return ch === 32 /* CharacterCodes.space */ || ch === 9 /* CharacterCodes.tab */;\n}\nfunction isLineBreak(ch) {\n    return ch === 10 /* CharacterCodes.lineFeed */ || ch === 13 /* CharacterCodes.carriageReturn */;\n}\nfunction isDigit(ch) {\n    return ch >= 48 /* CharacterCodes._0 */ && ch <= 57 /* CharacterCodes._9 */;\n}\nvar CharacterCodes;\n(function (CharacterCodes) {\n    CharacterCodes[CharacterCodes[\"lineFeed\"] = 10] = \"lineFeed\";\n    CharacterCodes[CharacterCodes[\"carriageReturn\"] = 13] = \"carriageReturn\";\n    CharacterCodes[CharacterCodes[\"space\"] = 32] = \"space\";\n    CharacterCodes[CharacterCodes[\"_0\"] = 48] = \"_0\";\n    CharacterCodes[CharacterCodes[\"_1\"] = 49] = \"_1\";\n    CharacterCodes[CharacterCodes[\"_2\"] = 50] = \"_2\";\n    CharacterCodes[CharacterCodes[\"_3\"] = 51] = \"_3\";\n    CharacterCodes[CharacterCodes[\"_4\"] = 52] = \"_4\";\n    CharacterCodes[CharacterCodes[\"_5\"] = 53] = \"_5\";\n    CharacterCodes[CharacterCodes[\"_6\"] = 54] = \"_6\";\n    CharacterCodes[CharacterCodes[\"_7\"] = 55] = \"_7\";\n    CharacterCodes[CharacterCodes[\"_8\"] = 56] = \"_8\";\n    CharacterCodes[CharacterCodes[\"_9\"] = 57] = \"_9\";\n    CharacterCodes[CharacterCodes[\"a\"] = 97] = \"a\";\n    CharacterCodes[CharacterCodes[\"b\"] = 98] = \"b\";\n    CharacterCodes[CharacterCodes[\"c\"] = 99] = \"c\";\n    CharacterCodes[CharacterCodes[\"d\"] = 100] = \"d\";\n    CharacterCodes[CharacterCodes[\"e\"] = 101] = \"e\";\n    CharacterCodes[CharacterCodes[\"f\"] = 102] = \"f\";\n    CharacterCodes[CharacterCodes[\"g\"] = 103] = \"g\";\n    CharacterCodes[CharacterCodes[\"h\"] = 104] = \"h\";\n    CharacterCodes[CharacterCodes[\"i\"] = 105] = \"i\";\n    CharacterCodes[CharacterCodes[\"j\"] = 106] = \"j\";\n    CharacterCodes[CharacterCodes[\"k\"] = 107] = \"k\";\n    CharacterCodes[CharacterCodes[\"l\"] = 108] = \"l\";\n    CharacterCodes[CharacterCodes[\"m\"] = 109] = \"m\";\n    CharacterCodes[CharacterCodes[\"n\"] = 110] = \"n\";\n    CharacterCodes[CharacterCodes[\"o\"] = 111] = \"o\";\n    CharacterCodes[CharacterCodes[\"p\"] = 112] = \"p\";\n    CharacterCodes[CharacterCodes[\"q\"] = 113] = \"q\";\n    CharacterCodes[CharacterCodes[\"r\"] = 114] = \"r\";\n    CharacterCodes[CharacterCodes[\"s\"] = 115] = \"s\";\n    CharacterCodes[CharacterCodes[\"t\"] = 116] = \"t\";\n    CharacterCodes[CharacterCodes[\"u\"] = 117] = \"u\";\n    CharacterCodes[CharacterCodes[\"v\"] = 118] = \"v\";\n    CharacterCodes[CharacterCodes[\"w\"] = 119] = \"w\";\n    CharacterCodes[CharacterCodes[\"x\"] = 120] = \"x\";\n    CharacterCodes[CharacterCodes[\"y\"] = 121] = \"y\";\n    CharacterCodes[CharacterCodes[\"z\"] = 122] = \"z\";\n    CharacterCodes[CharacterCodes[\"A\"] = 65] = \"A\";\n    CharacterCodes[CharacterCodes[\"B\"] = 66] = \"B\";\n    CharacterCodes[CharacterCodes[\"C\"] = 67] = \"C\";\n    CharacterCodes[CharacterCodes[\"D\"] = 68] = \"D\";\n    CharacterCodes[CharacterCodes[\"E\"] = 69] = \"E\";\n    CharacterCodes[CharacterCodes[\"F\"] = 70] = \"F\";\n    CharacterCodes[CharacterCodes[\"G\"] = 71] = \"G\";\n    CharacterCodes[CharacterCodes[\"H\"] = 72] = \"H\";\n    CharacterCodes[CharacterCodes[\"I\"] = 73] = \"I\";\n    CharacterCodes[CharacterCodes[\"J\"] = 74] = \"J\";\n    CharacterCodes[CharacterCodes[\"K\"] = 75] = \"K\";\n    CharacterCodes[CharacterCodes[\"L\"] = 76] = \"L\";\n    CharacterCodes[CharacterCodes[\"M\"] = 77] = \"M\";\n    CharacterCodes[CharacterCodes[\"N\"] = 78] = \"N\";\n    CharacterCodes[CharacterCodes[\"O\"] = 79] = \"O\";\n    CharacterCodes[CharacterCodes[\"P\"] = 80] = \"P\";\n    CharacterCodes[CharacterCodes[\"Q\"] = 81] = \"Q\";\n    CharacterCodes[CharacterCodes[\"R\"] = 82] = \"R\";\n    CharacterCodes[CharacterCodes[\"S\"] = 83] = \"S\";\n    CharacterCodes[CharacterCodes[\"T\"] = 84] = \"T\";\n    CharacterCodes[CharacterCodes[\"U\"] = 85] = \"U\";\n    CharacterCodes[CharacterCodes[\"V\"] = 86] = \"V\";\n    CharacterCodes[CharacterCodes[\"W\"] = 87] = \"W\";\n    CharacterCodes[CharacterCodes[\"X\"] = 88] = \"X\";\n    CharacterCodes[CharacterCodes[\"Y\"] = 89] = \"Y\";\n    CharacterCodes[CharacterCodes[\"Z\"] = 90] = \"Z\";\n    CharacterCodes[CharacterCodes[\"asterisk\"] = 42] = \"asterisk\";\n    CharacterCodes[CharacterCodes[\"backslash\"] = 92] = \"backslash\";\n    CharacterCodes[CharacterCodes[\"closeBrace\"] = 125] = \"closeBrace\";\n    CharacterCodes[CharacterCodes[\"closeBracket\"] = 93] = \"closeBracket\";\n    CharacterCodes[CharacterCodes[\"colon\"] = 58] = \"colon\";\n    CharacterCodes[CharacterCodes[\"comma\"] = 44] = \"comma\";\n    CharacterCodes[CharacterCodes[\"dot\"] = 46] = \"dot\";\n    CharacterCodes[CharacterCodes[\"doubleQuote\"] = 34] = \"doubleQuote\";\n    CharacterCodes[CharacterCodes[\"minus\"] = 45] = \"minus\";\n    CharacterCodes[CharacterCodes[\"openBrace\"] = 123] = \"openBrace\";\n    CharacterCodes[CharacterCodes[\"openBracket\"] = 91] = \"openBracket\";\n    CharacterCodes[CharacterCodes[\"plus\"] = 43] = \"plus\";\n    CharacterCodes[CharacterCodes[\"slash\"] = 47] = \"slash\";\n    CharacterCodes[CharacterCodes[\"formFeed\"] = 12] = \"formFeed\";\n    CharacterCodes[CharacterCodes[\"tab\"] = 9] = \"tab\";\n})(CharacterCodes || (CharacterCodes = {}));\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport { createScanner } from './scanner';\nvar ParseOptions;\n(function (ParseOptions) {\n    ParseOptions.DEFAULT = {\n        allowTrailingComma: false\n    };\n})(ParseOptions || (ParseOptions = {}));\n/**\n * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.\n */\nexport function getLocation(text, position) {\n    const segments = []; // strings or numbers\n    const earlyReturnException = new Object();\n    let previousNode = undefined;\n    const previousNodeInst = {\n        value: {},\n        offset: 0,\n        length: 0,\n        type: 'object',\n        parent: undefined\n    };\n    let isAtPropertyKey = false;\n    function setPreviousNode(value, offset, length, type) {\n        previousNodeInst.value = value;\n        previousNodeInst.offset = offset;\n        previousNodeInst.length = length;\n        previousNodeInst.type = type;\n        previousNodeInst.colonOffset = undefined;\n        previousNode = previousNodeInst;\n    }\n    try {\n        visit(text, {\n            onObjectBegin: (offset, length) => {\n                if (position <= offset) {\n                    throw earlyReturnException;\n                }\n                previousNode = undefined;\n                isAtPropertyKey = position > offset;\n                segments.push(''); // push a placeholder (will be replaced)\n            },\n            onObjectProperty: (name, offset, length) => {\n                if (position < offset) {\n                    throw earlyReturnException;\n                }\n                setPreviousNode(name, offset, length, 'property');\n                segments[segments.length - 1] = name;\n                if (position <= offset + length) {\n                    throw earlyReturnException;\n                }\n            },\n            onObjectEnd: (offset, length) => {\n                if (position <= offset) {\n                    throw earlyReturnException;\n                }\n                previousNode = undefined;\n                segments.pop();\n            },\n            onArrayBegin: (offset, length) => {\n                if (position <= offset) {\n                    throw earlyReturnException;\n                }\n                previousNode = undefined;\n                segments.push(0);\n            },\n            onArrayEnd: (offset, length) => {\n                if (position <= offset) {\n                    throw earlyReturnException;\n                }\n                previousNode = undefined;\n                segments.pop();\n            },\n            onLiteralValue: (value, offset, length) => {\n                if (position < offset) {\n                    throw earlyReturnException;\n                }\n                setPreviousNode(value, offset, length, getNodeType(value));\n                if (position <= offset + length) {\n                    throw earlyReturnException;\n                }\n            },\n            onSeparator: (sep, offset, length) => {\n                if (position <= offset) {\n                    throw earlyReturnException;\n                }\n                if (sep === ':' && previousNode && previousNode.type === 'property') {\n                    previousNode.colonOffset = offset;\n                    isAtPropertyKey = false;\n                    previousNode = undefined;\n                }\n                else if (sep === ',') {\n                    const last = segments[segments.length - 1];\n                    if (typeof last === 'number') {\n                        segments[segments.length - 1] = last + 1;\n                    }\n                    else {\n                        isAtPropertyKey = true;\n                        segments[segments.length - 1] = '';\n                    }\n                    previousNode = undefined;\n                }\n            }\n        });\n    }\n    catch (e) {\n        if (e !== earlyReturnException) {\n            throw e;\n        }\n    }\n    return {\n        path: segments,\n        previousNode,\n        isAtPropertyKey,\n        matches: (pattern) => {\n            let k = 0;\n            for (let i = 0; k < pattern.length && i < segments.length; i++) {\n                if (pattern[k] === segments[i] || pattern[k] === '*') {\n                    k++;\n                }\n                else if (pattern[k] !== '**') {\n                    return false;\n                }\n            }\n            return k === pattern.length;\n        }\n    };\n}\n/**\n * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n * Therefore always check the errors list to find out if the input was valid.\n */\nexport function parse(text, errors = [], options = ParseOptions.DEFAULT) {\n    let currentProperty = null;\n    let currentParent = [];\n    const previousParents = [];\n    function onValue(value) {\n        if (Array.isArray(currentParent)) {\n            currentParent.push(value);\n        }\n        else if (currentProperty !== null) {\n            currentParent[currentProperty] = value;\n        }\n    }\n    const visitor = {\n        onObjectBegin: () => {\n            const object = {};\n            onValue(object);\n            previousParents.push(currentParent);\n            currentParent = object;\n            currentProperty = null;\n        },\n        onObjectProperty: (name) => {\n            currentProperty = name;\n        },\n        onObjectEnd: () => {\n            currentParent = previousParents.pop();\n        },\n        onArrayBegin: () => {\n            const array = [];\n            onValue(array);\n            previousParents.push(currentParent);\n            currentParent = array;\n            currentProperty = null;\n        },\n        onArrayEnd: () => {\n            currentParent = previousParents.pop();\n        },\n        onLiteralValue: onValue,\n        onError: (error, offset, length) => {\n            errors.push({ error, offset, length });\n        }\n    };\n    visit(text, visitor, options);\n    return currentParent[0];\n}\n/**\n * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n */\nexport function parseTree(text, errors = [], options = ParseOptions.DEFAULT) {\n    let currentParent = { type: 'array', offset: -1, length: -1, children: [], parent: undefined }; // artificial root\n    function ensurePropertyComplete(endOffset) {\n        if (currentParent.type === 'property') {\n            currentParent.length = endOffset - currentParent.offset;\n            currentParent = currentParent.parent;\n        }\n    }\n    function onValue(valueNode) {\n        currentParent.children.push(valueNode);\n        return valueNode;\n    }\n    const visitor = {\n        onObjectBegin: (offset) => {\n            currentParent = onValue({ type: 'object', offset, length: -1, parent: currentParent, children: [] });\n        },\n        onObjectProperty: (name, offset, length) => {\n            currentParent = onValue({ type: 'property', offset, length: -1, parent: currentParent, children: [] });\n            currentParent.children.push({ type: 'string', value: name, offset, length, parent: currentParent });\n        },\n        onObjectEnd: (offset, length) => {\n            ensurePropertyComplete(offset + length); // in case of a missing value for a property: make sure property is complete\n            currentParent.length = offset + length - currentParent.offset;\n            currentParent = currentParent.parent;\n            ensurePropertyComplete(offset + length);\n        },\n        onArrayBegin: (offset, length) => {\n            currentParent = onValue({ type: 'array', offset, length: -1, parent: currentParent, children: [] });\n        },\n        onArrayEnd: (offset, length) => {\n            currentParent.length = offset + length - currentParent.offset;\n            currentParent = currentParent.parent;\n            ensurePropertyComplete(offset + length);\n        },\n        onLiteralValue: (value, offset, length) => {\n            onValue({ type: getNodeType(value), offset, length, parent: currentParent, value });\n            ensurePropertyComplete(offset + length);\n        },\n        onSeparator: (sep, offset, length) => {\n            if (currentParent.type === 'property') {\n                if (sep === ':') {\n                    currentParent.colonOffset = offset;\n                }\n                else if (sep === ',') {\n                    ensurePropertyComplete(offset);\n                }\n            }\n        },\n        onError: (error, offset, length) => {\n            errors.push({ error, offset, length });\n        }\n    };\n    visit(text, visitor, options);\n    const result = currentParent.children[0];\n    if (result) {\n        delete result.parent;\n    }\n    return result;\n}\n/**\n * Finds the node at the given path in a JSON DOM.\n */\nexport function findNodeAtLocation(root, path) {\n    if (!root) {\n        return undefined;\n    }\n    let node = root;\n    for (let segment of path) {\n        if (typeof segment === 'string') {\n            if (node.type !== 'object' || !Array.isArray(node.children)) {\n                return undefined;\n            }\n            let found = false;\n            for (const propertyNode of node.children) {\n                if (Array.isArray(propertyNode.children) && propertyNode.children[0].value === segment && propertyNode.children.length === 2) {\n                    node = propertyNode.children[1];\n                    found = true;\n                    break;\n                }\n            }\n            if (!found) {\n                return undefined;\n            }\n        }\n        else {\n            const index = segment;\n            if (node.type !== 'array' || index < 0 || !Array.isArray(node.children) || index >= node.children.length) {\n                return undefined;\n            }\n            node = node.children[index];\n        }\n    }\n    return node;\n}\n/**\n * Gets the JSON path of the given JSON DOM node\n */\nexport function getNodePath(node) {\n    if (!node.parent || !node.parent.children) {\n        return [];\n    }\n    const path = getNodePath(node.parent);\n    if (node.parent.type === 'property') {\n        const key = node.parent.children[0].value;\n        path.push(key);\n    }\n    else if (node.parent.type === 'array') {\n        const index = node.parent.children.indexOf(node);\n        if (index !== -1) {\n            path.push(index);\n        }\n    }\n    return path;\n}\n/**\n * Evaluates the JavaScript object of the given JSON DOM node\n */\nexport function getNodeValue(node) {\n    switch (node.type) {\n        case 'array':\n            return node.children.map(getNodeValue);\n        case 'object':\n            const obj = Object.create(null);\n            for (let prop of node.children) {\n                const valueNode = prop.children[1];\n                if (valueNode) {\n                    obj[prop.children[0].value] = getNodeValue(valueNode);\n                }\n            }\n            return obj;\n        case 'null':\n        case 'string':\n        case 'number':\n        case 'boolean':\n            return node.value;\n        default:\n            return undefined;\n    }\n}\nexport function contains(node, offset, includeRightBound = false) {\n    return (offset >= node.offset && offset < (node.offset + node.length)) || includeRightBound && (offset === (node.offset + node.length));\n}\n/**\n * Finds the most inner node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.\n */\nexport function findNodeAtOffset(node, offset, includeRightBound = false) {\n    if (contains(node, offset, includeRightBound)) {\n        const children = node.children;\n        if (Array.isArray(children)) {\n            for (let i = 0; i < children.length && children[i].offset <= offset; i++) {\n                const item = findNodeAtOffset(children[i], offset, includeRightBound);\n                if (item) {\n                    return item;\n                }\n            }\n        }\n        return node;\n    }\n    return undefined;\n}\n/**\n * Parses the given text and invokes the visitor functions for each object, array and literal reached.\n */\nexport function visit(text, visitor, options = ParseOptions.DEFAULT) {\n    const _scanner = createScanner(text, false);\n    // Important: Only pass copies of this to visitor functions to prevent accidental modification, and\n    // to not affect visitor functions which stored a reference to a previous JSONPath\n    const _jsonPath = [];\n    // Depth of onXXXBegin() callbacks suppressed. onXXXEnd() decrements this if it isn't 0 already.\n    // Callbacks are only called when this value is 0.\n    let suppressedCallbacks = 0;\n    function toNoArgVisit(visitFunction) {\n        return visitFunction ? () => suppressedCallbacks === 0 && visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()) : () => true;\n    }\n    function toOneArgVisit(visitFunction) {\n        return visitFunction ? (arg) => suppressedCallbacks === 0 && visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter()) : () => true;\n    }\n    function toOneArgVisitWithPath(visitFunction) {\n        return visitFunction ? (arg) => suppressedCallbacks === 0 && visitFunction(arg, _scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter(), () => _jsonPath.slice()) : () => true;\n    }\n    function toBeginVisit(visitFunction) {\n        return visitFunction ?\n            () => {\n                if (suppressedCallbacks > 0) {\n                    suppressedCallbacks++;\n                }\n                else {\n                    let cbReturn = visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter(), () => _jsonPath.slice());\n                    if (cbReturn === false) {\n                        suppressedCallbacks = 1;\n                    }\n                }\n            }\n            : () => true;\n    }\n    function toEndVisit(visitFunction) {\n        return visitFunction ?\n            () => {\n                if (suppressedCallbacks > 0) {\n                    suppressedCallbacks--;\n                }\n                if (suppressedCallbacks === 0) {\n                    visitFunction(_scanner.getTokenOffset(), _scanner.getTokenLength(), _scanner.getTokenStartLine(), _scanner.getTokenStartCharacter());\n                }\n            }\n            : () => true;\n    }\n    const onObjectBegin = toBeginVisit(visitor.onObjectBegin), onObjectProperty = toOneArgVisitWithPath(visitor.onObjectProperty), onObjectEnd = toEndVisit(visitor.onObjectEnd), onArrayBegin = toBeginVisit(visitor.onArrayBegin), onArrayEnd = toEndVisit(visitor.onArrayEnd), onLiteralValue = toOneArgVisitWithPath(visitor.onLiteralValue), onSeparator = toOneArgVisit(visitor.onSeparator), onComment = toNoArgVisit(visitor.onComment), onError = toOneArgVisit(visitor.onError);\n    const disallowComments = options && options.disallowComments;\n    const allowTrailingComma = options && options.allowTrailingComma;\n    function scanNext() {\n        while (true) {\n            const token = _scanner.scan();\n            switch (_scanner.getTokenError()) {\n                case 4 /* ScanError.InvalidUnicode */:\n                    handleError(14 /* ParseErrorCode.InvalidUnicode */);\n                    break;\n                case 5 /* ScanError.InvalidEscapeCharacter */:\n                    handleError(15 /* ParseErrorCode.InvalidEscapeCharacter */);\n                    break;\n                case 3 /* ScanError.UnexpectedEndOfNumber */:\n                    handleError(13 /* ParseErrorCode.UnexpectedEndOfNumber */);\n                    break;\n                case 1 /* ScanError.UnexpectedEndOfComment */:\n                    if (!disallowComments) {\n                        handleError(11 /* ParseErrorCode.UnexpectedEndOfComment */);\n                    }\n                    break;\n                case 2 /* ScanError.UnexpectedEndOfString */:\n                    handleError(12 /* ParseErrorCode.UnexpectedEndOfString */);\n                    break;\n                case 6 /* ScanError.InvalidCharacter */:\n                    handleError(16 /* ParseErrorCode.InvalidCharacter */);\n                    break;\n            }\n            switch (token) {\n                case 12 /* SyntaxKind.LineCommentTrivia */:\n                case 13 /* SyntaxKind.BlockCommentTrivia */:\n                    if (disallowComments) {\n                        handleError(10 /* ParseErrorCode.InvalidCommentToken */);\n                    }\n                    else {\n                        onComment();\n                    }\n                    break;\n                case 16 /* SyntaxKind.Unknown */:\n                    handleError(1 /* ParseErrorCode.InvalidSymbol */);\n                    break;\n                case 15 /* SyntaxKind.Trivia */:\n                case 14 /* SyntaxKind.LineBreakTrivia */:\n                    break;\n                default:\n                    return token;\n            }\n        }\n    }\n    function handleError(error, skipUntilAfter = [], skipUntil = []) {\n        onError(error);\n        if (skipUntilAfter.length + skipUntil.length > 0) {\n            let token = _scanner.getToken();\n            while (token !== 17 /* SyntaxKind.EOF */) {\n                if (skipUntilAfter.indexOf(token) !== -1) {\n                    scanNext();\n                    break;\n                }\n                else if (skipUntil.indexOf(token) !== -1) {\n                    break;\n                }\n                token = scanNext();\n            }\n        }\n    }\n    function parseString(isValue) {\n        const value = _scanner.getTokenValue();\n        if (isValue) {\n            onLiteralValue(value);\n        }\n        else {\n            onObjectProperty(value);\n            // add property name afterwards\n            _jsonPath.push(value);\n        }\n        scanNext();\n        return true;\n    }\n    function parseLiteral() {\n        switch (_scanner.getToken()) {\n            case 11 /* SyntaxKind.NumericLiteral */:\n                const tokenValue = _scanner.getTokenValue();\n                let value = Number(tokenValue);\n                if (isNaN(value)) {\n                    handleError(2 /* ParseErrorCode.InvalidNumberFormat */);\n                    value = 0;\n                }\n                onLiteralValue(value);\n                break;\n            case 7 /* SyntaxKind.NullKeyword */:\n                onLiteralValue(null);\n                break;\n            case 8 /* SyntaxKind.TrueKeyword */:\n                onLiteralValue(true);\n                break;\n            case 9 /* SyntaxKind.FalseKeyword */:\n                onLiteralValue(false);\n                break;\n            default:\n                return false;\n        }\n        scanNext();\n        return true;\n    }\n    function parseProperty() {\n        if (_scanner.getToken() !== 10 /* SyntaxKind.StringLiteral */) {\n            handleError(3 /* ParseErrorCode.PropertyNameExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n            return false;\n        }\n        parseString(false);\n        if (_scanner.getToken() === 6 /* SyntaxKind.ColonToken */) {\n            onSeparator(':');\n            scanNext(); // consume colon\n            if (!parseValue()) {\n                handleError(4 /* ParseErrorCode.ValueExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n            }\n        }\n        else {\n            handleError(5 /* ParseErrorCode.ColonExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n        }\n        _jsonPath.pop(); // remove processed property name\n        return true;\n    }\n    function parseObject() {\n        onObjectBegin();\n        scanNext(); // consume open brace\n        let needsComma = false;\n        while (_scanner.getToken() !== 2 /* SyntaxKind.CloseBraceToken */ && _scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\n            if (_scanner.getToken() === 5 /* SyntaxKind.CommaToken */) {\n                if (!needsComma) {\n                    handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n                }\n                onSeparator(',');\n                scanNext(); // consume comma\n                if (_scanner.getToken() === 2 /* SyntaxKind.CloseBraceToken */ && allowTrailingComma) {\n                    break;\n                }\n            }\n            else if (needsComma) {\n                handleError(6 /* ParseErrorCode.CommaExpected */, [], []);\n            }\n            if (!parseProperty()) {\n                handleError(4 /* ParseErrorCode.ValueExpected */, [], [2 /* SyntaxKind.CloseBraceToken */, 5 /* SyntaxKind.CommaToken */]);\n            }\n            needsComma = true;\n        }\n        onObjectEnd();\n        if (_scanner.getToken() !== 2 /* SyntaxKind.CloseBraceToken */) {\n            handleError(7 /* ParseErrorCode.CloseBraceExpected */, [2 /* SyntaxKind.CloseBraceToken */], []);\n        }\n        else {\n            scanNext(); // consume close brace\n        }\n        return true;\n    }\n    function parseArray() {\n        onArrayBegin();\n        scanNext(); // consume open bracket\n        let isFirstElement = true;\n        let needsComma = false;\n        while (_scanner.getToken() !== 4 /* SyntaxKind.CloseBracketToken */ && _scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\n            if (_scanner.getToken() === 5 /* SyntaxKind.CommaToken */) {\n                if (!needsComma) {\n                    handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n                }\n                onSeparator(',');\n                scanNext(); // consume comma\n                if (_scanner.getToken() === 4 /* SyntaxKind.CloseBracketToken */ && allowTrailingComma) {\n                    break;\n                }\n            }\n            else if (needsComma) {\n                handleError(6 /* ParseErrorCode.CommaExpected */, [], []);\n            }\n            if (isFirstElement) {\n                _jsonPath.push(0);\n                isFirstElement = false;\n            }\n            else {\n                _jsonPath[_jsonPath.length - 1]++;\n            }\n            if (!parseValue()) {\n                handleError(4 /* ParseErrorCode.ValueExpected */, [], [4 /* SyntaxKind.CloseBracketToken */, 5 /* SyntaxKind.CommaToken */]);\n            }\n            needsComma = true;\n        }\n        onArrayEnd();\n        if (!isFirstElement) {\n            _jsonPath.pop(); // remove array index\n        }\n        if (_scanner.getToken() !== 4 /* SyntaxKind.CloseBracketToken */) {\n            handleError(8 /* ParseErrorCode.CloseBracketExpected */, [4 /* SyntaxKind.CloseBracketToken */], []);\n        }\n        else {\n            scanNext(); // consume close bracket\n        }\n        return true;\n    }\n    function parseValue() {\n        switch (_scanner.getToken()) {\n            case 3 /* SyntaxKind.OpenBracketToken */:\n                return parseArray();\n            case 1 /* SyntaxKind.OpenBraceToken */:\n                return parseObject();\n            case 10 /* SyntaxKind.StringLiteral */:\n                return parseString(true);\n            default:\n                return parseLiteral();\n        }\n    }\n    scanNext();\n    if (_scanner.getToken() === 17 /* SyntaxKind.EOF */) {\n        if (options.allowEmptyContent) {\n            return true;\n        }\n        handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n        return false;\n    }\n    if (!parseValue()) {\n        handleError(4 /* ParseErrorCode.ValueExpected */, [], []);\n        return false;\n    }\n    if (_scanner.getToken() !== 17 /* SyntaxKind.EOF */) {\n        handleError(9 /* ParseErrorCode.EndOfFileExpected */, [], []);\n    }\n    return true;\n}\n/**\n * Takes JSON with JavaScript-style comments and remove\n * them. Optionally replaces every none-newline character\n * of comments with a replaceCharacter\n */\nexport function stripComments(text, replaceCh) {\n    let _scanner = createScanner(text), parts = [], kind, offset = 0, pos;\n    do {\n        pos = _scanner.getPosition();\n        kind = _scanner.scan();\n        switch (kind) {\n            case 12 /* SyntaxKind.LineCommentTrivia */:\n            case 13 /* SyntaxKind.BlockCommentTrivia */:\n            case 17 /* SyntaxKind.EOF */:\n                if (offset !== pos) {\n                    parts.push(text.substring(offset, pos));\n                }\n                if (replaceCh !== undefined) {\n                    parts.push(_scanner.getTokenValue().replace(/[^\\r\\n]/g, replaceCh));\n                }\n                offset = _scanner.getPosition();\n                break;\n        }\n    } while (kind !== 17 /* SyntaxKind.EOF */);\n    return parts.join('');\n}\nexport function getNodeType(value) {\n    switch (typeof value) {\n        case 'boolean': return 'boolean';\n        case 'number': return 'number';\n        case 'string': return 'string';\n        case 'object': {\n            if (!value) {\n                return 'null';\n            }\n            else if (Array.isArray(value)) {\n                return 'array';\n            }\n            return 'object';\n        }\n        default: return 'null';\n    }\n}\n","/*---------------------------------------------------------------------------------------------\n *  Copyright (c) Microsoft Corporation. All rights reserved.\n *  Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n'use strict';\nimport * as formatter from './impl/format';\nimport * as edit from './impl/edit';\nimport * as scanner from './impl/scanner';\nimport * as parser from './impl/parser';\n/**\n * Creates a JSON scanner on the given text.\n * If ignoreTrivia is set, whitespaces or comments are ignored.\n */\nexport const createScanner = scanner.createScanner;\nexport var ScanError;\n(function (ScanError) {\n    ScanError[ScanError[\"None\"] = 0] = \"None\";\n    ScanError[ScanError[\"UnexpectedEndOfComment\"] = 1] = \"UnexpectedEndOfComment\";\n    ScanError[ScanError[\"UnexpectedEndOfString\"] = 2] = \"UnexpectedEndOfString\";\n    ScanError[ScanError[\"UnexpectedEndOfNumber\"] = 3] = \"UnexpectedEndOfNumber\";\n    ScanError[ScanError[\"InvalidUnicode\"] = 4] = \"InvalidUnicode\";\n    ScanError[ScanError[\"InvalidEscapeCharacter\"] = 5] = \"InvalidEscapeCharacter\";\n    ScanError[ScanError[\"InvalidCharacter\"] = 6] = \"InvalidCharacter\";\n})(ScanError || (ScanError = {}));\nexport var SyntaxKind;\n(function (SyntaxKind) {\n    SyntaxKind[SyntaxKind[\"OpenBraceToken\"] = 1] = \"OpenBraceToken\";\n    SyntaxKind[SyntaxKind[\"CloseBraceToken\"] = 2] = \"CloseBraceToken\";\n    SyntaxKind[SyntaxKind[\"OpenBracketToken\"] = 3] = \"OpenBracketToken\";\n    SyntaxKind[SyntaxKind[\"CloseBracketToken\"] = 4] = \"CloseBracketToken\";\n    SyntaxKind[SyntaxKind[\"CommaToken\"] = 5] = \"CommaToken\";\n    SyntaxKind[SyntaxKind[\"ColonToken\"] = 6] = \"ColonToken\";\n    SyntaxKind[SyntaxKind[\"NullKeyword\"] = 7] = \"NullKeyword\";\n    SyntaxKind[SyntaxKind[\"TrueKeyword\"] = 8] = \"TrueKeyword\";\n    SyntaxKind[SyntaxKind[\"FalseKeyword\"] = 9] = \"FalseKeyword\";\n    SyntaxKind[SyntaxKind[\"StringLiteral\"] = 10] = \"StringLiteral\";\n    SyntaxKind[SyntaxKind[\"NumericLiteral\"] = 11] = \"NumericLiteral\";\n    SyntaxKind[SyntaxKind[\"LineCommentTrivia\"] = 12] = \"LineCommentTrivia\";\n    SyntaxKind[SyntaxKind[\"BlockCommentTrivia\"] = 13] = \"BlockCommentTrivia\";\n    SyntaxKind[SyntaxKind[\"LineBreakTrivia\"] = 14] = \"LineBreakTrivia\";\n    SyntaxKind[SyntaxKind[\"Trivia\"] = 15] = \"Trivia\";\n    SyntaxKind[SyntaxKind[\"Unknown\"] = 16] = \"Unknown\";\n    SyntaxKind[SyntaxKind[\"EOF\"] = 17] = \"EOF\";\n})(SyntaxKind || (SyntaxKind = {}));\n/**\n * For a given offset, evaluate the location in the JSON document. Each segment in the location path is either a property name or an array index.\n */\nexport const getLocation = parser.getLocation;\n/**\n * Parses the given text and returns the object the JSON content represents. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n * Therefore, always check the errors list to find out if the input was valid.\n */\nexport const parse = parser.parse;\n/**\n * Parses the given text and returns a tree representation the JSON content. On invalid input, the parser tries to be as fault tolerant as possible, but still return a result.\n */\nexport const parseTree = parser.parseTree;\n/**\n * Finds the node at the given path in a JSON DOM.\n */\nexport const findNodeAtLocation = parser.findNodeAtLocation;\n/**\n * Finds the innermost node at the given offset. If includeRightBound is set, also finds nodes that end at the given offset.\n */\nexport const findNodeAtOffset = parser.findNodeAtOffset;\n/**\n * Gets the JSON path of the given JSON DOM node\n */\nexport const getNodePath = parser.getNodePath;\n/**\n * Evaluates the JavaScript object of the given JSON DOM node\n */\nexport const getNodeValue = parser.getNodeValue;\n/**\n * Parses the given text and invokes the visitor functions for each object, array and literal reached.\n */\nexport const visit = parser.visit;\n/**\n * Takes JSON with JavaScript-style comments and remove\n * them. Optionally replaces every none-newline character\n * of comments with a replaceCharacter\n */\nexport const stripComments = parser.stripComments;\nexport var ParseErrorCode;\n(function (ParseErrorCode) {\n    ParseErrorCode[ParseErrorCode[\"InvalidSymbol\"] = 1] = \"InvalidSymbol\";\n    ParseErrorCode[ParseErrorCode[\"InvalidNumberFormat\"] = 2] = \"InvalidNumberFormat\";\n    ParseErrorCode[ParseErrorCode[\"PropertyNameExpected\"] = 3] = \"PropertyNameExpected\";\n    ParseErrorCode[ParseErrorCode[\"ValueExpected\"] = 4] = \"ValueExpected\";\n    ParseErrorCode[ParseErrorCode[\"ColonExpected\"] = 5] = \"ColonExpected\";\n    ParseErrorCode[ParseErrorCode[\"CommaExpected\"] = 6] = \"CommaExpected\";\n    ParseErrorCode[ParseErrorCode[\"CloseBraceExpected\"] = 7] = \"CloseBraceExpected\";\n    ParseErrorCode[ParseErrorCode[\"CloseBracketExpected\"] = 8] = \"CloseBracketExpected\";\n    ParseErrorCode[ParseErrorCode[\"EndOfFileExpected\"] = 9] = \"EndOfFileExpected\";\n    ParseErrorCode[ParseErrorCode[\"InvalidCommentToken\"] = 10] = \"InvalidCommentToken\";\n    ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfComment\"] = 11] = \"UnexpectedEndOfComment\";\n    ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfString\"] = 12] = \"UnexpectedEndOfString\";\n    ParseErrorCode[ParseErrorCode[\"UnexpectedEndOfNumber\"] = 13] = \"UnexpectedEndOfNumber\";\n    ParseErrorCode[ParseErrorCode[\"InvalidUnicode\"] = 14] = \"InvalidUnicode\";\n    ParseErrorCode[ParseErrorCode[\"InvalidEscapeCharacter\"] = 15] = \"InvalidEscapeCharacter\";\n    ParseErrorCode[ParseErrorCode[\"InvalidCharacter\"] = 16] = \"InvalidCharacter\";\n})(ParseErrorCode || (ParseErrorCode = {}));\nexport function printParseErrorCode(code) {\n    switch (code) {\n        case 1 /* ParseErrorCode.InvalidSymbol */: return 'InvalidSymbol';\n        case 2 /* ParseErrorCode.InvalidNumberFormat */: return 'InvalidNumberFormat';\n        case 3 /* ParseErrorCode.PropertyNameExpected */: return 'PropertyNameExpected';\n        case 4 /* ParseErrorCode.ValueExpected */: return 'ValueExpected';\n        case 5 /* ParseErrorCode.ColonExpected */: return 'ColonExpected';\n        case 6 /* ParseErrorCode.CommaExpected */: return 'CommaExpected';\n        case 7 /* ParseErrorCode.CloseBraceExpected */: return 'CloseBraceExpected';\n        case 8 /* ParseErrorCode.CloseBracketExpected */: return 'CloseBracketExpected';\n        case 9 /* ParseErrorCode.EndOfFileExpected */: return 'EndOfFileExpected';\n        case 10 /* ParseErrorCode.InvalidCommentToken */: return 'InvalidCommentToken';\n        case 11 /* ParseErrorCode.UnexpectedEndOfComment */: return 'UnexpectedEndOfComment';\n        case 12 /* ParseErrorCode.UnexpectedEndOfString */: return 'UnexpectedEndOfString';\n        case 13 /* ParseErrorCode.UnexpectedEndOfNumber */: return 'UnexpectedEndOfNumber';\n        case 14 /* ParseErrorCode.InvalidUnicode */: return 'InvalidUnicode';\n        case 15 /* ParseErrorCode.InvalidEscapeCharacter */: return 'InvalidEscapeCharacter';\n        case 16 /* ParseErrorCode.InvalidCharacter */: return 'InvalidCharacter';\n    }\n    return '<unknown ParseErrorCode>';\n}\n/**\n * Computes the edit operations needed to format a JSON document.\n *\n * @param documentText The input text\n * @param range The range to format or `undefined` to format the full content\n * @param options The formatting options\n * @returns The edit operations describing the formatting changes to the original document following the format described in {@linkcode EditResult}.\n * To apply the edit operations to the input, use {@linkcode applyEdits}.\n */\nexport function format(documentText, range, options) {\n    return formatter.format(documentText, range, options);\n}\n/**\n * Computes the edit operations needed to modify a value in the JSON document.\n *\n * @param documentText The input text\n * @param path The path of the value to change. The path represents either to the document root, a property or an array item.\n * If the path points to an non-existing property or item, it will be created.\n * @param value The new value for the specified property or item. If the value is undefined,\n * the property or item will be removed.\n * @param options Options\n * @returns The edit operations describing the changes to the original document, following the format described in {@linkcode EditResult}.\n * To apply the edit operations to the input, use {@linkcode applyEdits}.\n */\nexport function modify(text, path, value, options) {\n    return edit.setProperty(text, path, value, options);\n}\n/**\n * Applies edits to an input string.\n * @param text The input text\n * @param edits Edit operations following the format described in {@linkcode EditResult}.\n * @returns The text with the applied edits.\n * @throws An error if the edit operations are not well-formed as described in {@linkcode EditResult}.\n */\nexport function applyEdits(text, edits) {\n    let sortedEdits = edits.slice(0).sort((a, b) => {\n        const diff = a.offset - b.offset;\n        if (diff === 0) {\n            return a.length - b.length;\n        }\n        return diff;\n    });\n    let lastModifiedOffset = text.length;\n    for (let i = sortedEdits.length - 1; i >= 0; i--) {\n        let e = sortedEdits[i];\n        if (e.offset + e.length <= lastModifiedOffset) {\n            text = edit.applyEdit(text, e);\n        }\n        else {\n            throw new Error('Overlapping edit');\n        }\n        lastModifiedOffset = e.offset;\n    }\n    return text;\n}\n","import { useState, useEffect, useCallback, useMemo, forwardRef, useImperativeHandle } from 'react';\nimport { ChevronRight, ChevronDown } from 'lucide-react';\nimport { parse as parseJsonc } from 'jsonc-parser';\nimport { fetchTextUtf8 } from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { useResolvedTheme, type ResolvedTheme } from '../../ThemeContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\n\ninterface JsonRendererProps {\n  url: string;\n  fileName: string;\n}\n\ninterface JsonColors {\n  key: string;\n  string: string;\n  number: string;\n  keyword: string;\n  bracket: string;   // { } [ ]\n  colon: string;     // :\n  collapsed: string; // \"N items / N keys\" 折叠提示\n  arrow: string;     // 折叠箭头\n}\n\n// VSCode Dark Plus / GitHub Light 两套配色，与 react-syntax-highlighter 的 vscDarkPlus / vs 主题保持一致\nconst DARK_COLORS: JsonColors = {\n  key: '#9cdcfe',\n  string: '#ce9178',\n  number: '#b5cea8',\n  keyword: '#569cd6',\n  bracket: '#d4d4d4',\n  colon: 'rgb(255 255 255 / 0.6)',\n  collapsed: 'rgb(255 255 255 / 0.4)',\n  arrow: 'rgb(255 255 255 / 0.5)',\n};\n\nconst LIGHT_COLORS: JsonColors = {\n  key: '#005cc5',\n  string: '#032f62',\n  number: '#005cc5',\n  keyword: '#d73a49',\n  bracket: '#24292e',\n  colon: 'rgb(23 23 23 / 0.6)',\n  collapsed: 'rgb(23 23 23 / 0.45)',\n  arrow: 'rgb(23 23 23 / 0.55)',\n};\n\n// ---------- JSON 树节点 ----------\n\ninterface JsonNodeProps {\n  keyName?: string;\n  value: unknown;\n  depth: number;\n  defaultExpanded: boolean;\n  colors: JsonColors;\n}\n\nconst JsonNode: React.FC<JsonNodeProps> = ({ keyName, value, depth, defaultExpanded, colors }) => {\n  const t = useTranslator();\n  const [expanded, setExpanded] = useState(defaultExpanded);\n  const indent = depth * 20;\n\n  const toggle = useCallback(() => setExpanded(prev => !prev), []);\n\n  // 基本类型\n  if (value === null || value === undefined || typeof value !== 'object') {\n    return (\n      <div className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm\" style={{ paddingLeft: `${indent}px` }}>\n        <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0\" />\n        {keyName !== undefined && (\n          <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n            \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n          </span>\n        )}\n        {renderPrimitive(value, colors)}\n      </div>\n    );\n  }\n\n  const isArray = Array.isArray(value);\n  const entries = isArray ? (value as unknown[]) : Object.entries(value as Record<string, unknown>);\n  const count = entries.length;\n  const openBracket = isArray ? '[' : '{';\n  const closeBracket = isArray ? ']' : '}';\n\n  // 空对象/数组\n  if (count === 0) {\n    return (\n      <div className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm\" style={{ paddingLeft: `${indent}px` }}>\n        <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0\" />\n        {keyName !== undefined && (\n          <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n            \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n          </span>\n        )}\n        <span style={{ color: colors.bracket }}>{openBracket}{closeBracket}</span>\n      </div>\n    );\n  }\n\n  return (\n    <div>\n      {/* 折叠行 */}\n      <div\n        className=\"rfp-flex rfp-items-start rfp-py-px rfp-font-mono rfp-text-sm rfp-cursor-pointer hover:rfp-bg-surface-1 rfp-select-none\"\n        style={{ paddingLeft: `${indent}px` }}\n        onClick={toggle}\n      >\n        <span className=\"rfp-w-4 rfp-h-5 rfp-flex-shrink-0 rfp-flex rfp-items-center rfp-justify-center\" style={{ color: colors.arrow }}>\n          {expanded\n            ? <ChevronDown className=\"rfp-w-3.5 rfp-h-3.5\" />\n            : <ChevronRight className=\"rfp-w-3.5 rfp-h-3.5\" />\n          }\n        </span>\n        {keyName !== undefined && (\n          <span className=\"rfp-flex-shrink-0\" style={{ color: colors.key }}>\n            \"{keyName}\"<span style={{ color: colors.colon }}>: </span>\n          </span>\n        )}\n        <span style={{ color: colors.bracket }}>{openBracket}</span>\n        {!expanded && (\n          <span className=\"rfp-ml-1\" style={{ color: colors.collapsed }}>\n            {isArray ? `${count} ${t('json.items')}` : `${count} ${t('json.keys')}`}\n            <span style={{ color: colors.bracket }}> {closeBracket}</span>\n          </span>\n        )}\n      </div>\n\n      {/* 子节点 */}\n      {expanded && (\n        <>\n          {isArray\n            ? (value as unknown[]).map((item, i) => (\n                <JsonNode key={i} value={item} depth={depth + 1} defaultExpanded={depth < 1} colors={colors} />\n              ))\n            : Object.entries(value as Record<string, unknown>).map(([k, v]) => (\n                <JsonNode key={k} keyName={k} value={v} depth={depth + 1} defaultExpanded={depth < 1} colors={colors} />\n              ))\n          }\n          <div className=\"rfp-font-mono rfp-text-sm rfp-py-px\" style={{ paddingLeft: `${indent + 20}px`, color: colors.bracket }}>\n            {closeBracket}\n          </div>\n        </>\n      )}\n    </div>\n  );\n};\n\nfunction renderPrimitive(value: unknown, colors: JsonColors) {\n  if (value === null) return <span style={{ color: colors.keyword, fontStyle: 'italic' }}>null</span>;\n  if (value === undefined) return <span style={{ color: colors.keyword, fontStyle: 'italic' }}>undefined</span>;\n  if (typeof value === 'boolean') return <span style={{ color: colors.keyword }}>{String(value)}</span>;\n  if (typeof value === 'number') return <span style={{ color: colors.number }}>{String(value)}</span>;\n  if (typeof value === 'string') return <span style={{ color: colors.string }}>\"{value}\"</span>;\n  return <span style={{ color: colors.bracket }}>{String(value)}</span>;\n}\n\nfunction pickColors(theme: ResolvedTheme): JsonColors {\n  return theme === 'light' ? LIGHT_COLORS : DARK_COLORS;\n}\n\n// ---------- Main ----------\n\nexport const JsonRenderer = forwardRef<RendererHandle, JsonRendererProps>(({ url }, ref) => {\n  const t = useTranslator();\n  const fetcher = useFetcher();\n  const resolvedTheme = useResolvedTheme();\n  const colors = useMemo(() => pickColors(resolvedTheme), [resolvedTheme]);\n  const [data, setData] = useState<unknown>(null);\n  const [loading, setLoading] = useState(true);\n  const [error, setError] = useState<string | null>(null);\n\n  useEffect(() => {\n    const controller = new AbortController();\n    const loadJson = async () => {\n      try {\n        setLoading(true);\n        setError(null);\n        const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n        const parsed = parseJsonc(text);\n        setData(parsed);\n      } catch (err: any) {\n        if (err.name === 'AbortError') return;\n        setError(t('json.load_failed'));\n        console.error(err);\n      } finally {\n        setLoading(false);\n      }\n    };\n    loadJson();\n    return () => controller.abort();\n  }, [url]);\n\n  // 暴露接口给父组件（必须在 early return 之前调用）\n  useImperativeHandle(ref, () => ({\n    getToolbarGroups: () => [],\n  }), []);\n\n  if (loading) {\n    return (\n      <div className=\"rfp-flex rfp-items-center rfp-justify-center rfp-w-full rfp-h-full\">\n        <div className=\"rfp-w-12 rfp-h-12 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n      </div>\n    );\n  }\n\n  if (error) {\n    return <RendererError message={error} />;\n  }\n\n  return (\n    <div className=\"rfp-w-full rfp-h-full rfp-overflow-auto rfp-bg-code-bg rfp-py-6 rfp-px-4\">\n      <JsonNode value={data} depth={0} defaultExpanded colors={colors} />\n    </div>\n  );\n});\n"],"names":["createScanner","text","ignoreTrivia","len","pos","value","tokenOffset","token","lineNumber","lineStartOffset","tokenLineStartOffset","prevTokenLineStartOffset","scanError","scanHexDigits","count","exact","digits","ch","setPosition","newPosition","scanNumber","start","isDigit","end","scanString","result","ch3","isLineBreak","scanNext","code","isWhiteSpace","safeLength","commentClosed","isUnknownContentCharacter","scanNextNonTrivia","CharacterCodes","ParseOptions","parse","errors","options","currentProperty","currentParent","previousParents","onValue","visit","object","name","array","error","offset","length","visitor","_scanner","_jsonPath","suppressedCallbacks","toNoArgVisit","visitFunction","toOneArgVisit","arg","toOneArgVisitWithPath","toBeginVisit","toEndVisit","onObjectBegin","onObjectProperty","onObjectEnd","onArrayBegin","onArrayEnd","onLiteralValue","onSeparator","onComment","onError","disallowComments","allowTrailingComma","handleError","skipUntilAfter","skipUntil","parseString","isValue","parseLiteral","tokenValue","parseProperty","parseValue","parseObject","needsComma","parseArray","isFirstElement","ScanError","SyntaxKind","parser.parse","ParseErrorCode","DARK_COLORS","LIGHT_COLORS","JsonNode","keyName","depth","defaultExpanded","colors","t","useTranslator","expanded","setExpanded","useState","indent","toggle","useCallback","prev","jsxs","jsx","renderPrimitive","isArray","openBracket","closeBracket","ChevronDown","ChevronRight","Fragment","item","i","k","v","pickColors","theme","JsonRenderer","forwardRef","url","ref","fetcher","useFetcher","resolvedTheme","useResolvedTheme","useMemo","data","setData","loading","setLoading","setError","useEffect","controller","fetchTextUtf8","parsed","parseJsonc","err","useImperativeHandle","RendererError"],"mappings":"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","x_google_ignoreList":[0,1,2]}