diff --git a/package.json b/package.json index 0d59f0f4ef..ba6aa3674d 100644 --- a/package.json +++ b/package.json @@ -124,6 +124,7 @@ "@types/owasp-password-strength-test": "^1.3.0", "@types/stoppable": "^1.1.1", "@types/supertest": "^2.0.11", + "@types/uuid": "^8.3.1", "@typescript-eslint/eslint-plugin": "^4.22.0", "@typescript-eslint/parser": "^4.22.0", "copyfiles": "^2.4.1", diff --git a/src/lib/db/feature-strategy-store.ts b/src/lib/db/feature-strategy-store.ts index 00aeddd085..ba5302ccc8 100644 --- a/src/lib/db/feature-strategy-store.ts +++ b/src/lib/db/feature-strategy-store.ts @@ -1,6 +1,6 @@ import { Knex } from 'knex'; import EventEmitter from 'events'; -import * as uuid from 'uuid'; +import { v4 as uuidv4 } from 'uuid'; import metricsHelper from '../util/metrics-helper'; import { DB_TIME } from '../metric-events'; import { Logger, LogProvider } from '../logger'; @@ -142,7 +142,7 @@ class FeatureStrategiesStore implements IFeatureStrategiesStore { async createStrategyConfig( strategyConfig: Omit, ): Promise { - const strategyRow = mapInput({ ...strategyConfig, id: uuid.v4() }); + const strategyRow = mapInput({ ...strategyConfig, id: uuidv4() }); const rows = await this.db(T.featureStrategies) .insert(strategyRow) .returning('*'); diff --git a/src/lib/server-impl.ts b/src/lib/server-impl.ts index ed74d04489..5f081292b2 100644 --- a/src/lib/server-impl.ts +++ b/src/lib/server-impl.ts @@ -2,7 +2,7 @@ import EventEmitter from 'events'; import stoppable, { StoppableServer } from 'stoppable'; import { promisify } from 'util'; import version from './util/version'; -import migrator from '../migrator'; +import { migrateDb } from '../migrator'; import getApp from './app'; import { createMetricsMonitor } from './metrics'; import { createStores } from './db'; @@ -116,7 +116,7 @@ async function start(opts: IUnleashOptions = {}): Promise { logger.info('DB migration: disabled'); } else { logger.info('DB migration: start'); - await migrator(config); + await migrateDb(config); logger.info('DB migration: end'); } } catch (err) { @@ -140,7 +140,7 @@ async function create(opts: IUnleashOptions): Promise { if (config.db.disableMigration) { logger.info('DB migrations disabled'); } else { - await migrator(config); + await migrateDb(config); } } catch (err) { logger.error('Failed to migrate db', err); diff --git a/src/migrator.js b/src/migrator.js deleted file mode 100644 index 810bf3d538..0000000000 --- a/src/migrator.js +++ /dev/null @@ -1,19 +0,0 @@ -'use strict'; - -require('db-migrate-shared').log.setLogLevel('error'); - -const { getInstance } = require('db-migrate'); - -async function migrateDb({ db }) { - const custom = { ...db, connectionTimeoutMillis: 10000 }; - - const dbm = getInstance(true, { - cwd: __dirname, - config: { custom }, - env: 'custom', - }); - - return dbm.up(); -} - -module.exports = migrateDb; diff --git a/src/migrator.ts b/src/migrator.ts new file mode 100644 index 0000000000..b119668b2e --- /dev/null +++ b/src/migrator.ts @@ -0,0 +1,30 @@ +import { log } from 'db-migrate-shared'; +import { getInstance } from 'db-migrate'; +import { IUnleashConfig } from './lib/types/option'; + +log.setLogLevel('error'); + +export async function migrateDb({ db }: IUnleashConfig): Promise { + const custom = { ...db, connectionTimeoutMillis: 10000 }; + + const dbm = getInstance(true, { + cwd: __dirname, + config: { custom }, + env: 'custom', + }); + + return dbm.up(); +} + +// This exists to ease testing +export async function resetDb({ db }: IUnleashConfig): Promise { + const custom = { ...db, connectionTimeoutMillis: 10000 }; + + const dbm = getInstance(true, { + cwd: __dirname, + config: { custom }, + env: 'custom', + }); + + return dbm.reset(); +} diff --git a/src/test/e2e/helpers/database-init.ts b/src/test/e2e/helpers/database-init.ts index b5d0dffbd3..dd11152465 100644 --- a/src/test/e2e/helpers/database-init.ts +++ b/src/test/e2e/helpers/database-init.ts @@ -1,5 +1,5 @@ import { EventEmitter } from 'events'; -import migrator from '../../../migrator'; +import { migrateDb } from '../../../migrator'; import { createStores } from '../../../lib/db'; import { createDb } from '../../../lib/db/db-pool'; import dbConfig from './database-config'; @@ -88,7 +88,7 @@ export default async function init( await db.raw(`DROP SCHEMA IF EXISTS ${config.db.schema} CASCADE`); await db.raw(`CREATE SCHEMA IF NOT EXISTS ${config.db.schema}`); // @ts-ignore - await migrator({ ...config, databaseSchema: config.db.schema }); + await migrateDb({ ...config, databaseSchema: config.db.schema }); await db.destroy(); const testDb = createDb(config); const stores = await createStores(config, eventBus, testDb); diff --git a/yarn.lock b/yarn.lock index 38445a3cb6..4177c15224 100644 --- a/yarn.lock +++ b/yarn.lock @@ -888,6 +888,11 @@ dependencies: "@types/superagent" "*" +"@types/uuid@^8.3.1": + version "8.3.1" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.1.tgz" + integrity sha512-Y2mHTRAbqfFkpjldbkHGY8JIzRN6XqYRliG8/24FcHm2D2PwW24fl5xMRTVGdrb7iMrwCaIEbLWerGIkXuFWVg== + "@types/yargs-parser@*": version "20.2.1" resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-20.2.1.tgz" @@ -1233,12 +1238,12 @@ async@^3.1.1: async@~0.9.0: version "0.9.2" - resolved "https://registry.yarnpkg.com/async/-/async-0.9.2.tgz#aea74d5e61c1f899613bf64bda66d4c78f2fd17d" + resolved "https://registry.npmjs.org/async/-/async-0.9.2.tgz" integrity sha1-rqdNXmHB+JlhO/ZL2mbUx48v0X0= async@~1.0.0: version "1.0.0" - resolved "https://registry.yarnpkg.com/async/-/async-1.0.0.tgz#f8fc04ca3a13784ade9e1641af98578cfbd647a9" + resolved "https://registry.npmjs.org/async/-/async-1.0.0.tgz" integrity sha1-+PwEyjoTeErenhZBr5hXjPvWR6k= asynckit@^0.4.0: @@ -1557,7 +1562,7 @@ char-regex@^1.0.2: chownr@^2.0.0: version "2.0.0" - resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece" + resolved "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz" integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ== ci-info@^3.1.1: @@ -1677,12 +1682,12 @@ colorette@^1.2.2: colors@1.0.x: version "1.0.3" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" + resolved "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz" integrity sha1-BDP0TYCWgP3rYO0mDxsMJi6CpAs= colors@^1.1.2: version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + resolved "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz" integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== combined-stream@^1.0.6, combined-stream@^1.0.8, combined-stream@~1.0.6: @@ -1923,7 +1928,7 @@ cssstyle@^2.3.0: cycle@1.0.x: version "1.0.3" - resolved "https://registry.yarnpkg.com/cycle/-/cycle-1.0.3.tgz#21e80b2be8580f98b468f379430662b046c34ad2" + resolved "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz" integrity sha1-IegLK+hYD5i0aPN5QwZisEbDStI= d@1, d@^1.0.1: @@ -1969,7 +1974,7 @@ db-migrate-base@^2.3.0: db-migrate-pg@1.2.2: version "1.2.2" - resolved "https://registry.yarnpkg.com/db-migrate-pg/-/db-migrate-pg-1.2.2.tgz#66436dbad0ba398c05851d200f768db6b2e5bc1a" + resolved "https://registry.npmjs.org/db-migrate-pg/-/db-migrate-pg-1.2.2.tgz" integrity sha512-+rgrhGNWC2SzcfweopyZqOQ1Igz1RVFMUZwUs6SviHpOUzFwb0NZWkG0pw1GaO+JxTxS7VJjckUWkOwZbVYVag== dependencies: bluebird "^3.1.1" @@ -1984,7 +1989,7 @@ db-migrate-shared@1.2.0, db-migrate-shared@^1.2.0: db-migrate@0.11.12: version "0.11.12" - resolved "https://registry.yarnpkg.com/db-migrate/-/db-migrate-0.11.12.tgz#2798fc46da51fc2589497d462f3c6116802cfb6a" + resolved "https://registry.npmjs.org/db-migrate/-/db-migrate-0.11.12.tgz" integrity sha512-HUS8T5A3sKGCi+hz9XMKMwAKfU9sqhpDufW9nbVSRc5wxDO695uxA5lDe+If0OdvwwQOVxOnEZqkzAAxgyeFWg== dependencies: balanced-match "^1.0.0" @@ -2781,7 +2786,7 @@ extsprintf@^1.2.0: eyes@0.1.x: version "0.1.8" - resolved "https://registry.yarnpkg.com/eyes/-/eyes-0.1.8.tgz#62cf120234c683785d902348a800ef3e0cc20bc0" + resolved "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz" integrity sha1-Ys8SAjTGg3hdkCNIqADvPgzCC8A= faker@^5.5.3: @@ -3048,7 +3053,7 @@ fs-extra@^8.1.0: fs-minipass@^2.0.0: version "2.1.0" - resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb" + resolved "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz" integrity sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg== dependencies: minipass "^3.0.0" @@ -3806,7 +3811,7 @@ isobject@^3.0.0, isobject@^3.0.1: isstream@0.1.x, isstream@~0.1.2: version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" + resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= istanbul-lib-coverage@^3.0.0: @@ -4443,7 +4448,7 @@ kleur@^3.0.3: knex@0.95.10: version "0.95.10" - resolved "https://registry.yarnpkg.com/knex/-/knex-0.95.10.tgz#9c41a4f69309bc437f79985cbc0a1e7a3208483e" + resolved "https://registry.npmjs.org/knex/-/knex-0.95.10.tgz" integrity sha512-I60A8TXcMdeJlE6h7DSgEYyY37S7kgLObz1qlJ7QvPMD6vnKO5dtuLEht5pMia9Qf5BomqVgkWCdVTqcC/ImOA== dependencies: colorette "1.2.1" @@ -4870,14 +4875,14 @@ minimist@^1.2.0, minimist@^1.2.5: minipass@^3.0.0: version "3.1.3" - resolved "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz#7d42ff1f39635482e15f9cdb53184deebd5815fd" + resolved "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz" integrity sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg== dependencies: yallist "^4.0.0" minizlib@^2.1.1: version "2.1.2" - resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931" + resolved "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz" integrity sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg== dependencies: minipass "^3.0.0" @@ -4893,7 +4898,7 @@ mixin-deep@^1.2.0: mkdirp@1.x, mkdirp@^1.0.3, mkdirp@^1.0.4: version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz" integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== mkdirp@^0.5.4, mkdirp@~0.5.0: @@ -4959,7 +4964,7 @@ mustache@^4.1.0: mute-stream@~0.0.4: version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== nanomatch@^1.2.9: @@ -5645,7 +5650,7 @@ promise-polyfill@^8.1.3: prompt@^1.0.0: version "1.2.0" - resolved "https://registry.yarnpkg.com/prompt/-/prompt-1.2.0.tgz#5d8f1d9011766bac07abde510dbf4338d87b4f02" + resolved "https://registry.npmjs.org/prompt/-/prompt-1.2.0.tgz" integrity sha512-iGerYRpRUg5ZyC+FJ/25G5PUKuWAGRjW1uOlhX7Pi3O5YygdK6R+KEaBjRbHSkU5vfS5PZCltSPZdDtUYwRCZA== dependencies: async "~0.9.0" @@ -5801,7 +5806,7 @@ read-pkg@^6.0.0: read@1.0.x: version "1.0.7" - resolved "https://registry.yarnpkg.com/read/-/read-1.0.7.tgz#b3da19bd052431a97671d44a42634adf710b40c4" + resolved "https://registry.npmjs.org/read/-/read-1.0.7.tgz" integrity sha1-s9oZvQUkMal2cdRKQmNK33ELQMQ= dependencies: mute-stream "~0.0.4" @@ -5850,7 +5855,7 @@ readable-stream@~1.0.31: rechoir@0.7.0: version "0.7.0" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.0.tgz#32650fd52c21ab252aa5d65b19310441c7e03aca" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz" integrity sha512-ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q== dependencies: resolve "^1.9.0" @@ -6005,7 +6010,7 @@ reusify@^1.0.4: revalidator@0.1.x: version "0.1.8" - resolved "https://registry.yarnpkg.com/revalidator/-/revalidator-0.1.8.tgz#fece61bfa0c1b52a206bd6b18198184bdd523a3b" + resolved "https://registry.npmjs.org/revalidator/-/revalidator-0.1.8.tgz" integrity sha1-/s5hv6DBtSoga9axgZgYS91SOjs= rfdc@^1.1.4: @@ -6363,7 +6368,7 @@ sshpk@^1.7.0: stack-trace@0.0.x: version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" + resolved "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz" integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= stack-utils@^2.0.3: @@ -6626,7 +6631,7 @@ table@^6.0.9: tar@^6.1.0: version "6.1.11" - resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621" + resolved "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz" integrity sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA== dependencies: chownr "^2.0.0" @@ -7200,7 +7205,7 @@ wide-align@^1.1.0: winston@2.x: version "2.4.5" - resolved "https://registry.yarnpkg.com/winston/-/winston-2.4.5.tgz#f2e431d56154c4ea765545fc1003bd340c95b59a" + resolved "https://registry.npmjs.org/winston/-/winston-2.4.5.tgz" integrity sha512-TWoamHt5yYvsMarGlGEQE59SbJHqGsZV8/lwC+iCcGeAe0vUaOh+Lv6SYM17ouzC/a/LB1/hz/7sxFBtlu1l4A== dependencies: async "~1.0.0" @@ -7280,7 +7285,7 @@ y18n@^5.0.5: yallist@^4.0.0: version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== yaml@^1.10.0: