1

I want to use my other code in an Umzug migration. I use Umzug with Sequelize in a NestJS project.

Umzug config:

require('ts-node/register')
const umzug = new Umzug({
    migrations: {
        path: process.env.MIGRATIONS_PATH,
        pattern: /\.ts$/,
    },
    storage: 'sequelize',
    storageOptions: {
        sequelize: sequelize,
    }
});
await sequelize.sync().then(() => umzug.up())

Migration:

import PostTypeId from "data/PostTypeId";

export async function up() {

}

export async function down() {

}

When Umzug is run at my app's startup, it prints:

[Nest] 316   - 02/21/2021, 11:24:42 AM   [ExceptionHandler] Cannot find module 'data/PostTypeId'
Require stack:
- /home/node/app/backend/src/database/migrations/2021-02-17_22-11-00_game-data.ts
- /home/node/app/backend/node_modules/umzug/lib/migration.js
- /home/node/app/backend/node_modules/umzug/lib/index.js
- /home/node/app/backend/dist/database/database.providers.js
- /home/node/app/backend/dist/database/database.module.js
- /home/node/app/backend/dist/app.module.config.js
- /home/node/app/backend/dist/app.module.js
- /home/node/app/backend/dist/main.js +4344ms
Error: Cannot find module 'data/PostTypeId'
Require stack:
- /home/node/app/backend/src/database/migrations/2021-02-17_22-11-00_game-data.ts
- /home/node/app/backend/node_modules/umzug/lib/migration.js
- /home/node/app/backend/node_modules/umzug/lib/index.js
- /home/node/app/backend/dist/database/database.providers.js
- /home/node/app/backend/dist/database/database.module.js
- /home/node/app/backend/dist/app.module.config.js
- /home/node/app/backend/dist/app.module.js
- /home/node/app/backend/dist/main.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:1029:15)
    at Function.Module._load (internal/modules/cjs/loader.js:898:27)
    at Module.require (internal/modules/cjs/loader.js:1089:19)
    at require (internal/modules/cjs/helpers.js:73:18)
    at Object.<anonymous> (/home/node/app/backend/src/database/migrations/2021-02-17_22-11-00_game-data.ts:3:1)
    at Module._compile (internal/modules/cjs/loader.js:1200:30)
    at Module.m._compile (/home/node/app/backend/node_modules/ts-node/src/index.ts:858:23)
    at Module._extensions..js (internal/modules/cjs/loader.js:1220:10)
    at Object.require.extensions.<computed> [as .ts] (/home/node/app/backend/node_modules/ts-node/src/index.ts:861:12)
    at Module.load (internal/modules/cjs/loader.js:1049:32)
    at Function.Module._load (internal/modules/cjs/loader.js:937:14)
    at Module.require (internal/modules/cjs/loader.js:1089:19)
    at require (internal/modules/cjs/helpers.js:73:18)
    at Migration.migration (/home/node/app/backend/node_modules/umzug/lib/migration.js:75:12)
    at /home/node/app/backend/node_modules/umzug/lib/migration.js:121:37
    at Generator.next (<anonymous>)
    at asyncGeneratorStep (/home/node/app/backend/node_modules/umzug/lib/migration.js:9:103)
    at _next (/home/node/app/backend/node_modules/umzug/lib/migration.js:11:194)
    at /home/node/app/backend/node_modules/umzug/lib/migration.js:11:364
    at new Promise (<anonymous>)
    at /home/node/app/backend/node_modules/umzug/lib/migration.js:11:97
    at Migration._exec (/home/node/app/backend/node_modules/umzug/lib/migration.js:139:7)

So obviously it can't import the module I want. But how to have a module imported in an Umzug migration then? I know I can pass stuff in migration parameters, but I need different parameters in different migrations.

gvlasov
  • 18,638
  • 21
  • 74
  • 110
  • Found this discussion in repo https://github.com/sequelize/umzug/issues/168 but don't really know how to apply that to get migrations as ES6 modules – gvlasov Feb 21 '21 at 11:33

2 Answers2

1

In order to load custom paths defined in tsconfig.json use tsconfig-paths. Then you can run migrate.js specified in the umzug example like this:

node -r tsconfig-paths/register migrate [up|down|create|...]
Nikaels
  • 11
  • 1
0

My problem was that I couldn't import modules from my project's source code as defined in my tsconfig.json:

"paths": {
  "data/*": [
    "src/data/*"
  ]
},

, but I could import modules from node_modules. I don't know how to have my paths from tsconfig.json used in Umuzg migrations, but the workaround for me was to use relative paths for imports: instead of

import PostTypeId from "data/PostTypeId";

I used

import PostTypeId from "../../data/PostTypeId";

Not very beautiful, but it works. If anyone knows how to use your own tsconfig.json in Umzug migrations, please share your knowledge.

gvlasov
  • 18,638
  • 21
  • 74
  • 110