mirror of
https://github.com/bitwarden/browser
synced 2025-12-18 01:03:35 +00:00
PM-3585 Improve state migrations (#5009)
* WIP: safer state migrations Co-authored-by: Justin Baur <justindbaur@users.noreply.github.com> * Add min version check and remove old migrations Co-authored-by: Oscar Hinton <Hinton@users.noreply.github.com> * Add rollback and version checking * Add state version move migration * Expand tests and improve typing for Migrations * Remove StateMigration Service * Rewrite version 5 and 6 migrations * Add all but initial migration to supported migrations * Handle stateVersion location in migrator update versions * Move to unique migrations directory * Disallow imports outside of state-migrations * Lint and test fixes * Do not run migrations if we cannot determine state * Fix desktop background StateService build * Document Migration builder class * Add debug logging to migrations * Comment on migrator overrides * Use specific property names * `npm run prettier` 🤖 * Insert new migration * Set stateVersion when creating new globals object * PR comments * Fix migrate imports * Move migration building into `migrate` function * Export current version from migration definitions * Move file version concerns to migrator * Update migrate spec to reflect new version requirements * Fix import paths * Prefer unique state data * Remove unnecessary async * Prefer to not use `any` --------- Co-authored-by: Justin Baur <justindbaur@users.noreply.github.com> Co-authored-by: Oscar Hinton <Hinton@users.noreply.github.com>
This commit is contained in:
26
libs/common/src/state-migrations/migrations/min-version.ts
Normal file
26
libs/common/src/state-migrations/migrations/min-version.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { MinVersion, MIN_VERSION } from "../migrate";
|
||||
import { MigrationHelper } from "../migration-helper";
|
||||
import { IRREVERSIBLE, Migrator } from "../migrator";
|
||||
|
||||
export function minVersionError(current: number) {
|
||||
return `Your local data is too old to be migrated. Your current state version is ${current}, but minimum version is ${MIN_VERSION}.`;
|
||||
}
|
||||
|
||||
export class MinVersionMigrator extends Migrator<0, MinVersion> {
|
||||
constructor() {
|
||||
super(0, MIN_VERSION);
|
||||
}
|
||||
|
||||
// Overrides the default implementation to catch any version that may be passed in.
|
||||
override shouldMigrate(helper: MigrationHelper): Promise<boolean> {
|
||||
return Promise.resolve(helper.currentVersion < MIN_VERSION);
|
||||
}
|
||||
async migrate(helper: MigrationHelper): Promise<void> {
|
||||
if (helper.currentVersion < MIN_VERSION) {
|
||||
throw new Error(minVersionError(helper.currentVersion));
|
||||
}
|
||||
}
|
||||
async rollback(helper: MigrationHelper): Promise<void> {
|
||||
throw IRREVERSIBLE;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user