{"version":3,"sources":["jsdelivr-header.js","/npm/mysqldump@3.2.0/dist/cjs.js"],"names":[],"mappings":"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","file":"/npm/mysqldump@3.2.0/dist/cjs.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.19.2.\n * Original file: /npm/mysqldump@3.2.0/dist/cjs.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';\n\nvar fs = require('fs');\nvar deepmerge = require('deepmerge');\nvar sqlformatter = require('sql-formatter');\nvar mysql = require('mysql2');\nvar sqlstring = require('sqlstring');\nvar zlib = require('zlib');\nvar mysql$1 = require('mysql2/promise');\n\n/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\nfunction __awaiter(thisArg, _arguments, P, generator) {\r\n    return new (P || (P = Promise))(function (resolve, reject) {\r\n        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n        function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n        function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n        step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n    });\r\n}\n\nfunction getTables(connection, dbName, restrictedTables, restrictedTablesIsBlacklist) {\r\n    return __awaiter(this, void 0, void 0, function* () {\r\n        // list the tables\r\n        const showTablesKey = `Tables_in_${dbName}`;\r\n        const tablesRes = yield connection.query(`SHOW FULL TABLES FROM \\`${dbName}\\``);\r\n        const actualTables = tablesRes.map(r => ({\r\n            name: r[showTablesKey].replace(/'/g, ''),\r\n            schema: null,\r\n            data: null,\r\n            isView: r.Table_type === 'VIEW',\r\n            columns: {},\r\n            columnsOrdered: [],\r\n            triggers: [],\r\n        }));\r\n        let tables = actualTables;\r\n        if (restrictedTables.length > 0) {\r\n            if (restrictedTablesIsBlacklist) {\r\n                // exclude the tables from the options that actually exist in the db\r\n                tables = tables.filter(t => restrictedTables.indexOf(t.name) === -1);\r\n            }\r\n            else {\r\n                // only include the tables from the options that actually exist in the db\r\n                // keeping the order of the passed-in whitelist and filtering out non-existing tables\r\n                tables = restrictedTables\r\n                    .map(tableName => actualTables.find(t => t.name === tableName))\r\n                    .filter((t) => t !== undefined);\r\n            }\r\n        }\r\n        // get the column definitions\r\n        const columnsMultiQuery = tables\r\n            .map(t => `SHOW COLUMNS FROM \\`${t.name}\\` FROM \\`${dbName}\\`;`)\r\n            .join('\\n');\r\n        const columns = yield connection.multiQuery(columnsMultiQuery);\r\n        columns.forEach((cols, i) => {\r\n            tables[i].columns = cols.reduce((acc, c) => {\r\n                acc[c.Field] = {\r\n                    type: c.Type\r\n                        // split to remove things like 'unsigned' from the string\r\n                        .split(' ')[0]\r\n                        // split to remove the lengths\r\n                        .split('(')[0]\r\n                        .toLowerCase(),\r\n                    nullable: c.Null === 'YES',\r\n                };\r\n                return acc;\r\n            }, {});\r\n            tables[i].columnsOrdered = cols.map(c => c.Field);\r\n        });\r\n        return tables;\r\n    });\r\n}\n\nfunction isCreateView(v) {\r\n    return 'View' in v;\r\n}\r\nfunction getSchemaDump(connection, options, tables) {\r\n    return __awaiter(this, void 0, void 0, function* () {\r\n        const format$$1 = options.format\r\n            ? (sql) => sqlformatter.format(sql)\r\n            : (sql) => sql;\r\n        // we create a multi query here so we can query all at once rather than in individual connections\r\n        const getSchemaMultiQuery = tables\r\n            .map(t => `SHOW CREATE TABLE \\`${t.name}\\`;`)\r\n            .join('\\n');\r\n        const createStatements = (yield connection.multiQuery(getSchemaMultiQuery))\r\n            // mysql2 returns an array of arrays which will all have our one row\r\n            .map(r => r[0])\r\n            .map((res, i) => {\r\n            const table = tables[i];\r\n            if (isCreateView(res)) {\r\n                return Object.assign({}, table, { name: res.View, schema: format$$1(res['Create View']), data: null, isView: true });\r\n            }\r\n            return Object.assign({}, table, { name: res.Table, schema: format$$1(res['Create Table']), data: null, isView: false });\r\n        })\r\n            .map(s => {\r\n            // clean up the generated SQL as per the options\r\n            if (!options.autoIncrement) {\r\n                s.schema = s.schema.replace(/AUTO_INCREMENT\\s*=\\s*\\d+ /g, '');\r\n            }\r\n            if (!options.engine) {\r\n                s.schema = s.schema.replace(/ENGINE\\s*=\\s*\\w+ /, '');\r\n            }\r\n            if (s.isView) {\r\n                if (options.view.createOrReplace) {\r\n                    s.schema = s.schema.replace(/^CREATE/, 'CREATE OR REPLACE');\r\n                }\r\n                if (!options.view.algorithm) {\r\n                    s.schema = s.schema.replace(/^CREATE( OR REPLACE)? ALGORITHM[ ]?=[ ]?\\w+/, 'CREATE$1');\r\n                }\r\n                if (!options.view.definer) {\r\n                    s.schema = s.schema.replace(/^CREATE( OR REPLACE)?( ALGORITHM[ ]?=[ ]?\\w+)? DEFINER[ ]?=[ ]?.+?@.+?( )/, 'CREATE$1$2$3');\r\n                }\r\n                if (!options.view.sqlSecurity) {\r\n                    s.schema = s.schema.replace(\r\n                    // eslint-disable-next-line max-len\r\n                    /^CREATE( OR REPLACE)?( ALGORITHM[ ]?=[ ]?\\w+)?( DEFINER[ ]?=[ ]?.+?@.+)? SQL SECURITY (?:DEFINER|INVOKER)/, 'CREATE$1$2$3');\r\n                }\r\n            }\r\n            else {\r\n                if (options.table.dropIfExist) {\r\n                    s.schema = s.schema.replace(/^CREATE TABLE/, `DROP TABLE IF EXISTS \\`${s.name}\\`;\\nCREATE TABLE`);\r\n                }\r\n                else if (options.table.ifNotExist) {\r\n                    s.schema = s.schema.replace(/^CREATE TABLE/, 'CREATE TABLE IF NOT EXISTS');\r\n                }\r\n                if (options.table.charset === false) {\r\n                    s.schema = s.schema.replace(/( )?(DEFAULT )?(CHARSET|CHARACTER SET) = \\w+/, '');\r\n                }\r\n            }\r\n            // fix up binary/hex default values if formatted\r\n            if (options.format) {\r\n                s.schema = s.schema\r\n                    // fix up binary and hex strings\r\n                    .replace(/DEFAULT b '(\\d+)'/g, \"DEFAULT b'$1'\")\r\n                    .replace(/DEFAULT X '(\\d+)'/g, \"DEFAULT X'$1'\")\r\n                    // fix up set defs which get split over two lines and then cause next lines to be extra indented\r\n                    .replace(/\\n {2}set/g, ' set')\r\n                    .replace(/ {4}/g, '  ');\r\n            }\r\n            // add a semicolon to separate schemas\r\n            s.schema += ';';\r\n            // pad the sql with a header\r\n            s.schema = [\r\n                '# ------------------------------------------------------------',\r\n                `# SCHEMA DUMP FOR TABLE: ${s.name}`,\r\n                '# ------------------------------------------------------------',\r\n                '',\r\n                s.schema,\r\n                '',\r\n            ].join('\\n');\r\n            return s;\r\n        })\r\n            .sort((a, b) => {\r\n            // sort the views to be last\r\n            if (a.isView && !b.isView) {\r\n                return 1;\r\n            }\r\n            if (!a.isView && b.isView) {\r\n                return -1;\r\n            }\r\n            return 0;\r\n        });\r\n        return createStatements;\r\n    });\r\n}\n\nfunction getTriggerDump(connection, dbName, options, tables) {\r\n    return __awaiter(this, void 0, void 0, function* () {\r\n        const triggers = (yield connection.query(`SHOW TRIGGERS FROM \\`${dbName}\\``))\r\n            // only include triggers from the tables that we have\r\n            .filter(trig => tables.some(t => t.name === trig.Table))\r\n            // convert to a trigger name => table index map for easy lookup\r\n            .reduce((acc, trig) => {\r\n            tables.some((t, i) => {\r\n                if (t.name === trig.Table) {\r\n                    acc.set(trig.Trigger, i);\r\n                    return true;\r\n                }\r\n                return false;\r\n            });\r\n            return acc;\r\n        }, new Map());\r\n        if (triggers.size === 0) {\r\n            // no triggers to process\r\n            return tables;\r\n        }\r\n        // we create a multi query here so we can query all at once rather than in individual connections\r\n        const getSchemaMultiQuery = [];\r\n        triggers.forEach((_, t) => getSchemaMultiQuery.push(`SHOW CREATE TRIGGER \\`${t}\\`;`));\r\n        const result = yield connection.multiQuery(getSchemaMultiQuery.join('\\n'));\r\n        // mysql2 returns an array of arrays which will all have our one row\r\n        result\r\n            .map(r => r[0])\r\n            .forEach(res => {\r\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n            const table = tables[triggers.get(res.Trigger)];\r\n            // clean up the generated SQL\r\n            let sql = `${res['SQL Original Statement']}`;\r\n            if (!options.definer) {\r\n                sql = sql.replace(/CREATE DEFINER=.+?@.+? /, 'CREATE ');\r\n            }\r\n            // add the delimiter in case it's a multi statement trigger\r\n            if (options.delimiter) {\r\n                sql = `DELIMITER ${options.delimiter}\\n${sql}${options.delimiter}\\nDELIMITER ;`;\r\n            }\r\n            else {\r\n                // else just add a semicolon\r\n                sql = `${sql};`;\r\n            }\r\n            // drop trigger statement should go outside the delimiter mods\r\n            if (options.dropIfExist) {\r\n                sql = `DROP TRIGGER IF EXISTS ${res.Trigger};\\n${sql}`;\r\n            }\r\n            // add a header to the trigger\r\n            sql = [\r\n                '# ------------------------------------------------------------',\r\n                `# TRIGGER DUMP FOR: ${res.Trigger}`,\r\n                '# ------------------------------------------------------------',\r\n                '',\r\n                sql,\r\n                '',\r\n            ].join('\\n');\r\n            table.triggers.push(sql);\r\n            return table;\r\n        });\r\n        return tables;\r\n    });\r\n}\n\nconst numberTypes = new Set([\r\n    'integer',\r\n    'int',\r\n    'smallint',\r\n    'tinyint',\r\n    'mediumint',\r\n    'bigint',\r\n    'decimal',\r\n    'numeric',\r\n    'float',\r\n    'double',\r\n    'real',\r\n]);\r\nconst stringTypes = new Set([\r\n    'date',\r\n    'datetime',\r\n    'timestamp',\r\n    'time',\r\n    'year',\r\n    'char',\r\n    'varchar',\r\n    'text',\r\n    'mediumtext',\r\n    'longtext',\r\n    'tinytext',\r\n    'set',\r\n    'enum',\r\n    'json',\r\n]);\r\nconst bitTypes = new Set(['bit']);\r\nconst hexTypes = new Set([\r\n    'blob',\r\n    'tinyblob',\r\n    'mediumblob',\r\n    'longblob',\r\n    'binary',\r\n    'varbinary',\r\n]);\r\nconst geometryTypes = new Set([\r\n    'point',\r\n    'linestring',\r\n    'polygon',\r\n    'multipoint',\r\n    'multilinestring',\r\n    'multipolygon',\r\n    'geometrycollection',\r\n]);\r\nfunction resolveType(columnType) {\r\n    if (numberTypes.has(columnType)) {\r\n        return 'NUMBER';\r\n    }\r\n    if (stringTypes.has(columnType)) {\r\n        return 'STRING';\r\n    }\r\n    if (hexTypes.has(columnType)) {\r\n        return 'HEX';\r\n    }\r\n    if (geometryTypes.has(columnType)) {\r\n        return 'GEOMETRY';\r\n    } // shouldn't ever happen\r\n    /* istanbul ignore else */ if (bitTypes.has(columnType)) {\r\n        return 'BIT';\r\n    } // shouldn't ever happen\r\n    /* istanbul ignore next */ throw new Error(`UNKNOWN TYPE \"${columnType}\"`);\r\n}\n\n// adapted from https://github.com/mysqljs/mysql/blob/master/lib/protocol/Parser.js\r\n// changes:\r\n// - cleaned up to use const/let + types\r\n// - reduced duplication\r\n// - made it return a string rather than an object/array\r\nfunction parseGeometryValue(buffer) {\r\n    let offset = 4;\r\n    const geomConstructors = {\r\n        1: 'POINT',\r\n        2: 'LINESTRING',\r\n        3: 'POLYGON',\r\n        4: 'MULTIPOINT',\r\n        5: 'MULTILINESTRING',\r\n        6: 'MULTIPOLYGON',\r\n        7: 'GEOMETRYCOLLECTION',\r\n    };\r\n    function readDouble(byteOrder) {\r\n        /* istanbul ignore next */ // ignore coverage for this line as it depends on internal db config\r\n        const val = byteOrder\r\n            ? buffer.readDoubleLE(offset)\r\n            : buffer.readDoubleBE(offset);\r\n        offset += 8;\r\n        return val;\r\n    }\r\n    function readUInt32(byteOrder) {\r\n        /* istanbul ignore next */ // ignore coverage for this line as it depends on internal db config\r\n        const val = byteOrder\r\n            ? buffer.readUInt32LE(offset)\r\n            : buffer.readUInt32BE(offset);\r\n        offset += 4;\r\n        return val;\r\n    }\r\n    // eslint-disable-next-line complexity\r\n    function parseGeometry() {\r\n        let result = [];\r\n        const byteOrder = buffer.readUInt8(offset);\r\n        offset += 1;\r\n        const wkbType = readUInt32(byteOrder);\r\n        switch (wkbType) {\r\n            case 1: {\r\n                // WKBPoint - POINT(1 1)\r\n                const x = readDouble(byteOrder);\r\n                const y = readDouble(byteOrder);\r\n                result.push(`${x} ${y}`);\r\n                break;\r\n            }\r\n            case 2: {\r\n                // WKBLineString - LINESTRING(0 0,1 1,2 2)\r\n                const numPoints = readUInt32(byteOrder);\r\n                result = [];\r\n                for (let i = numPoints; i > 0; i -= 1) {\r\n                    const x = readDouble(byteOrder);\r\n                    const y = readDouble(byteOrder);\r\n                    result.push(`${x} ${y}`);\r\n                }\r\n                break;\r\n            }\r\n            case 3: {\r\n                // WKBPolygon - POLYGON((0 0,10 0,10 10,0 10,0 0),(5 5,7 5,7 7,5 7, 5 5))\r\n                const numRings = readUInt32(byteOrder);\r\n                result = [];\r\n                for (let i = numRings; i > 0; i -= 1) {\r\n                    const numPoints = readUInt32(byteOrder);\r\n                    const line = [];\r\n                    for (let j = numPoints; j > 0; j -= 1) {\r\n                        const x = readDouble(byteOrder);\r\n                        const y = readDouble(byteOrder);\r\n                        line.push(`${x} ${y}`);\r\n                    }\r\n                    result.push(`(${line.join(',')})`);\r\n                }\r\n                break;\r\n            }\r\n            case 4: // WKBMultiPoint\r\n            case 5: // WKBMultiLineString\r\n            case 6: // WKBMultiPolygon\r\n            case 7: {\r\n                // WKBGeometryCollection - GEOMETRYCOLLECTION(POINT(1 1),LINESTRING(0 0,1 1,2 2,3 3,4 4))\r\n                const num = readUInt32(byteOrder);\r\n                result = [];\r\n                for (let i = num; i > 0; i -= 1) {\r\n                    let geom = parseGeometry();\r\n                    // remove the function name from the sub geometry declaration from the multi declaration\r\n                    // eslint-disable-next-line default-case\r\n                    switch (wkbType) {\r\n                        case 4: // WKBMultiPoint\r\n                            // multipoint = MULTIPOINT(\\d+ \\d+, \\d+ \\d+....)\r\n                            geom = geom.replace(/POINT\\((.+)\\)/, '$1');\r\n                            break;\r\n                        case 5: // WKBMultiLineString\r\n                            geom = geom.replace('LINESTRING', '');\r\n                            break;\r\n                        case 6: // WKBMultiPolygon\r\n                            geom = geom.replace('POLYGON', '');\r\n                            break;\r\n                    }\r\n                    result.push(geom);\r\n                }\r\n                break;\r\n            } // this case shouldn't happen ever\r\n            /* istanbul ignore next */ default:\r\n                throw new Error(`Unexpected WKBGeometry Type: ${wkbType}`);\r\n        }\r\n        return `${geomConstructors[wkbType]}(${result.join(',')})`;\r\n    }\r\n    return `GeomFromText('${parseGeometry()}')`;\r\n}\r\nfunction intToBit(int) {\r\n    let bits = int.toString(2);\r\n    while (bits.length < 8) {\r\n        bits = `0${bits}`;\r\n    }\r\n    return bits;\r\n}\r\n/**\r\n * sql-formatter doesn't support hex/binary literals\r\n * so we wrap them in this fake function call which gets removed later\r\n */\r\nfunction noformatWrap(str) {\r\n    return `NOFORMAT_WRAP(\"##${str}##\")`;\r\n}\r\nconst DBNULL = 'NULL';\r\nfunction typeCast(tables) {\r\n    const tablesByName = tables.reduce((acc, t) => {\r\n        acc.set(t.name, t);\r\n        return acc;\r\n    }, new Map());\r\n    // eslint-disable-next-line complexity\r\n    return (field) => {\r\n        // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n        const table = tablesByName.get(field.table);\r\n        const columnType = resolveType(table.columns[field.name].type);\r\n        let value = ''; // the else case shouldn't happen ever\r\n        /* istanbul ignore else */ if (columnType === 'GEOMETRY') {\r\n            // parse and convert the binary representation to a nice string\r\n            const buf = field.buffer();\r\n            if (buf == null) {\r\n                value = null;\r\n            }\r\n            else {\r\n                value = parseGeometryValue(buf);\r\n            }\r\n        }\r\n        else if (columnType === 'STRING') {\r\n            // sanitize the string types\r\n            value = sqlstring.escape(field.string());\r\n        }\r\n        else if (columnType === 'BIT') {\r\n            // bit fields have a binary representation we have to deal with\r\n            const buf = field.buffer();\r\n            if (buf == null) {\r\n                value = null;\r\n            }\r\n            else {\r\n                // represent a binary literal (b'010101')\r\n                const numBytes = buf.length;\r\n                let bitString = '';\r\n                for (let i = 0; i < numBytes; i += 1) {\r\n                    const int8 = buf.readUInt8(i);\r\n                    bitString += intToBit(int8);\r\n                }\r\n                // truncate the bit string to the field length\r\n                bitString = bitString.substr(-field.length);\r\n                value = noformatWrap(`b'${bitString}'`);\r\n            }\r\n        }\r\n        else if (columnType === 'HEX') {\r\n            // binary blobs\r\n            const buf = field.buffer();\r\n            if (buf == null) {\r\n                value = null;\r\n            }\r\n            else {\r\n                // represent a hex literal (X'AF12')\r\n                const numBytes = buf.length;\r\n                let hexString = '';\r\n                for (let i = 0; i < numBytes; i += 1) {\r\n                    const int8 = buf.readUInt8(i);\r\n                    const hex = int8.toString(16);\r\n                    if (hex.length < 2) {\r\n                        hexString += '0';\r\n                    }\r\n                    hexString += hex;\r\n                }\r\n                value = noformatWrap(`X'${hexString}'`);\r\n            }\r\n        }\r\n        else if (columnType === 'NUMBER') {\r\n            value = field.string();\r\n        }\r\n        else {\r\n            throw new Error(`Unknown column type detected: ${columnType}`);\r\n        }\r\n        // handle nulls\r\n        if (value == null) {\r\n            value = DBNULL;\r\n        }\r\n        return value;\r\n    };\r\n}\n\nfunction buildInsert(table, values, format$$1) {\r\n    const sql = format$$1([\r\n        `INSERT INTO \\`${table.name}\\` (\\`${table.columnsOrdered.join('`,`')}\\`)`,\r\n        `VALUES ${values.join(',')};`,\r\n    ].join(' '));\r\n    // sql-formatter lib doesn't support the X'aaff' or b'01010' literals, and it adds a space in and breaks them\r\n    // this undoes the wrapping we did to get around the formatting\r\n    return sql.replace(/NOFORMAT_WRAP\\(\"##(.+?)##\"\\)/g, '$1');\r\n}\r\nfunction buildInsertValue(row, table) {\r\n    return `(${table.columnsOrdered.map(c => row[c]).join(',')})`;\r\n}\r\nfunction executeSql(connection, sql) {\r\n    return new Promise((resolve, reject) => connection.query(sql, err => err ? /* istanbul ignore next */ reject(err) : resolve()));\r\n}\r\n// eslint-disable-next-line complexity\r\nfunction getDataDump(connectionOptions, options, tables, dumpToFile) {\r\n    return __awaiter(this, void 0, void 0, function* () {\r\n        // ensure we have a non-zero max row option\r\n        options.maxRowsPerInsertStatement = Math.max(options.maxRowsPerInsertStatement, 0);\r\n        // clone the array\r\n        tables = [...tables];\r\n        // build the format function if requested\r\n        const format$$1 = options.format\r\n            ? (sql) => sqlformatter.format(sql)\r\n            : (sql) => sql;\r\n        // we open a new connection with a special typecast function for dumping data\r\n        const connection = mysql.createConnection(deepmerge.all([\r\n            connectionOptions,\r\n            {\r\n                multipleStatements: true,\r\n                typeCast: typeCast(tables),\r\n            },\r\n        ]));\r\n        const retTables = [];\r\n        let currentTableLines = null;\r\n        // open the write stream (if configured to)\r\n        const outFileStream = dumpToFile\r\n            ? fs.createWriteStream(dumpToFile, {\r\n                flags: 'a',\r\n                encoding: 'utf8',\r\n            })\r\n            : null;\r\n        function saveChunk(str, inArray = true) {\r\n            if (!Array.isArray(str)) {\r\n                str = [str];\r\n            }\r\n            // write to file if configured\r\n            if (outFileStream) {\r\n                str.forEach(s => outFileStream.write(`${s}\\n`));\r\n            }\r\n            // write to memory if configured\r\n            if (inArray && currentTableLines) {\r\n                currentTableLines.push(...str);\r\n            }\r\n        }\r\n        try {\r\n            if (options.lockTables) {\r\n                // see: https://dev.mysql.com/doc/refman/5.7/en/replication-solutions-backups-read-only.html\r\n                yield executeSql(connection, 'FLUSH TABLES WITH READ LOCK');\r\n                yield executeSql(connection, 'SET GLOBAL read_only = ON');\r\n            }\r\n            // to avoid having to load an entire DB's worth of data at once, we select from each table individually\r\n            // note that we use async/await within this loop to only process one table at a time (to reduce memory footprint)\r\n            while (tables.length > 0) {\r\n                // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n                const table = tables.shift();\r\n                if (table.isView && !options.includeViewData) {\r\n                    // don't dump data for views\r\n                    retTables.push(deepmerge.all([\r\n                        table,\r\n                        {\r\n                            data: null,\r\n                        },\r\n                    ]));\r\n                    // eslint-disable-next-line no-continue\r\n                    continue;\r\n                }\r\n                currentTableLines = options.returnFromFunction ? [] : null;\r\n                if (retTables.length > 0) {\r\n                    // add a newline before the next header to pad the dumps\r\n                    saveChunk('');\r\n                }\r\n                if (options.verbose) {\r\n                    // write the table header to the file\r\n                    const header = [\r\n                        '# ------------------------------------------------------------',\r\n                        `# DATA DUMP FOR TABLE: ${table.name}${options.lockTables ? ' (locked)' : ''}`,\r\n                        '# ------------------------------------------------------------',\r\n                        '',\r\n                    ];\r\n                    saveChunk(header);\r\n                }\r\n                // eslint-disable-next-line no-await-in-loop\r\n                yield new Promise((resolve, reject) => {\r\n                    // send the query\r\n                    const where = options.where[table.name]\r\n                        ? ` WHERE ${options.where[table.name]}`\r\n                        : '';\r\n                    const query = connection.query(`SELECT * FROM \\`${table.name}\\`${where}`);\r\n                    let rowQueue = [];\r\n                    // stream the data to the file\r\n                    query.on('result', (row) => {\r\n                        // build the values list\r\n                        rowQueue.push(buildInsertValue(row, table));\r\n                        // if we've got a full queue\r\n                        if (rowQueue.length === options.maxRowsPerInsertStatement) {\r\n                            // create and write a fresh statement\r\n                            const insert = buildInsert(table, rowQueue, format$$1);\r\n                            saveChunk(insert);\r\n                            rowQueue = [];\r\n                        }\r\n                    });\r\n                    query.on('end', () => {\r\n                        // write the remaining rows to disk\r\n                        if (rowQueue.length > 0) {\r\n                            const insert = buildInsert(table, rowQueue, format$$1);\r\n                            saveChunk(insert);\r\n                            rowQueue = [];\r\n                        }\r\n                        resolve();\r\n                    });\r\n                    query.on('error', \r\n                    /* istanbul ignore next */ err => reject(err));\r\n                });\r\n                // update the table definition\r\n                retTables.push(deepmerge.all([\r\n                    table,\r\n                    {\r\n                        data: currentTableLines\r\n                            ? currentTableLines.join('\\n')\r\n                            : null,\r\n                    },\r\n                ]));\r\n            }\r\n            saveChunk('');\r\n        }\r\n        finally {\r\n            if (options.lockTables) {\r\n                // see: https://dev.mysql.com/doc/refman/5.7/en/replication-solutions-backups-read-only.html\r\n                yield executeSql(connection, 'SET GLOBAL read_only = OFF');\r\n                yield executeSql(connection, 'UNLOCK TABLES');\r\n            }\r\n        }\r\n        // clean up our connections\r\n        yield connection.end();\r\n        if (outFileStream) {\r\n            // tidy up the file stream, making sure writes are 100% flushed before continuing\r\n            yield new Promise(resolve => {\r\n                outFileStream.once('finish', () => {\r\n                    resolve();\r\n                });\r\n                outFileStream.end();\r\n            });\r\n        }\r\n        return retTables;\r\n    });\r\n}\n\nfunction compressFile(filename) {\r\n    const tempFilename = `${filename}.temp`;\r\n    fs.renameSync(filename, tempFilename);\r\n    const deleteFile = (file) => {\r\n        try {\r\n            fs.unlinkSync(file);\r\n        }\r\n        catch (_err) {\r\n            /* istanbul ignore next */\r\n        }\r\n    };\r\n    try {\r\n        const read = fs.createReadStream(tempFilename);\r\n        const zip = zlib.createGzip();\r\n        const write = fs.createWriteStream(filename);\r\n        read.pipe(zip).pipe(write);\r\n        return new Promise((resolve, reject) => {\r\n            write.on('error', \r\n            /* istanbul ignore next */ err => {\r\n                // close the write stream and propagate the error\r\n                write.end();\r\n                reject(err);\r\n            });\r\n            write.on('finish', () => {\r\n                resolve();\r\n            });\r\n        });\r\n    }\r\n    catch (err) /* istanbul ignore next */ {\r\n        // in case of an error: remove the output file and propagate the error\r\n        deleteFile(filename);\r\n        throw err;\r\n    }\r\n    finally {\r\n        // in any case: remove the temp file\r\n        deleteFile(tempFilename);\r\n    }\r\n}\n\nconst pool = [];\r\nclass DB {\r\n    // can only instantiate via DB.connect method\r\n    constructor(connection) {\r\n        this.connection = connection;\r\n    }\r\n    static connect(options) {\r\n        return __awaiter(this, void 0, void 0, function* () {\r\n            const instance = new DB(yield mysql$1.createConnection(options));\r\n            pool.push(instance);\r\n            return instance;\r\n        });\r\n    }\r\n    query(sql) {\r\n        return __awaiter(this, void 0, void 0, function* () {\r\n            const res = yield this.connection.query(sql);\r\n            return res[0];\r\n        });\r\n    }\r\n    multiQuery(sql) {\r\n        return __awaiter(this, void 0, void 0, function* () {\r\n            let isMulti = true;\r\n            if (sql.split(';').length === 2) {\r\n                isMulti = false;\r\n            }\r\n            let res = (yield this.connection.query(sql))[0];\r\n            if (!isMulti) {\r\n                // mysql will return a non-array payload if there's only one statement in the query\r\n                // so standardise the res..\r\n                // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n                res = [res];\r\n            }\r\n            return res;\r\n        });\r\n    }\r\n    end() {\r\n        return __awaiter(this, void 0, void 0, function* () {\r\n            yield this.connection.end().catch(() => { });\r\n        });\r\n    }\r\n    static cleanup() {\r\n        return __awaiter(this, void 0, void 0, function* () {\r\n            yield Promise.all(pool.map((p) => __awaiter(this, void 0, void 0, function* () {\r\n                yield p.end();\r\n            })));\r\n        });\r\n    }\r\n}\n\nconst ERRORS = {\r\n    MISSING_CONNECTION_CONFIG: 'Expected to be given `connection` options.',\r\n    MISSING_CONNECTION_HOST: 'Expected to be given `host` connection option.',\r\n    MISSING_CONNECTION_DATABASE: 'Expected to be given `database` connection option.',\r\n    MISSING_CONNECTION_USER: 'Expected to be given `user` connection option.',\r\n    MISSING_CONNECTION_PASSWORD: 'Expected to be given `password` connection option.',\r\n};\n\n// a bunch of session variables we use to make the import work smoothly\r\nconst HEADER_VARIABLES = [\r\n    // Add commands to store the client encodings used when importing and set to UTF8 to preserve data\r\n    '/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;',\r\n    '/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;',\r\n    '/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;',\r\n    '/*!40101 SET NAMES utf8 */;',\r\n    // Add commands to disable foreign key checks\r\n    '/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;',\r\n    \"/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;\",\r\n    '/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;',\r\n    '',\r\n].join('\\n');\r\nconst FOOTER_VARIABLES = [\r\n    '/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;',\r\n    '/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;',\r\n    '/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;',\r\n    '/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;',\r\n    '/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;',\r\n    '/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;',\r\n    '',\r\n].join('\\n');\n\nconst defaultOptions = {\r\n    connection: {\r\n        host: 'localhost',\r\n        port: 3306,\r\n        user: '',\r\n        password: '',\r\n        database: '',\r\n        charset: 'UTF8_GENERAL_CI',\r\n        ssl: null,\r\n    },\r\n    dump: {\r\n        tables: [],\r\n        excludeTables: false,\r\n        schema: {\r\n            format: true,\r\n            autoIncrement: true,\r\n            engine: true,\r\n            table: {\r\n                ifNotExist: true,\r\n                dropIfExist: false,\r\n                charset: true,\r\n            },\r\n            view: {\r\n                createOrReplace: true,\r\n                algorithm: false,\r\n                definer: false,\r\n                sqlSecurity: false,\r\n            },\r\n        },\r\n        data: {\r\n            format: true,\r\n            verbose: true,\r\n            lockTables: false,\r\n            includeViewData: false,\r\n            where: {},\r\n            returnFromFunction: false,\r\n            maxRowsPerInsertStatement: 1,\r\n        },\r\n        trigger: {\r\n            delimiter: ';;',\r\n            dropIfExist: true,\r\n            definer: false,\r\n        },\r\n    },\r\n    dumpToFile: null,\r\n};\r\nfunction assert(condition, message) {\r\n    if (!condition) {\r\n        throw new Error(message);\r\n    }\r\n}\r\n// eslint-disable-next-line complexity, import/no-default-export\r\nfunction main(inputOptions) {\r\n    return __awaiter(this, void 0, void 0, function* () {\r\n        let connection;\r\n        try {\r\n            // assert the given options have all the required properties\r\n            assert(inputOptions.connection, ERRORS.MISSING_CONNECTION_CONFIG);\r\n            assert(inputOptions.connection.host, ERRORS.MISSING_CONNECTION_HOST);\r\n            assert(inputOptions.connection.database, ERRORS.MISSING_CONNECTION_DATABASE);\r\n            assert(inputOptions.connection.user, ERRORS.MISSING_CONNECTION_USER);\r\n            // note that you can have empty string passwords, hence the type assertion\r\n            assert(typeof inputOptions.connection.password === 'string', ERRORS.MISSING_CONNECTION_PASSWORD);\r\n            const options = deepmerge.all([\r\n                defaultOptions,\r\n                inputOptions,\r\n            ]);\r\n            // if not dumping to file and not otherwise configured, set returnFromFunction to true.\r\n            if (!options.dumpToFile) {\r\n                const hasValue = inputOptions.dump &&\r\n                    inputOptions.dump.data &&\r\n                    inputOptions.dump.data.returnFromFunction !== undefined;\r\n                if (options.dump.data && !hasValue) {\r\n                    options.dump\r\n                        .data.returnFromFunction = true;\r\n                }\r\n            }\r\n            // make sure the port is a number\r\n            options.connection.port = parseInt(`${options.connection.port}`, 10);\r\n            // write to the destination file (i.e. clear it)\r\n            if (options.dumpToFile) {\r\n                fs.writeFileSync(options.dumpToFile, '');\r\n            }\r\n            // write the initial headers\r\n            if (options.dumpToFile) {\r\n                fs.appendFileSync(options.dumpToFile, `${HEADER_VARIABLES}\\n`);\r\n            }\r\n            connection = yield DB.connect(deepmerge.all([options.connection, { multipleStatements: true }]));\r\n            // list the tables\r\n            const res = {\r\n                dump: {\r\n                    schema: null,\r\n                    data: null,\r\n                    trigger: null,\r\n                },\r\n                tables: yield getTables(connection, options.connection.database, options.dump.tables, options.dump.excludeTables),\r\n            };\r\n            // dump the schema if requested\r\n            if (options.dump.schema !== false) {\r\n                const tables = res.tables;\r\n                res.tables = yield getSchemaDump(connection, options.dump.schema, tables);\r\n                res.dump.schema = res.tables\r\n                    .map(t => t.schema)\r\n                    .filter(t => t)\r\n                    .join('\\n')\r\n                    .trim();\r\n            }\r\n            // write the schema to the file\r\n            if (options.dumpToFile && res.dump.schema) {\r\n                fs.appendFileSync(options.dumpToFile, `${res.dump.schema}\\n\\n`);\r\n            }\r\n            // dump the triggers if requested\r\n            if (options.dump.trigger !== false) {\r\n                const tables = res.tables;\r\n                res.tables = yield getTriggerDump(connection, options.connection.database, options.dump.trigger, tables);\r\n                res.dump.trigger = res.tables\r\n                    .map(t => t.triggers.join('\\n'))\r\n                    .filter(t => t)\r\n                    .join('\\n')\r\n                    .trim();\r\n            }\r\n            // data dump uses its own connection so kill ours\r\n            yield connection.end();\r\n            // dump data if requested\r\n            if (options.dump.data !== false) {\r\n                // don't even try to run the data dump\r\n                const tables = res.tables;\r\n                res.tables = yield getDataDump(options.connection, options.dump.data, tables, options.dumpToFile);\r\n                res.dump.data = res.tables\r\n                    .map(t => t.data)\r\n                    .filter(t => t)\r\n                    .join('\\n')\r\n                    .trim();\r\n            }\r\n            // write the triggers to the file\r\n            if (options.dumpToFile && res.dump.trigger) {\r\n                fs.appendFileSync(options.dumpToFile, `${res.dump.trigger}\\n\\n`);\r\n            }\r\n            // reset all of the variables\r\n            if (options.dumpToFile) {\r\n                fs.appendFileSync(options.dumpToFile, FOOTER_VARIABLES);\r\n            }\r\n            // compress output file\r\n            if (options.dumpToFile && options.compressFile) {\r\n                yield compressFile(options.dumpToFile);\r\n            }\r\n            return res;\r\n        }\r\n        finally {\r\n            DB.cleanup();\r\n        }\r\n    });\r\n}\r\n// a hacky way to make the package work with both require and ES modules\r\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\r\nmain.default = main;\n\nmodule.exports = main;\n"]}