@strapi/database 5.51.1 → 5.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/dialects/mysql/database-inspector.js +1 -1
- package/dist/dialects/mysql/database-inspector.js.map +1 -1
- package/dist/dialects/mysql/database-inspector.mjs +1 -1
- package/dist/dialects/mysql/database-inspector.mjs.map +1 -1
- package/dist/dialects/mysql/index.js +2 -2
- package/dist/dialects/mysql/index.js.map +1 -1
- package/dist/dialects/mysql/index.mjs +2 -2
- package/dist/dialects/mysql/index.mjs.map +1 -1
- package/dist/entity-manager/index.js +30 -30
- package/dist/entity-manager/index.js.map +1 -1
- package/dist/entity-manager/index.mjs +30 -30
- package/dist/entity-manager/index.mjs.map +1 -1
- package/dist/entity-manager/relations-orderer.js +1 -1
- package/dist/entity-manager/relations-orderer.js.map +1 -1
- package/dist/entity-manager/relations-orderer.mjs +1 -1
- package/dist/entity-manager/relations-orderer.mjs.map +1 -1
- package/dist/fields/datetime.d.ts.map +1 -1
- package/dist/fields/datetime.js +6 -23
- package/dist/fields/datetime.js.map +1 -1
- package/dist/fields/datetime.mjs +6 -3
- package/dist/fields/datetime.mjs.map +1 -1
- package/dist/fields/index.d.ts.map +1 -1
- package/dist/fields/index.js +21 -8
- package/dist/fields/index.js.map +1 -1
- package/dist/fields/index.mjs +21 -4
- package/dist/fields/index.mjs.map +1 -1
- package/dist/fields/json.js +1 -1
- package/dist/fields/json.js.map +1 -1
- package/dist/fields/json.mjs +1 -1
- package/dist/fields/json.mjs.map +1 -1
- package/dist/fields/shared/parsers.js +1 -1
- package/dist/fields/shared/parsers.js.map +1 -1
- package/dist/fields/shared/parsers.mjs +1 -1
- package/dist/fields/shared/parsers.mjs.map +1 -1
- package/dist/fields/timestamp.d.ts.map +1 -1
- package/dist/fields/timestamp.js +5 -23
- package/dist/fields/timestamp.js.map +1 -1
- package/dist/fields/timestamp.mjs +5 -3
- package/dist/fields/timestamp.mjs.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/migrations/common.d.ts +12 -2
- package/dist/migrations/common.d.ts.map +1 -1
- package/dist/migrations/common.js.map +1 -1
- package/dist/migrations/common.mjs.map +1 -1
- package/dist/migrations/discover.d.ts +8 -0
- package/dist/migrations/discover.d.ts.map +1 -0
- package/dist/migrations/discover.js +49 -0
- package/dist/migrations/discover.js.map +1 -0
- package/dist/migrations/discover.mjs +42 -0
- package/dist/migrations/discover.mjs.map +1 -0
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.js.map +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs +1 -1
- package/dist/migrations/internal-migrations/5.0.0-05-drop-slug-unique-index.mjs.map +1 -1
- package/dist/migrations/internal.d.ts.map +1 -1
- package/dist/migrations/internal.js +21 -40
- package/dist/migrations/internal.js.map +1 -1
- package/dist/migrations/internal.mjs +21 -40
- package/dist/migrations/internal.mjs.map +1 -1
- package/dist/migrations/resolver.d.ts +9 -0
- package/dist/migrations/resolver.d.ts.map +1 -0
- package/dist/migrations/resolver.js +53 -0
- package/dist/migrations/resolver.js.map +1 -0
- package/dist/migrations/resolver.mjs +45 -0
- package/dist/migrations/resolver.mjs.map +1 -0
- package/dist/migrations/runner.d.ts +24 -0
- package/dist/migrations/runner.d.ts.map +1 -0
- package/dist/migrations/runner.js +92 -0
- package/dist/migrations/runner.js.map +1 -0
- package/dist/migrations/runner.mjs +90 -0
- package/dist/migrations/runner.mjs.map +1 -0
- package/dist/migrations/users.d.ts.map +1 -1
- package/dist/migrations/users.js +22 -68
- package/dist/migrations/users.js.map +1 -1
- package/dist/migrations/users.mjs +21 -68
- package/dist/migrations/users.mjs.map +1 -1
- package/dist/query/helpers/populate/apply.js +2 -2
- package/dist/query/helpers/populate/apply.js.map +1 -1
- package/dist/query/helpers/populate/apply.mjs +2 -2
- package/dist/query/helpers/populate/apply.mjs.map +1 -1
- package/dist/query/helpers/search.d.ts +1 -0
- package/dist/query/helpers/search.d.ts.map +1 -1
- package/dist/query/helpers/search.js +1 -0
- package/dist/query/helpers/search.js.map +1 -1
- package/dist/query/helpers/search.mjs +1 -1
- package/dist/query/helpers/search.mjs.map +1 -1
- package/dist/query/helpers/transform.d.ts.map +1 -1
- package/dist/query/helpers/transform.js +4 -1
- package/dist/query/helpers/transform.js.map +1 -1
- package/dist/query/helpers/transform.mjs +4 -1
- package/dist/query/helpers/transform.mjs.map +1 -1
- package/dist/query/helpers/where.d.ts.map +1 -1
- package/dist/query/helpers/where.js +34 -14
- package/dist/query/helpers/where.js.map +1 -1
- package/dist/query/helpers/where.mjs +34 -14
- package/dist/query/helpers/where.mjs.map +1 -1
- package/package.json +6 -7
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.js","sources":["../../src/migrations/internal.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"internal.js","sources":["../../src/migrations/internal.ts"],"sourcesContent":["import { wrapTransaction } from './common';\nimport { createMigrationRunner } from './runner';\nimport { internalMigrations } from './internal-migrations';\nimport { createStorage } from './storage';\nimport { transformLogMessage } from './logger';\n\nimport type { InternalMigrationProvider, Migration } from './common';\nimport type { Database } from '..';\n\nexport const createInternalMigrationProvider = (db: Database): InternalMigrationProvider => {\n const context = { db };\n const migrations: Migration[] = [...internalMigrations];\n\n const runner = createMigrationRunner({\n storage: createStorage({ db, tableName: 'strapi_migrations_internal' }),\n logger: {\n info(message) {\n // NOTE: only log internal migration in debug mode\n db.logger.debug(transformLogMessage('info', message));\n },\n },\n getMigrations: async () =>\n migrations.map((migration) => ({\n name: migration.name,\n up: wrapTransaction(context.db)(migration.up),\n down: wrapTransaction(context.db)(migration.down),\n })),\n });\n\n return {\n async register(migration: Migration) {\n migrations.push(migration);\n },\n async shouldRun() {\n const pendingMigrations = await runner.pending();\n return pendingMigrations.length > 0;\n },\n async up() {\n await runner.up();\n },\n async down() {\n await runner.down();\n },\n };\n};\n"],"names":["createInternalMigrationProvider","db","context","migrations","internalMigrations","runner","createMigrationRunner","storage","createStorage","tableName","logger","info","message","debug","transformLogMessage","getMigrations","map","migration","name","up","wrapTransaction","down","register","push","shouldRun","pendingMigrations","pending","length"],"mappings":";;;;;;;;AASO,MAAMA,kCAAkC,CAACC,EAAAA,GAAAA;AAC9C,IAAA,MAAMC,OAAAA,GAAU;AAAED,QAAAA;AAAG,KAAA;AACrB,IAAA,MAAME,UAAAA,GAA0B;AAAIC,QAAAA,GAAAA;AAAmB,KAAA;AAEvD,IAAA,MAAMC,WAASC,4BAAAA,CAAsB;AACnCC,QAAAA,OAAAA,EAASC,qBAAAA,CAAc;AAAEP,YAAAA,EAAAA;YAAIQ,SAAAA,EAAW;AAA6B,SAAA,CAAA;QACrEC,MAAAA,EAAQ;AACNC,YAAAA,IAAAA,CAAAA,CAAKC,OAAO,EAAA;;AAEVX,gBAAAA,EAAAA,CAAGS,MAAM,CAACG,KAAK,CAACC,2BAAoB,MAAA,EAAQF,OAAAA,CAAAA,CAAAA;AAC9C,YAAA;AACF,SAAA;AACAG,QAAAA,aAAAA,EAAe,UACbZ,UAAAA,CAAWa,GAAG,CAAC,CAACC,aAAe;AAC7BC,oBAAAA,IAAAA,EAAMD,UAAUC,IAAI;AACpBC,oBAAAA,EAAAA,EAAIC,sBAAAA,CAAgBlB,OAAAA,CAAQD,EAAE,CAAA,CAAEgB,UAAUE,EAAE,CAAA;AAC5CE,oBAAAA,IAAAA,EAAMD,sBAAAA,CAAgBlB,OAAAA,CAAQD,EAAE,CAAA,CAAEgB,UAAUI,IAAI;iBAClD,CAAA;AACJ,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,UAASL,SAAoB,EAAA;AACjCd,YAAAA,UAAAA,CAAWoB,IAAI,CAACN,SAAAA,CAAAA;AAClB,QAAA,CAAA;QACA,MAAMO,SAAAA,CAAAA,GAAAA;YACJ,MAAMC,iBAAAA,GAAoB,MAAMpB,QAAAA,CAAOqB,OAAO,EAAA;YAC9C,OAAOD,iBAAAA,CAAkBE,MAAM,GAAG,CAAA;AACpC,QAAA,CAAA;QACA,MAAMR,EAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMd,SAAOc,EAAE,EAAA;AACjB,QAAA,CAAA;QACA,MAAME,IAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMhB,SAAOgB,IAAI,EAAA;AACnB,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { wrapTransaction } from './common.mjs';
|
|
2
|
+
import { createMigrationRunner } from './runner.mjs';
|
|
2
3
|
import { internalMigrations } from './internal-migrations/index.mjs';
|
|
3
4
|
import { createStorage } from './storage.mjs';
|
|
4
5
|
import { transformLogMessage } from './logger.mjs';
|
|
@@ -10,56 +11,36 @@ const createInternalMigrationProvider = (db)=>{
|
|
|
10
11
|
const migrations = [
|
|
11
12
|
...internalMigrations
|
|
12
13
|
];
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
db,
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
db.
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
db.logger.warn(transformLogMessage('warn', message));
|
|
31
|
-
},
|
|
32
|
-
error (message) {
|
|
33
|
-
db.logger.error(transformLogMessage('error', message));
|
|
34
|
-
},
|
|
35
|
-
debug (message) {
|
|
36
|
-
db.logger.debug(transformLogMessage('debug', message));
|
|
37
|
-
}
|
|
38
|
-
},
|
|
39
|
-
context,
|
|
40
|
-
migrations: ()=>migrations.map((migration)=>{
|
|
41
|
-
return {
|
|
42
|
-
name: migration.name,
|
|
43
|
-
up: wrapTransaction(context.db)(migration.up),
|
|
44
|
-
down: wrapTransaction(context.db)(migration.down)
|
|
45
|
-
};
|
|
46
|
-
})
|
|
47
|
-
});
|
|
48
|
-
return lazyProvider;
|
|
49
|
-
};
|
|
14
|
+
const runner = createMigrationRunner({
|
|
15
|
+
storage: createStorage({
|
|
16
|
+
db,
|
|
17
|
+
tableName: 'strapi_migrations_internal'
|
|
18
|
+
}),
|
|
19
|
+
logger: {
|
|
20
|
+
info (message) {
|
|
21
|
+
// NOTE: only log internal migration in debug mode
|
|
22
|
+
db.logger.debug(transformLogMessage('info', message));
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
getMigrations: async ()=>migrations.map((migration)=>({
|
|
26
|
+
name: migration.name,
|
|
27
|
+
up: wrapTransaction(context.db)(migration.up),
|
|
28
|
+
down: wrapTransaction(context.db)(migration.down)
|
|
29
|
+
}))
|
|
30
|
+
});
|
|
50
31
|
return {
|
|
51
32
|
async register (migration) {
|
|
52
33
|
migrations.push(migration);
|
|
53
34
|
},
|
|
54
35
|
async shouldRun () {
|
|
55
|
-
const pendingMigrations = await
|
|
36
|
+
const pendingMigrations = await runner.pending();
|
|
56
37
|
return pendingMigrations.length > 0;
|
|
57
38
|
},
|
|
58
39
|
async up () {
|
|
59
|
-
await
|
|
40
|
+
await runner.up();
|
|
60
41
|
},
|
|
61
42
|
async down () {
|
|
62
|
-
await
|
|
43
|
+
await runner.down();
|
|
63
44
|
}
|
|
64
45
|
};
|
|
65
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"internal.mjs","sources":["../../src/migrations/internal.ts"],"sourcesContent":["import
|
|
1
|
+
{"version":3,"file":"internal.mjs","sources":["../../src/migrations/internal.ts"],"sourcesContent":["import { wrapTransaction } from './common';\nimport { createMigrationRunner } from './runner';\nimport { internalMigrations } from './internal-migrations';\nimport { createStorage } from './storage';\nimport { transformLogMessage } from './logger';\n\nimport type { InternalMigrationProvider, Migration } from './common';\nimport type { Database } from '..';\n\nexport const createInternalMigrationProvider = (db: Database): InternalMigrationProvider => {\n const context = { db };\n const migrations: Migration[] = [...internalMigrations];\n\n const runner = createMigrationRunner({\n storage: createStorage({ db, tableName: 'strapi_migrations_internal' }),\n logger: {\n info(message) {\n // NOTE: only log internal migration in debug mode\n db.logger.debug(transformLogMessage('info', message));\n },\n },\n getMigrations: async () =>\n migrations.map((migration) => ({\n name: migration.name,\n up: wrapTransaction(context.db)(migration.up),\n down: wrapTransaction(context.db)(migration.down),\n })),\n });\n\n return {\n async register(migration: Migration) {\n migrations.push(migration);\n },\n async shouldRun() {\n const pendingMigrations = await runner.pending();\n return pendingMigrations.length > 0;\n },\n async up() {\n await runner.up();\n },\n async down() {\n await runner.down();\n },\n };\n};\n"],"names":["createInternalMigrationProvider","db","context","migrations","internalMigrations","runner","createMigrationRunner","storage","createStorage","tableName","logger","info","message","debug","transformLogMessage","getMigrations","map","migration","name","up","wrapTransaction","down","register","push","shouldRun","pendingMigrations","pending","length"],"mappings":";;;;;;AASO,MAAMA,kCAAkC,CAACC,EAAAA,GAAAA;AAC9C,IAAA,MAAMC,OAAAA,GAAU;AAAED,QAAAA;AAAG,KAAA;AACrB,IAAA,MAAME,UAAAA,GAA0B;AAAIC,QAAAA,GAAAA;AAAmB,KAAA;AAEvD,IAAA,MAAMC,SAASC,qBAAAA,CAAsB;AACnCC,QAAAA,OAAAA,EAASC,aAAAA,CAAc;AAAEP,YAAAA,EAAAA;YAAIQ,SAAAA,EAAW;AAA6B,SAAA,CAAA;QACrEC,MAAAA,EAAQ;AACNC,YAAAA,IAAAA,CAAAA,CAAKC,OAAO,EAAA;;AAEVX,gBAAAA,EAAAA,CAAGS,MAAM,CAACG,KAAK,CAACC,oBAAoB,MAAA,EAAQF,OAAAA,CAAAA,CAAAA;AAC9C,YAAA;AACF,SAAA;AACAG,QAAAA,aAAAA,EAAe,UACbZ,UAAAA,CAAWa,GAAG,CAAC,CAACC,aAAe;AAC7BC,oBAAAA,IAAAA,EAAMD,UAAUC,IAAI;AACpBC,oBAAAA,EAAAA,EAAIC,eAAAA,CAAgBlB,OAAAA,CAAQD,EAAE,CAAA,CAAEgB,UAAUE,EAAE,CAAA;AAC5CE,oBAAAA,IAAAA,EAAMD,eAAAA,CAAgBlB,OAAAA,CAAQD,EAAE,CAAA,CAAEgB,UAAUI,IAAI;iBAClD,CAAA;AACJ,KAAA,CAAA;IAEA,OAAO;AACL,QAAA,MAAMC,UAASL,SAAoB,EAAA;AACjCd,YAAAA,UAAAA,CAAWoB,IAAI,CAACN,SAAAA,CAAAA;AAClB,QAAA,CAAA;QACA,MAAMO,SAAAA,CAAAA,GAAAA;YACJ,MAAMC,iBAAAA,GAAoB,MAAMpB,MAAAA,CAAOqB,OAAO,EAAA;YAC9C,OAAOD,iBAAAA,CAAkBE,MAAM,GAAG,CAAA;AACpC,QAAA,CAAA;QACA,MAAMR,EAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMd,OAAOc,EAAE,EAAA;AACjB,QAAA,CAAA;QACA,MAAME,IAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMhB,OAAOgB,IAAI,EAAA;AACnB,QAAA;AACF,KAAA;AACF;;;;"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { Context, MigrationResolver } from './common';
|
|
2
|
+
export declare const migrationResolver: MigrationResolver;
|
|
3
|
+
export declare const resolveMigrationFiles: (filepaths: string[], context: Context) => {
|
|
4
|
+
name: string;
|
|
5
|
+
path?: string;
|
|
6
|
+
up: import("./common").MigrationRunnerFn;
|
|
7
|
+
down: import("./common").MigrationRunnerFn;
|
|
8
|
+
}[];
|
|
9
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/migrations/resolver.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAG3D,eAAO,MAAM,iBAAiB,EAAE,iBA8B/B,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,WAAW,MAAM,EAAE,EAAE,SAAS,OAAO;;;;;GAK1E,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var path = require('path');
|
|
4
|
+
var fse = require('fs-extra');
|
|
5
|
+
var common = require('./common.js');
|
|
6
|
+
|
|
7
|
+
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
8
|
+
|
|
9
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
10
|
+
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
11
|
+
|
|
12
|
+
// TODO: check multiple commands in one sql statement
|
|
13
|
+
const migrationResolver = ({ name, path: migrationPath, context })=>{
|
|
14
|
+
const { db } = context;
|
|
15
|
+
if (!migrationPath) {
|
|
16
|
+
throw new Error(`Migration ${name} has no path`);
|
|
17
|
+
}
|
|
18
|
+
// if sql file run with knex raw
|
|
19
|
+
if (migrationPath.match(/\.sql$/)) {
|
|
20
|
+
const sql = fse__default.default.readFileSync(migrationPath, 'utf8');
|
|
21
|
+
return {
|
|
22
|
+
name,
|
|
23
|
+
path: migrationPath,
|
|
24
|
+
up: common.wrapTransaction(db)((knex)=>knex.raw(sql)),
|
|
25
|
+
async down () {
|
|
26
|
+
throw new Error('Down migration is not supported for sql files');
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
// NOTE: we can add some ts register if we want to handle ts migration files at some point
|
|
31
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
32
|
+
const migration = require(migrationPath);
|
|
33
|
+
return {
|
|
34
|
+
name,
|
|
35
|
+
path: migrationPath,
|
|
36
|
+
up: common.wrapTransaction(db)(migration.up),
|
|
37
|
+
down: common.wrapTransaction(db)(migration.down)
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
const resolveMigrationFiles = (filepaths, context)=>{
|
|
41
|
+
return filepaths.map((filepath)=>{
|
|
42
|
+
const name = path__default.default.basename(filepath);
|
|
43
|
+
return migrationResolver({
|
|
44
|
+
name,
|
|
45
|
+
path: filepath,
|
|
46
|
+
context
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
exports.migrationResolver = migrationResolver;
|
|
52
|
+
exports.resolveMigrationFiles = resolveMigrationFiles;
|
|
53
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sources":["../../src/migrations/resolver.ts"],"sourcesContent":["import path from 'path';\n\nimport fse from 'fs-extra';\n\nimport { wrapTransaction } from './common';\n\nimport type { Context, MigrationResolver } from './common';\n\n// TODO: check multiple commands in one sql statement\nexport const migrationResolver: MigrationResolver = ({ name, path: migrationPath, context }) => {\n const { db } = context;\n\n if (!migrationPath) {\n throw new Error(`Migration ${name} has no path`);\n }\n\n // if sql file run with knex raw\n if (migrationPath.match(/\\.sql$/)) {\n const sql = fse.readFileSync(migrationPath, 'utf8');\n\n return {\n name,\n path: migrationPath,\n up: wrapTransaction(db)((knex) => knex.raw(sql)),\n async down() {\n throw new Error('Down migration is not supported for sql files');\n },\n };\n }\n\n // NOTE: we can add some ts register if we want to handle ts migration files at some point\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const migration = require(migrationPath);\n return {\n name,\n path: migrationPath,\n up: wrapTransaction(db)(migration.up),\n down: wrapTransaction(db)(migration.down),\n };\n};\n\nexport const resolveMigrationFiles = (filepaths: string[], context: Context) => {\n return filepaths.map((filepath) => {\n const name = path.basename(filepath);\n return migrationResolver({ name, path: filepath, context });\n });\n};\n"],"names":["migrationResolver","name","path","migrationPath","context","db","Error","match","sql","fse","readFileSync","up","wrapTransaction","knex","raw","down","migration","require","resolveMigrationFiles","filepaths","map","filepath","basename"],"mappings":";;;;;;;;;;;AAQA;AACO,MAAMA,iBAAAA,GAAuC,CAAC,EAAEC,IAAI,EAAEC,IAAAA,EAAMC,aAAa,EAAEC,OAAO,EAAE,GAAA;IACzF,MAAM,EAAEC,EAAE,EAAE,GAAGD,OAAAA;AAEf,IAAA,IAAI,CAACD,aAAAA,EAAe;AAClB,QAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,UAAU,EAAEL,IAAAA,CAAK,YAAY,CAAC,CAAA;AACjD,IAAA;;IAGA,IAAIE,aAAAA,CAAcI,KAAK,CAAC,QAAA,CAAA,EAAW;AACjC,QAAA,MAAMC,GAAAA,GAAMC,oBAAAA,CAAIC,YAAY,CAACP,aAAAA,EAAe,MAAA,CAAA;QAE5C,OAAO;AACLF,YAAAA,IAAAA;YACAC,IAAAA,EAAMC,aAAAA;AACNQ,YAAAA,EAAAA,EAAIC,uBAAgBP,EAAAA,CAAAA,CAAI,CAACQ,IAAAA,GAASA,IAAAA,CAAKC,GAAG,CAACN,GAAAA,CAAAA,CAAAA;YAC3C,MAAMO,IAAAA,CAAAA,GAAAA;AACJ,gBAAA,MAAM,IAAIT,KAAAA,CAAM,+CAAA,CAAA;AAClB,YAAA;AACF,SAAA;AACF,IAAA;;;AAIA,IAAA,MAAMU,YAAYC,OAAAA,CAAQd,aAAAA,CAAAA;IAC1B,OAAO;AACLF,QAAAA,IAAAA;QACAC,IAAAA,EAAMC,aAAAA;QACNQ,EAAAA,EAAIC,sBAAAA,CAAgBP,EAAAA,CAAAA,CAAIW,SAAAA,CAAUL,EAAE,CAAA;QACpCI,IAAAA,EAAMH,sBAAAA,CAAgBP,EAAAA,CAAAA,CAAIW,SAAAA,CAAUD,IAAI;AAC1C,KAAA;AACF;AAEO,MAAMG,qBAAAA,GAAwB,CAACC,SAAAA,EAAqBf,OAAAA,GAAAA;IACzD,OAAOe,SAAAA,CAAUC,GAAG,CAAC,CAACC,QAAAA,GAAAA;QACpB,MAAMpB,IAAAA,GAAOC,qBAAAA,CAAKoB,QAAQ,CAACD,QAAAA,CAAAA;AAC3B,QAAA,OAAOrB,iBAAAA,CAAkB;AAAEC,YAAAA,IAAAA;YAAMC,IAAAA,EAAMmB,QAAAA;AAAUjB,YAAAA;AAAQ,SAAA,CAAA;AAC3D,IAAA,CAAA,CAAA;AACF;;;;;"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import path from 'path';
|
|
2
|
+
import fse from 'fs-extra';
|
|
3
|
+
import { wrapTransaction } from './common.mjs';
|
|
4
|
+
|
|
5
|
+
// TODO: check multiple commands in one sql statement
|
|
6
|
+
const migrationResolver = ({ name, path: migrationPath, context })=>{
|
|
7
|
+
const { db } = context;
|
|
8
|
+
if (!migrationPath) {
|
|
9
|
+
throw new Error(`Migration ${name} has no path`);
|
|
10
|
+
}
|
|
11
|
+
// if sql file run with knex raw
|
|
12
|
+
if (migrationPath.match(/\.sql$/)) {
|
|
13
|
+
const sql = fse.readFileSync(migrationPath, 'utf8');
|
|
14
|
+
return {
|
|
15
|
+
name,
|
|
16
|
+
path: migrationPath,
|
|
17
|
+
up: wrapTransaction(db)((knex)=>knex.raw(sql)),
|
|
18
|
+
async down () {
|
|
19
|
+
throw new Error('Down migration is not supported for sql files');
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// NOTE: we can add some ts register if we want to handle ts migration files at some point
|
|
24
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
25
|
+
const migration = require(migrationPath);
|
|
26
|
+
return {
|
|
27
|
+
name,
|
|
28
|
+
path: migrationPath,
|
|
29
|
+
up: wrapTransaction(db)(migration.up),
|
|
30
|
+
down: wrapTransaction(db)(migration.down)
|
|
31
|
+
};
|
|
32
|
+
};
|
|
33
|
+
const resolveMigrationFiles = (filepaths, context)=>{
|
|
34
|
+
return filepaths.map((filepath)=>{
|
|
35
|
+
const name = path.basename(filepath);
|
|
36
|
+
return migrationResolver({
|
|
37
|
+
name,
|
|
38
|
+
path: filepath,
|
|
39
|
+
context
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
export { migrationResolver, resolveMigrationFiles };
|
|
45
|
+
//# sourceMappingURL=resolver.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.mjs","sources":["../../src/migrations/resolver.ts"],"sourcesContent":["import path from 'path';\n\nimport fse from 'fs-extra';\n\nimport { wrapTransaction } from './common';\n\nimport type { Context, MigrationResolver } from './common';\n\n// TODO: check multiple commands in one sql statement\nexport const migrationResolver: MigrationResolver = ({ name, path: migrationPath, context }) => {\n const { db } = context;\n\n if (!migrationPath) {\n throw new Error(`Migration ${name} has no path`);\n }\n\n // if sql file run with knex raw\n if (migrationPath.match(/\\.sql$/)) {\n const sql = fse.readFileSync(migrationPath, 'utf8');\n\n return {\n name,\n path: migrationPath,\n up: wrapTransaction(db)((knex) => knex.raw(sql)),\n async down() {\n throw new Error('Down migration is not supported for sql files');\n },\n };\n }\n\n // NOTE: we can add some ts register if we want to handle ts migration files at some point\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n const migration = require(migrationPath);\n return {\n name,\n path: migrationPath,\n up: wrapTransaction(db)(migration.up),\n down: wrapTransaction(db)(migration.down),\n };\n};\n\nexport const resolveMigrationFiles = (filepaths: string[], context: Context) => {\n return filepaths.map((filepath) => {\n const name = path.basename(filepath);\n return migrationResolver({ name, path: filepath, context });\n });\n};\n"],"names":["migrationResolver","name","path","migrationPath","context","db","Error","match","sql","fse","readFileSync","up","wrapTransaction","knex","raw","down","migration","require","resolveMigrationFiles","filepaths","map","filepath","basename"],"mappings":";;;;AAQA;AACO,MAAMA,iBAAAA,GAAuC,CAAC,EAAEC,IAAI,EAAEC,IAAAA,EAAMC,aAAa,EAAEC,OAAO,EAAE,GAAA;IACzF,MAAM,EAAEC,EAAE,EAAE,GAAGD,OAAAA;AAEf,IAAA,IAAI,CAACD,aAAAA,EAAe;AAClB,QAAA,MAAM,IAAIG,KAAAA,CAAM,CAAC,UAAU,EAAEL,IAAAA,CAAK,YAAY,CAAC,CAAA;AACjD,IAAA;;IAGA,IAAIE,aAAAA,CAAcI,KAAK,CAAC,QAAA,CAAA,EAAW;AACjC,QAAA,MAAMC,GAAAA,GAAMC,GAAAA,CAAIC,YAAY,CAACP,aAAAA,EAAe,MAAA,CAAA;QAE5C,OAAO;AACLF,YAAAA,IAAAA;YACAC,IAAAA,EAAMC,aAAAA;AACNQ,YAAAA,EAAAA,EAAIC,gBAAgBP,EAAAA,CAAAA,CAAI,CAACQ,IAAAA,GAASA,IAAAA,CAAKC,GAAG,CAACN,GAAAA,CAAAA,CAAAA;YAC3C,MAAMO,IAAAA,CAAAA,GAAAA;AACJ,gBAAA,MAAM,IAAIT,KAAAA,CAAM,+CAAA,CAAA;AAClB,YAAA;AACF,SAAA;AACF,IAAA;;;AAIA,IAAA,MAAMU,YAAYC,OAAAA,CAAQd,aAAAA,CAAAA;IAC1B,OAAO;AACLF,QAAAA,IAAAA;QACAC,IAAAA,EAAMC,aAAAA;QACNQ,EAAAA,EAAIC,eAAAA,CAAgBP,EAAAA,CAAAA,CAAIW,SAAAA,CAAUL,EAAE,CAAA;QACpCI,IAAAA,EAAMH,eAAAA,CAAgBP,EAAAA,CAAAA,CAAIW,SAAAA,CAAUD,IAAI;AAC1C,KAAA;AACF;AAEO,MAAMG,qBAAAA,GAAwB,CAACC,SAAAA,EAAqBf,OAAAA,GAAAA;IACzD,OAAOe,SAAAA,CAAUC,GAAG,CAAC,CAACC,QAAAA,GAAAA;QACpB,MAAMpB,IAAAA,GAAOC,IAAAA,CAAKoB,QAAQ,CAACD,QAAAA,CAAAA;AAC3B,QAAA,OAAOrB,iBAAAA,CAAkB;AAAEC,YAAAA,IAAAA;YAAMC,IAAAA,EAAMmB,QAAAA;AAAUjB,YAAAA;AAAQ,SAAA,CAAA;AAC3D,IAAA,CAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { MigrationRunnerFn } from './common';
|
|
2
|
+
import type { createStorage } from './storage';
|
|
3
|
+
export interface MigrationMeta {
|
|
4
|
+
name: string;
|
|
5
|
+
path?: string;
|
|
6
|
+
}
|
|
7
|
+
export interface RunnableMigration extends MigrationMeta {
|
|
8
|
+
up: MigrationRunnerFn;
|
|
9
|
+
down: MigrationRunnerFn;
|
|
10
|
+
}
|
|
11
|
+
export interface MigrationRunnerLogger {
|
|
12
|
+
info(message: unknown): void;
|
|
13
|
+
}
|
|
14
|
+
export interface MigrationRunnerOptions {
|
|
15
|
+
storage: ReturnType<typeof createStorage>;
|
|
16
|
+
logger: MigrationRunnerLogger;
|
|
17
|
+
getMigrations: () => Promise<RunnableMigration[]>;
|
|
18
|
+
}
|
|
19
|
+
export declare const createMigrationRunner: (opts: MigrationRunnerOptions) => {
|
|
20
|
+
pending(): Promise<MigrationMeta[]>;
|
|
21
|
+
up(): Promise<MigrationMeta[]>;
|
|
22
|
+
down(): Promise<MigrationMeta[]>;
|
|
23
|
+
};
|
|
24
|
+
//# sourceMappingURL=runner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.d.ts","sourceRoot":"","sources":["../../src/migrations/runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAE/C,MAAM,WAAW,aAAa;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,iBAAkB,SAAQ,aAAa;IACtD,EAAE,EAAE,iBAAiB,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;CACzB;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9B;AAED,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,UAAU,CAAC,OAAO,aAAa,CAAC,CAAC;IAC1C,MAAM,EAAE,qBAAqB,CAAC;IAC9B,aAAa,EAAE,MAAM,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CACnD;AAoBD,eAAO,MAAM,qBAAqB,GAAI,MAAM,sBAAsB;eAsB7C,OAAO,CAAC,aAAa,EAAE,CAAC;UAK7B,OAAO,CAAC,aAAa,EAAE,CAAC;YAuBtB,OAAO,CAAC,aAAa,EAAE,CAAC;CAwBzC,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const logEvent = (logger, event, name, extra)=>{
|
|
4
|
+
logger.info({
|
|
5
|
+
event,
|
|
6
|
+
name,
|
|
7
|
+
...extra
|
|
8
|
+
});
|
|
9
|
+
};
|
|
10
|
+
const wrapMigrationError = (name, direction, cause)=>{
|
|
11
|
+
const causeMessage = cause instanceof Error ? `Original error: ${cause.message}` : `Non-error value thrown. See cause for full value: ${String(cause)}`;
|
|
12
|
+
return new Error(`Migration ${name} (${direction}) failed: ${causeMessage}`, {
|
|
13
|
+
cause
|
|
14
|
+
});
|
|
15
|
+
};
|
|
16
|
+
const createMigrationRunner = (opts)=>{
|
|
17
|
+
const getPendingMigrations = async ()=>{
|
|
18
|
+
const [migrations, executedNames] = await Promise.all([
|
|
19
|
+
opts.getMigrations(),
|
|
20
|
+
opts.storage.executed()
|
|
21
|
+
]);
|
|
22
|
+
const executedSet = new Set(executedNames);
|
|
23
|
+
return migrations.filter((migration)=>!executedSet.has(migration.name));
|
|
24
|
+
};
|
|
25
|
+
const getExecutedMigrations = async ()=>{
|
|
26
|
+
const [migrations, executedNames] = await Promise.all([
|
|
27
|
+
opts.getMigrations(),
|
|
28
|
+
opts.storage.executed()
|
|
29
|
+
]);
|
|
30
|
+
const executedSet = new Set(executedNames);
|
|
31
|
+
return migrations.filter((migration)=>executedSet.has(migration.name));
|
|
32
|
+
};
|
|
33
|
+
return {
|
|
34
|
+
async pending () {
|
|
35
|
+
const pending = await getPendingMigrations();
|
|
36
|
+
return pending.map(({ name, path })=>({
|
|
37
|
+
name,
|
|
38
|
+
path
|
|
39
|
+
}));
|
|
40
|
+
},
|
|
41
|
+
async up () {
|
|
42
|
+
const toBeApplied = await getPendingMigrations();
|
|
43
|
+
for (const migration of toBeApplied){
|
|
44
|
+
const start = Date.now();
|
|
45
|
+
logEvent(opts.logger, 'migrating', migration.name);
|
|
46
|
+
try {
|
|
47
|
+
await migration.up();
|
|
48
|
+
} catch (error) {
|
|
49
|
+
throw wrapMigrationError(migration.name, 'up', error);
|
|
50
|
+
}
|
|
51
|
+
await opts.storage.logMigration({
|
|
52
|
+
name: migration.name
|
|
53
|
+
});
|
|
54
|
+
const durationSeconds = (Date.now() - start) / 1000;
|
|
55
|
+
logEvent(opts.logger, 'migrated', migration.name, {
|
|
56
|
+
durationSeconds
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
return toBeApplied.map(({ name, path })=>({
|
|
60
|
+
name,
|
|
61
|
+
path
|
|
62
|
+
}));
|
|
63
|
+
},
|
|
64
|
+
async down () {
|
|
65
|
+
const executedReversed = (await getExecutedMigrations()).slice().reverse();
|
|
66
|
+
const toBeReverted = executedReversed.slice(0, 1);
|
|
67
|
+
for (const migration of toBeReverted){
|
|
68
|
+
const start = Date.now();
|
|
69
|
+
logEvent(opts.logger, 'reverting', migration.name);
|
|
70
|
+
try {
|
|
71
|
+
await migration.down();
|
|
72
|
+
} catch (error) {
|
|
73
|
+
throw wrapMigrationError(migration.name, 'down', error);
|
|
74
|
+
}
|
|
75
|
+
await opts.storage.unlogMigration({
|
|
76
|
+
name: migration.name
|
|
77
|
+
});
|
|
78
|
+
const durationSeconds = Number.parseFloat(((Date.now() - start) / 1000).toFixed(3));
|
|
79
|
+
logEvent(opts.logger, 'reverted', migration.name, {
|
|
80
|
+
durationSeconds
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
return toBeReverted.map(({ name, path })=>({
|
|
84
|
+
name,
|
|
85
|
+
path
|
|
86
|
+
}));
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
exports.createMigrationRunner = createMigrationRunner;
|
|
92
|
+
//# sourceMappingURL=runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.js","sources":["../../src/migrations/runner.ts"],"sourcesContent":["import type { MigrationRunnerFn } from './common';\nimport type { createStorage } from './storage';\n\nexport interface MigrationMeta {\n name: string;\n path?: string;\n}\n\nexport interface RunnableMigration extends MigrationMeta {\n up: MigrationRunnerFn;\n down: MigrationRunnerFn;\n}\n\nexport interface MigrationRunnerLogger {\n info(message: unknown): void;\n}\n\nexport interface MigrationRunnerOptions {\n storage: ReturnType<typeof createStorage>;\n logger: MigrationRunnerLogger;\n getMigrations: () => Promise<RunnableMigration[]>;\n}\n\nconst logEvent = (\n logger: MigrationRunnerLogger,\n event: string,\n name: string,\n extra?: Record<string, unknown>\n) => {\n logger.info({ event, name, ...extra });\n};\n\nconst wrapMigrationError = (name: string, direction: 'up' | 'down', cause: unknown): Error => {\n const causeMessage =\n cause instanceof Error\n ? `Original error: ${cause.message}`\n : `Non-error value thrown. See cause for full value: ${String(cause)}`;\n\n return new Error(`Migration ${name} (${direction}) failed: ${causeMessage}`, { cause });\n};\n\nexport const createMigrationRunner = (opts: MigrationRunnerOptions) => {\n const getPendingMigrations = async (): Promise<RunnableMigration[]> => {\n const [migrations, executedNames] = await Promise.all([\n opts.getMigrations(),\n opts.storage.executed(),\n ]);\n\n const executedSet = new Set(executedNames);\n return migrations.filter((migration) => !executedSet.has(migration.name));\n };\n\n const getExecutedMigrations = async (): Promise<RunnableMigration[]> => {\n const [migrations, executedNames] = await Promise.all([\n opts.getMigrations(),\n opts.storage.executed(),\n ]);\n\n const executedSet = new Set(executedNames);\n return migrations.filter((migration) => executedSet.has(migration.name));\n };\n\n return {\n async pending(): Promise<MigrationMeta[]> {\n const pending = await getPendingMigrations();\n return pending.map(({ name, path }) => ({ name, path }));\n },\n\n async up(): Promise<MigrationMeta[]> {\n const toBeApplied = await getPendingMigrations();\n\n for (const migration of toBeApplied) {\n const start = Date.now();\n\n logEvent(opts.logger, 'migrating', migration.name);\n\n try {\n await migration.up();\n } catch (error) {\n throw wrapMigrationError(migration.name, 'up', error);\n }\n\n await opts.storage.logMigration({ name: migration.name });\n\n const durationSeconds = (Date.now() - start) / 1000;\n logEvent(opts.logger, 'migrated', migration.name, { durationSeconds });\n }\n\n return toBeApplied.map(({ name, path }) => ({ name, path }));\n },\n\n async down(): Promise<MigrationMeta[]> {\n const executedReversed = (await getExecutedMigrations()).slice().reverse();\n const toBeReverted = executedReversed.slice(0, 1);\n\n for (const migration of toBeReverted) {\n const start = Date.now();\n\n logEvent(opts.logger, 'reverting', migration.name);\n\n try {\n await migration.down();\n } catch (error) {\n throw wrapMigrationError(migration.name, 'down', error);\n }\n\n await opts.storage.unlogMigration({ name: migration.name });\n\n const durationSeconds = Number.parseFloat(((Date.now() - start) / 1000).toFixed(3));\n logEvent(opts.logger, 'reverted', migration.name, { durationSeconds });\n }\n\n return toBeReverted.map(({ name, path }) => ({ name, path }));\n },\n };\n};\n"],"names":["logEvent","logger","event","name","extra","info","wrapMigrationError","direction","cause","causeMessage","Error","message","String","createMigrationRunner","opts","getPendingMigrations","migrations","executedNames","Promise","all","getMigrations","storage","executed","executedSet","Set","filter","migration","has","getExecutedMigrations","pending","map","path","up","toBeApplied","start","Date","now","error","logMigration","durationSeconds","down","executedReversed","slice","reverse","toBeReverted","unlogMigration","Number","parseFloat","toFixed"],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const logEvent = (logger, event, name, extra)=>{
|
|
2
|
+
logger.info({
|
|
3
|
+
event,
|
|
4
|
+
name,
|
|
5
|
+
...extra
|
|
6
|
+
});
|
|
7
|
+
};
|
|
8
|
+
const wrapMigrationError = (name, direction, cause)=>{
|
|
9
|
+
const causeMessage = cause instanceof Error ? `Original error: ${cause.message}` : `Non-error value thrown. See cause for full value: ${String(cause)}`;
|
|
10
|
+
return new Error(`Migration ${name} (${direction}) failed: ${causeMessage}`, {
|
|
11
|
+
cause
|
|
12
|
+
});
|
|
13
|
+
};
|
|
14
|
+
const createMigrationRunner = (opts)=>{
|
|
15
|
+
const getPendingMigrations = async ()=>{
|
|
16
|
+
const [migrations, executedNames] = await Promise.all([
|
|
17
|
+
opts.getMigrations(),
|
|
18
|
+
opts.storage.executed()
|
|
19
|
+
]);
|
|
20
|
+
const executedSet = new Set(executedNames);
|
|
21
|
+
return migrations.filter((migration)=>!executedSet.has(migration.name));
|
|
22
|
+
};
|
|
23
|
+
const getExecutedMigrations = async ()=>{
|
|
24
|
+
const [migrations, executedNames] = await Promise.all([
|
|
25
|
+
opts.getMigrations(),
|
|
26
|
+
opts.storage.executed()
|
|
27
|
+
]);
|
|
28
|
+
const executedSet = new Set(executedNames);
|
|
29
|
+
return migrations.filter((migration)=>executedSet.has(migration.name));
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
async pending () {
|
|
33
|
+
const pending = await getPendingMigrations();
|
|
34
|
+
return pending.map(({ name, path })=>({
|
|
35
|
+
name,
|
|
36
|
+
path
|
|
37
|
+
}));
|
|
38
|
+
},
|
|
39
|
+
async up () {
|
|
40
|
+
const toBeApplied = await getPendingMigrations();
|
|
41
|
+
for (const migration of toBeApplied){
|
|
42
|
+
const start = Date.now();
|
|
43
|
+
logEvent(opts.logger, 'migrating', migration.name);
|
|
44
|
+
try {
|
|
45
|
+
await migration.up();
|
|
46
|
+
} catch (error) {
|
|
47
|
+
throw wrapMigrationError(migration.name, 'up', error);
|
|
48
|
+
}
|
|
49
|
+
await opts.storage.logMigration({
|
|
50
|
+
name: migration.name
|
|
51
|
+
});
|
|
52
|
+
const durationSeconds = (Date.now() - start) / 1000;
|
|
53
|
+
logEvent(opts.logger, 'migrated', migration.name, {
|
|
54
|
+
durationSeconds
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
return toBeApplied.map(({ name, path })=>({
|
|
58
|
+
name,
|
|
59
|
+
path
|
|
60
|
+
}));
|
|
61
|
+
},
|
|
62
|
+
async down () {
|
|
63
|
+
const executedReversed = (await getExecutedMigrations()).slice().reverse();
|
|
64
|
+
const toBeReverted = executedReversed.slice(0, 1);
|
|
65
|
+
for (const migration of toBeReverted){
|
|
66
|
+
const start = Date.now();
|
|
67
|
+
logEvent(opts.logger, 'reverting', migration.name);
|
|
68
|
+
try {
|
|
69
|
+
await migration.down();
|
|
70
|
+
} catch (error) {
|
|
71
|
+
throw wrapMigrationError(migration.name, 'down', error);
|
|
72
|
+
}
|
|
73
|
+
await opts.storage.unlogMigration({
|
|
74
|
+
name: migration.name
|
|
75
|
+
});
|
|
76
|
+
const durationSeconds = Number.parseFloat(((Date.now() - start) / 1000).toFixed(3));
|
|
77
|
+
logEvent(opts.logger, 'reverted', migration.name, {
|
|
78
|
+
durationSeconds
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
return toBeReverted.map(({ name, path })=>({
|
|
82
|
+
name,
|
|
83
|
+
path
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export { createMigrationRunner };
|
|
90
|
+
//# sourceMappingURL=runner.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runner.mjs","sources":["../../src/migrations/runner.ts"],"sourcesContent":["import type { MigrationRunnerFn } from './common';\nimport type { createStorage } from './storage';\n\nexport interface MigrationMeta {\n name: string;\n path?: string;\n}\n\nexport interface RunnableMigration extends MigrationMeta {\n up: MigrationRunnerFn;\n down: MigrationRunnerFn;\n}\n\nexport interface MigrationRunnerLogger {\n info(message: unknown): void;\n}\n\nexport interface MigrationRunnerOptions {\n storage: ReturnType<typeof createStorage>;\n logger: MigrationRunnerLogger;\n getMigrations: () => Promise<RunnableMigration[]>;\n}\n\nconst logEvent = (\n logger: MigrationRunnerLogger,\n event: string,\n name: string,\n extra?: Record<string, unknown>\n) => {\n logger.info({ event, name, ...extra });\n};\n\nconst wrapMigrationError = (name: string, direction: 'up' | 'down', cause: unknown): Error => {\n const causeMessage =\n cause instanceof Error\n ? `Original error: ${cause.message}`\n : `Non-error value thrown. See cause for full value: ${String(cause)}`;\n\n return new Error(`Migration ${name} (${direction}) failed: ${causeMessage}`, { cause });\n};\n\nexport const createMigrationRunner = (opts: MigrationRunnerOptions) => {\n const getPendingMigrations = async (): Promise<RunnableMigration[]> => {\n const [migrations, executedNames] = await Promise.all([\n opts.getMigrations(),\n opts.storage.executed(),\n ]);\n\n const executedSet = new Set(executedNames);\n return migrations.filter((migration) => !executedSet.has(migration.name));\n };\n\n const getExecutedMigrations = async (): Promise<RunnableMigration[]> => {\n const [migrations, executedNames] = await Promise.all([\n opts.getMigrations(),\n opts.storage.executed(),\n ]);\n\n const executedSet = new Set(executedNames);\n return migrations.filter((migration) => executedSet.has(migration.name));\n };\n\n return {\n async pending(): Promise<MigrationMeta[]> {\n const pending = await getPendingMigrations();\n return pending.map(({ name, path }) => ({ name, path }));\n },\n\n async up(): Promise<MigrationMeta[]> {\n const toBeApplied = await getPendingMigrations();\n\n for (const migration of toBeApplied) {\n const start = Date.now();\n\n logEvent(opts.logger, 'migrating', migration.name);\n\n try {\n await migration.up();\n } catch (error) {\n throw wrapMigrationError(migration.name, 'up', error);\n }\n\n await opts.storage.logMigration({ name: migration.name });\n\n const durationSeconds = (Date.now() - start) / 1000;\n logEvent(opts.logger, 'migrated', migration.name, { durationSeconds });\n }\n\n return toBeApplied.map(({ name, path }) => ({ name, path }));\n },\n\n async down(): Promise<MigrationMeta[]> {\n const executedReversed = (await getExecutedMigrations()).slice().reverse();\n const toBeReverted = executedReversed.slice(0, 1);\n\n for (const migration of toBeReverted) {\n const start = Date.now();\n\n logEvent(opts.logger, 'reverting', migration.name);\n\n try {\n await migration.down();\n } catch (error) {\n throw wrapMigrationError(migration.name, 'down', error);\n }\n\n await opts.storage.unlogMigration({ name: migration.name });\n\n const durationSeconds = Number.parseFloat(((Date.now() - start) / 1000).toFixed(3));\n logEvent(opts.logger, 'reverted', migration.name, { durationSeconds });\n }\n\n return toBeReverted.map(({ name, path }) => ({ name, path }));\n },\n };\n};\n"],"names":["logEvent","logger","event","name","extra","info","wrapMigrationError","direction","cause","causeMessage","Error","message","String","createMigrationRunner","opts","getPendingMigrations","migrations","executedNames","Promise","all","getMigrations","storage","executed","executedSet","Set","filter","migration","has","getExecutedMigrations","pending","map","path","up","toBeApplied","start","Date","now","error","logMigration","durationSeconds","down","executedReversed","slice","reverse","toBeReverted","unlogMigration","Number","parseFloat","toFixed"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/migrations/users.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"users.d.ts","sourceRoot":"","sources":["../../src/migrations/users.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,IAAI,CAAC;AAEnC,eAAO,MAAM,2BAA2B,GAAI,IAAI,QAAQ,KAAG,qBAgC1D,CAAC"}
|
package/dist/migrations/users.js
CHANGED
|
@@ -1,95 +1,49 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
+
var path = require('path');
|
|
3
4
|
var fse = require('fs-extra');
|
|
5
|
+
var discover = require('./discover.js');
|
|
6
|
+
var runner = require('./runner.js');
|
|
7
|
+
var resolver = require('./resolver.js');
|
|
4
8
|
var storage = require('./storage.js');
|
|
5
|
-
var common = require('./common.js');
|
|
6
9
|
var logger = require('./logger.js');
|
|
7
10
|
|
|
8
11
|
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
12
|
|
|
13
|
+
var path__default = /*#__PURE__*/_interopDefault(path);
|
|
10
14
|
var fse__default = /*#__PURE__*/_interopDefault(fse);
|
|
11
15
|
|
|
12
|
-
// TODO: check multiple commands in one sql statement
|
|
13
|
-
const migrationResolver = ({ name, path, context })=>{
|
|
14
|
-
const { db } = context;
|
|
15
|
-
if (!path) {
|
|
16
|
-
throw new Error(`Migration ${name} has no path`);
|
|
17
|
-
}
|
|
18
|
-
// if sql file run with knex raw
|
|
19
|
-
if (path.match(/\.sql$/)) {
|
|
20
|
-
const sql = fse__default.default.readFileSync(path, 'utf8');
|
|
21
|
-
return {
|
|
22
|
-
name,
|
|
23
|
-
up: common.wrapTransaction(db)((knex)=>knex.raw(sql)),
|
|
24
|
-
async down () {
|
|
25
|
-
throw new Error('Down migration is not supported for sql files');
|
|
26
|
-
}
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
// NOTE: we can add some ts register if we want to handle ts migration files at some point
|
|
30
|
-
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
31
|
-
const migration = require(path);
|
|
32
|
-
return {
|
|
33
|
-
name,
|
|
34
|
-
up: common.wrapTransaction(db)(migration.up),
|
|
35
|
-
down: common.wrapTransaction(db)(migration.down)
|
|
36
|
-
};
|
|
37
|
-
};
|
|
38
16
|
const createUserMigrationProvider = (db)=>{
|
|
39
17
|
const dir = db.config.settings.migrations.dir;
|
|
40
18
|
fse__default.default.ensureDirSync(dir);
|
|
41
19
|
const context = {
|
|
42
20
|
db
|
|
43
21
|
};
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
db,
|
|
53
|
-
tableName: 'strapi_migrations'
|
|
54
|
-
}),
|
|
55
|
-
logger: {
|
|
56
|
-
info (message) {
|
|
57
|
-
// NOTE: only log internal migration in debug mode
|
|
58
|
-
db.logger.info(logger.transformLogMessage('info', message));
|
|
59
|
-
},
|
|
60
|
-
warn (message) {
|
|
61
|
-
db.logger.warn(logger.transformLogMessage('warn', message));
|
|
62
|
-
},
|
|
63
|
-
error (message) {
|
|
64
|
-
db.logger.error(logger.transformLogMessage('error', message));
|
|
65
|
-
},
|
|
66
|
-
debug (message) {
|
|
67
|
-
db.logger.debug(logger.transformLogMessage('debug', message));
|
|
68
|
-
}
|
|
69
|
-
},
|
|
70
|
-
context,
|
|
71
|
-
migrations: {
|
|
72
|
-
glob: [
|
|
73
|
-
'*.{js,sql}',
|
|
74
|
-
{
|
|
75
|
-
cwd: dir
|
|
76
|
-
}
|
|
77
|
-
],
|
|
78
|
-
resolve: migrationResolver
|
|
22
|
+
const runner$1 = runner.createMigrationRunner({
|
|
23
|
+
storage: storage.createStorage({
|
|
24
|
+
db,
|
|
25
|
+
tableName: 'strapi_migrations'
|
|
26
|
+
}),
|
|
27
|
+
logger: {
|
|
28
|
+
info (message) {
|
|
29
|
+
db.logger.info(logger.transformLogMessage('info', message));
|
|
79
30
|
}
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
|
|
31
|
+
},
|
|
32
|
+
async getMigrations () {
|
|
33
|
+
const filepaths = discover.discoverMigrationFiles(path__default.default.resolve(dir));
|
|
34
|
+
return resolver.resolveMigrationFiles(filepaths, context);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
83
37
|
return {
|
|
84
38
|
async shouldRun () {
|
|
85
|
-
const pendingMigrations = await
|
|
39
|
+
const pendingMigrations = await runner$1.pending();
|
|
86
40
|
return pendingMigrations.length > 0 && db.config?.settings?.runMigrations === true;
|
|
87
41
|
},
|
|
88
42
|
async up () {
|
|
89
|
-
await
|
|
43
|
+
await runner$1.up();
|
|
90
44
|
},
|
|
91
45
|
async down () {
|
|
92
|
-
await
|
|
46
|
+
await runner$1.down();
|
|
93
47
|
}
|
|
94
48
|
};
|
|
95
49
|
};
|