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,80 +1,80 @@
|
|
|
1
|
-
// FunctionHelper
|
|
2
|
-
// -------
|
|
3
|
-
// Used for adding functions from the builder
|
|
4
|
-
// Example usage: table.dateTime('datetime_to_date').notNull().defaultTo(knex.fn.now());
|
|
5
|
-
class FunctionHelper {
|
|
6
|
-
constructor(client) {
|
|
7
|
-
this.client = client;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
now(precision) {
|
|
11
|
-
if (typeof precision === 'number') {
|
|
12
|
-
return this.client.raw(`CURRENT_TIMESTAMP(${precision})`);
|
|
13
|
-
}
|
|
14
|
-
return this.client.raw('CURRENT_TIMESTAMP');
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
uuid() {
|
|
18
|
-
switch (this.client.driverName) {
|
|
19
|
-
case 'sqlite3':
|
|
20
|
-
case 'better-sqlite3':
|
|
21
|
-
return this.client.raw(
|
|
22
|
-
"(lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6))))"
|
|
23
|
-
);
|
|
24
|
-
case 'mssql':
|
|
25
|
-
return this.client.raw('(NEWID())');
|
|
26
|
-
case 'pg':
|
|
27
|
-
case 'pgnative':
|
|
28
|
-
case 'cockroachdb':
|
|
29
|
-
return this.client.raw('(gen_random_uuid())');
|
|
30
|
-
case 'oracle':
|
|
31
|
-
case 'oracledb':
|
|
32
|
-
return this.client.raw('(random_uuid())');
|
|
33
|
-
case 'mysql':
|
|
34
|
-
case 'mysql2':
|
|
35
|
-
return this.client.raw('(UUID())');
|
|
36
|
-
default:
|
|
37
|
-
throw new Error(
|
|
38
|
-
`${this.client.driverName} does not have a uuid function`
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
uuidToBin(uuid, ordered = true) {
|
|
44
|
-
const buf = Buffer.from(uuid.replace(/-/g, ''), 'hex');
|
|
45
|
-
return ordered
|
|
46
|
-
? Buffer.concat([
|
|
47
|
-
buf.slice(6, 8),
|
|
48
|
-
buf.slice(4, 6),
|
|
49
|
-
buf.slice(0, 4),
|
|
50
|
-
buf.slice(8, 16),
|
|
51
|
-
])
|
|
52
|
-
: Buffer.concat([
|
|
53
|
-
buf.slice(0, 4),
|
|
54
|
-
buf.slice(4, 6),
|
|
55
|
-
buf.slice(6, 8),
|
|
56
|
-
buf.slice(8, 16),
|
|
57
|
-
]);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
binToUuid(bin, ordered = true) {
|
|
61
|
-
const buf = Buffer.from(bin, 'hex');
|
|
62
|
-
return ordered
|
|
63
|
-
? [
|
|
64
|
-
buf.toString('hex', 4, 8),
|
|
65
|
-
buf.toString('hex', 2, 4),
|
|
66
|
-
buf.toString('hex', 0, 2),
|
|
67
|
-
buf.toString('hex', 8, 10),
|
|
68
|
-
buf.toString('hex', 10, 16),
|
|
69
|
-
].join('-')
|
|
70
|
-
: [
|
|
71
|
-
buf.toString('hex', 0, 4),
|
|
72
|
-
buf.toString('hex', 4, 6),
|
|
73
|
-
buf.toString('hex', 6, 8),
|
|
74
|
-
buf.toString('hex', 8, 10),
|
|
75
|
-
buf.toString('hex', 10, 16),
|
|
76
|
-
].join('-');
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
module.exports = FunctionHelper;
|
|
1
|
+
// FunctionHelper
|
|
2
|
+
// -------
|
|
3
|
+
// Used for adding functions from the builder
|
|
4
|
+
// Example usage: table.dateTime('datetime_to_date').notNull().defaultTo(knex.fn.now());
|
|
5
|
+
class FunctionHelper {
|
|
6
|
+
constructor(client) {
|
|
7
|
+
this.client = client;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
now(precision) {
|
|
11
|
+
if (typeof precision === 'number') {
|
|
12
|
+
return this.client.raw(`CURRENT_TIMESTAMP(${precision})`);
|
|
13
|
+
}
|
|
14
|
+
return this.client.raw('CURRENT_TIMESTAMP');
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
uuid() {
|
|
18
|
+
switch (this.client.driverName) {
|
|
19
|
+
case 'sqlite3':
|
|
20
|
+
case 'better-sqlite3':
|
|
21
|
+
return this.client.raw(
|
|
22
|
+
"(lower(hex(randomblob(4))) || '-' || lower(hex(randomblob(2))) || '-4' || substr(lower(hex(randomblob(2))),2) || '-' || substr('89ab',abs(random()) % 4 + 1, 1) || substr(lower(hex(randomblob(2))),2) || '-' || lower(hex(randomblob(6))))"
|
|
23
|
+
);
|
|
24
|
+
case 'mssql':
|
|
25
|
+
return this.client.raw('(NEWID())');
|
|
26
|
+
case 'pg':
|
|
27
|
+
case 'pgnative':
|
|
28
|
+
case 'cockroachdb':
|
|
29
|
+
return this.client.raw('(gen_random_uuid())');
|
|
30
|
+
case 'oracle':
|
|
31
|
+
case 'oracledb':
|
|
32
|
+
return this.client.raw('(random_uuid())');
|
|
33
|
+
case 'mysql':
|
|
34
|
+
case 'mysql2':
|
|
35
|
+
return this.client.raw('(UUID())');
|
|
36
|
+
default:
|
|
37
|
+
throw new Error(
|
|
38
|
+
`${this.client.driverName} does not have a uuid function`
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
uuidToBin(uuid, ordered = true) {
|
|
44
|
+
const buf = Buffer.from(uuid.replace(/-/g, ''), 'hex');
|
|
45
|
+
return ordered
|
|
46
|
+
? Buffer.concat([
|
|
47
|
+
buf.slice(6, 8),
|
|
48
|
+
buf.slice(4, 6),
|
|
49
|
+
buf.slice(0, 4),
|
|
50
|
+
buf.slice(8, 16),
|
|
51
|
+
])
|
|
52
|
+
: Buffer.concat([
|
|
53
|
+
buf.slice(0, 4),
|
|
54
|
+
buf.slice(4, 6),
|
|
55
|
+
buf.slice(6, 8),
|
|
56
|
+
buf.slice(8, 16),
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
binToUuid(bin, ordered = true) {
|
|
61
|
+
const buf = Buffer.from(bin, 'hex');
|
|
62
|
+
return ordered
|
|
63
|
+
? [
|
|
64
|
+
buf.toString('hex', 4, 8),
|
|
65
|
+
buf.toString('hex', 2, 4),
|
|
66
|
+
buf.toString('hex', 0, 2),
|
|
67
|
+
buf.toString('hex', 8, 10),
|
|
68
|
+
buf.toString('hex', 10, 16),
|
|
69
|
+
].join('-')
|
|
70
|
+
: [
|
|
71
|
+
buf.toString('hex', 0, 4),
|
|
72
|
+
buf.toString('hex', 4, 6),
|
|
73
|
+
buf.toString('hex', 6, 8),
|
|
74
|
+
buf.toString('hex', 8, 10),
|
|
75
|
+
buf.toString('hex', 10, 16),
|
|
76
|
+
].join('-');
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
module.exports = FunctionHelper;
|
package/lib/knex-builder/Knex.js
CHANGED
|
@@ -1,59 +1,59 @@
|
|
|
1
|
-
const Client = require('../client');
|
|
2
|
-
const QueryBuilder = require('../query/querybuilder');
|
|
3
|
-
const QueryInterface = require('../query/method-constants');
|
|
4
|
-
|
|
5
|
-
const makeKnex = require('./make-knex');
|
|
6
|
-
const { KnexTimeoutError } = require('../util/timeout');
|
|
7
|
-
const { resolveConfig } = require('./internal/config-resolver');
|
|
8
|
-
const SchemaBuilder = require('../schema/builder');
|
|
9
|
-
const ViewBuilder = require('../schema/viewbuilder');
|
|
10
|
-
const ColumnBuilder = require('../schema/columnbuilder');
|
|
11
|
-
const TableBuilder = require('../schema/tablebuilder');
|
|
12
|
-
|
|
13
|
-
function knex(config) {
|
|
14
|
-
const { resolvedConfig, Dialect } = resolveConfig(...arguments);
|
|
15
|
-
|
|
16
|
-
const newKnex = makeKnex(new Dialect(resolvedConfig));
|
|
17
|
-
if (resolvedConfig.userParams) {
|
|
18
|
-
newKnex.userParams = resolvedConfig.userParams;
|
|
19
|
-
}
|
|
20
|
-
return newKnex;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
// Expose Client on the main Knex namespace.
|
|
24
|
-
knex.Client = Client;
|
|
25
|
-
|
|
26
|
-
knex.KnexTimeoutError = KnexTimeoutError;
|
|
27
|
-
|
|
28
|
-
knex.QueryBuilder = {
|
|
29
|
-
extend: function (methodName, fn) {
|
|
30
|
-
QueryBuilder.extend(methodName, fn);
|
|
31
|
-
QueryInterface.push(methodName);
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
|
|
35
|
-
knex.SchemaBuilder = {
|
|
36
|
-
extend: function (methodName, fn) {
|
|
37
|
-
SchemaBuilder.extend(methodName, fn);
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
knex.ViewBuilder = {
|
|
42
|
-
extend: function (methodName, fn) {
|
|
43
|
-
ViewBuilder.extend(methodName, fn);
|
|
44
|
-
},
|
|
45
|
-
};
|
|
46
|
-
|
|
47
|
-
knex.ColumnBuilder = {
|
|
48
|
-
extend: function (methodName, fn) {
|
|
49
|
-
ColumnBuilder.extend(methodName, fn);
|
|
50
|
-
},
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
knex.TableBuilder = {
|
|
54
|
-
extend: function (methodName, fn) {
|
|
55
|
-
TableBuilder.extend(methodName, fn);
|
|
56
|
-
},
|
|
57
|
-
};
|
|
58
|
-
|
|
59
|
-
module.exports = knex;
|
|
1
|
+
const Client = require('../client');
|
|
2
|
+
const QueryBuilder = require('../query/querybuilder');
|
|
3
|
+
const QueryInterface = require('../query/method-constants');
|
|
4
|
+
|
|
5
|
+
const makeKnex = require('./make-knex');
|
|
6
|
+
const { KnexTimeoutError } = require('../util/timeout');
|
|
7
|
+
const { resolveConfig } = require('./internal/config-resolver');
|
|
8
|
+
const SchemaBuilder = require('../schema/builder');
|
|
9
|
+
const ViewBuilder = require('../schema/viewbuilder');
|
|
10
|
+
const ColumnBuilder = require('../schema/columnbuilder');
|
|
11
|
+
const TableBuilder = require('../schema/tablebuilder');
|
|
12
|
+
|
|
13
|
+
function knex(config) {
|
|
14
|
+
const { resolvedConfig, Dialect } = resolveConfig(...arguments);
|
|
15
|
+
|
|
16
|
+
const newKnex = makeKnex(new Dialect(resolvedConfig));
|
|
17
|
+
if (resolvedConfig.userParams) {
|
|
18
|
+
newKnex.userParams = resolvedConfig.userParams;
|
|
19
|
+
}
|
|
20
|
+
return newKnex;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
// Expose Client on the main Knex namespace.
|
|
24
|
+
knex.Client = Client;
|
|
25
|
+
|
|
26
|
+
knex.KnexTimeoutError = KnexTimeoutError;
|
|
27
|
+
|
|
28
|
+
knex.QueryBuilder = {
|
|
29
|
+
extend: function (methodName, fn) {
|
|
30
|
+
QueryBuilder.extend(methodName, fn);
|
|
31
|
+
QueryInterface.push(methodName);
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
knex.SchemaBuilder = {
|
|
36
|
+
extend: function (methodName, fn) {
|
|
37
|
+
SchemaBuilder.extend(methodName, fn);
|
|
38
|
+
},
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
knex.ViewBuilder = {
|
|
42
|
+
extend: function (methodName, fn) {
|
|
43
|
+
ViewBuilder.extend(methodName, fn);
|
|
44
|
+
},
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
knex.ColumnBuilder = {
|
|
48
|
+
extend: function (methodName, fn) {
|
|
49
|
+
ColumnBuilder.extend(methodName, fn);
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
knex.TableBuilder = {
|
|
54
|
+
extend: function (methodName, fn) {
|
|
55
|
+
TableBuilder.extend(methodName, fn);
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
module.exports = knex;
|
|
@@ -1,57 +1,57 @@
|
|
|
1
|
-
const Client = require('../../client');
|
|
2
|
-
const { SUPPORTED_CLIENTS } = require('../../constants');
|
|
3
|
-
|
|
4
|
-
const parseConnection = require('./parse-connection');
|
|
5
|
-
const { getDialectByNameOrAlias } = require('../../dialects');
|
|
6
|
-
|
|
7
|
-
function resolveConfig(config) {
|
|
8
|
-
let Dialect;
|
|
9
|
-
let resolvedConfig;
|
|
10
|
-
|
|
11
|
-
// If config is a string, try to parse it
|
|
12
|
-
const parsedConfig =
|
|
13
|
-
typeof config === 'string'
|
|
14
|
-
? Object.assign(parseConnection(config), arguments[2])
|
|
15
|
-
: config;
|
|
16
|
-
|
|
17
|
-
// If user provided no relevant parameters, use generic client
|
|
18
|
-
if (
|
|
19
|
-
arguments.length === 0 ||
|
|
20
|
-
(!parsedConfig.client && !parsedConfig.dialect)
|
|
21
|
-
) {
|
|
22
|
-
Dialect = Client;
|
|
23
|
-
}
|
|
24
|
-
// If user provided Client constructor as a parameter, use it
|
|
25
|
-
else if (typeof parsedConfig.client === 'function') {
|
|
26
|
-
Dialect = parsedConfig.client;
|
|
27
|
-
}
|
|
28
|
-
// If neither applies, let's assume user specified name of a client or dialect as a string
|
|
29
|
-
else {
|
|
30
|
-
const clientName = parsedConfig.client || parsedConfig.dialect;
|
|
31
|
-
if (!SUPPORTED_CLIENTS.includes(clientName)) {
|
|
32
|
-
throw new Error(
|
|
33
|
-
`knex: Unknown configuration option 'client' value ${clientName}. Note that it is case-sensitive, check documentation for supported values.`
|
|
34
|
-
);
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
Dialect = getDialectByNameOrAlias(clientName);
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
// If config connection parameter is passed as string, try to parse it
|
|
41
|
-
if (typeof parsedConfig.connection === 'string') {
|
|
42
|
-
resolvedConfig = Object.assign({}, parsedConfig, {
|
|
43
|
-
connection: parseConnection(parsedConfig.connection).connection,
|
|
44
|
-
});
|
|
45
|
-
} else {
|
|
46
|
-
resolvedConfig = Object.assign({}, parsedConfig);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return {
|
|
50
|
-
resolvedConfig,
|
|
51
|
-
Dialect,
|
|
52
|
-
};
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
module.exports = {
|
|
56
|
-
resolveConfig,
|
|
57
|
-
};
|
|
1
|
+
const Client = require('../../client');
|
|
2
|
+
const { SUPPORTED_CLIENTS } = require('../../constants');
|
|
3
|
+
|
|
4
|
+
const parseConnection = require('./parse-connection');
|
|
5
|
+
const { getDialectByNameOrAlias } = require('../../dialects');
|
|
6
|
+
|
|
7
|
+
function resolveConfig(config) {
|
|
8
|
+
let Dialect;
|
|
9
|
+
let resolvedConfig;
|
|
10
|
+
|
|
11
|
+
// If config is a string, try to parse it
|
|
12
|
+
const parsedConfig =
|
|
13
|
+
typeof config === 'string'
|
|
14
|
+
? Object.assign(parseConnection(config), arguments[2])
|
|
15
|
+
: config;
|
|
16
|
+
|
|
17
|
+
// If user provided no relevant parameters, use generic client
|
|
18
|
+
if (
|
|
19
|
+
arguments.length === 0 ||
|
|
20
|
+
(!parsedConfig.client && !parsedConfig.dialect)
|
|
21
|
+
) {
|
|
22
|
+
Dialect = Client;
|
|
23
|
+
}
|
|
24
|
+
// If user provided Client constructor as a parameter, use it
|
|
25
|
+
else if (typeof parsedConfig.client === 'function') {
|
|
26
|
+
Dialect = parsedConfig.client;
|
|
27
|
+
}
|
|
28
|
+
// If neither applies, let's assume user specified name of a client or dialect as a string
|
|
29
|
+
else {
|
|
30
|
+
const clientName = parsedConfig.client || parsedConfig.dialect;
|
|
31
|
+
if (!SUPPORTED_CLIENTS.includes(clientName)) {
|
|
32
|
+
throw new Error(
|
|
33
|
+
`knex: Unknown configuration option 'client' value ${clientName}. Note that it is case-sensitive, check documentation for supported values.`
|
|
34
|
+
);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
Dialect = getDialectByNameOrAlias(clientName);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// If config connection parameter is passed as string, try to parse it
|
|
41
|
+
if (typeof parsedConfig.connection === 'string') {
|
|
42
|
+
resolvedConfig = Object.assign({}, parsedConfig, {
|
|
43
|
+
connection: parseConnection(parsedConfig.connection).connection,
|
|
44
|
+
});
|
|
45
|
+
} else {
|
|
46
|
+
resolvedConfig = Object.assign({}, parsedConfig);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return {
|
|
50
|
+
resolvedConfig,
|
|
51
|
+
Dialect,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
module.exports = {
|
|
56
|
+
resolveConfig,
|
|
57
|
+
};
|
|
@@ -1,87 +1,87 @@
|
|
|
1
|
-
const { parse } = require('pg-connection-string');
|
|
2
|
-
const parsePG = parse;
|
|
3
|
-
const isWindows = process && process.platform && process.platform === 'win32';
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* @param str
|
|
7
|
-
* @returns {URL}
|
|
8
|
-
*/
|
|
9
|
-
function tryParse(str) {
|
|
10
|
-
try {
|
|
11
|
-
return new URL(str);
|
|
12
|
-
} catch (e) {
|
|
13
|
-
return null;
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
module.exports = function parseConnectionString(str) {
|
|
18
|
-
const parsed = tryParse(str);
|
|
19
|
-
const isDriveLetter = isWindows && parsed && parsed.protocol.length === 2;
|
|
20
|
-
if (!parsed || isDriveLetter) {
|
|
21
|
-
return {
|
|
22
|
-
client: 'sqlite3',
|
|
23
|
-
connection: {
|
|
24
|
-
filename: str,
|
|
25
|
-
},
|
|
26
|
-
};
|
|
27
|
-
}
|
|
28
|
-
let { protocol } = parsed;
|
|
29
|
-
if (protocol.slice(-1) === ':') {
|
|
30
|
-
protocol = protocol.slice(0, -1);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
const isPG = ['postgresql', 'postgres'].includes(protocol);
|
|
34
|
-
|
|
35
|
-
return {
|
|
36
|
-
client: protocol,
|
|
37
|
-
connection: isPG ? parsePG(str) : connectionObject(parsed),
|
|
38
|
-
};
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* @param {URL} parsed
|
|
43
|
-
* @returns {{}}
|
|
44
|
-
*/
|
|
45
|
-
function connectionObject(parsed) {
|
|
46
|
-
const connection = {};
|
|
47
|
-
let db = parsed.pathname;
|
|
48
|
-
if (db[0] === '/') {
|
|
49
|
-
db = db.slice(1);
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
connection.database = db;
|
|
53
|
-
|
|
54
|
-
if (parsed.hostname) {
|
|
55
|
-
if (parsed.protocol.indexOf('mssql') === 0) {
|
|
56
|
-
connection.server = parsed.hostname;
|
|
57
|
-
} else {
|
|
58
|
-
connection.host = parsed.hostname;
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
if (parsed.port) {
|
|
62
|
-
connection.port = parsed.port;
|
|
63
|
-
}
|
|
64
|
-
if (parsed.username || parsed.password) {
|
|
65
|
-
connection.user = decodeURIComponent(parsed.username);
|
|
66
|
-
}
|
|
67
|
-
if (parsed.password) {
|
|
68
|
-
connection.password = decodeURIComponent(parsed.password);
|
|
69
|
-
}
|
|
70
|
-
if (parsed.searchParams) {
|
|
71
|
-
for (const [key, value] of parsed.searchParams.entries()) {
|
|
72
|
-
const isNestedConfigSupported = ['mysql:', 'mariadb:', 'mssql:'].includes(
|
|
73
|
-
parsed.protocol
|
|
74
|
-
);
|
|
75
|
-
if (isNestedConfigSupported) {
|
|
76
|
-
try {
|
|
77
|
-
connection[key] = JSON.parse(value);
|
|
78
|
-
} catch (err) {
|
|
79
|
-
connection[key] = value;
|
|
80
|
-
}
|
|
81
|
-
} else {
|
|
82
|
-
connection[key] = value;
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
return connection;
|
|
87
|
-
}
|
|
1
|
+
const { parse } = require('pg-connection-string');
|
|
2
|
+
const parsePG = parse;
|
|
3
|
+
const isWindows = process && process.platform && process.platform === 'win32';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* @param str
|
|
7
|
+
* @returns {URL}
|
|
8
|
+
*/
|
|
9
|
+
function tryParse(str) {
|
|
10
|
+
try {
|
|
11
|
+
return new URL(str);
|
|
12
|
+
} catch (e) {
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
module.exports = function parseConnectionString(str) {
|
|
18
|
+
const parsed = tryParse(str);
|
|
19
|
+
const isDriveLetter = isWindows && parsed && parsed.protocol.length === 2;
|
|
20
|
+
if (!parsed || isDriveLetter) {
|
|
21
|
+
return {
|
|
22
|
+
client: 'sqlite3',
|
|
23
|
+
connection: {
|
|
24
|
+
filename: str,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
let { protocol } = parsed;
|
|
29
|
+
if (protocol.slice(-1) === ':') {
|
|
30
|
+
protocol = protocol.slice(0, -1);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
const isPG = ['postgresql', 'postgres'].includes(protocol);
|
|
34
|
+
|
|
35
|
+
return {
|
|
36
|
+
client: protocol,
|
|
37
|
+
connection: isPG ? parsePG(str) : connectionObject(parsed),
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* @param {URL} parsed
|
|
43
|
+
* @returns {{}}
|
|
44
|
+
*/
|
|
45
|
+
function connectionObject(parsed) {
|
|
46
|
+
const connection = {};
|
|
47
|
+
let db = parsed.pathname;
|
|
48
|
+
if (db[0] === '/') {
|
|
49
|
+
db = db.slice(1);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
connection.database = db;
|
|
53
|
+
|
|
54
|
+
if (parsed.hostname) {
|
|
55
|
+
if (parsed.protocol.indexOf('mssql') === 0) {
|
|
56
|
+
connection.server = parsed.hostname;
|
|
57
|
+
} else {
|
|
58
|
+
connection.host = parsed.hostname;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
if (parsed.port) {
|
|
62
|
+
connection.port = parsed.port;
|
|
63
|
+
}
|
|
64
|
+
if (parsed.username || parsed.password) {
|
|
65
|
+
connection.user = decodeURIComponent(parsed.username);
|
|
66
|
+
}
|
|
67
|
+
if (parsed.password) {
|
|
68
|
+
connection.password = decodeURIComponent(parsed.password);
|
|
69
|
+
}
|
|
70
|
+
if (parsed.searchParams) {
|
|
71
|
+
for (const [key, value] of parsed.searchParams.entries()) {
|
|
72
|
+
const isNestedConfigSupported = ['mysql:', 'mariadb:', 'mssql:'].includes(
|
|
73
|
+
parsed.protocol
|
|
74
|
+
);
|
|
75
|
+
if (isNestedConfigSupported) {
|
|
76
|
+
try {
|
|
77
|
+
connection[key] = JSON.parse(value);
|
|
78
|
+
} catch (err) {
|
|
79
|
+
connection[key] = value;
|
|
80
|
+
}
|
|
81
|
+
} else {
|
|
82
|
+
connection[key] = value;
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
return connection;
|
|
87
|
+
}
|