{"version":3,"sources":["jsdelivr-header.js","/npm/genpac@1.3.0/src/index.js"],"names":[],"mappings":"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","file":"/npm/genpac@1.3.0/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/genpac@1.3.0/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","const fs = require('fs');\r\n\r\nconst { get, isEmpty } = require('lodash');\r\nconst ConfigParser = require('configparser');\r\nconst request = require('request');\r\n\r\nconst packageInfo = require('../package.json');\r\nconst utils = require('./utils');\r\n\r\nconst VERSION = packageInfo.version;\r\nconst DEFAULT_URL = 'https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt';\r\n\r\nconst PAC_TPL = 'pac-tpl.js';\r\nconst PAC_TPL_MIN = 'pac-tpl.min.js';\r\nconst PAC_TPL_BASE64 = 'pac-tpl.base64.js';\r\n\r\nconst SOCKS4 = 'socks4';\r\nconst SOCKS5 = 'socks5';\r\nconst HTTP = 'http';\r\nconst PROXY_TYPES = {\r\n    SOCKS4,\r\n    SOCKS5,\r\n    HTTP,\r\n    PROXY: HTTP,\r\n    SOCKS: SOCKS4,\r\n};\r\n\r\nclass GenPAC {\r\n    constructor({\r\n        proxy = '',\r\n        output = '',\r\n        gfwlistURL = DEFAULT_URL,\r\n        gfwlistProxy = '',\r\n        gfwlistLocal = '',\r\n        updateGFWListLocal,\r\n        userRule = [],\r\n        userRuleFrom = [],\r\n        configFrom = '',\r\n        compress,\r\n        base64,\r\n    } = {}) {\r\n        this.configFrom = configFrom;\r\n\r\n        const cfg = GenPAC.readConfig(this.configFrom);\r\n        this.proxy = proxy || cfg.proxy;\r\n        this.gfwlistURL = gfwlistURL || cfg.gfwlistURL;\r\n        this.gfwlistProxy = gfwlistProxy || cfg.gfwlistProxy;\r\n\r\n        this.updateGFWListLocal = utils.convBool(\r\n            utils.checkUndefined(updateGFWListLocal, cfg.updateGFWListLocal),\r\n        );\r\n        this.compress = utils.convBool(utils.checkUndefined(compress, cfg.compress));\r\n        this.base64 = utils.convBool(utils.checkUndefined(base64, cfg.base64));\r\n\r\n        this.output = output || cfg.output;\r\n        this.gfwlistLocal = gfwlistLocal || cfg.gfwlistLocal;\r\n\r\n        this.userRule = userRule;\r\n        if (!Array.isArray(this.userRule)) {\r\n            this.userRule = [this.userRule];\r\n        }\r\n        this.userRuleFrom = !isEmpty(userRuleFrom) ? userRuleFrom : cfg.userRuleFrom;\r\n        if (!Array.isArray(this.userRuleFrom)) {\r\n            this.userRuleFrom = [this.userRuleFrom];\r\n        }\r\n\r\n        if (this.base64) {\r\n            this.compress = true;\r\n            GenPAC.logError(\r\n                'WARNING: some brower DO NOT support pac file which was encoded by base64.',\r\n            );\r\n        }\r\n\r\n        this._ret = {\r\n            version: VERSION,\r\n            proxy: this.proxy || 'DIRECT',\r\n            generated: '',\r\n            modified: '',\r\n            gfwlistFrom: '',\r\n            rules: '',\r\n        };\r\n    }\r\n\r\n    static logError(...args) {\r\n        const lastArg = args[args.length - 1];\r\n        const exit = get(lastArg, 'exit');\r\n        if (typeof exit === 'undefined') {\r\n            console.error(...args);\r\n        } else {\r\n            console.error(...args.slice(0, -1));\r\n            if (exit === true) {\r\n                process.exit(1);\r\n            }\r\n        }\r\n    }\r\n\r\n    static readConfig(configFrom) {\r\n        let cfg = {};\r\n        function getv(k, d) {\r\n            try {\r\n                return utils.strip(get(cfg, k, d), ' \\'\\t\"');\r\n            } catch (error) {\r\n                return d;\r\n            }\r\n        }\r\n        if (!configFrom) {\r\n            return cfg;\r\n        }\r\n        try {\r\n            const cfgParser = new ConfigParser();\r\n            cfgParser.read(utils.abspath(configFrom));\r\n            cfg = cfgParser.items('config');\r\n        } catch (error) {\r\n            GenPAC.logError('read config file fail.', { exit: true });\r\n        }\r\n        return {\r\n            proxy: getv('proxy', ''),\r\n            output: getv('output', ''),\r\n            gfwlistURL: getv('gfwlist-url', DEFAULT_URL),\r\n            gfwlistProxy: getv('gfwlist-proxy', ''),\r\n            gfwlistLocal: getv('gfwlist-local', ''),\r\n            userRuleFrom: getv('user-rule-from', []),\r\n            updateGFWListLocal: getv('update-gfwlist-local', true),\r\n            compress: getv('compress', false),\r\n            base64: getv('base64', false),\r\n        };\r\n    }\r\n\r\n    static parseRules(rules) {\r\n        function wildcardToRegExp(pattern) {\r\n            let p = pattern.replace(/([\\\\+|{}[\\]()^$.#])/g, String.raw`\\$1`);\r\n            // p = p.replace(/\\*+/g, '*')\r\n            p = p.replace(/\\*/g, String.raw`.*`);\r\n            p = p.replace(/\\？/g, String.raw`.`);\r\n            return p;\r\n        }\r\n\r\n        const directWildcard = [];\r\n        const directRegexp = [];\r\n        const proxyWildcard = [];\r\n        const proxyRegexp = [];\r\n\r\n        rules.forEach((l) => {\r\n            let line = utils.strip(l);\r\n\r\n            // comment\r\n            if (!line || line.startsWith('!')) {\r\n                return;\r\n            }\r\n\r\n            let isDirect = false;\r\n            let isRegexp = true;\r\n            // exception rules\r\n            if (line.startsWith('@@')) {\r\n                line = line.slice(2);\r\n                isDirect = true;\r\n            }\r\n\r\n            // regular expressions\r\n            if (line.startsWith('/') && line.endsWith('/')) {\r\n                line = line.slice(1, -1);\r\n            } else if (line.indexOf('^') !== -1) {\r\n                line = wildcardToRegExp(line);\r\n                line = line.replace(/\\\\\\^/g, String.raw`(?:[^\\w\\-.%\\u0080-\\uFFFF]|$)`);\r\n            } else if (line.startsWith('||')) {\r\n                line = wildcardToRegExp(line.slice(2));\r\n                // When using the constructor function, the normal string\r\n                // escape rules (preceding special characters with \\ when\r\n                // included in a string) are necessary.\r\n                // For example, the following are equivalent:\r\n                // re = new RegExp('\\\\w+')\r\n                // re = /\\w+/\r\n                // via: http://aptana.com/reference/api/RegExp.html\r\n                // line = r'^[\\\\w\\\\-]+:\\\\/+(?!\\\\/)(?:[^\\\\/]+\\\\.)?' + line\r\n                // JSON.stringify will escape `\\`\r\n                line = String.raw`^[\\w\\-]+:\\/+(?!\\/)(?:[^\\/]+\\.)?` + line;\r\n            } else if (line.startsWith('|') || line.endsWith('|')) {\r\n                line = wildcardToRegExp(line);\r\n                line = line.replace(/^\\\\\\|/, '^');\r\n                line = line.replace(/\\\\\\|$/g, '$');\r\n            } else {\r\n                isRegexp = false;\r\n            }\r\n\r\n            if (!isRegexp) {\r\n                line = `*${utils.strip(line, '*')}*`;\r\n            }\r\n\r\n            if (isDirect) {\r\n                if (isRegexp) {\r\n                    directRegexp.push(line);\r\n                } else {\r\n                    directWildcard.push(line);\r\n                }\r\n            } else if (isRegexp) {\r\n                proxyRegexp.push(line);\r\n            } else {\r\n                proxyWildcard.push(line);\r\n            }\r\n        });\r\n\r\n        return [directRegexp, directWildcard, proxyRegexp, proxyWildcard];\r\n    }\r\n\r\n    buildOpener() {\r\n        let proxy;\r\n        // 设置代理\r\n        if (this.gfwlistProxy) {\r\n            // format: PROXY|SOCKS|SOCKS4|SOCKS5 [USR:PWD]@HOST:PORT\r\n            const [\r\n                input,\r\n                proxyType,\r\n                proxyUser,\r\n                proxyPwd,\r\n                proxyHost,\r\n                proxyPort,\r\n            ] = this.gfwlistProxy.match(/(PROXY|SOCKS|SOCKS4|SOCKS5) (?:(.+):(.+)@)?(.+):(\\d+)/i);\r\n            proxy = `${PROXY_TYPES[proxyType.toUpperCase()]}://`;\r\n            if (proxyUser || proxyPwd) {\r\n                proxy = `${proxy}${proxyUser}:${proxyPwd}@`;\r\n            }\r\n            proxy = `${proxy}${proxyHost}:${proxyPort}`;\r\n        }\r\n        return new Promise((resolve, reject) => {\r\n            request({\r\n                method: 'get',\r\n                uri: this.gfwlistURL,\r\n                proxy,\r\n            }, (err, response, body) => {\r\n                if (err) {\r\n                    reject(err);\r\n                } else {\r\n                    resolve(body);\r\n                }\r\n            });\r\n        });\r\n    }\r\n\r\n    async fetchGFWList() {\r\n        let content = '';\r\n        try {\r\n            content = await this.buildOpener();\r\n            this._ret.gfwlistFrom = `online[${this.gfwlistURL}]`;\r\n            if (this.gfwlistLocal && this.updateGFWListLocal) {\r\n                fs.writeFile(utils.abspath(this.gfwlistLocal), content, (err) => {});\r\n            }\r\n        } catch (error) {\r\n            try {\r\n                content = fs.readFileSync(utils.abspath(this.gfwlistLocal), {\r\n                    encoding: 'utf8',\r\n                });\r\n                this._ret.gfwlistFrom = `local[${this.gfwlistLocal}]`;\r\n            } catch (err) {}\r\n        }\r\n        if (!content) {\r\n            if (this.gfwlistURL !== '-' || this.gfwlistLocal) {\r\n                GenPAC.logError('fetch gfwlist fail.', { exit: true });\r\n            } else {\r\n                this._ret.gfwlistFrom = 'unused';\r\n            }\r\n        }\r\n        try {\r\n            content = `! ${Buffer.from(content, 'base64').toString('utf8')}`;\r\n            content = utils.splitLines(content);\r\n            const lastModifiedLine = content.find(\r\n                e => e.startsWith('!') && e.includes('Last Modified'),\r\n            );\r\n            if (lastModifiedLine) {\r\n                this._ret.modified = utils.strip(\r\n                    lastModifiedLine\r\n                        .split(':')\r\n                        .slice(1)\r\n                        .join(':'),\r\n                );\r\n            }\r\n        } catch (error) {}\r\n\r\n        if (!this._ret.modified) {\r\n            this._ret.modified = '-';\r\n        }\r\n\r\n        return content;\r\n    }\r\n\r\n    fetchUserRules() {\r\n        const rules = this.userRule;\r\n        let ruleString = '';\r\n        this.userRuleFrom.forEach((f) => {\r\n            if (!f) {\r\n                return;\r\n            }\r\n            try {\r\n                ruleString = `${ruleString}\\n${fs.readFileSync(utils.abspath(f), {\r\n                    encoding: 'utf8',\r\n                })}`;\r\n            } catch (error) {\r\n                GenPAC.logError('read user rule file fail. ', f);\r\n            }\r\n        });\r\n        return rules.concat(utils.splitLines(ruleString));\r\n    }\r\n\r\n    startParse(gfwlistRules, userRules) {\r\n        const rules = [GenPAC.parseRules(userRules), GenPAC.parseRules(gfwlistRules)];\r\n        if (this.compress) {\r\n            this._ret.rules = JSON.stringify(rules);\r\n        } else {\r\n            this._ret.rules = JSON.stringify(rules, null, 4);\r\n        }\r\n        this._ret.generated = new Date();\r\n        this._ret.generated = this._ret.generated.toLocaleString();\r\n    }\r\n\r\n    outputPAC() {\r\n        const pacTpl = utils.pkgdata(this.compress ? PAC_TPL_MIN : PAC_TPL);\r\n        let content = fs.readFileSync(pacTpl, {\r\n            encoding: 'utf8',\r\n        });\r\n\r\n        content = utils.replace(content, {\r\n            __VERSION__: this._ret.version,\r\n            __GENERATED__: this._ret.generated,\r\n            __MODIFIED__: this._ret.modified,\r\n            __GFWLIST_FROM__: this._ret.gfwlistFrom,\r\n            __PROXY__: this._ret.proxy,\r\n            __RULES__: this._ret.rules,\r\n        });\r\n\r\n        if (this.base64) {\r\n            const b64 = fs.readFileSync(utils.pkgdata(PAC_TPL_BASE64), {\r\n                encoding: 'utf8',\r\n            });\r\n            content = utils.replace(b64, {\r\n                __BASE64__: Buffer.from(content).toString('base64'),\r\n                __VERSION__: this._ret.version,\r\n            });\r\n        }\r\n\r\n        if (this.output && this.output !== '-') {\r\n            fs.writeFile(utils.abspath(this.output), content, (err) => {});\r\n        } else {\r\n            console.info(content);\r\n        }\r\n    }\r\n\r\n    async generate() {\r\n        const gfwlistRules = await this.fetchGFWList();\r\n        const userRules = this.fetchUserRules();\r\n        this.startParse(gfwlistRules, userRules);\r\n        this.outputPAC();\r\n    }\r\n}\r\n\r\nmodule.exports = GenPAC;\r\n"]}