knex 2.5.0 → 2.5.1
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/CHANGELOG.md +64 -58
- package/CONTRIBUTING.md +194 -194
- package/README.md +149 -147
- package/UPGRADING.md +245 -233
- package/bin/cli.js +475 -473
- package/bin/utils/cli-config-utils.js +212 -210
- package/bin/utils/constants.js +7 -7
- package/bin/utils/migrationsLister.js +37 -37
- package/knex.js +23 -23
- package/knex.mjs +11 -11
- package/lib/builder-interface-augmenter.js +120 -120
- package/lib/client.js +495 -495
- package/lib/constants.js +61 -61
- package/lib/dialects/better-sqlite3/index.js +77 -77
- package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
- package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
- package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
- package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
- package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
- package/lib/dialects/cockroachdb/index.js +86 -86
- package/lib/dialects/index.js +20 -20
- package/lib/dialects/mssql/index.js +500 -500
- package/lib/dialects/mssql/mssql-formatter.js +34 -34
- package/lib/dialects/mssql/query/mssql-querycompiler.js +601 -601
- package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
- package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
- package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -378
- package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
- package/lib/dialects/mssql/transaction.js +176 -176
- package/lib/dialects/mysql/index.js +201 -201
- package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -274
- package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
- package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
- package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
- package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
- package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
- package/lib/dialects/mysql/transaction.js +46 -46
- package/lib/dialects/mysql2/index.js +53 -53
- package/lib/dialects/mysql2/transaction.js +44 -44
- package/lib/dialects/oracle/DEAD_CODE.md +5 -5
- package/lib/dialects/oracle/index.js +92 -92
- package/lib/dialects/oracle/query/oracle-querycompiler.js +343 -343
- package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
- package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
- package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
- package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
- package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
- package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
- package/lib/dialects/oracle/utils.js +87 -87
- package/lib/dialects/oracledb/index.js +327 -327
- package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
- package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +61 -61
- package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
- package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
- package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
- package/lib/dialects/oracledb/transaction.js +98 -98
- package/lib/dialects/oracledb/utils.js +208 -208
- package/lib/dialects/pgnative/index.js +60 -60
- package/lib/dialects/postgres/execution/pg-transaction.js +19 -19
- package/lib/dialects/postgres/index.js +358 -358
- package/lib/dialects/postgres/query/pg-querybuilder.js +43 -43
- package/lib/dialects/postgres/query/pg-querycompiler.js +400 -400
- package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
- package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
- package/lib/dialects/postgres/schema/pg-tablecompiler.js +304 -304
- package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
- package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
- package/lib/dialects/redshift/index.js +86 -86
- package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
- package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
- package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
- package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
- package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
- package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
- package/lib/dialects/redshift/transaction.js +32 -32
- package/lib/dialects/sqlite3/execution/sqlite-transaction.js +25 -25
- package/lib/dialects/sqlite3/index.js +250 -250
- package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
- package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
- package/lib/dialects/sqlite3/schema/ddl.js +400 -400
- package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
- package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
- package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
- package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
- package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
- package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
- package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
- package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
- package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -347
- package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
- package/lib/execution/batch-insert.js +51 -51
- package/lib/execution/internal/delay.js +6 -6
- package/lib/execution/internal/ensure-connection-callback.js +41 -41
- package/lib/execution/internal/query-executioner.js +62 -62
- package/lib/execution/runner.js +325 -325
- package/lib/execution/transaction.js +409 -409
- package/lib/formatter/formatterUtils.js +42 -42
- package/lib/formatter/rawFormatter.js +84 -84
- package/lib/formatter/wrappingFormatter.js +250 -250
- package/lib/formatter.js +25 -25
- package/lib/index.js +3 -3
- package/lib/knex-builder/FunctionHelper.js +80 -80
- package/lib/knex-builder/Knex.js +59 -59
- package/lib/knex-builder/internal/config-resolver.js +57 -57
- package/lib/knex-builder/internal/parse-connection.js +87 -87
- package/lib/knex-builder/make-knex.js +345 -345
- package/lib/logger.js +76 -76
- package/lib/migrations/common/MigrationsLoader.js +36 -36
- package/lib/migrations/migrate/MigrationGenerator.js +84 -84
- package/lib/migrations/migrate/Migrator.js +598 -598
- package/lib/migrations/migrate/migrate-stub.js +17 -17
- package/lib/migrations/migrate/migration-list-resolver.js +33 -33
- package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
- package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
- package/lib/migrations/migrate/table-creator.js +77 -77
- package/lib/migrations/migrate/table-resolver.js +27 -27
- package/lib/migrations/seed/Seeder.js +137 -137
- package/lib/migrations/seed/seed-stub.js +13 -13
- package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
- package/lib/migrations/seed/sources/fs-seeds.js +65 -65
- package/lib/migrations/util/fs.js +86 -86
- package/lib/migrations/util/import-file.js +12 -12
- package/lib/migrations/util/is-module-type.js +9 -9
- package/lib/migrations/util/template.js +52 -52
- package/lib/migrations/util/timestamp.js +14 -14
- package/lib/query/analytic.js +52 -52
- package/lib/query/constants.js +15 -15
- package/lib/query/joinclause.js +270 -270
- package/lib/query/method-constants.js +136 -136
- package/lib/query/querybuilder.js +1793 -1793
- package/lib/query/querycompiler.js +1591 -1591
- package/lib/raw.js +139 -139
- package/lib/ref.js +39 -39
- package/lib/schema/builder.js +115 -115
- package/lib/schema/columnbuilder.js +146 -146
- package/lib/schema/columncompiler.js +307 -307
- package/lib/schema/compiler.js +187 -187
- package/lib/schema/internal/helpers.js +55 -55
- package/lib/schema/tablebuilder.js +376 -376
- package/lib/schema/tablecompiler.js +433 -433
- package/lib/schema/viewbuilder.js +92 -92
- package/lib/schema/viewcompiler.js +138 -138
- package/lib/util/finally-mixin.js +13 -13
- package/lib/util/helpers.js +95 -95
- package/lib/util/is.js +32 -32
- package/lib/util/nanoid.js +40 -40
- package/lib/util/noop.js +1 -1
- package/lib/util/save-async-stack.js +14 -14
- package/lib/util/security.js +26 -26
- package/lib/util/string.js +190 -190
- package/lib/util/timeout.js +29 -29
- package/package.json +11 -10
- package/scripts/build.js +125 -125
- package/scripts/clean.js +31 -31
- package/scripts/docker-compose.yml +152 -152
- package/scripts/next-release-howto.md +24 -24
- package/scripts/release.sh +2 -0
- package/scripts/runkit-example.js +35 -34
- package/scripts/stress-test/docker-compose.yml +57 -57
- package/scripts/stress-test/knex-stress-test.js +212 -208
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -145
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -100
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -184
- package/scripts/update_gitignore_for_tsc_output.js +90 -90
- package/types/index.d.ts +3274 -3273
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
// Stub Migrate:
|
|
2
|
-
// Used for now in browser builds, where filesystem access isn't
|
|
3
|
-
// available.
|
|
4
|
-
const StubMigrate = (module.exports = function () {});
|
|
5
|
-
|
|
6
|
-
const noSuchMethod = async function () {
|
|
7
|
-
throw new Error('Migrations are not supported');
|
|
8
|
-
};
|
|
9
|
-
|
|
10
|
-
StubMigrate.prototype = {
|
|
11
|
-
make: noSuchMethod,
|
|
12
|
-
latest: noSuchMethod,
|
|
13
|
-
rollback: noSuchMethod,
|
|
14
|
-
currentVersion: noSuchMethod,
|
|
15
|
-
up: noSuchMethod,
|
|
16
|
-
down: noSuchMethod,
|
|
17
|
-
};
|
|
1
|
+
// Stub Migrate:
|
|
2
|
+
// Used for now in browser builds, where filesystem access isn't
|
|
3
|
+
// available.
|
|
4
|
+
const StubMigrate = (module.exports = function () {});
|
|
5
|
+
|
|
6
|
+
const noSuchMethod = async function () {
|
|
7
|
+
throw new Error('Migrations are not supported');
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
StubMigrate.prototype = {
|
|
11
|
+
make: noSuchMethod,
|
|
12
|
+
latest: noSuchMethod,
|
|
13
|
+
rollback: noSuchMethod,
|
|
14
|
+
currentVersion: noSuchMethod,
|
|
15
|
+
up: noSuchMethod,
|
|
16
|
+
down: noSuchMethod,
|
|
17
|
+
};
|
|
@@ -1,33 +1,33 @@
|
|
|
1
|
-
const { getTableName } = require('./table-resolver');
|
|
2
|
-
const { ensureTable } = require('./table-creator');
|
|
3
|
-
|
|
4
|
-
// Lists all available migration versions, as a sorted array.
|
|
5
|
-
function listAll(migrationSource, loadExtensions) {
|
|
6
|
-
return migrationSource.getMigrations(loadExtensions);
|
|
7
|
-
}
|
|
8
|
-
|
|
9
|
-
// Lists all migrations that have been completed for the current db, as an
|
|
10
|
-
// array.
|
|
11
|
-
async function listCompleted(tableName, schemaName, trxOrKnex) {
|
|
12
|
-
await ensureTable(tableName, schemaName, trxOrKnex);
|
|
13
|
-
|
|
14
|
-
return await trxOrKnex
|
|
15
|
-
.from(getTableName(tableName, schemaName))
|
|
16
|
-
.orderBy('id')
|
|
17
|
-
.select('name');
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Gets the migration list from the migration directory specified in config, as well as
|
|
21
|
-
// the list of completed migrations to check what should be run.
|
|
22
|
-
function listAllAndCompleted(config, trxOrKnex) {
|
|
23
|
-
return Promise.all([
|
|
24
|
-
listAll(config.migrationSource, config.loadExtensions),
|
|
25
|
-
listCompleted(config.tableName, config.schemaName, trxOrKnex),
|
|
26
|
-
]);
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
module.exports = {
|
|
30
|
-
listAll,
|
|
31
|
-
listAllAndCompleted,
|
|
32
|
-
listCompleted,
|
|
33
|
-
};
|
|
1
|
+
const { getTableName } = require('./table-resolver');
|
|
2
|
+
const { ensureTable } = require('./table-creator');
|
|
3
|
+
|
|
4
|
+
// Lists all available migration versions, as a sorted array.
|
|
5
|
+
function listAll(migrationSource, loadExtensions) {
|
|
6
|
+
return migrationSource.getMigrations(loadExtensions);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
// Lists all migrations that have been completed for the current db, as an
|
|
10
|
+
// array.
|
|
11
|
+
async function listCompleted(tableName, schemaName, trxOrKnex) {
|
|
12
|
+
await ensureTable(tableName, schemaName, trxOrKnex);
|
|
13
|
+
|
|
14
|
+
return await trxOrKnex
|
|
15
|
+
.from(getTableName(tableName, schemaName))
|
|
16
|
+
.orderBy('id')
|
|
17
|
+
.select('name');
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
// Gets the migration list from the migration directory specified in config, as well as
|
|
21
|
+
// the list of completed migrations to check what should be run.
|
|
22
|
+
function listAllAndCompleted(config, trxOrKnex) {
|
|
23
|
+
return Promise.all([
|
|
24
|
+
listAll(config.migrationSource, config.loadExtensions),
|
|
25
|
+
listCompleted(config.tableName, config.schemaName, trxOrKnex),
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
module.exports = {
|
|
30
|
+
listAll,
|
|
31
|
+
listAllAndCompleted,
|
|
32
|
+
listCompleted,
|
|
33
|
+
};
|
|
@@ -1,58 +1,58 @@
|
|
|
1
|
-
const { FsMigrations } = require('./sources/fs-migrations');
|
|
2
|
-
const Logger = require('../../logger');
|
|
3
|
-
const { DEFAULT_LOAD_EXTENSIONS } = require('../common/MigrationsLoader');
|
|
4
|
-
const defaultLogger = new Logger();
|
|
5
|
-
|
|
6
|
-
const CONFIG_DEFAULT = Object.freeze({
|
|
7
|
-
extension: 'js',
|
|
8
|
-
loadExtensions: DEFAULT_LOAD_EXTENSIONS,
|
|
9
|
-
tableName: 'knex_migrations',
|
|
10
|
-
schemaName: null,
|
|
11
|
-
directory: './migrations',
|
|
12
|
-
disableTransactions: false,
|
|
13
|
-
disableMigrationsListValidation: false,
|
|
14
|
-
sortDirsSeparately: false,
|
|
15
|
-
});
|
|
16
|
-
|
|
17
|
-
function getMergedConfig(config, currentConfig, logger = defaultLogger) {
|
|
18
|
-
// config is the user specified config, mergedConfig has defaults and current config
|
|
19
|
-
// applied to it.
|
|
20
|
-
const mergedConfig = Object.assign(
|
|
21
|
-
{},
|
|
22
|
-
CONFIG_DEFAULT,
|
|
23
|
-
currentConfig || {},
|
|
24
|
-
config
|
|
25
|
-
);
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
config &&
|
|
29
|
-
// If user specifies any FS related config,
|
|
30
|
-
// clear specified migrationSource to avoid ambiguity
|
|
31
|
-
(config.directory ||
|
|
32
|
-
config.sortDirsSeparately !== undefined ||
|
|
33
|
-
config.loadExtensions)
|
|
34
|
-
) {
|
|
35
|
-
if (config.migrationSource) {
|
|
36
|
-
logger.warn(
|
|
37
|
-
'FS-related option specified for migration configuration. This resets migrationSource to default FsMigrations'
|
|
38
|
-
);
|
|
39
|
-
}
|
|
40
|
-
mergedConfig.migrationSource = null;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
// If the user has not specified any configs, we need to
|
|
44
|
-
// default to fs migrations to maintain compatibility
|
|
45
|
-
if (!mergedConfig.migrationSource) {
|
|
46
|
-
mergedConfig.migrationSource = new FsMigrations(
|
|
47
|
-
mergedConfig.directory,
|
|
48
|
-
mergedConfig.sortDirsSeparately,
|
|
49
|
-
mergedConfig.loadExtensions
|
|
50
|
-
);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return mergedConfig;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
module.exports = {
|
|
57
|
-
getMergedConfig,
|
|
58
|
-
};
|
|
1
|
+
const { FsMigrations } = require('./sources/fs-migrations');
|
|
2
|
+
const Logger = require('../../logger');
|
|
3
|
+
const { DEFAULT_LOAD_EXTENSIONS } = require('../common/MigrationsLoader');
|
|
4
|
+
const defaultLogger = new Logger();
|
|
5
|
+
|
|
6
|
+
const CONFIG_DEFAULT = Object.freeze({
|
|
7
|
+
extension: 'js',
|
|
8
|
+
loadExtensions: DEFAULT_LOAD_EXTENSIONS,
|
|
9
|
+
tableName: 'knex_migrations',
|
|
10
|
+
schemaName: null,
|
|
11
|
+
directory: './migrations',
|
|
12
|
+
disableTransactions: false,
|
|
13
|
+
disableMigrationsListValidation: false,
|
|
14
|
+
sortDirsSeparately: false,
|
|
15
|
+
});
|
|
16
|
+
|
|
17
|
+
function getMergedConfig(config, currentConfig, logger = defaultLogger) {
|
|
18
|
+
// config is the user specified config, mergedConfig has defaults and current config
|
|
19
|
+
// applied to it.
|
|
20
|
+
const mergedConfig = Object.assign(
|
|
21
|
+
{},
|
|
22
|
+
CONFIG_DEFAULT,
|
|
23
|
+
currentConfig || {},
|
|
24
|
+
config
|
|
25
|
+
);
|
|
26
|
+
|
|
27
|
+
if (
|
|
28
|
+
config &&
|
|
29
|
+
// If user specifies any FS related config,
|
|
30
|
+
// clear specified migrationSource to avoid ambiguity
|
|
31
|
+
(config.directory ||
|
|
32
|
+
config.sortDirsSeparately !== undefined ||
|
|
33
|
+
config.loadExtensions)
|
|
34
|
+
) {
|
|
35
|
+
if (config.migrationSource) {
|
|
36
|
+
logger.warn(
|
|
37
|
+
'FS-related option specified for migration configuration. This resets migrationSource to default FsMigrations'
|
|
38
|
+
);
|
|
39
|
+
}
|
|
40
|
+
mergedConfig.migrationSource = null;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// If the user has not specified any configs, we need to
|
|
44
|
+
// default to fs migrations to maintain compatibility
|
|
45
|
+
if (!mergedConfig.migrationSource) {
|
|
46
|
+
mergedConfig.migrationSource = new FsMigrations(
|
|
47
|
+
mergedConfig.directory,
|
|
48
|
+
mergedConfig.sortDirsSeparately,
|
|
49
|
+
mergedConfig.loadExtensions
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
return mergedConfig;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
module.exports = {
|
|
57
|
+
getMergedConfig,
|
|
58
|
+
};
|
|
@@ -1,74 +1,74 @@
|
|
|
1
|
-
const path = require('path');
|
|
2
|
-
const sortBy = require('lodash/sortBy');
|
|
3
|
-
|
|
4
|
-
const { readdir } = require('../../util/fs');
|
|
5
|
-
const { AbstractMigrationsLoader } = require('../../common/MigrationsLoader');
|
|
6
|
-
|
|
7
|
-
class FsMigrations extends AbstractMigrationsLoader {
|
|
8
|
-
/**
|
|
9
|
-
* Gets the migration names
|
|
10
|
-
* @returns Promise<string[]>
|
|
11
|
-
*/
|
|
12
|
-
getMigrations(loadExtensions) {
|
|
13
|
-
// Get a list of files in all specified migration directories
|
|
14
|
-
const readMigrationsPromises = this.migrationsPaths.map((configDir) => {
|
|
15
|
-
const absoluteDir = path.resolve(process.cwd(), configDir);
|
|
16
|
-
return readdir(absoluteDir).then((files) => ({
|
|
17
|
-
files,
|
|
18
|
-
configDir,
|
|
19
|
-
absoluteDir,
|
|
20
|
-
}));
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
return Promise.all(readMigrationsPromises).then((allMigrations) => {
|
|
24
|
-
const migrations = allMigrations.reduce((acc, migrationDirectory) => {
|
|
25
|
-
// When true, files inside the folder should be sorted
|
|
26
|
-
if (this.sortDirsSeparately) {
|
|
27
|
-
migrationDirectory.files = migrationDirectory.files.sort();
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
migrationDirectory.files.forEach((file) =>
|
|
31
|
-
acc.push({ file, directory: migrationDirectory.configDir })
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
return acc;
|
|
35
|
-
}, []);
|
|
36
|
-
|
|
37
|
-
// If true we have already sorted the migrations inside the folders
|
|
38
|
-
// return the migrations fully qualified
|
|
39
|
-
if (this.sortDirsSeparately) {
|
|
40
|
-
return filterMigrations(
|
|
41
|
-
this,
|
|
42
|
-
migrations,
|
|
43
|
-
loadExtensions || this.loadExtensions
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return filterMigrations(
|
|
48
|
-
this,
|
|
49
|
-
sortBy(migrations, 'file'),
|
|
50
|
-
loadExtensions || this.loadExtensions
|
|
51
|
-
);
|
|
52
|
-
});
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
getMigrationName(migration) {
|
|
56
|
-
return migration.file;
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
getMigration(migrationInfo) {
|
|
60
|
-
return this.getFile(migrationInfo);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
function filterMigrations(migrationSource, migrations, loadExtensions) {
|
|
65
|
-
return migrations.filter((migration) => {
|
|
66
|
-
const migrationName = migrationSource.getMigrationName(migration);
|
|
67
|
-
const extension = path.extname(migrationName);
|
|
68
|
-
return loadExtensions.includes(extension);
|
|
69
|
-
});
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
module.exports = {
|
|
73
|
-
FsMigrations,
|
|
74
|
-
};
|
|
1
|
+
const path = require('path');
|
|
2
|
+
const sortBy = require('lodash/sortBy');
|
|
3
|
+
|
|
4
|
+
const { readdir } = require('../../util/fs');
|
|
5
|
+
const { AbstractMigrationsLoader } = require('../../common/MigrationsLoader');
|
|
6
|
+
|
|
7
|
+
class FsMigrations extends AbstractMigrationsLoader {
|
|
8
|
+
/**
|
|
9
|
+
* Gets the migration names
|
|
10
|
+
* @returns Promise<string[]>
|
|
11
|
+
*/
|
|
12
|
+
getMigrations(loadExtensions) {
|
|
13
|
+
// Get a list of files in all specified migration directories
|
|
14
|
+
const readMigrationsPromises = this.migrationsPaths.map((configDir) => {
|
|
15
|
+
const absoluteDir = path.resolve(process.cwd(), configDir);
|
|
16
|
+
return readdir(absoluteDir).then((files) => ({
|
|
17
|
+
files,
|
|
18
|
+
configDir,
|
|
19
|
+
absoluteDir,
|
|
20
|
+
}));
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
return Promise.all(readMigrationsPromises).then((allMigrations) => {
|
|
24
|
+
const migrations = allMigrations.reduce((acc, migrationDirectory) => {
|
|
25
|
+
// When true, files inside the folder should be sorted
|
|
26
|
+
if (this.sortDirsSeparately) {
|
|
27
|
+
migrationDirectory.files = migrationDirectory.files.sort();
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
migrationDirectory.files.forEach((file) =>
|
|
31
|
+
acc.push({ file, directory: migrationDirectory.configDir })
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
return acc;
|
|
35
|
+
}, []);
|
|
36
|
+
|
|
37
|
+
// If true we have already sorted the migrations inside the folders
|
|
38
|
+
// return the migrations fully qualified
|
|
39
|
+
if (this.sortDirsSeparately) {
|
|
40
|
+
return filterMigrations(
|
|
41
|
+
this,
|
|
42
|
+
migrations,
|
|
43
|
+
loadExtensions || this.loadExtensions
|
|
44
|
+
);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
return filterMigrations(
|
|
48
|
+
this,
|
|
49
|
+
sortBy(migrations, 'file'),
|
|
50
|
+
loadExtensions || this.loadExtensions
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
getMigrationName(migration) {
|
|
56
|
+
return migration.file;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
getMigration(migrationInfo) {
|
|
60
|
+
return this.getFile(migrationInfo);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
function filterMigrations(migrationSource, migrations, loadExtensions) {
|
|
65
|
+
return migrations.filter((migration) => {
|
|
66
|
+
const migrationName = migrationSource.getMigrationName(migration);
|
|
67
|
+
const extension = path.extname(migrationName);
|
|
68
|
+
return loadExtensions.includes(extension);
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
module.exports = {
|
|
73
|
+
FsMigrations,
|
|
74
|
+
};
|
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
const {
|
|
2
|
-
getTable,
|
|
3
|
-
getLockTableName,
|
|
4
|
-
getLockTableNameWithSchema,
|
|
5
|
-
getTableName,
|
|
6
|
-
} = require('./table-resolver');
|
|
7
|
-
|
|
8
|
-
function ensureTable(tableName, schemaName, trxOrKnex) {
|
|
9
|
-
const lockTable = getLockTableName(tableName);
|
|
10
|
-
return getSchemaBuilder(trxOrKnex, schemaName)
|
|
11
|
-
.hasTable(tableName)
|
|
12
|
-
.then((exists) => {
|
|
13
|
-
return !exists && _createMigrationTable(tableName, schemaName, trxOrKnex);
|
|
14
|
-
})
|
|
15
|
-
.then(() => {
|
|
16
|
-
return getSchemaBuilder(trxOrKnex, schemaName).hasTable(lockTable);
|
|
17
|
-
})
|
|
18
|
-
.then((exists) => {
|
|
19
|
-
return (
|
|
20
|
-
!exists && _createMigrationLockTable(lockTable, schemaName, trxOrKnex)
|
|
21
|
-
);
|
|
22
|
-
})
|
|
23
|
-
.then(() => {
|
|
24
|
-
return getTable(trxOrKnex, lockTable, schemaName).select('*');
|
|
25
|
-
})
|
|
26
|
-
.then((data) => {
|
|
27
|
-
return (
|
|
28
|
-
!data.length && _insertLockRowIfNeeded(tableName, schemaName, trxOrKnex)
|
|
29
|
-
);
|
|
30
|
-
});
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function _createMigrationTable(tableName, schemaName, trxOrKnex) {
|
|
34
|
-
return getSchemaBuilder(trxOrKnex, schemaName).createTable(
|
|
35
|
-
getTableName(tableName),
|
|
36
|
-
function (t) {
|
|
37
|
-
t.increments();
|
|
38
|
-
t.string('name');
|
|
39
|
-
t.integer('batch');
|
|
40
|
-
t.timestamp('migration_time');
|
|
41
|
-
}
|
|
42
|
-
);
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
function _createMigrationLockTable(tableName, schemaName, trxOrKnex) {
|
|
46
|
-
return getSchemaBuilder(trxOrKnex, schemaName).createTable(
|
|
47
|
-
tableName,
|
|
48
|
-
function (t) {
|
|
49
|
-
t.increments('index').primary();
|
|
50
|
-
t.integer('is_locked');
|
|
51
|
-
}
|
|
52
|
-
);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
function _insertLockRowIfNeeded(tableName, schemaName, trxOrKnex) {
|
|
56
|
-
const lockTableWithSchema = getLockTableNameWithSchema(tableName, schemaName);
|
|
57
|
-
return trxOrKnex
|
|
58
|
-
.select('*')
|
|
59
|
-
.from(lockTableWithSchema)
|
|
60
|
-
.then((data) => {
|
|
61
|
-
return !data.length
|
|
62
|
-
? trxOrKnex.from(lockTableWithSchema).insert({ is_locked: 0 })
|
|
63
|
-
: null;
|
|
64
|
-
});
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
//Get schema-aware schema builder for a given schema nam
|
|
68
|
-
function getSchemaBuilder(trxOrKnex, schemaName) {
|
|
69
|
-
return schemaName
|
|
70
|
-
? trxOrKnex.schema.withSchema(schemaName)
|
|
71
|
-
: trxOrKnex.schema;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
module.exports = {
|
|
75
|
-
ensureTable,
|
|
76
|
-
getSchemaBuilder,
|
|
77
|
-
};
|
|
1
|
+
const {
|
|
2
|
+
getTable,
|
|
3
|
+
getLockTableName,
|
|
4
|
+
getLockTableNameWithSchema,
|
|
5
|
+
getTableName,
|
|
6
|
+
} = require('./table-resolver');
|
|
7
|
+
|
|
8
|
+
function ensureTable(tableName, schemaName, trxOrKnex) {
|
|
9
|
+
const lockTable = getLockTableName(tableName);
|
|
10
|
+
return getSchemaBuilder(trxOrKnex, schemaName)
|
|
11
|
+
.hasTable(tableName)
|
|
12
|
+
.then((exists) => {
|
|
13
|
+
return !exists && _createMigrationTable(tableName, schemaName, trxOrKnex);
|
|
14
|
+
})
|
|
15
|
+
.then(() => {
|
|
16
|
+
return getSchemaBuilder(trxOrKnex, schemaName).hasTable(lockTable);
|
|
17
|
+
})
|
|
18
|
+
.then((exists) => {
|
|
19
|
+
return (
|
|
20
|
+
!exists && _createMigrationLockTable(lockTable, schemaName, trxOrKnex)
|
|
21
|
+
);
|
|
22
|
+
})
|
|
23
|
+
.then(() => {
|
|
24
|
+
return getTable(trxOrKnex, lockTable, schemaName).select('*');
|
|
25
|
+
})
|
|
26
|
+
.then((data) => {
|
|
27
|
+
return (
|
|
28
|
+
!data.length && _insertLockRowIfNeeded(tableName, schemaName, trxOrKnex)
|
|
29
|
+
);
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
function _createMigrationTable(tableName, schemaName, trxOrKnex) {
|
|
34
|
+
return getSchemaBuilder(trxOrKnex, schemaName).createTable(
|
|
35
|
+
getTableName(tableName),
|
|
36
|
+
function (t) {
|
|
37
|
+
t.increments();
|
|
38
|
+
t.string('name');
|
|
39
|
+
t.integer('batch');
|
|
40
|
+
t.timestamp('migration_time');
|
|
41
|
+
}
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function _createMigrationLockTable(tableName, schemaName, trxOrKnex) {
|
|
46
|
+
return getSchemaBuilder(trxOrKnex, schemaName).createTable(
|
|
47
|
+
tableName,
|
|
48
|
+
function (t) {
|
|
49
|
+
t.increments('index').primary();
|
|
50
|
+
t.integer('is_locked');
|
|
51
|
+
}
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
function _insertLockRowIfNeeded(tableName, schemaName, trxOrKnex) {
|
|
56
|
+
const lockTableWithSchema = getLockTableNameWithSchema(tableName, schemaName);
|
|
57
|
+
return trxOrKnex
|
|
58
|
+
.select('*')
|
|
59
|
+
.from(lockTableWithSchema)
|
|
60
|
+
.then((data) => {
|
|
61
|
+
return !data.length
|
|
62
|
+
? trxOrKnex.from(lockTableWithSchema).insert({ is_locked: 0 })
|
|
63
|
+
: null;
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
//Get schema-aware schema builder for a given schema nam
|
|
68
|
+
function getSchemaBuilder(trxOrKnex, schemaName) {
|
|
69
|
+
return schemaName
|
|
70
|
+
? trxOrKnex.schema.withSchema(schemaName)
|
|
71
|
+
: trxOrKnex.schema;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
module.exports = {
|
|
75
|
+
ensureTable,
|
|
76
|
+
getSchemaBuilder,
|
|
77
|
+
};
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
//Get schema-aware table name
|
|
2
|
-
function getTableName(tableName, schemaName) {
|
|
3
|
-
return schemaName ? `${schemaName}.${tableName}` : tableName;
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
//Get schema-aware query builder for a given table and schema name
|
|
7
|
-
function getTable(trxOrKnex, tableName, schemaName) {
|
|
8
|
-
return schemaName
|
|
9
|
-
? trxOrKnex(tableName).withSchema(schemaName)
|
|
10
|
-
: trxOrKnex(tableName);
|
|
11
|
-
}
|
|
12
|
-
function getLockTableName(tableName) {
|
|
13
|
-
return tableName + '_lock';
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
function getLockTableNameWithSchema(tableName, schemaName) {
|
|
17
|
-
return schemaName
|
|
18
|
-
? schemaName + '.' + getLockTableName(tableName)
|
|
19
|
-
: getLockTableName(tableName);
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
module.exports = {
|
|
23
|
-
getLockTableName,
|
|
24
|
-
getLockTableNameWithSchema,
|
|
25
|
-
getTable,
|
|
26
|
-
getTableName,
|
|
27
|
-
};
|
|
1
|
+
//Get schema-aware table name
|
|
2
|
+
function getTableName(tableName, schemaName) {
|
|
3
|
+
return schemaName ? `${schemaName}.${tableName}` : tableName;
|
|
4
|
+
}
|
|
5
|
+
|
|
6
|
+
//Get schema-aware query builder for a given table and schema name
|
|
7
|
+
function getTable(trxOrKnex, tableName, schemaName) {
|
|
8
|
+
return schemaName
|
|
9
|
+
? trxOrKnex(tableName).withSchema(schemaName)
|
|
10
|
+
: trxOrKnex(tableName);
|
|
11
|
+
}
|
|
12
|
+
function getLockTableName(tableName) {
|
|
13
|
+
return tableName + '_lock';
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
function getLockTableNameWithSchema(tableName, schemaName) {
|
|
17
|
+
return schemaName
|
|
18
|
+
? schemaName + '.' + getLockTableName(tableName)
|
|
19
|
+
: getLockTableName(tableName);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
module.exports = {
|
|
23
|
+
getLockTableName,
|
|
24
|
+
getLockTableNameWithSchema,
|
|
25
|
+
getTable,
|
|
26
|
+
getTableName,
|
|
27
|
+
};
|