diff --git a/package.json b/package.json index 087ece53d..439edc235 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@storybook/addons": "^6.5.13", "@storybook/preact": "^6.5.13", "@testing-library/dom": "^5.4.0", + "@types/bluebird": "^3.5.42", "@types/body-parser": "^1.17.0", "@types/compression": "^1.0.1", "@types/cron": "^1.7.2", @@ -50,7 +51,6 @@ "@types/node": "^11.13.2", "@types/plotly.js": "^1.44.9", "@types/tmp": "^0.1.0", - "@types/umzug": "^2.2.2", "@types/uuid": "^8.3.0", "@types/yargs": "^12.0.8", "@types/yargs-parser": "^11.0.0", diff --git a/packages/server/package.json b/packages/server/package.json index 390e4dac0..9eb73d13c 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -31,7 +31,7 @@ "express-basic-auth": "^1.2.0", "morgan": "^1.9.1", "sequelize": "^6.35.2", - "umzug": "^2.2.0", + "umzug": "^3.4.0", "uuid": "^8.3.1" }, "devDependencies": { diff --git a/packages/server/src/api/storage/sql/migrations/20191008-initial.js b/packages/server/src/api/storage/sql/migrations/20191008-initial.js index 9a57e127e..c810e0926 100644 --- a/packages/server/src/api/storage/sql/migrations/20191008-initial.js +++ b/packages/server/src/api/storage/sql/migrations/20191008-initial.js @@ -5,15 +5,15 @@ */ 'use strict'; +const Sequelize = require('sequelize'); + /* eslint-disable new-cap */ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface - * @param {typeof import('sequelize')} Sequelize - * @param {LHCI.ServerCommand.StorageOptions} options + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async (queryInterface, Sequelize, options) => { + up: async ({queryInterface, options}) => { await queryInterface.createTable('projects', { id: {type: Sequelize.UUID(), primaryKey: true}, name: {type: Sequelize.STRING(40)}, @@ -58,9 +58,9 @@ module.exports = { }); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.dropTable('statistics'); await queryInterface.dropTable('runs'); await queryInterface.dropTable('builds'); diff --git a/packages/server/src/api/storage/sql/migrations/20191009-project-token.js b/packages/server/src/api/storage/sql/migrations/20191009-project-token.js index 1d727fbdf..7dc5f6724 100644 --- a/packages/server/src/api/storage/sql/migrations/20191009-project-token.js +++ b/packages/server/src/api/storage/sql/migrations/20191009-project-token.js @@ -5,14 +5,15 @@ */ 'use strict'; +const Sequelize = require('sequelize'); + /* eslint-disable new-cap */ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface - * @param {typeof import('sequelize')} Sequelize + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async (queryInterface, Sequelize) => { + up: async ({queryInterface}) => { await queryInterface.addColumn('projects', 'token', {type: Sequelize.UUID()}); await queryInterface.bulkUpdate( 'projects', @@ -22,9 +23,9 @@ module.exports = { ); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.removeColumn('projects', 'token'); }, }; diff --git a/packages/server/src/api/storage/sql/migrations/20191029-committed-at.js b/packages/server/src/api/storage/sql/migrations/20191029-committed-at.js index 9afd42316..14c6b1f80 100644 --- a/packages/server/src/api/storage/sql/migrations/20191029-committed-at.js +++ b/packages/server/src/api/storage/sql/migrations/20191029-committed-at.js @@ -5,21 +5,22 @@ */ 'use strict'; +const Sequelize = require('sequelize'); + /* eslint-disable new-cap */ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface - * @param {typeof import('sequelize')} Sequelize + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async (queryInterface, Sequelize) => { + up: async ({queryInterface}) => { await queryInterface.addColumn('builds', 'committedAt', {type: Sequelize.DATE(6)}); await queryInterface.addColumn('builds', 'ancestorCommittedAt', {type: Sequelize.DATE(6)}); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.removeColumn('builds', 'committedAt'); await queryInterface.removeColumn('builds', 'ancestorCommittedAt'); }, diff --git a/packages/server/src/api/storage/sql/migrations/2019110801-project-slug.js b/packages/server/src/api/storage/sql/migrations/2019110801-project-slug.js index 000ed1fbd..a06f52e5e 100644 --- a/packages/server/src/api/storage/sql/migrations/2019110801-project-slug.js +++ b/packages/server/src/api/storage/sql/migrations/2019110801-project-slug.js @@ -5,14 +5,15 @@ */ 'use strict'; +const Sequelize = require('sequelize'); + /* eslint-disable new-cap */ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface - * @param {typeof import('sequelize')} Sequelize + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async (queryInterface, Sequelize) => { + up: async ({queryInterface}) => { await queryInterface.addColumn('projects', 'slug', {type: Sequelize.STRING(40)}); await queryInterface.bulkUpdate( 'projects', @@ -28,9 +29,9 @@ module.exports = { }); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.removeIndex('projects', 'projects_unique_slug'); await queryInterface.removeColumn('projects', 'slug'); }, diff --git a/packages/server/src/api/storage/sql/migrations/2019111001-statistic-version.js b/packages/server/src/api/storage/sql/migrations/2019111001-statistic-version.js index 69cb3f935..b98380ccb 100644 --- a/packages/server/src/api/storage/sql/migrations/2019111001-statistic-version.js +++ b/packages/server/src/api/storage/sql/migrations/2019111001-statistic-version.js @@ -5,14 +5,15 @@ */ 'use strict'; +const Sequelize = require('sequelize'); + /* eslint-disable new-cap */ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface - * @param {typeof import('sequelize')} Sequelize + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async (queryInterface, Sequelize) => { + up: async ({queryInterface}) => { await queryInterface.addColumn('statistics', 'version', {type: Sequelize.DECIMAL(8, 2)}); await queryInterface.bulkUpdate( 'statistics', @@ -22,9 +23,9 @@ module.exports = { ); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.removeColumn('statistics', 'version'); }, }; diff --git a/packages/server/src/api/storage/sql/migrations/2020030501-admin-token.js b/packages/server/src/api/storage/sql/migrations/2020030501-admin-token.js index 1323332e3..da8090480 100644 --- a/packages/server/src/api/storage/sql/migrations/2020030501-admin-token.js +++ b/packages/server/src/api/storage/sql/migrations/2020030501-admin-token.js @@ -5,16 +5,16 @@ */ 'use strict'; +const Sequelize = require('sequelize'); const {hashAdminToken, generateAdminToken} = require('../../auth.js'); /* eslint-disable new-cap */ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface - * @param {typeof import('sequelize')} Sequelize + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async (queryInterface, Sequelize) => { + up: async ({queryInterface}) => { await queryInterface.addColumn('projects', 'adminToken', {type: Sequelize.STRING(64)}); await queryInterface.bulkUpdate( 'projects', @@ -26,9 +26,9 @@ module.exports = { ); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.removeColumn('projects', 'adminToken'); }, }; diff --git a/packages/server/src/api/storage/sql/migrations/2020032401-base-branch.js b/packages/server/src/api/storage/sql/migrations/2020032401-base-branch.js index 2b315af4b..5393acf2c 100644 --- a/packages/server/src/api/storage/sql/migrations/2020032401-base-branch.js +++ b/packages/server/src/api/storage/sql/migrations/2020032401-base-branch.js @@ -5,14 +5,15 @@ */ 'use strict'; +const Sequelize = require('sequelize'); + /* eslint-disable new-cap */ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface - * @param {typeof import('sequelize')} Sequelize + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async (queryInterface, Sequelize) => { + up: async ({queryInterface}) => { await queryInterface.addColumn('projects', 'baseBranch', {type: Sequelize.STRING(80)}); await queryInterface.bulkUpdate( 'projects', @@ -22,9 +23,9 @@ module.exports = { ); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.removeColumn('projects', 'baseBranch'); }, }; diff --git a/packages/server/src/api/storage/sql/migrations/2020081801-table-indexes.js b/packages/server/src/api/storage/sql/migrations/2020081801-table-indexes.js index c00537fdb..6af83abb5 100644 --- a/packages/server/src/api/storage/sql/migrations/2020081801-table-indexes.js +++ b/packages/server/src/api/storage/sql/migrations/2020081801-table-indexes.js @@ -7,9 +7,9 @@ module.exports = { /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - up: async queryInterface => { + up: async ({queryInterface}) => { await queryInterface.addIndex('builds', ['projectId', 'lifecycle', 'createdAt']); await queryInterface.addIndex('builds', ['projectId', 'hash', 'createdAt']); await queryInterface.addIndex('builds', ['projectId', 'branch', 'hash', 'createdAt']); @@ -18,9 +18,9 @@ module.exports = { await queryInterface.addIndex('statistics', ['projectId', 'buildId', 'url', 'name']); }, /** - * @param {import('sequelize').QueryInterface} queryInterface + * @param {{queryInterface: import('sequelize').QueryInterface, options: LHCI.ServerCommand.StorageOptions}} _ */ - down: async queryInterface => { + down: async ({queryInterface}) => { await queryInterface.removeIndex('builds', ['projectId', 'lifecycle']); await queryInterface.removeIndex('builds', ['projectId', 'hash']); await queryInterface.removeIndex('builds', ['projectId', 'branch', 'hash']); diff --git a/packages/server/src/api/storage/sql/sql.js b/packages/server/src/api/storage/sql/sql.js index e0246f243..a91f255b4 100644 --- a/packages/server/src/api/storage/sql/sql.js +++ b/packages/server/src/api/storage/sql/sql.js @@ -7,9 +7,8 @@ const log = require('debug')('lhci:server:sql'); const logVerbose = require('debug')('lhci:server:sql:verbose'); -const path = require('path'); const uuid = require('uuid'); -const Umzug = require('umzug'); +const {Umzug, SequelizeStorage} = require('umzug'); const {Sequelize, Op} = require('sequelize'); const {omit, padEnd} = require('@lhci/utils/src/lodash.js'); const {hashAdminToken, generateAdminToken} = require('../auth.js'); @@ -133,15 +132,29 @@ function createSequelize(options) { */ function createUmzug(sequelize, options) { return new Umzug({ - logging: /** @param {*} msg */ msg => logVerbose('[umzug]', msg), - storage: 'sequelize', - storageOptions: { - sequelize: /** @type {*} */ (sequelize), - tableName: options.sqlMigrationOptions && options.sqlMigrationOptions.tableName, + logger: { + debug: msg => logVerbose('[umzug]', msg), + warn: msg => logVerbose('[umzug]', msg), + error: msg => logVerbose('[umzug]', msg), + info: msg => logVerbose('[umzug]', msg), }, + storage: new SequelizeStorage({ + sequelize, + tableName: options.sqlMigrationOptions && options.sqlMigrationOptions.tableName, + }), + context: {queryInterface: sequelize.getQueryInterface(), options}, migrations: { - path: path.join(__dirname, 'migrations'), - params: [sequelize.getQueryInterface(), Sequelize, options], + glob: `${__dirname}/migrations/*.js`, + resolve: ({name, path, context}) => { + if (!path) throw new Error('unexpected missing path'); + + const migration = require(path); + return { + name, + up: async () => migration.up(context), + down: async () => migration.down(context), + }; + }, }, }); } diff --git a/yarn.lock b/yarn.lock index a743b6e07..031ce2bc5 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3250,6 +3250,16 @@ unbzip2-stream "1.4.3" yargs "17.7.1" +"@rushstack/ts-command-line@^4.12.2": + version "4.17.1" + resolved "https://registry.yarnpkg.com/@rushstack/ts-command-line/-/ts-command-line-4.17.1.tgz#c78db928ce5b93f2e98fd9e14c24f3f3876e57f1" + integrity sha512-2jweO1O57BYP5qdBGl6apJLB+aRIn5ccIRTPDyULh0KMwVzFqWtw6IZWt1qtUoZD/pD2RNkIOosH6Cq45rIYeg== + dependencies: + "@types/argparse" "1.0.38" + argparse "~1.0.9" + colors "~1.2.1" + string-argv "~0.3.1" + "@sentry/core@6.19.7": version "6.19.7" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-6.19.7.tgz#156aaa56dd7fad8c89c145be6ad7a4f7209f9785" @@ -3989,6 +3999,11 @@ resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-2.0.0.tgz#f544a148d3ab35801c1f633a7441fd87c2e484bf" integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== +"@types/argparse@1.0.38": + version "1.0.38" + resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9" + integrity sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA== + "@types/babel__core@^7.1.14": version "7.1.18" resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.18.tgz#1a29abcc411a9c05e2094c98f9a1b7da6cdf49f8" @@ -4029,10 +4044,10 @@ dependencies: "@babel/types" "^7.3.0" -"@types/bluebird@*": - version "3.5.25" - resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.25.tgz#59188b871208092e37767e4b3d80c3b3eaae43bd" - integrity sha512-yfhIBix+AIFTmYGtkC0Bi+XGjSkOINykqKvO/Wqdz/DuXlAKK7HmhLAXdPIGsV4xzKcL3ev/zYc4yLNo+OvGaw== +"@types/bluebird@^3.5.42": + version "3.5.42" + resolved "https://registry.yarnpkg.com/@types/bluebird/-/bluebird-3.5.42.tgz#7ec05f1ce9986d920313c1377a5662b1b563d366" + integrity sha512-Jhy+MWRlro6UjVi578V/4ZGNfeCOcNCp0YaFNIUGFKlImowqwb1O/22wDVk3FDGMLqxdpOV3qQHD5fPEH4hK6A== "@types/body-parser@*", "@types/body-parser@^1.17.0": version "1.17.0" @@ -4042,13 +4057,6 @@ "@types/connect" "*" "@types/node" "*" -"@types/bson@*": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/bson/-/bson-4.0.0.tgz#9073772679d749116eb1dfca56f8eaac6d59cc7a" - integrity sha512-pq/rqJwJWkbS10crsG5bgnrisL8pML79KlMKQMoQwLUjlPAkrUHMvHJ3oGwE7WHR61Lv/nadMwXVAD2b+fpD8Q== - dependencies: - "@types/node" "*" - "@types/color-name@^1.1.1": version "1.1.1" resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0" @@ -4068,13 +4076,6 @@ dependencies: "@types/node" "*" -"@types/continuation-local-storage@*": - version "3.2.1" - resolved "https://registry.yarnpkg.com/@types/continuation-local-storage/-/continuation-local-storage-3.2.1.tgz#a33e0df9dce9b424d1c98fc4fdebd8578dceec7e" - integrity sha1-oz4N+dzptCTRyY/E/evYV43O7H4= - dependencies: - "@types/node" "*" - "@types/cron@^1.7.2": version "1.7.2" resolved "https://registry.yarnpkg.com/@types/cron/-/cron-1.7.2.tgz#e9fb420da616920dae82d13adfca53282ffaab6e" @@ -4545,11 +4546,6 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/lodash@*": - version "4.14.120" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.120.tgz#cf265d06f6c7a710db087ed07523ab8c1a24047b" - integrity sha512-jQ21kQ120mo+IrDs1nFNVm/AsdFxIx2+vZ347DbogHJPd/JzKNMOqU6HCYin1W6v8l5R9XSO2/e9cxmn7HAnVw== - "@types/lodash@^4.14.167": version "4.14.188" resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.188.tgz#e4990c4c81f7c9b00c5ff8eae389c10f27980da5" @@ -4572,14 +4568,6 @@ resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== -"@types/mongodb@*": - version "3.3.6" - resolved "https://registry.yarnpkg.com/@types/mongodb/-/mongodb-3.3.6.tgz#ed8a2ff4a27170f8da284d817235c46019bdaa24" - integrity sha512-bPv0lGnkL/iOoA+GSAcS5ad9QyPc/rW547vrF5j+AKX4spaMZgpaCWQ4D6ipVSN6OKuks3ueCFEPinyJJSk2zA== - dependencies: - "@types/bson" "*" - "@types/node" "*" - "@types/morgan@^1.7.35": version "1.7.35" resolved "https://registry.yarnpkg.com/@types/morgan/-/morgan-1.7.35.tgz#6358f502931cc2583d7a94248c41518baa688494" @@ -4669,16 +4657,6 @@ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.3.tgz#7ee330ba7caafb98090bece86a5ee44115904c2c" integrity sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA== -"@types/sequelize@*": - version "4.28.5" - resolved "https://registry.yarnpkg.com/@types/sequelize/-/sequelize-4.28.5.tgz#25dcb3afd1518a52ab611d706c7be93a6ee28902" - integrity sha512-1n2GJuTnUPzXzO4pv/m531y1lYkWjxgtv+FGIa3DDF30XZMPzXBWfDt/XpXaR64OQ/6CWwf5ZMwJ2CucO0VFvw== - dependencies: - "@types/bluebird" "*" - "@types/continuation-local-storage" "*" - "@types/lodash" "*" - "@types/validator" "*" - "@types/serve-static@*": version "1.13.2" resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.13.2.tgz#f5ac4d7a6420a99a6a45af4719f4dcd8cd907a48" @@ -4726,14 +4704,6 @@ dependencies: source-map "^0.6.1" -"@types/umzug@^2.2.2": - version "2.2.2" - resolved "https://registry.yarnpkg.com/@types/umzug/-/umzug-2.2.2.tgz#0a17d4bd5c8b2416024c8d7cb25a55a79a53b075" - integrity sha512-1QN9IdwPsSftLniv2hguPSJQMnSQE8Eu+RzOOy5KlrLS75NLtAP7dGI11JkS0o2XoY1QdF0KTEGoGJ7zAawQuQ== - dependencies: - "@types/mongodb" "*" - "@types/sequelize" "*" - "@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2", "@types/unist@^2.0.3": version "2.0.6" resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d" @@ -4744,11 +4714,6 @@ resolved "https://registry.yarnpkg.com/@types/uuid/-/uuid-8.3.0.tgz#215c231dff736d5ba92410e6d602050cce7e273f" integrity sha512-eQ9qFW/fhfGJF8WKHGEHZEyVWfZxrT+6CLIJGBcZPfxUh/+BnEj+UCGYMlr9qZuX/2AltsvwrGqp0LhEW8D0zQ== -"@types/validator@*": - version "10.9.0" - resolved "https://registry.yarnpkg.com/@types/validator/-/validator-10.9.0.tgz#747f36c7ad281da769458ab4c3b8837aee1578b6" - integrity sha512-mf0VpXk+NoTmkUmuJCsdwBYxjYZW41amCSzd4t/fABMKl+qGMViwFP0pR7ukFdZRXWI1LIkca3VIbXVBmWZ4kQ== - "@types/validator@^13.7.17": version "13.11.7" resolved "https://registry.yarnpkg.com/@types/validator/-/validator-13.11.7.tgz#99e19760297667ae46b7069ec8b96cbfe0a08b98" @@ -5656,7 +5621,7 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" -argparse@^1.0.7: +argparse@^1.0.7, argparse@~1.0.9: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== @@ -6080,14 +6045,6 @@ babel-preset-jest@^29.4.3: babel-plugin-jest-hoist "^29.4.3" babel-preset-current-node-syntax "^1.0.0" -babel-runtime@^6.23.0: - version "6.26.0" - resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe" - integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4= - dependencies: - core-js "^2.4.0" - regenerator-runtime "^0.11.0" - bail@^1.0.0: version "1.0.5" resolved "https://registry.yarnpkg.com/bail/-/bail-1.0.5.tgz#b6fa133404a392cbc1f8c4bf63f5953351e7a776" @@ -6330,6 +6287,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" @@ -7264,6 +7228,11 @@ colors@1.4.0: resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== +colors@~1.2.1: + version "1.2.5" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.2.5.tgz#89c7ad9a374bc030df8013241f68136ed8835afc" + integrity sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg== + columnify@^1.5.4: version "1.5.4" resolved "https://registry.yarnpkg.com/columnify/-/columnify-1.5.4.tgz#4737ddf1c7b69a8a7c340570782e947eec8e78bb" @@ -7634,11 +7603,6 @@ core-js-compat@^3.20.0, core-js-compat@^3.20.2, core-js-compat@^3.8.1: browserslist "^4.19.1" semver "7.0.0" -core-js@^2.4.0: - version "2.6.9" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.9.tgz#6b4b214620c834152e179323727fc19741b084f2" - integrity sha512-HOpZf6eXmnl7la+cUdMnLvUxKNqLUzJvgIziQ0DiF3JwSImNphIqdGqzj6hIKyX04MmV0poclQ7+wjWvxQyR2A== - core-js@^3.0.4: version "3.6.4" resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.6.4.tgz#440a83536b458114b9cb2ac1580ba377dc470647" @@ -8840,7 +8804,7 @@ elliptic@^6.0.0: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.0" -emittery@^0.13.1: +emittery@^0.13.0, emittery@^0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== @@ -11067,6 +11031,17 @@ glob@^7.1.6: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^8.0.3: + version "8.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-8.1.0.tgz#d388f656593ef708ee3e34640fdfb99a9fd1c33e" + integrity sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ== + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^5.0.1" + once "^1.3.0" + global@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -14440,6 +14415,13 @@ minimatch@^3.0.4: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist-options@^3.0.1: version "3.0.2" resolved "https://registry.yarnpkg.com/minimist-options/-/minimist-options-3.0.2.tgz#fba4c8191339e13ecf4d61beb03f070103f3d954" @@ -16360,6 +16342,11 @@ polytope-closest-point@^1.0.0: dependencies: numeric "^1.2.6" +pony-cause@^2.1.4: + version "2.1.10" + resolved "https://registry.yarnpkg.com/pony-cause/-/pony-cause-2.1.10.tgz#828457ad6f13be401a075dbf14107a9057945174" + integrity sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw== + posix-character-classes@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" @@ -17348,11 +17335,6 @@ regenerate@^1.4.2: resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== -regenerator-runtime@^0.11.0: - version "0.11.1" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" - integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg== - regenerator-runtime@^0.13.10: version "0.13.10" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.10.tgz#ed07b19616bcbec5da6274ebc75ae95634bfc2ee" @@ -18922,6 +18904,11 @@ stream-shift@^1.0.0: resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" integrity sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI= +string-argv@~0.3.1: + version "0.3.2" + resolved "https://registry.yarnpkg.com/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6" + integrity sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q== + string-length@^4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/string-length/-/string-length-4.0.2.tgz#a8a8dc7bd5c1a82b9b3c8b87e125f66871b6e57a" @@ -19941,6 +19928,11 @@ type-fest@^0.8.1: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== +type-fest@^3.0.0: + version "3.13.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-3.13.1.tgz#bb744c1f0678bea7543a2d1ec24e83e68e8c8706" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + type-is@~1.6.16: version "1.6.16" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.16.tgz#f89ce341541c672b25ee7ae3c73dee3b2be50194" @@ -20025,13 +20017,16 @@ umask@^1.1.0: resolved "https://registry.yarnpkg.com/umask/-/umask-1.1.0.tgz#f29cebf01df517912bb58ff9c4e50fde8e33320d" integrity sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0= -umzug@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/umzug/-/umzug-2.2.0.tgz#6160bdc1817e4a63a625946775063c638623e62e" - integrity sha512-xZLW76ax70pND9bx3wqwb8zqkFGzZIK8dIHD9WdNy/CrNfjWcwQgQkGCuUqcuwEBvUm+g07z+qWvY+pxDmMEEw== - dependencies: - babel-runtime "^6.23.0" - bluebird "^3.5.3" +umzug@^3.4.0: + version "3.4.0" + resolved "https://registry.yarnpkg.com/umzug/-/umzug-3.4.0.tgz#97819a2d2288c8ce2c156c3be8b18b02f2208423" + integrity sha512-bTen9ElCBoWU1mhcaXqVZWXxB1PojsBQBs/4vW0YV8f5CfhuhkfRjQZj6SCb6IuHWPkccDzF+T+RGZCYUiXaKg== + dependencies: + "@rushstack/ts-command-line" "^4.12.2" + emittery "^0.13.0" + glob "^8.0.3" + pony-cause "^2.1.4" + type-fest "^3.0.0" unbox-primitive@^1.0.1: version "1.0.1"