From 276b295f3f79cf945fd6132d5dd214197fb18911 Mon Sep 17 00:00:00 2001 From: Juan Ferrer Toribio Date: Fri, 11 Aug 2023 15:41:03 +0200 Subject: [PATCH] refs #5483 Automatic fixtures, refactor and fixes --- README.md | 16 +- assets/myt.default.yml | 17 ++ helpers/local-fixtures.js | 79 ++++++ lib/command.js | 6 + lib/dumper.js | 47 +++- myt-dump.js | 103 ++++++-- myt-fixtures.js | 5 +- myt-pull.js | 2 +- myt-push.js | 15 +- myt-run.js | 81 +++--- myt-version.js | 2 +- myt.js | 23 +- package-lock.json | 407 +++++++++++++++--------------- package.json | 8 +- server/Dockerfile.dump | 7 +- server/docker-fixtures.sh | 1 + server/docker-import.sh | 4 + server/docker-init.sh | 9 +- template/.gitignore | 1 + template/dump/afterDump.sql | 1 - template/dump/beforeDump.sql | 1 - template/dump/dump.after.sql | 1 + template/dump/dump.before.sql | 1 + template/dump/fixtures.after.sql | 1 + template/dump/fixtures.before.sql | 1 + template/dump/fixtures.sql | 1 - 26 files changed, 534 insertions(+), 306 deletions(-) create mode 100644 helpers/local-fixtures.js delete mode 100644 template/dump/afterDump.sql delete mode 100644 template/dump/beforeDump.sql create mode 100644 template/dump/dump.after.sql create mode 100644 template/dump/dump.before.sql create mode 100644 template/dump/fixtures.after.sql create mode 100644 template/dump/fixtures.before.sql delete mode 100644 template/dump/fixtures.sql diff --git a/README.md b/README.md index 152b87b..760d125 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,11 @@ development, so any help is welcomed! Feel free to contribute. ## Installation +Required libraries to build with *node-gyp*. +```text +# apt install libkrb5-dev libssl-dev +``` + It's recommended to install the package globally. ```text @@ -148,9 +153,10 @@ routines. You can create your local fixture and structure files. -* *dump/beforeDump.sql* -* *dump/afterDump.sql* -* *dump/fixtures.sql* +* *dump/dump.before.sql* +* *dump/dump.after.sql* +* *dump/fixtures.before.sql* +* *dump/fixtures.after.sql* ## Versioning commands @@ -180,7 +186,7 @@ When *--checkout* option is provided, it does the following before export: Applies versions and routine changes into database. ```text -$ myt push [] [-f|--force] [-c|--commit] [-s|--sums] +$ myt push [] [-f|--force] [-c|--commit] [-s|--sums] [-t|--triggers] ``` Commit is saved into database only if *--commit* option is provided, it @@ -221,7 +227,7 @@ Exports database structure and fixtures from remote into hidden files located in *dump* folder. If no remote is specified *production* is used. ```text -$ myt dump [] [-l|--lock] +$ myt dump [] [-l|--lock] [-t|--triggers] ``` ### fixtures diff --git a/assets/myt.default.yml b/assets/myt.default.yml index e7e66f7..ca5ac48 100755 --- a/assets/myt.default.yml +++ b/assets/myt.default.yml @@ -2,7 +2,24 @@ versionSchema: myt versionDigits: 5 maxOldVersions: 20 mockDate: false +mockFunctions: + - mockTime + - mockUtcTime sumViews: true +privileges: + userTable: global_priv + userWhere: >- + JSON_VALUE(`Priv`, '$.is_role') + AND JSON_VALUE(`Priv`, '$.authentication_string') IS NULL + AND JSON_VALUE(`Priv`, '$.mysql_old_password') IS NULL + AND JSON_VALUE(`Priv`, '$.mysql_native_password') IS NULL + tables: + - db + - tables_priv + - columns_priv + - procs_priv + where: >- + `Host` = '' schemas: - myt fixtures: diff --git a/helpers/local-fixtures.js b/helpers/local-fixtures.js new file mode 100644 index 0000000..ee02234 --- /dev/null +++ b/helpers/local-fixtures.js @@ -0,0 +1,79 @@ +#!/bin/node + +require('require-yaml'); +const mysql = require('mysql2/promise'); +const {fixtures} = require(`${process.cwd()}/myt.config.yml`); + +const config = { + host: 'localhost', + user: 'root', + password: 'root' +}; + +async function connectAndQuery() { + try { + const connection = await mysql.createConnection(config); + + // Get schemas + + const [schemaResults] = await connection.query('SHOW DATABASES'); + const schemaNames = schemaResults.map(r => r.Database); + + // Filter system schemas + + const systemSchemas = ['mysql', 'sys', 'information_schema', 'performance_schema']; + const userSchemas = schemaNames.filter(s => !systemSchemas.includes(s)); + + if (userSchemas.length === 0) { + console.log('There are no user schemas with tables that have records.'); + connection.end(); + return; + } + + // Get tables with records + + userSchemas.sort((a, b) => a.localeCompare(b)); + for (const schemaName of userSchemas) { + const [tableResults] = await connection.query( + `SELECT TABLE_NAME tableName + FROM information_schema.TABLES + WHERE TABLE_SCHEMA = ? + AND TABLE_TYPE <> 'VIEW'`, + [schemaName] + ); + const tableNames = tableResults.map(r => r.tableName); + if (tableNames.length === 0) continue; + + const schemaFixtures = new Set(fixtures[schemaName]); + const nonEmptyTables = []; + + for (const tableName of tableNames) { + if (schemaFixtures.has(tableName)) continue; + try { + const [[row]] = await connection.query( + `SELECT COUNT(*) \`count\` FROM ??.??`, + [schemaName, tableName] + ); + if (row.count == 0) continue; + if (!fixtures[schemaName]?.[tableName]) + nonEmptyTables.push(tableName); + } catch (err) { + console.error('Error:', err.message); + } + } + + nonEmptyTables.sort((a, b) => a.localeCompare(b)); + if (nonEmptyTables.length) { + console.log(`${schemaName}:`); + for (const tableName of nonEmptyTables) + console.log(` - ${tableName}`); + } + } + + connection.end(); + } catch (err) { + console.error('Error:', err.message); + } +} + +connectAndQuery(); diff --git a/lib/command.js b/lib/command.js index aea3141..51673df 100644 --- a/lib/command.js +++ b/lib/command.js @@ -10,4 +10,10 @@ module.exports = class MytCommand { async run(myt, opts) { throw new Error('run command not defined'); } + + emit(event) { + const messages = this.constructor.messages; + if (messages && messages[event]) + console.log(messages[event]); + } } diff --git a/lib/dumper.js b/lib/dumper.js index 755d93d..94d601a 100644 --- a/lib/dumper.js +++ b/lib/dumper.js @@ -8,12 +8,11 @@ module.exports = class Dumper { this.opts = opts; } - async init(dumpFile) { - const dumpDir = this.opts.dumpDir; + async init(dumpDir, dumpFile) { if (!await fs.pathExists(dumpDir)) - await fs.mkdir(dumpDir); + await fs.mkdir(dumpDir, {recursive: true}); - const dumpPath = path.join(dumpDir, dumpFile); + const dumpPath = path.join(dumpDir, `${dumpFile}.sql`); // FIXME: If it's called after docker.build() statement it creates an // "invalid" WriteStream @@ -28,6 +27,10 @@ module.exports = class Dumper { this.dumpStream = dumpStream; } + async end() { + await this.dumpStream.end(); + } + async use(schema) { await this.dumpStream.write( `USE ${SqlString.escapeId(schema, true)};\n`, @@ -36,7 +39,7 @@ module.exports = class Dumper { } async dumpFixtures(tables, replace, args) { - const fixturesArgs = [ + let fixturesArgs = [ '--no-create-info', '--skip-triggers', '--skip-extended-insert', @@ -45,18 +48,40 @@ module.exports = class Dumper { '--skip-set-charset', '--skip-comments', '--skip-tz-utc' - ].concat(args); - + ] + if (args) + fixturesArgs = fixturesArgs.concat(args); if (replace) fixturesArgs.push('--replace'); for (const schema in tables) { - await this.use(schema); const args = fixturesArgs.concat([schema], tables[schema]); - await this.runDump('mysqldump', args, this.dumpStream); + await this.use(schema); + await this.runDump('mysqldump', args); } } + async dumpPrivileges(tables, args, where) { + let privArgs = [ + '--no-create-info', + '--skip-triggers', + '--insert-ignore', + '--skip-extended-insert', + '--skip-add-locks', + '--skip-set-charset', + '--skip-comments', + '--skip-tz-utc' + ]; + if (args) + privArgs = privArgs.concat(args); + if (where) + privArgs.push('--where', where); + args = privArgs.concat(['mysql'], tables); + + await this.use('mysql'); + await this.runDump('mysqldump', args); + } + async runDump(command, args) { const iniPath = path.join(this.opts.subdir || '', 'remotes', this.opts.iniFile); const myArgs = [ @@ -76,8 +101,4 @@ module.exports = class Dumper { rm: true }, execOptions); } - - async end() { - await this.dumpStream.end(); - } } diff --git a/myt-dump.js b/myt-dump.js index a1ec212..6a4491d 100644 --- a/myt-dump.js +++ b/myt-dump.js @@ -1,13 +1,15 @@ const Myt = require('./myt'); const Command = require('./lib/command'); -const fs = require('fs-extra'); const Dumper = require('./lib/dumper'); +const fs = require('fs-extra'); +const path = require('path'); class Dump extends Command { static usage = { description: 'Dumps structure and fixtures from remote', params: { - lock: 'Whether to lock tables on dump' + lock: 'Whether to lock tables on dump', + triggers: 'Wether to include triggers into dump' }, operand: 'remote' }; @@ -17,54 +19,111 @@ class Dump extends Command { remote: 'production' }, alias: { - lock: 'l' + lock: 'l', + triggers: 't' }, boolean: [ - 'lock' + 'lock', + 'triggers' ] }; + static messages = { + dumpStructure: 'Dumping structure.', + dumpData: 'Dumping data.', + dumpPrivileges: 'Dumping privileges.', + dumpTriggers: 'Dumping triggers.' + }; + async run(myt, opts) { - const dumper = new Dumper(opts); - await dumper.init('.dump.sql'); + let dumper; + const dumpDataDir = path.join(opts.dumpDir, '.dump'); const baseArgs = [ `--lock-tables=${opts.lock ? 'true' : 'false'}` ]; - console.log('Dumping structure.'); + await fs.remove(dumpDataDir); + + // Structure + + this.emit('dumpStructure'); + + dumper = new Dumper(opts); + await dumper.init(dumpDataDir, 'structure'); let dumpArgs = [ '--default-character-set=utf8', '--no-data', '--comments', '--routines', '--events', - '--skip-triggers', - '--databases' + '--skip-triggers' ].concat(baseArgs); + dumpArgs.push('--databases'); dumpArgs = dumpArgs.concat(opts.schemas); await dumper.runDump('docker-dump.sh', dumpArgs); + await dumper.end(); - console.log('Dumping fixtures.'); + // Data + + this.emit('dumpData'); + + dumper = new Dumper(opts); + await dumper.init(dumpDataDir, 'data'); await dumper.dumpFixtures(opts.fixtures, false, baseArgs); + await dumper.end(); + + // Privileges - console.log('Dumping privileges.'); const privs = opts.privileges; - if (privs && Array.isArray(privs.tables)) { - let args = [ - '--no-create-info', - '--skip-triggers', - '--insert-ignore', - '--complete-insert' - ].concat(baseArgs); - if (privs.where) args.push('--where', privs.where); - args = args.concat(['mysql'], privs.tables); + if (privs) { + this.emit('dumpPrivileges'); - await dumper.use('mysql'); - await dumper.runDump('mysqldump', args); + dumper = new Dumper(opts); + await dumper.init(dumpDataDir, 'privileges'); + + const {tables, userTable, where} = privs; + + if (tables) + await dumper.dumpPrivileges(tables, baseArgs, where); + + if (userTable) { + let userWhere = ''; + for (const cond of [where, privs.userWhere]) { + if (!cond) continue; + if (userWhere) userWhere += ' AND '; + userWhere += cond; + } + await dumper.dumpPrivileges([userTable], baseArgs, userWhere); + } + + await dumper.end(); } await dumper.end(); + + // Triggers + + if (opts.triggers) { + this.emit('dumpTriggers'); + + const dumper = new Dumper(opts); + await dumper.init(dumpDataDir, 'triggers'); + + let dumpArgs = [ + '--default-character-set=utf8', + '--no-create-info', + '--no-data', + '--no-create-db', + '--skip-opt', + '--comments' + ].concat(baseArgs); + + dumpArgs.push('--databases'); + dumpArgs = dumpArgs.concat(opts.schemas); + await dumper.runDump('mysqldump', dumpArgs); + await dumper.end(); + } } } diff --git a/myt-fixtures.js b/myt-fixtures.js index f252356..5d8c3a6 100644 --- a/myt-fixtures.js +++ b/myt-fixtures.js @@ -16,8 +16,8 @@ class Fixtures extends Command { async run(myt, opts) { const dumper = new Dumper(opts); - await dumper.init('fixtures.sql'); - await dumper.dumpFixtures(opts.localFixtures, true); + await dumper.init(opts.dumpDir, '.fixtures'); + await dumper.dumpFixtures(opts.localFixtures, false); await dumper.end(); } } @@ -26,4 +26,3 @@ module.exports = Fixtures; if (require.main === module) new Myt().run(Fixtures); - diff --git a/myt-pull.js b/myt-pull.js index c555240..d472893 100755 --- a/myt-pull.js +++ b/myt-pull.js @@ -98,7 +98,7 @@ class Pull extends Command { const schemas = await fs.readdir(routinesDir); for (const schema of schemas) { if (opts.schemas.indexOf(schema) == -1) - await fs.remove(`${routinesDir}/${schema}`, {recursive: true}); + await fs.remove(`${routinesDir}/${schema}`); } for (const schema in shaSums) { diff --git a/myt-push.js b/myt-push.js index 9a494ac..f7954b5 100644 --- a/myt-push.js +++ b/myt-push.js @@ -311,7 +311,7 @@ class Push extends Command { for (const change of changes) try { - if (opts.trigger && change.type.name === 'TRIGGER') + if (opts.triggers && change.type.name === 'TRIGGER') continue; const schema = change.schema; @@ -325,7 +325,14 @@ class Push extends Command { newSql = await fs.readFile(fullPath, 'utf8'); const oldSql = await engine.fetchRoutine(type, schema, name); const oldSum = engine.getShaSum(type, schema, name); - const isEqual = newSql == oldSql; + + const isMockFn = type == 'function' + && schema == opts.versionSchema + && opts.remote == 'local' + && opts.mockDate + && opts.mockFunctions + && opts.mockFunctions.indexOf(name) !== -1; + const ignore = newSql == oldSql || isMockFn; let statusMsg; if (exists && !oldSql) @@ -336,7 +343,7 @@ class Push extends Command { statusMsg = '[ยท]'.yellow; let actionMsg; - if (isEqual) + if (ignore) actionMsg = '[I]'.blue; else actionMsg = '[A]'.green; @@ -348,7 +355,7 @@ class Push extends Command { change.fullName ); - if (!isEqual) { + if (!ignore) { const scapedSchema = SqlString.escapeId(schema, true); if (exists) { diff --git a/myt-run.js b/myt-run.js index 0797d76..b78932c 100644 --- a/myt-run.js +++ b/myt-run.js @@ -36,9 +36,10 @@ class Run extends Command { async run(myt, opts) { const dumpDir = opts.dumpDir; + const dumpDataDir = path.join(dumpDir, '.dump'); const serverDir = path.join(__dirname, 'server'); - if (!await fs.pathExists(`${dumpDir}/.dump.sql`)) + if (!await fs.pathExists(`${dumpDataDir}/structure.sql`)) throw new Error('To run local database you have to create a dump first'); // Build base image @@ -118,41 +119,8 @@ class Run extends Command { } await server.wait(); - - // Apply changes - - Object.assign(opts, { - commit: true, - trigger: true, - dbConfig - }); - await myt.runCommand(Push, opts); - - // Apply fixtures - - console.log('Applying fixtures.'); - await ct.exec(null, - 'docker-import.sh', - ['/workspace/dump/fixtures'], - 'spawn', - true - ); - - // Create triggers - - console.log('Creating triggers.'); const conn = await myt.createConnection(); - for (const schema of opts.schemas) { - const triggersPath = `${opts.routinesDir}/${schema}/triggers`; - if (!await fs.pathExists(triggersPath)) - continue; - - const triggersDir = await fs.readdir(triggersPath); - for (const triggerFile of triggersDir) - await connExt.queryFromFile(conn, `${triggersPath}/${triggerFile}`); - } - // Mock date functions console.log('Mocking date functions.'); @@ -167,6 +135,51 @@ class Run extends Command { await connExt.multiQuery(conn, sql); } + // Apply changes + + const hasTriggers = await fs.exists(`${dumpDataDir}/triggers.sql`); + + Object.assign(opts, { + triggers: hasTriggers, + commit: true, + dbConfig + }); + await myt.runCommand(Push, opts); + + // Apply fixtures + + console.log('Applying fixtures.'); + const fixturesFiles = [ + 'fixtures.before', + '.fixtures', + 'fixtures.after', + 'fixtures.local' + ] + for (const file of fixturesFiles) { + if (!await fs.exists(`${dumpDir}/${file}.sql`)) continue; + await ct.exec(null, 'docker-import.sh', + [`/workspace/dump/${file}`], + 'spawn', + true + ); + } + + // Create triggers + + if (!hasTriggers) { + console.log('Creating triggers.'); + + for (const schema of opts.schemas) { + const triggersPath = `${opts.routinesDir}/${schema}/triggers`; + if (!await fs.pathExists(triggersPath)) + continue; + + const triggersDir = await fs.readdir(triggersPath); + for (const triggerFile of triggersDir) + await connExt.queryFromFile(conn, `${triggersPath}/${triggerFile}`); + } + } + return server; } } diff --git a/myt-version.js b/myt-version.js index 78c287a..cd4472d 100644 --- a/myt-version.js +++ b/myt-version.js @@ -123,7 +123,7 @@ class Version extends Command { } catch (err) { await conn.query('ROLLBACK'); if (newVersionDir && await fs.pathExists(newVersionDir)) - await fs.remove(newVersionDir, {recursive: true}); + await fs.remove(newVersionDir); throw err; } } diff --git a/myt.js b/myt.js index d3c0268..e5c5659 100755 --- a/myt.js +++ b/myt.js @@ -170,12 +170,29 @@ class Myt { async load(opts) { // Configuration file - const config = require(`${__dirname}/assets/myt.default.yml`); + const defaultConfig = require(`${__dirname}/assets/myt.default.yml`); + const config = Object.assign({}, defaultConfig); const configFile = 'myt.config.yml'; const configPath = path.join(opts.workspace, configFile); - if (await fs.pathExists(configPath)) - Object.assign(config, require(configPath)); + + if (await fs.pathExists(configPath)) { + const mergeKeys = new Set([ + 'privileges' + ]); + + const wsConfig = require(configPath); + for (const key in wsConfig) { + if (!mergeKeys.has(key)) { + config[key] = wsConfig[key]; + } else { + config[key] = Object.assign({}, + config[key], + wsConfig[key] + ); + } + } + } Object.assign(opts, config); opts.configFile = configFile; diff --git a/package-lock.json b/package-lock.json index 8ae2619..2347562 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,21 +1,21 @@ { "name": "@verdnatura/myt", - "version": "1.5.20", + "version": "1.5.21", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@verdnatura/myt", - "version": "1.5.20", + "version": "1.5.21", "license": "GPL-3.0", "dependencies": { "@sqltools/formatter": "^1.2.5", "colors": "^1.4.0", "ejs": "^3.1.9", - "fs-extra": "^8.1.0", + "fs-extra": "^11.1.1", "getopts": "^2.3.0", - "ini": "^1.3.8", - "mysql2": "^2.3.3", + "ini": "^4.1.1", + "mysql2": "^3.3.4", "nodegit": "^0.27.0", "require-yaml": "^0.0.1", "sha.js": "^2.4.11" @@ -76,9 +76,9 @@ } }, "node_modules/@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz", + "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==" }, "node_modules/@types/responselike": { "version": "1.0.0", @@ -166,9 +166,9 @@ } }, "node_modules/async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "node_modules/asynckit": { "version": "0.4.0", @@ -184,9 +184,9 @@ } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "node_modules/balanced-match": { "version": "1.0.0", @@ -251,9 +251,9 @@ } }, "node_modules/cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "dependencies": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -429,9 +429,9 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "node_modules/denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==", "engines": { "node": ">=0.10" } @@ -507,9 +507,9 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/filelist": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", - "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "dependencies": { "minimatch": "^5.0.1" } @@ -523,9 +523,9 @@ } }, "node_modules/filelist/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dependencies": { "brace-expansion": "^2.0.1" }, @@ -560,16 +560,35 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dependencies": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" }, "engines": { - "node": ">=6 <7 || >=8" + "node": ">=14.14" + } + }, + "node_modules/fs-extra/node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/fs-extra/node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "engines": { + "node": ">= 10.0.0" } }, "node_modules/fs-minipass": { @@ -774,9 +793,12 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/is-fullwidth-code-point": { "version": "1.0.0", @@ -792,7 +814,7 @@ "node_modules/is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, "node_modules/is-typedarray": { "version": "1.0.0", @@ -815,14 +837,14 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "node_modules/jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "dependencies": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" }, "bin": { "jake": "bin/cli.js" @@ -868,9 +890,9 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "node_modules/json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "bin": { "json5": "lib/cli.js" }, @@ -914,9 +936,9 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "node_modules/long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "node_modules/lowercase-keys": { "version": "2.0.0", @@ -927,14 +949,11 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==", "engines": { - "node": ">=10" + "node": ">=16.14" } }, "node_modules/mime-db": { @@ -979,9 +998,9 @@ } }, "node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -995,11 +1014,6 @@ "yallist": "^3.0.0" } }, - "node_modules/minipass/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/minizlib": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", @@ -1025,16 +1039,16 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/mysql2": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", - "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.4.tgz", + "integrity": "sha512-66K70s503WCweXmC8rKZ6oFpo+1qd96bx1QloaoYcSABwxvDzjGlqAHSxiDoXgBIv6YSTSZd6lvgWteYhBz7WA==", "dependencies": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" }, @@ -1043,30 +1057,24 @@ } }, "node_modules/named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "dependencies": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "engines": { - "node": ">=6.0.0" + "node": ">=12.0.0" } }, "node_modules/named-placeholders/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "engines": { + "node": ">=12" } }, - "node_modules/named-placeholders/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" - }, "node_modules/nan": { "version": "2.17.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.17.0.tgz", @@ -1361,11 +1369,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -1381,9 +1384,9 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "engines": { "node": ">=6" } @@ -1415,10 +1418,15 @@ "rc": "cli.js" } }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, "node_modules/readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -1516,7 +1524,7 @@ "node_modules/seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "node_modules/set-blocking": { "version": "2.0.0", @@ -1696,11 +1704,6 @@ } ] }, - "node_modules/tar/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - }, "node_modules/to-buffer": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", @@ -1834,9 +1837,9 @@ } }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } }, "dependencies": { @@ -1883,9 +1886,9 @@ } }, "@types/node": { - "version": "18.11.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", - "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==" + "version": "20.3.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.3.0.tgz", + "integrity": "sha512-cumHmIAf6On83X7yP+LrsEyUOf/YlociZelmpRYaGFydoaPdxdt80MAbu6vWerQT2COCp2nPvHdsbD7tHn/YlQ==" }, "@types/responselike": { "version": "1.0.0", @@ -1957,9 +1960,9 @@ "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==" }, "async": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.3.tgz", - "integrity": "sha512-spZRyzKL5l5BZQrr/6m/SqFdBN0q3OCI0f9rjfBzCMBIP4p75P620rR3gTmaksNOhmzgdxcaxdNfMy6anrbM0g==" + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, "asynckit": { "version": "0.4.0", @@ -1972,9 +1975,9 @@ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==" }, "balanced-match": { "version": "1.0.0", @@ -2036,9 +2039,9 @@ } }, "cacheable-request": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", - "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz", + "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==", "requires": { "clone-response": "^1.0.2", "get-stream": "^5.1.0", @@ -2174,9 +2177,9 @@ "integrity": "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==" }, "denque": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/denque/-/denque-2.0.1.tgz", - "integrity": "sha512-tfiWc6BQLXNLpNiR5iGd0Ocu3P3VpxfzFiqubLgMfhfOw9WyvgJBd46CClNn9k3qfbjvT//0cf7AlYRX/OslMQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz", + "integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==" }, "detect-libc": { "version": "1.0.3", @@ -2234,9 +2237,9 @@ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "filelist": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.3.tgz", - "integrity": "sha512-LwjCsruLWQULGYKy7TX0OPtrL9kLpojOFKc5VCTxdFTV7w5zbsgqVKfnkKG7Qgjtq50gKfO56hJv88OfcGb70Q==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", "requires": { "minimatch": "^5.0.1" }, @@ -2250,9 +2253,9 @@ } }, "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "requires": { "brace-expansion": "^2.0.1" } @@ -2280,13 +2283,29 @@ "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "requires": { "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "dependencies": { + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==" + } } }, "fs-minipass": { @@ -2456,9 +2475,9 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" }, "is-fullwidth-code-point": { "version": "1.0.0", @@ -2471,7 +2490,7 @@ "is-property": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", - "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + "integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==" }, "is-typedarray": { "version": "1.0.0", @@ -2494,14 +2513,14 @@ "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" }, "jake": { - "version": "10.8.5", - "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz", - "integrity": "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw==", + "version": "10.8.7", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.8.7.tgz", + "integrity": "sha512-ZDi3aP+fG/LchyBzUM804VjddnwfSfsdeYkwt8NcbKRvo4rFkjhs456iLFn3k2ZUWvNe4i48WACDbza8fhq2+w==", "requires": { "async": "^3.2.3", "chalk": "^4.0.2", - "filelist": "^1.0.1", - "minimatch": "^3.0.4" + "filelist": "^1.0.4", + "minimatch": "^3.1.2" } }, "js-yaml": { @@ -2538,9 +2557,9 @@ "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==" }, "json5": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz", - "integrity": "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ==" + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==" }, "jsonfile": { "version": "4.0.0", @@ -2575,9 +2594,9 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" }, "long": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", - "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/long/-/long-5.2.3.tgz", + "integrity": "sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==" }, "lowercase-keys": { "version": "2.0.0", @@ -2585,12 +2604,9 @@ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-8.0.5.tgz", + "integrity": "sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==" }, "mime-db": { "version": "1.52.0", @@ -2619,9 +2635,9 @@ } }, "minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { "version": "2.9.0", @@ -2630,13 +2646,6 @@ "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" - }, - "dependencies": { - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } } }, "minizlib": { @@ -2661,41 +2670,32 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "mysql2": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-2.3.3.tgz", - "integrity": "sha512-wxJUev6LgMSgACDkb/InIFxDprRa6T95+VEoR+xPvtngtccNH2dGjEB/fVZ8yg1gWv1510c9CvXuJHi5zUm0ZA==", + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.3.4.tgz", + "integrity": "sha512-66K70s503WCweXmC8rKZ6oFpo+1qd96bx1QloaoYcSABwxvDzjGlqAHSxiDoXgBIv6YSTSZd6lvgWteYhBz7WA==", "requires": { - "denque": "^2.0.1", + "denque": "^2.1.0", "generate-function": "^2.3.1", "iconv-lite": "^0.6.3", - "long": "^4.0.0", - "lru-cache": "^6.0.0", - "named-placeholders": "^1.1.2", + "long": "^5.2.1", + "lru-cache": "^8.0.0", + "named-placeholders": "^1.1.3", "seq-queue": "^0.0.5", "sqlstring": "^2.3.2" } }, "named-placeholders": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.2.tgz", - "integrity": "sha512-wiFWqxoLL3PGVReSZpjLVxyJ1bRqe+KKJVbr4hGs1KWfTZTQyezHFBbuKj9hsizHyGV2ne7EMjHdxEGAybD5SA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.3.tgz", + "integrity": "sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==", "requires": { - "lru-cache": "^4.1.3" + "lru-cache": "^7.14.1" }, "dependencies": { "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, @@ -2928,11 +2928,6 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -2948,9 +2943,9 @@ } }, "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==" }, "qs": { "version": "6.5.3", @@ -2971,12 +2966,19 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + } } }, "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -3061,7 +3063,7 @@ "seq-queue": { "version": "0.0.5", "resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz", - "integrity": "sha1-1WgS4cAXpuTnw+Ojeh2m143TyT4=" + "integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==" }, "set-blocking": { "version": "2.0.0", @@ -3160,11 +3162,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } }, @@ -3308,9 +3305,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" } } } diff --git a/package.json b/package.json index 237c2fe..d773e80 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@verdnatura/myt", - "version": "1.5.20", + "version": "1.5.21", "author": "Verdnatura Levante SL", "description": "MySQL version control", "license": "GPL-3.0", @@ -15,10 +15,10 @@ "@sqltools/formatter": "^1.2.5", "colors": "^1.4.0", "ejs": "^3.1.9", - "fs-extra": "^8.1.0", + "fs-extra": "^11.1.1", "getopts": "^2.3.0", - "ini": "^1.3.8", - "mysql2": "^2.3.3", + "ini": "^4.1.1", + "mysql2": "^3.3.4", "nodegit": "^0.27.0", "require-yaml": "^0.0.1", "sha.js": "^2.4.11" diff --git a/server/Dockerfile.dump b/server/Dockerfile.dump index fdebb71..af254e8 100644 --- a/server/Dockerfile.dump +++ b/server/Dockerfile.dump @@ -2,11 +2,8 @@ FROM myt/server USER root -COPY \ - .dump.sql \ - beforeDump.sql \ - afterDump.sql \ - dump/ +COPY .dump dump/.dump +COPY dump.*.sql dump/ RUN gosu mysql docker-init.sh diff --git a/server/docker-fixtures.sh b/server/docker-fixtures.sh index 3d57ace..cc12728 100755 --- a/server/docker-fixtures.sh +++ b/server/docker-fixtures.sh @@ -1,4 +1,5 @@ #!/bin/bash # FIXME: It can corrupt data +# Currently not used, instead mysqldump --skip-extended-insert option is used mysqldump $@ | sed -E 's/(VALUES |\),)\(/\1\n\t\(/g' diff --git a/server/docker-import.sh b/server/docker-import.sh index d456d99..5f78211 100755 --- a/server/docker-import.sh +++ b/server/docker-import.sh @@ -1,6 +1,10 @@ #!/bin/bash FILE="$1.sql" +if [[ ! -f "$FILE" ]] ; then + exit +fi + echo "[LOG] -> Importing $FILE" export MYSQL_PWD=root mysql -u root --default-character-set=utf8 --comments -f < "$FILE" diff --git a/server/docker-init.sh b/server/docker-init.sh index 7410125..17f96a8 100755 --- a/server/docker-init.sh +++ b/server/docker-init.sh @@ -13,8 +13,11 @@ docker_temp_server_start "$CMD" docker_setup_db docker_process_init_files /docker-entrypoint-initdb.d/* -docker-import.sh dump/beforeDump -docker-import.sh dump/.dump -docker-import.sh dump/afterDump +docker-import.sh dump/dump.before +docker-import.sh dump/.dump/structure +docker-import.sh dump/.dump/data +docker-import.sh dump/.dump/triggers +docker-import.sh dump/.dump/privileges +docker-import.sh dump/dump.after docker_temp_server_stop diff --git a/template/.gitignore b/template/.gitignore index 8661963..c5163d6 100644 --- a/template/.gitignore +++ b/template/.gitignore @@ -4,3 +4,4 @@ remotes/*.ini !remotes/local.ini !remotes/docker.ini dump/.changes +dump/fixtures.local.sql diff --git a/template/dump/afterDump.sql b/template/dump/afterDump.sql deleted file mode 100644 index d2e0ec1..0000000 --- a/template/dump/afterDump.sql +++ /dev/null @@ -1 +0,0 @@ --- Executed after data dump diff --git a/template/dump/beforeDump.sql b/template/dump/beforeDump.sql deleted file mode 100644 index c206249..0000000 --- a/template/dump/beforeDump.sql +++ /dev/null @@ -1 +0,0 @@ --- Executed before data dump diff --git a/template/dump/dump.after.sql b/template/dump/dump.after.sql new file mode 100644 index 0000000..f1a121b --- /dev/null +++ b/template/dump/dump.after.sql @@ -0,0 +1 @@ +-- Executed after dump diff --git a/template/dump/dump.before.sql b/template/dump/dump.before.sql new file mode 100644 index 0000000..24168fe --- /dev/null +++ b/template/dump/dump.before.sql @@ -0,0 +1 @@ +-- Executed before dump diff --git a/template/dump/fixtures.after.sql b/template/dump/fixtures.after.sql new file mode 100644 index 0000000..9dceb7d --- /dev/null +++ b/template/dump/fixtures.after.sql @@ -0,0 +1 @@ +-- Executed after fixtures diff --git a/template/dump/fixtures.before.sql b/template/dump/fixtures.before.sql new file mode 100644 index 0000000..0d9e4ac --- /dev/null +++ b/template/dump/fixtures.before.sql @@ -0,0 +1 @@ +-- Executed before fixtures diff --git a/template/dump/fixtures.sql b/template/dump/fixtures.sql deleted file mode 100644 index 857e844..0000000 --- a/template/dump/fixtures.sql +++ /dev/null @@ -1 +0,0 @@ --- Place your local fixtures here