Releases: sequelize/umzug
v3.3.1
Amended release notes from 3.3.0 (and comparison with v3.2.1):
What's Changed
v3.3.0
Original release notes
## What's Changed * Fix false positive Confusing Ordering warning by @rpominov in https://github.com//pull/575 * async template function by @ccamensuli in https://github.com//pull/591 * Fix typo in readme by @sdepold in https://github.com//pull/604 * feat: remove uniqueness from sequelize storage by @mau31415 in https://github.com//pull/602New Contributors
Full Changelog: v3.2.1...v3.3.0
v3.2.1
v3.2.0
v3.1.2
What's Changed
- chore(deps): bump moment from 2.29.1 to 2.29.2 by @dependabot in #552
- chore: bump dependencies (incl pony-cause -> v2.1.2) by @mmkal in #562 (see #561)
Full Changelog: v3.1.1...v3.1.2
v3.1.1
- fix(deps): bump emittery to avoid sindresorhus/emittery#95 (see #541 (comment)) 7baad24
- chore(deps): bump minimist from 1.2.5 to 1.2.6 (#549) b3b3582
v3.1.0
v3.0.0
Major release with some breaking changes since v2.x, see migration guide here: https://github.com/sequelize/umzug#upgrading-from-v2x
Several new features, including a new built-in CLI, typescript support, templating, improved events, logging and error messages, and more.
Find usage examples under https://github.com/sequelize/umzug/tree/master/examples
Migration guide at time of writing copied here for covenience:
Upgrading from v2.x
The Umzug class should be imported as a named import, i.e. import { Umzug } from 'umzug'
.
The MigrationMeta
type, which is returned by umzug.executed()
and umzug.pending()
, no longer has a file
property - it has a name
and optional path
- since migrations are not necessarily bound to files on the file system.
The migrations.glob
parameter replaces path
, pattern
and traverseDirectories
. It can be used, in combination with cwd
and ignore
to do much more flexible file lookups. See https://npmjs.com/package/glob for more information on the syntax.
The migrations.resolve
parameter replaces customResolver
. Explicit support for wrap
and nameFormatter
has been removed - these can be easily implemented in a resolve
function.
The constructor option logging
is replaced by logger
to allow for warn
and error
messages in future. NodeJS's global console
object can be passed to this. To disable logging, replace logging: false
with logger: undefined
.
Breaking change to storages: remove string parameter (#429) b6414ba
- Custom storage implementations must update
logMigration(name) { ... }
tologMigration({ name }) { ...}
. Likewise withunlogMigration
. This is to allow receivingcontext
andpath
properties in the same arg object.
Note that this may break external storage implementations too. To adapt, you can just modify or extend thelogMigration
andunlogMigration
implementations (something likelogMigration: ({ name }) => oldStorage.logMigration(name)
).
Events have moved from the default nodejs EventEmitter
to emittery. It has better design for async code, a less bloated API surface and strong types. But, it doesn't allow passing multiple arguments to callbacks, so listeners have to change slightly, as well as .addListener(...)
and .removeListener(...)
no longer being supported (.on(...)
and .off(...)
should now be used):
Before:
umzug.on('migrating', (name, m) => console.log({ name, path: m.path }))
After:
umzug.on('migrating', ev => console.log({ name: ev.name, path: ev.path }))
The Umzug#execute
method is removed. Use Umzug#up
or Umzug#down
.
The options for Umguz#up
and Umzug#down
have changed:
umzug.up({ to: 'some-name' })
andumzug.down({ to: 'some-name' })
are still valid.umzug.up({ from: '...' })
andumzug.down({ from: '...' })
are no longer supported. To run migrations out-of-order (which is not generally recommended), you can explicitly useumzug.up({ migrations: ['...'] })
andumzug.down({ migrations: ['...'] })
.- name matches must be exact.
umzug.up({ to: 'some-n' })
will no longer match a migration calledsome-name
. umzug.down({ to: 0 })
is still valid butumzug.up({ to: 0 })
is not.umzug.up({ migrations: ['m1', 'm2'] })
is still valid but the shorthandumzug.up(['m1', 'm2'])
has been removed.umzug.down({ migrations: ['m1', 'm2'] })
is still valid but the shorthandumzug.down(['m1', 'm2'])
has been removed.umzug.up({ migrations: ['m1', 'already-run'] })
will throw an error, ifalready-run
is not found in the list of pending migrations.umzug.down({ migrations: ['m1', 'has-not-been-run'] })
will throw an error, ifhas-not-been-run
is not found in the list of executed migrations.umzug.up({ migrations: ['m1', 'm2'], rerun: 'ALLOW' })
will re-apply migrationsm1
andm2
even if they've already been run.umzug.up({ migrations: ['m1', 'm2'], rerun: 'SKIP' })
will skip migrationsm1
andm2
if they've already been run.umzug.down({ migrations: ['m1', 'm2'], rerun: 'ALLOW' })
will "revert" migrationsm1
andm2
even if they've never been run.umzug.down({ migrations: ['m1', 'm2'], rerun: 'SKIP' })
will skip reverting migrationsm1
andm2
if they haven't been run or are already reverted.umzug.up({ migrations: ['m1', 'does-not-exist', 'm2'] })
will throw an error if the migration name is not found. Note that the error will be thrown and no migrations run unless all migration names are found - whether or notrerun: 'ALLOW'
is added.
The context
parameter replaces params
, and is passed in as a property to migration functions as an options object, alongs side name
and path
. This means the signature for migrations, which in v2 was (context) => Promise<void>
, has changed slightly in v3, to ({ name, path, context }) => Promise<void>
.
Handling existing v2-format migrations
The resolve
function can also be used to upgrade your umzug version to v3 when you have existing v2-compatible migrations:
const { Umzug } = require('umzug');
const umzug = new Umzug({
migrations: {
glob: 'migrations/umzug-v2-format/*.js',
resolve: ({name, path, context}) => {
// Adjust the migration from the new signature to the v2 signature, making easier to upgrade to v3
const migration = require(path)
return { name, up: async () => migration.up(context), down: async () => migration.down(context) }
}
},
context: sequelize.getQueryInterface(),
logger: console,
});
Similarly, you no longer need migrationSorting
, you can instantiate a new Umzug
instance to manipulate migration lists directly:
const { Umzug } = require('umzug');
const parent = new Umzug({
migrations: { glob: 'migrations/**/*.js' },
context: sequelize.getQueryInterface(),
})
const umzug = new Umzug({
...parent.options,
migrations: ctx => (await parent.migrations()).sort((a, b) => b.path.localeCompare(a.path))
})
👇 full, generated changelog
What's Changed
- feat: add format function by @jaulz in #196
- Super refactor by @papb in #206
- Fix typo by @rockers7414 in #207
- TypeScript rewrite by @papb in #209
- chore(lint): prettier by @mmkal in #213
- chore: add v3 notice to readme by @mmkal in #214
- Support custom sorting function by @rockers7414 in #208
- refactor: jest by @mmkal in #215
- chore: editorconfig by @mmkal in #218
- test: convert storage tests to typescript by @mmkal in #217
- chore: use localeCompare for string comparison by @mmkal in #219
- feat: memory storage by @mmkal in #220
- test: port legacy-tests to jest by @mmkal in #221
- fix: make types allow { to: 0 } by @mmkal in #223
- fix: workaround sequelize types in tests by @mmkal in #226
- test: events by @mmkal in #225
- test: code coverage by @mmkal in #229
- fix: to: undefined shouldn't be like to: 0 by @mmkal in #231
- fix: sequelize latest by @mmkal in #232
- Configure Renovate by @renovate in #234
- Update README.md by @luwol03 in #321
- feat: v3 api by @mmkal in #325
- feat: allow skipping re-runs by @mmkal in #342
- docs: add example for multiple glob dirs by @mmkal in #343
- fix(deps): update dependency fs-jetpack to v3 by @renovate in #260
- fix: keep extension in migration name by @mmkal in #354
- chore(renovate): group dev dependencies by @mmkal in #356
- docs: beta vs stable package install instructions by @mmkal in #350
- fix: import sequelize as a type by @mmkal in #349
- Pass name, path, context to up/down functions by @mmkal in #355
- fix(deps): update dependency fs-jetpack to v4 by @renovate in #365
- chore: turn on typescript strictNullChecks by @mmkal in #368
- feat: return migration meta from up/down by @mmkal in #367
- fix: remove sequelize type dependency completely by @mmkal in #370
- Completed v2 migration snippet by @MichielDeMey in #380
- Separate out glob input type by @mmkal in #385
- fix: require ts optimistically by @mmkal in #388
- Support
step
in up and down options by @mmkal in #386 - Log json-able objects instead of strings by @mmkal in #393
- Typed async events by @mmkal in #394
- Add beforeAll/afterAll events + file locking by @mmkal in #397
- Pass con...
v3.0.0-beta-cli.18
- Create post-release.yml 7448d3f
- Sequelize v6 (#527) ca2db34
- Separate lint dependencies (#526) 0bea5d1
- rm yarn.lock e0cb83d
- chore(deps): update devdependencies (major) (#432) e5a511a
- chore(deps): update devdependencies (#446) ec2c572
- chore(deps): update dependency json-schema to 0.4.0 [security] (#524) b9dd193
- Remove
.extend(...)
in favour of constructor (#523) 2911d20 - fix(deps): update dependency type-fest to v2 (#517) 20b769d
- chore(deps): update codecov/codecov-action action to v2 (#515) fbec984
- Create FUNDING.yml 47aa6b2
- fix(deps): update dependency emittery to ^0.10.0 (#481) f749e5e
- Bump sqlite3 version to avoid node-gyp error (#516) 457d57b
- Drop support for node <12 (#511) 555f481
- chore(deps): update dependency sequelize to v5.22.4 (#448) e1cec9c
- chore(deps): update dependency ansi-regex to 5.0.1 [security] (#510) dcc8fc5
- chore(deps): update dependency path-parse to 1.0.7 [security] (#508) ac43ae9
- Update umzug.mjs (#509) e739e1f
- Add documentation for configuring Umzug migration parameters (#493) f7d4692
- chore(deps): update dependency tmpl to 1.0.5 [security] (#506) 946e496
- fix #491. replace
removeOne
withdeleteOne
(#492) cd7a1ad - docs: fix code example (#489) db34970