UNPKG

2.76 kBJavaScriptView Raw
1'use strict'
2
3process.on('unhandledRejection', function(reason, promise){
4 console.log({ event: 'UnhandledPromiseRejection', promise, reason })
5 process.exit(1)
6})
7
8const uuid = require('uuid/v4')
9const analyser = require('./analyser')
10const ConflictError = require('./errors/conflict')
11const localRepository = require('./repositories/local')
12const MigrationUpError = require('./errors/migration-up')
13const remoteRepository = require('./repositories/remote')
14const MigrationDownError = require('./errors/migration-down')
15
16const conflictValidation = async (analysed) => {
17 const conflicts = await analysed.conflicting()
18 if (conflicts.length > 0) {
19
20 throw new ConflictError(conflicts)
21 }
22}
23
24const migrateDown = async (migrationRegistry, local, args) => {
25 const migrationFiles = await local.fetchAll(migrationRegistry.content)
26 const downedMigrations = []
27
28 try {
29 for (const migration of migrationFiles) {
30 await migration.content.down(...args)
31 downedMigrations.push(migration.name)
32 }
33 } catch (err) {
34 throw new MigrationDownError(err, migrationRegistry, downedMigrations)
35 }
36}
37
38const migrateUp = async (migrationFiles, args) => {
39 const migrationRegistry = { name: uuid(), content: [] }
40
41 try {
42 for (const migration of migrationFiles) {
43 await migration.content.up(...args)
44 migrationRegistry.content.push(migration.name)
45 }
46 } catch (err) {
47 throw new MigrationUpError(err, migrationRegistry)
48 }
49
50 return migrationRegistry
51}
52
53const unsynced = async (analysed, local) => {
54 const unsynced = await analysed.unsynced()
55 return local.fetchAll(unsynced.map(migration => migration.name))
56}
57
58module.exports = (local, remote) => ({
59 up: async (...args) => {
60 const analysed = await analyser(local, remote).analyse()
61
62 await conflictValidation(analysed)
63
64 const migrations = await unsynced(analysed, local)
65 const migrationRegistry = await migrateUp(migrations, args)
66
67 if (migrationRegistry.content.length === 0) {
68 return migrationRegistry
69 }
70
71 return remote.add(migrationRegistry.name, migrationRegistry.content)
72 .then(() => migrationRegistry)
73 },
74 down: async (...args) => {
75 await analyser(local, remote).analyse()
76 .then(conflictValidation)
77
78 const latestMigration = await remote.all()
79 .then(all => all.reverse().shift())
80
81 if (!latestMigration) {
82 return null
83 }
84
85 await migrateDown(latestMigration, local, args)
86 await remote.remove(latestMigration.name)
87
88 return latestMigration
89 }
90})
91
92module.exports.from = (localAdaptor, remoteAdaptor) => {
93 return module.exports(
94 localRepository(localAdaptor),
95 remoteRepository(remoteAdaptor),
96 )
97}