diff options
author | kumavis <kumavis@users.noreply.github.com> | 2017-02-08 10:55:26 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-02-08 10:55:26 +0800 |
commit | c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9 (patch) | |
tree | 139d5dfad53652b50e0af07c3aec37394b3b654b /app/scripts/lib/migrator/index.js | |
parent | ffe588365cb2dd84906613d13ad8e35b08a08dbb (diff) | |
parent | ce57957aa0fdeb79efd6ede8b6e94b8f26131dcf (diff) | |
download | tangerine-wallet-browser-c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9.tar tangerine-wallet-browser-c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9.tar.gz tangerine-wallet-browser-c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9.tar.bz2 tangerine-wallet-browser-c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9.tar.lz tangerine-wallet-browser-c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9.tar.xz tangerine-wallet-browser-c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9.tar.zst tangerine-wallet-browser-c9aab2084ec7dd8b81b02c9053a8fcbb6038e0b9.zip |
Merge pull request #1094 from MetaMask/dev
Version 3.2.0
Diffstat (limited to 'app/scripts/lib/migrator/index.js')
-rw-r--r-- | app/scripts/lib/migrator/index.js | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/app/scripts/lib/migrator/index.js b/app/scripts/lib/migrator/index.js new file mode 100644 index 000000000..312345263 --- /dev/null +++ b/app/scripts/lib/migrator/index.js @@ -0,0 +1,51 @@ +const asyncQ = require('async-q') + +class Migrator { + + constructor (opts = {}) { + let migrations = opts.migrations || [] + this.migrations = migrations.sort((a, b) => a.version - b.version) + let lastMigration = this.migrations.slice(-1)[0] + // use specified defaultVersion or highest migration version + this.defaultVersion = opts.defaultVersion || (lastMigration && lastMigration.version) || 0 + } + + // run all pending migrations on meta in place + migrateData (versionedData = this.generateInitialState()) { + let remaining = this.migrations.filter(migrationIsPending) + + return ( + asyncQ.eachSeries(remaining, (migration) => this.runMigration(versionedData, migration)) + .then(() => versionedData) + ) + + // migration is "pending" if hit has a higher + // version number than currentVersion + function migrationIsPending(migration) { + return migration.version > versionedData.meta.version + } + } + + runMigration(versionedData, migration) { + return ( + migration.migrate(versionedData) + .then((versionedData) => { + if (!versionedData.data) return Promise.reject(new Error('Migrator - Migration returned empty data')) + if (migration.version !== undefined && versionedData.meta.version !== migration.version) return Promise.reject(new Error('Migrator - Migration did not update version number correctly')) + return Promise.resolve(versionedData) + }) + ) + } + + generateInitialState (initState) { + return { + meta: { + version: this.defaultVersion, + }, + data: initState, + } + } + +} + +module.exports = Migrator |