mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-23 09:52:26 +01:00
Merge pull request #1417 from MetaMask/fixMigrator2
Fix and simplify migrator with es7
This commit is contained in:
commit
117cf9c331
@ -1,42 +1,35 @@
|
||||
const asyncQ = require('async-q')
|
||||
|
||||
class Migrator {
|
||||
|
||||
constructor (opts = {}) {
|
||||
const migrations = opts.migrations || []
|
||||
// sort migrations by version
|
||||
this.migrations = migrations.sort((a, b) => a.version - b.version)
|
||||
// grab migration with highest version
|
||||
const 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()) {
|
||||
const remaining = this.migrations.filter(migrationIsPending)
|
||||
async migrateData (versionedData = this.generateInitialState()) {
|
||||
const pendingMigrations = this.migrations.filter(migrationIsPending)
|
||||
|
||||
return (
|
||||
asyncQ.eachSeries(remaining, (migration) => this.runMigration(versionedData, migration))
|
||||
.then(() => versionedData)
|
||||
)
|
||||
for (let index in pendingMigrations) {
|
||||
let migration = pendingMigrations[index]
|
||||
versionedData = await migration.migrate(versionedData)
|
||||
if (!versionedData.data) throw new Error('Migrator - migration returned empty data')
|
||||
if (versionedData.version !== undefined && versionedData.meta.version !== migration.version) throw new Error('Migrator - Migration did not update version number correctly')
|
||||
}
|
||||
|
||||
// migration is "pending" if hit has a higher
|
||||
return versionedData
|
||||
|
||||
// migration is "pending" if it 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: {
|
||||
|
@ -1,6 +1,6 @@
|
||||
machine:
|
||||
node:
|
||||
version: 6.0.0
|
||||
version: 7.6.0
|
||||
dependencies:
|
||||
pre:
|
||||
- "npm i -g testem"
|
||||
|
41
test/unit/migrator-test.js
Normal file
41
test/unit/migrator-test.js
Normal file
@ -0,0 +1,41 @@
|
||||
const assert = require('assert')
|
||||
const clone = require('clone')
|
||||
const Migrator = require('../../app/scripts/lib/migrator/')
|
||||
const migrations = [
|
||||
{
|
||||
version: 1,
|
||||
migrate: (data) => {
|
||||
// clone the data just like we do in migrations
|
||||
const clonedData = clone(data)
|
||||
clonedData.meta.version = 1
|
||||
return Promise.resolve(clonedData)
|
||||
},
|
||||
},
|
||||
{
|
||||
version: 2,
|
||||
migrate: (data) => {
|
||||
const clonedData = clone(data)
|
||||
clonedData.meta.version = 2
|
||||
return Promise.resolve(clonedData)
|
||||
},
|
||||
},
|
||||
{
|
||||
version: 3,
|
||||
migrate: (data) => {
|
||||
const clonedData = clone(data)
|
||||
clonedData.meta.version = 3
|
||||
return Promise.resolve(clonedData)
|
||||
},
|
||||
},
|
||||
]
|
||||
const versionedData = {meta: {version: 0}, data:{hello:'world'}}
|
||||
describe('Migrator', () => {
|
||||
const migrator = new Migrator({ migrations })
|
||||
it('migratedData version should be version 3', (done) => {
|
||||
migrator.migrateData(versionedData)
|
||||
.then((migratedData) => {
|
||||
assert.equal(migratedData.meta.version, migrations[2].version)
|
||||
done()
|
||||
}).catch(done)
|
||||
})
|
||||
})
|
Loading…
Reference in New Issue
Block a user