{"version":3,"sources":["jsdelivr-header.js","/npm/ssh-config@5.1.0/dist/ssh-config.js"],"names":[],"mappings":"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","file":"/npm/ssh-config@5.1.0/dist/ssh-config.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/ssh-config@5.1.0/dist/ssh-config.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n    return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.SSHConfig = exports.glob = exports.LineType = void 0;\nexports.parse = parse;\nexports.stringify = stringify;\nconst glob_ts_1 = __importDefault(require(\"./glob.js\"));\nexports.glob = glob_ts_1.default;\nconst node_child_process_1 = require(\"node:child_process\");\nconst node_os_1 = __importDefault(require(\"node:os\"));\nconst RE_SPACE = /\\s/;\nconst RE_LINE_BREAK = /\\r|\\n/;\nconst RE_SECTION_DIRECTIVE = /^(Host|Match)$/i;\nconst RE_MULTI_VALUE_DIRECTIVE = /^(GlobalKnownHostsFile|Host|IPQoS|SendEnv|UserKnownHostsFile|ProxyCommand|Match|CanonicalDomains)$/i;\nconst RE_QUOTE_DIRECTIVE = /^(?:CertificateFile|IdentityFile|IdentityAgent|User)$/i;\nconst RE_SINGLE_LINE_DIRECTIVE = /^(Include|IdentityFile)$/i;\n/**\n * A type of line in an ssh-config file. Differentiates between directives,\n * comments, and empty lines.\n */\nvar LineType;\n(function (LineType) {\n    /** line with a directive in an ssh-config file */\n    LineType[LineType[\"DIRECTIVE\"] = 1] = \"DIRECTIVE\";\n    /** line with a comment in an ssh-config file */\n    LineType[LineType[\"COMMENT\"] = 2] = \"COMMENT\";\n    /** empty line in an ssh-config file */\n    LineType[LineType[\"EMPTY\"] = 3] = \"EMPTY\";\n})(LineType || (exports.LineType = LineType = {}));\nconst REPEATABLE_DIRECTIVES = [\n    'IdentityFile',\n    'LocalForward',\n    'RemoteForward',\n    'DynamicForward',\n    'CertificateFile',\n];\nfunction compare(line, opts) {\n    // @ts-ignore\n    return opts.hasOwnProperty(line.param) && opts[line.param] === line.value;\n}\nfunction getIndent(config) {\n    for (const line of config) {\n        if (line.type === LineType.DIRECTIVE && 'config' in line) {\n            for (const subline of line.config) {\n                if (subline.before) {\n                    return subline.before;\n                }\n            }\n        }\n    }\n    return '  ';\n}\nfunction match(criteria, context) {\n    const testCriterion = (key, criterion) => {\n        switch (key.toLowerCase()) {\n            case 'all':\n                return true;\n            case 'final':\n                if (context.inFinalPass) {\n                    return true;\n                }\n                context.doFinalPass = true;\n                return false;\n            case 'exec':\n                const command = `function main {\n          ${criterion}\n        }\n        main`;\n                return (0, node_child_process_1.spawnSync)(command, { shell: true }).status === 0;\n            case 'host':\n                return (0, glob_ts_1.default)(criterion, context.params.HostName);\n            case 'originalhost':\n                return (0, glob_ts_1.default)(criterion, context.params.OriginalHost);\n            case 'user':\n                return (0, glob_ts_1.default)(criterion, context.params.User);\n            case 'localuser':\n                return (0, glob_ts_1.default)(criterion, context.params.LocalUser);\n        }\n    };\n    for (const key in criteria) {\n        const criterion = criteria[key];\n        const values = Array.isArray(criterion) ? criterion.map(({ val }) => val) : criterion;\n        if (!testCriterion(key, values)) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Represents parsed SSH config. Main element of this library.\n *\n * A parsed SSH config is modelled as an array of {@link Line}s.\n */\nclass SSHConfig extends Array {\n    /** shortcut to access {@link LineType.DIRECTIVE} */\n    static DIRECTIVE = LineType.DIRECTIVE;\n    /** shortcut to access {@link LineType.COMMENT} */\n    static COMMENT = LineType.COMMENT;\n    /** shortcut to access {@link LineType.EMPTY} */\n    static EMPTY = LineType.EMPTY;\n    /**\n     * Parse SSH config text into structured object.\n     */\n    static parse(text) {\n        return parse(text);\n    }\n    /**\n     * Stringify structured object into SSH config text.\n     */\n    static stringify(config) {\n        return stringify(config);\n    }\n    compute(opts, computeOpts) {\n        if (typeof opts === 'string')\n            opts = { Host: opts };\n        let userInfo;\n        try {\n            userInfo = node_os_1.default.userInfo();\n        }\n        catch {\n            // os.userInfo() throws a SystemError if a user has no username or homedir.\n            userInfo = { username: process.env.USER || process.env.USERNAME || '' };\n        }\n        const context = {\n            params: {\n                Host: opts.Host,\n                HostName: opts.Host,\n                OriginalHost: opts.Host,\n                User: userInfo.username,\n                LocalUser: userInfo.username,\n            },\n            inFinalPass: false,\n            doFinalPass: false,\n        };\n        const obj = {};\n        const setProperty = (name, value) => {\n            const key = computeOpts?.ignoreCase ? name.toLowerCase() : name;\n            let val;\n            if (Array.isArray(value)) {\n                if (/ProxyCommand/i.test(key)) {\n                    val = value.map(({ val, separator, quoted }) => {\n                        return `${separator}${quoted ? `\"${val.replace(/\"/g, '\\\\\"')}\"` : val}`;\n                    }).join('').trim();\n                }\n                else {\n                    val = value.map(({ val }) => val);\n                }\n            }\n            else {\n                val = value;\n            }\n            const val0 = Array.isArray(val) ? val[0] : val;\n            // Use case-insensitive check for repeatable directives\n            const isRepeatable = REPEATABLE_DIRECTIVES.some(d => d.toLowerCase() === name.toLowerCase());\n            if (isRepeatable) {\n                const list = (obj[key] || (obj[key] = []));\n                list.push(...[].concat(val));\n            }\n            else if (obj[key] == null) {\n                if (name === 'HostName') {\n                    context.params.HostName = val0;\n                }\n                else if (name === 'User') {\n                    context.params.User = val0;\n                }\n                obj[key] = val;\n            }\n        };\n        if (opts.User !== undefined) {\n            setProperty('User', opts.User);\n        }\n        const doPass = () => {\n            for (const line of this) {\n                if (line.type !== LineType.DIRECTIVE)\n                    continue;\n                // Host and Match directives are always case-insensitive (per OpenSSH behavior)\n                if (/^host$/i.test(line.param) && (0, glob_ts_1.default)(Array.isArray(line.value) ? line.value.map(({ val }) => val) : line.value, context.params.Host)) {\n                    let canonicalizeHostName = false;\n                    let canonicalDomains = [];\n                    setProperty(line.param, line.value);\n                    for (const subline of line.config) {\n                        if (subline.type === LineType.DIRECTIVE) {\n                            setProperty(subline.param, subline.value);\n                            if (/^CanonicalizeHostName$/i.test(subline.param) && subline.value === 'yes') {\n                                canonicalizeHostName = true;\n                            }\n                            if (/^CanonicalDomains$/i.test(subline.param) && Array.isArray(subline.value)) {\n                                canonicalDomains = subline.value.map(({ val }) => val);\n                            }\n                        }\n                    }\n                    if (canonicalDomains.length > 0 && canonicalizeHostName && context.params.Host === context.params.OriginalHost) {\n                        for (const domain of canonicalDomains) {\n                            const host = `${context.params.OriginalHost}.${domain}`;\n                            const { status, stderr } = (0, node_child_process_1.spawnSync)('nslookup', [host]);\n                            if (status === 0 && !/can't find/.test(stderr.toString())) {\n                                context.params.Host = host;\n                                setProperty('Host', host);\n                                doPass();\n                                break;\n                            }\n                        }\n                    }\n                }\n                else if (/^match$/i.test(line.param) && 'criteria' in line && match(line.criteria, context)) {\n                    for (const subline of line.config) {\n                        if (subline.type === LineType.DIRECTIVE) {\n                            setProperty(subline.param, subline.value);\n                        }\n                    }\n                }\n                else if (!/^(host|match)$/i.test(line.param)) {\n                    setProperty(line.param, line.value);\n                }\n            }\n        };\n        doPass();\n        if (context.doFinalPass) {\n            context.inFinalPass = true;\n            context.params.Host = context.params.HostName;\n            doPass();\n        }\n        return obj;\n    }\n    find(opts) {\n        if (typeof opts === 'function')\n            return super.find(opts);\n        if (!(opts && ('Host' in opts || 'Match' in opts))) {\n            throw new Error('Can only find by Host or Match');\n        }\n        return super.find((line) => 'param' in line && compare(line, opts));\n    }\n    remove(opts) {\n        let index;\n        if (typeof opts === 'function') {\n            index = super.findIndex(opts);\n        }\n        else if (!(opts && ('Host' in opts || 'Match' in opts))) {\n            throw new Error('Can only remove by Host or Match');\n        }\n        else {\n            index = super.findIndex((line) => 'param' in line && compare(line, opts));\n        }\n        if (index >= 0)\n            return this.splice(index, 1);\n    }\n    /**\n     * Convert this SSH config to its textual presentation via {@link stringify}.\n     */\n    toString() {\n        return stringify(this);\n    }\n    /**\n     * Append new section to existing SSH config.\n     */\n    append(opts) {\n        const indent = getIndent(this);\n        const lastEntry = this.length > 0 ? this[this.length - 1] : null;\n        let config = lastEntry && lastEntry.config || this;\n        let configWas = this;\n        let lastLine = config.length > 0 ? config[config.length - 1] : lastEntry;\n        if (lastLine && !lastLine.after)\n            lastLine.after = '\\n';\n        let sectionLineFound = config !== configWas;\n        for (const param in opts) {\n            const value = opts[param];\n            const line = {\n                type: LineType.DIRECTIVE,\n                param,\n                separator: ' ',\n                value: Array.isArray(value) ? value.map((val, i) => ({ val, separator: i === 0 ? '' : ' ' })) : value,\n                before: sectionLineFound ? indent : indent.replace(/  |\\t/, ''),\n                after: '\\n',\n            };\n            if (RE_SECTION_DIRECTIVE.test(param)) {\n                sectionLineFound = true;\n                line.before = indent.replace(/  |\\t/, '');\n                config = configWas;\n                // separate sections with an extra newline\n                // https://github.com/cyjake/ssh-config/issues/23#issuecomment-564768248\n                if (lastLine && lastLine.after === '\\n')\n                    lastLine.after += '\\n';\n                config.push(line);\n                config = line.config = new SSHConfig();\n            }\n            else {\n                config.push(line);\n            }\n            lastLine = line;\n        }\n        return configWas;\n    }\n    /**\n     * Prepend new section to existing SSH config.\n     */\n    prepend(opts, beforeFirstSection = false) {\n        const indent = getIndent(this);\n        let config = this;\n        let i = 0;\n        // insert above known sections\n        if (beforeFirstSection) {\n            while (i < this.length && !('config' in this[i])) {\n                i += 1;\n            }\n            if (i >= this.length) { // No sections in original config\n                return this.append(opts);\n            }\n        }\n        // Prepend new section above the first section\n        let sectionLineFound = false;\n        let processedLines = 0;\n        for (const param in opts) {\n            processedLines += 1;\n            const value = opts[param];\n            const line = {\n                type: LineType.DIRECTIVE,\n                param,\n                separator: ' ',\n                value: Array.isArray(value) ? value.map((val, i) => ({ val, separator: i === 0 ? '' : ' ' })) : value,\n                before: '',\n                after: '\\n',\n            };\n            if (RE_SECTION_DIRECTIVE.test(param)) {\n                line.before = indent.replace(/  |\\t/, '');\n                config.splice(i, 0, line);\n                config = line.config = new SSHConfig();\n                sectionLineFound = true;\n                continue;\n            }\n            // separate from previous sections with an extra newline\n            if (processedLines === Object.keys(opts).length) {\n                line.after += '\\n';\n            }\n            if (!sectionLineFound) {\n                config.splice(i, 0, line);\n                i += 1;\n                // Add an extra newline if a single line directive like Include\n                if (RE_SINGLE_LINE_DIRECTIVE.test(param)) {\n                    line.after += '\\n';\n                }\n                continue;\n            }\n            line.before = indent;\n            config.push(line);\n        }\n        return config;\n    }\n}\nexports.default = SSHConfig;\nexports.SSHConfig = SSHConfig;\n/**\n * Parse SSH config text into structured object.\n */\nfunction parse(text) {\n    // Handle Buffer input by converting to string\n    const input = typeof text === 'string' ? text : text.toString('utf-8');\n    let i = 0;\n    let chr = next();\n    let config = new SSHConfig();\n    let configWas = config;\n    function next() {\n        return input[i++];\n    }\n    function space() {\n        let spaces = '';\n        while (RE_SPACE.test(chr)) {\n            spaces += chr;\n            chr = next();\n        }\n        return spaces;\n    }\n    function linebreak() {\n        let breaks = '';\n        while (RE_LINE_BREAK.test(chr)) {\n            breaks += chr;\n            chr = next();\n        }\n        return breaks;\n    }\n    function parameter() {\n        let param = '';\n        while (chr && /[^ \\t=]/.test(chr)) {\n            param += chr;\n            chr = next();\n        }\n        return param;\n    }\n    function separator() {\n        let sep = space();\n        if (chr === '=') {\n            sep += chr;\n            chr = next();\n        }\n        return (sep + space());\n    }\n    function value() {\n        let val = '';\n        let quoted = false;\n        let escaped = false;\n        while (chr && !RE_LINE_BREAK.test(chr)) {\n            // backslash escapes only double quotes\n            if (escaped) {\n                val += chr === '\"' ? chr : `\\\\${chr}`;\n                escaped = false;\n            }\n            // ProxyCommand ssh -W \"%h:%p\" firewall.example.org\n            else if (chr === '\"' && (!val || quoted)) {\n                quoted = !quoted;\n            }\n            else if (chr === '\\\\') {\n                escaped = true;\n            }\n            else if (chr === '#' && !quoted) {\n                break;\n            }\n            else {\n                val += chr;\n            }\n            chr = next();\n        }\n        if (quoted || escaped) {\n            throw new Error(`Unexpected line break at ${val}`);\n        }\n        return val.trim();\n    }\n    function comment() {\n        const type = LineType.COMMENT;\n        let content = '';\n        while (chr && !RE_LINE_BREAK.test(chr)) {\n            content += chr;\n            chr = next();\n        }\n        return { type, content, before: '', after: '' };\n    }\n    // Host *.co.uk\n    // Host * !local.dev\n    // Host \"foo bar\"\n    function values() {\n        const results = [];\n        let val = '';\n        // whether current value is quoted or not\n        let valQuoted = false;\n        // the separator preceding current value\n        let valSeparator = ' ';\n        // whether current context is within quotations or not\n        let quoted = false;\n        let escaped = false;\n        while (chr && !RE_LINE_BREAK.test(chr)) {\n            if (escaped) {\n                val += chr === '\"' ? chr : `\\\\${chr}`;\n                escaped = false;\n            }\n            else if (chr === '\"') {\n                quoted = !quoted;\n            }\n            else if (chr === '\\\\') {\n                escaped = true;\n            }\n            else if (quoted) {\n                val += chr;\n                valQuoted = true;\n            }\n            else if (/[ \\t=]/.test(chr)) {\n                if (val) {\n                    results.push({ val, separator: valSeparator, quoted: valQuoted });\n                    val = '';\n                    valQuoted = false;\n                    valSeparator = chr;\n                }\n                // otherwise ignore the space\n            }\n            else if (chr === '#' && results.length > 0) {\n                break;\n            }\n            else {\n                val += chr;\n            }\n            chr = next();\n        }\n        if (quoted || escaped) {\n            throw new Error(`Unexpected line break at ${results.map(({ val }) => val).concat(val).join(' ')}`);\n        }\n        if (val)\n            results.push({ val, separator: valSeparator, quoted: valQuoted });\n        return results.length > 1 ? results : results[0].val;\n    }\n    function directive() {\n        const type = LineType.DIRECTIVE;\n        const param = parameter();\n        // Host \"foo bar\" baz\n        const multiple = RE_MULTI_VALUE_DIRECTIVE.test(param);\n        const result = {\n            type,\n            param,\n            separator: separator(),\n            quoted: !multiple && chr === '\"',\n            value: multiple ? values() : value(),\n            before: '',\n            after: '',\n        };\n        if (!result.quoted)\n            delete result.quoted;\n        if (/^Match$/i.test(param)) {\n            const criteria = {};\n            if (typeof result.value === 'string') {\n                result.value = [{ val: result.value, separator: '', quoted: result.quoted }];\n            }\n            let i = 0;\n            while (i < result.value.length) {\n                const { val: keyword } = result.value[i];\n                switch (keyword.toLowerCase()) {\n                    case 'all':\n                    case 'canonical':\n                    case 'final':\n                        criteria[keyword] = [];\n                        i += 1;\n                        break;\n                    default:\n                        if (i + 1 >= result.value.length) {\n                            throw new Error(`Missing value for match criteria ${keyword}`);\n                        }\n                        criteria[keyword] = result.value[i + 1].val;\n                        i += 2;\n                        break;\n                }\n            }\n            result.criteria = criteria;\n        }\n        return result;\n    }\n    function line() {\n        const before = space();\n        const node = chr === '#' ? comment() : directive();\n        const after = linebreak();\n        node.before = before;\n        node.after = after;\n        return node;\n    }\n    while (chr) {\n        let node = line();\n        if (node.type === LineType.DIRECTIVE && RE_SECTION_DIRECTIVE.test(node.param)) {\n            config = configWas;\n            config.push(node);\n            config = node.config = new SSHConfig();\n        }\n        else if (node.type === LineType.DIRECTIVE && !node.param) {\n            // blank lines at file end\n            if (config.length === 0) {\n                if (configWas.length === 0) {\n                    configWas.push({ type: LineType.EMPTY, before: '', after: node.before });\n                }\n                else {\n                    configWas[configWas.length - 1].after += node.before;\n                }\n            }\n            else {\n                config[config.length - 1].after += node.before;\n            }\n        }\n        else {\n            config.push(node);\n        }\n    }\n    return configWas;\n}\n/**\n * Stringify structured object into SSH config text.\n */\nfunction stringify(config) {\n    let str = '';\n    function formatValue(value, quoted) {\n        if (Array.isArray(value)) {\n            let result = '';\n            for (const { val, separator, quoted } of value) {\n                result += (result ? separator : '') + formatValue(val, quoted || RE_SPACE.test(val));\n            }\n            return result;\n        }\n        return quoted ? `\"${value}\"` : value;\n    }\n    function formatDirective(line) {\n        const quoted = line.quoted\n            || (RE_QUOTE_DIRECTIVE.test(line.param) && typeof line.value === 'string' && RE_SPACE.test(line.value));\n        const value = formatValue(line.value, quoted);\n        return `${line.param}${line.separator}${value}`;\n    }\n    const format = (line) => {\n        str += line.before;\n        if (line.type === LineType.COMMENT) {\n            str += line.content;\n        }\n        else if (line.type === LineType.DIRECTIVE && REPEATABLE_DIRECTIVES.includes(line.param)) {\n            (Array.isArray(line.value) ? line.value : [line.value]).forEach((value, i, values) => {\n                str += formatDirective({ ...line, value: typeof value !== 'string' ? value.val : value });\n                if (i < values.length - 1)\n                    str += `\\n${line.before}`;\n            });\n        }\n        else if (line.type === LineType.DIRECTIVE) {\n            str += formatDirective(line);\n        }\n        str += line.after;\n        if ('config' in line) {\n            line.config.forEach(format);\n        }\n    };\n    config.forEach(format);\n    return str;\n}\n"]}