knex 3.2.3 → 3.2.4
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 +2447 -2441
- package/CONTRIBUTING.md +190 -190
- package/LICENSE +22 -22
- package/README.md +156 -156
- package/UPGRADING.md +245 -245
- package/bin/cli.js +516 -516
- package/bin/knexfile-runtime-error.js +27 -27
- package/bin/utils/cli-config-utils.js +217 -217
- 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 +585 -585
- package/lib/constants.js +61 -61
- package/lib/dialects/better-sqlite3/index.js +101 -101
- 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 +46 -46
- package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
- package/lib/dialects/cockroachdb/index.js +86 -86
- package/lib/dialects/index.js +34 -34
- package/lib/dialects/mssql/index.js +498 -498
- 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 +393 -393
- package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
- package/lib/dialects/mssql/transaction.js +176 -176
- package/lib/dialects/mysql/index.js +317 -317
- package/lib/dialects/mysql/query/mysql-querybuilder.js +14 -14
- package/lib/dialects/mysql/query/mysql-querycompiler.js +292 -292
- 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 +426 -426
- 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 +22 -22
- package/lib/dialects/oracle/schema/internal/trigger.js +155 -155
- 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 +124 -124
- package/lib/dialects/oracle/schema/oracle-tablecompiler.js +210 -210
- package/lib/dialects/oracle/utils.js +107 -107
- package/lib/dialects/oracledb/index.js +381 -381
- 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 +373 -373
- 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 +162 -162
- package/lib/dialects/postgres/schema/pg-compiler.js +138 -138
- package/lib/dialects/postgres/schema/pg-tablecompiler.js +331 -331
- 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 +134 -134
- 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 +172 -172
- package/lib/dialects/sqlite3/index.js +263 -263
- package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
- package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +341 -341
- package/lib/dialects/sqlite3/schema/ddl.js +380 -380
- 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 +364 -364
- 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 +417 -417
- package/lib/formatter/formatterUtils.js +42 -42
- package/lib/formatter/rawFormatter.js +84 -84
- package/lib/formatter/wrappingFormatter.js +253 -253
- 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 +632 -632
- 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/stub/cjs.stub +15 -15
- package/lib/migrations/migrate/stub/coffee.stub +13 -13
- package/lib/migrations/migrate/stub/eg.stub +14 -14
- package/lib/migrations/migrate/stub/js-schema.stub +22 -22
- package/lib/migrations/migrate/stub/js.stub +22 -22
- package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
- package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
- package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
- package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
- package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
- package/lib/migrations/migrate/stub/ls.stub +14 -14
- package/lib/migrations/migrate/stub/mjs.stub +23 -23
- package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
- package/lib/migrations/migrate/stub/ts.stub +21 -21
- 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/seed/stub/coffee.stub +9 -9
- package/lib/migrations/seed/stub/eg.stub +11 -11
- package/lib/migrations/seed/stub/js.stub +13 -13
- package/lib/migrations/seed/stub/ls.stub +11 -11
- package/lib/migrations/seed/stub/mjs.stub +12 -12
- package/lib/migrations/seed/stub/ts.stub +13 -13
- 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 +1634 -1634
- 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 +379 -379
- package/lib/schema/tablecompiler.js +450 -450
- 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 +32 -32
- package/lib/util/string.js +190 -190
- package/lib/util/timeout.js +29 -29
- package/package.json +294 -293
- package/scripts/act-testing/act.sh +19 -19
- package/scripts/act-testing/merged-no-label.json +11 -11
- package/scripts/act-testing/merged-patch-labeled.json +12 -12
- package/scripts/act-testing/merged-skip-labeled.json +12 -12
- package/scripts/act-testing/not-merged-patch-labeled.json +12 -12
- package/scripts/build-for-release.sh +121 -121
- package/scripts/build.js +125 -125
- package/scripts/clean.js +31 -31
- package/scripts/docker-compose.yml +150 -150
- package/scripts/format-changelog.js +55 -55
- package/scripts/next-release-howto.md +24 -24
- package/scripts/oracledb-install-driver-libs.sh +82 -82
- package/scripts/release.sh +36 -36
- package/scripts/runkit-example.js +35 -35
- package/scripts/stress-test/README.txt +18 -18
- package/scripts/stress-test/docker-compose.yml +55 -55
- package/scripts/stress-test/knex-stress-test.js +212 -212
- package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +149 -149
- package/scripts/stress-test/mysql2-sudden-exit-without-error.js +101 -101
- package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +188 -188
- package/types/index.d.mts +11 -0
- package/types/index.d.ts +3321 -3321
- package/types/result.d.ts +27 -27
- package/types/tables.d.ts +4 -4
package/lib/raw.js
CHANGED
|
@@ -1,139 +1,139 @@
|
|
|
1
|
-
// Raw
|
|
2
|
-
// -------
|
|
3
|
-
const { EventEmitter } = require('events');
|
|
4
|
-
const debug = require('debug');
|
|
5
|
-
const assign = require('lodash/assign');
|
|
6
|
-
const isPlainObject = require('lodash/isPlainObject');
|
|
7
|
-
const reduce = require('lodash/reduce');
|
|
8
|
-
|
|
9
|
-
const {
|
|
10
|
-
replaceRawArrBindings,
|
|
11
|
-
replaceKeyBindings,
|
|
12
|
-
} = require('./formatter/rawFormatter');
|
|
13
|
-
const helpers = require('./util/helpers');
|
|
14
|
-
const saveAsyncStack = require('./util/save-async-stack');
|
|
15
|
-
const { nanoid } = require('./util/nanoid');
|
|
16
|
-
const { isNumber, isObject } = require('./util/is');
|
|
17
|
-
const {
|
|
18
|
-
augmentWithBuilderInterface,
|
|
19
|
-
} = require('./builder-interface-augmenter');
|
|
20
|
-
|
|
21
|
-
const debugBindings = debug('knex:bindings');
|
|
22
|
-
|
|
23
|
-
class Raw extends EventEmitter {
|
|
24
|
-
constructor(client) {
|
|
25
|
-
super();
|
|
26
|
-
|
|
27
|
-
this.client = client;
|
|
28
|
-
|
|
29
|
-
this.sql = '';
|
|
30
|
-
this.bindings = [];
|
|
31
|
-
|
|
32
|
-
// Todo: Deprecate
|
|
33
|
-
this._wrappedBefore = undefined;
|
|
34
|
-
this._wrappedAfter = undefined;
|
|
35
|
-
if (client && client.config) {
|
|
36
|
-
this._debug = client.config.debug;
|
|
37
|
-
saveAsyncStack(this, 4);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
set(sql, bindings) {
|
|
41
|
-
this.sql = sql;
|
|
42
|
-
this.bindings =
|
|
43
|
-
(isObject(bindings) && !bindings.toSQL) || bindings === undefined
|
|
44
|
-
? bindings
|
|
45
|
-
: [bindings];
|
|
46
|
-
|
|
47
|
-
return this;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
timeout(ms, { cancel } = {}) {
|
|
51
|
-
if (isNumber(ms) && ms > 0) {
|
|
52
|
-
this._timeout = ms;
|
|
53
|
-
if (cancel) {
|
|
54
|
-
this.client.assertCanCancelQuery();
|
|
55
|
-
this._cancelOnTimeout = true;
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
return this;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
// Wraps the current sql with `before` and `after`.
|
|
62
|
-
wrap(before, after) {
|
|
63
|
-
this._wrappedBefore = before;
|
|
64
|
-
this._wrappedAfter = after;
|
|
65
|
-
return this;
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
// Calls `toString` on the Knex object.
|
|
69
|
-
toString() {
|
|
70
|
-
return this.toQuery();
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
// Returns the raw sql for the query.
|
|
74
|
-
toSQL(method, tz) {
|
|
75
|
-
let obj;
|
|
76
|
-
if (Array.isArray(this.bindings)) {
|
|
77
|
-
obj = replaceRawArrBindings(this, this.client);
|
|
78
|
-
} else if (this.bindings && isPlainObject(this.bindings)) {
|
|
79
|
-
obj = replaceKeyBindings(this, this.client);
|
|
80
|
-
} else {
|
|
81
|
-
obj = {
|
|
82
|
-
method: 'raw',
|
|
83
|
-
sql: this.sql,
|
|
84
|
-
bindings: this.bindings === undefined ? [] : [this.bindings],
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
if (this._wrappedBefore) {
|
|
89
|
-
obj.sql = this._wrappedBefore + obj.sql;
|
|
90
|
-
}
|
|
91
|
-
if (this._wrappedAfter) {
|
|
92
|
-
obj.sql = obj.sql + this._wrappedAfter;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
obj.options = reduce(this._options, assign, {});
|
|
96
|
-
|
|
97
|
-
if (this._timeout) {
|
|
98
|
-
obj.timeout = this._timeout;
|
|
99
|
-
if (this._cancelOnTimeout) {
|
|
100
|
-
obj.cancelOnTimeout = this._cancelOnTimeout;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
obj.bindings = obj.bindings || [];
|
|
105
|
-
if (helpers.containsUndefined(obj.bindings)) {
|
|
106
|
-
const undefinedBindingIndices = helpers.getUndefinedIndices(
|
|
107
|
-
this.bindings
|
|
108
|
-
);
|
|
109
|
-
debugBindings(obj.bindings);
|
|
110
|
-
throw new Error(
|
|
111
|
-
`Undefined binding(s) detected for keys [${undefinedBindingIndices}] when compiling RAW query: ${obj.sql}`
|
|
112
|
-
);
|
|
113
|
-
}
|
|
114
|
-
|
|
115
|
-
obj.__knexQueryUid = nanoid();
|
|
116
|
-
|
|
117
|
-
Object.defineProperties(obj, {
|
|
118
|
-
toNative: {
|
|
119
|
-
value: () => ({
|
|
120
|
-
sql: this.client.positionBindings(obj.sql),
|
|
121
|
-
bindings: this.client.prepBindings(obj.bindings),
|
|
122
|
-
}),
|
|
123
|
-
enumerable: false,
|
|
124
|
-
},
|
|
125
|
-
});
|
|
126
|
-
|
|
127
|
-
return obj;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
// Workaround to avoid circular dependency between wrappingFormatter.unwrapRaw and rawFormatter
|
|
132
|
-
Raw.prototype.isRawInstance = true;
|
|
133
|
-
|
|
134
|
-
// Allow the `Raw` object to be utilized with full access to the relevant
|
|
135
|
-
// promise API.
|
|
136
|
-
augmentWithBuilderInterface(Raw);
|
|
137
|
-
helpers.addQueryContext(Raw);
|
|
138
|
-
|
|
139
|
-
module.exports = Raw;
|
|
1
|
+
// Raw
|
|
2
|
+
// -------
|
|
3
|
+
const { EventEmitter } = require('events');
|
|
4
|
+
const debug = require('debug');
|
|
5
|
+
const assign = require('lodash/assign');
|
|
6
|
+
const isPlainObject = require('lodash/isPlainObject');
|
|
7
|
+
const reduce = require('lodash/reduce');
|
|
8
|
+
|
|
9
|
+
const {
|
|
10
|
+
replaceRawArrBindings,
|
|
11
|
+
replaceKeyBindings,
|
|
12
|
+
} = require('./formatter/rawFormatter');
|
|
13
|
+
const helpers = require('./util/helpers');
|
|
14
|
+
const saveAsyncStack = require('./util/save-async-stack');
|
|
15
|
+
const { nanoid } = require('./util/nanoid');
|
|
16
|
+
const { isNumber, isObject } = require('./util/is');
|
|
17
|
+
const {
|
|
18
|
+
augmentWithBuilderInterface,
|
|
19
|
+
} = require('./builder-interface-augmenter');
|
|
20
|
+
|
|
21
|
+
const debugBindings = debug('knex:bindings');
|
|
22
|
+
|
|
23
|
+
class Raw extends EventEmitter {
|
|
24
|
+
constructor(client) {
|
|
25
|
+
super();
|
|
26
|
+
|
|
27
|
+
this.client = client;
|
|
28
|
+
|
|
29
|
+
this.sql = '';
|
|
30
|
+
this.bindings = [];
|
|
31
|
+
|
|
32
|
+
// Todo: Deprecate
|
|
33
|
+
this._wrappedBefore = undefined;
|
|
34
|
+
this._wrappedAfter = undefined;
|
|
35
|
+
if (client && client.config) {
|
|
36
|
+
this._debug = client.config.debug;
|
|
37
|
+
saveAsyncStack(this, 4);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
set(sql, bindings) {
|
|
41
|
+
this.sql = sql;
|
|
42
|
+
this.bindings =
|
|
43
|
+
(isObject(bindings) && !bindings.toSQL) || bindings === undefined
|
|
44
|
+
? bindings
|
|
45
|
+
: [bindings];
|
|
46
|
+
|
|
47
|
+
return this;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
timeout(ms, { cancel } = {}) {
|
|
51
|
+
if (isNumber(ms) && ms > 0) {
|
|
52
|
+
this._timeout = ms;
|
|
53
|
+
if (cancel) {
|
|
54
|
+
this.client.assertCanCancelQuery();
|
|
55
|
+
this._cancelOnTimeout = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return this;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Wraps the current sql with `before` and `after`.
|
|
62
|
+
wrap(before, after) {
|
|
63
|
+
this._wrappedBefore = before;
|
|
64
|
+
this._wrappedAfter = after;
|
|
65
|
+
return this;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Calls `toString` on the Knex object.
|
|
69
|
+
toString() {
|
|
70
|
+
return this.toQuery();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Returns the raw sql for the query.
|
|
74
|
+
toSQL(method, tz) {
|
|
75
|
+
let obj;
|
|
76
|
+
if (Array.isArray(this.bindings)) {
|
|
77
|
+
obj = replaceRawArrBindings(this, this.client);
|
|
78
|
+
} else if (this.bindings && isPlainObject(this.bindings)) {
|
|
79
|
+
obj = replaceKeyBindings(this, this.client);
|
|
80
|
+
} else {
|
|
81
|
+
obj = {
|
|
82
|
+
method: 'raw',
|
|
83
|
+
sql: this.sql,
|
|
84
|
+
bindings: this.bindings === undefined ? [] : [this.bindings],
|
|
85
|
+
};
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
if (this._wrappedBefore) {
|
|
89
|
+
obj.sql = this._wrappedBefore + obj.sql;
|
|
90
|
+
}
|
|
91
|
+
if (this._wrappedAfter) {
|
|
92
|
+
obj.sql = obj.sql + this._wrappedAfter;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
obj.options = reduce(this._options, assign, {});
|
|
96
|
+
|
|
97
|
+
if (this._timeout) {
|
|
98
|
+
obj.timeout = this._timeout;
|
|
99
|
+
if (this._cancelOnTimeout) {
|
|
100
|
+
obj.cancelOnTimeout = this._cancelOnTimeout;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
obj.bindings = obj.bindings || [];
|
|
105
|
+
if (helpers.containsUndefined(obj.bindings)) {
|
|
106
|
+
const undefinedBindingIndices = helpers.getUndefinedIndices(
|
|
107
|
+
this.bindings
|
|
108
|
+
);
|
|
109
|
+
debugBindings(obj.bindings);
|
|
110
|
+
throw new Error(
|
|
111
|
+
`Undefined binding(s) detected for keys [${undefinedBindingIndices}] when compiling RAW query: ${obj.sql}`
|
|
112
|
+
);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
obj.__knexQueryUid = nanoid();
|
|
116
|
+
|
|
117
|
+
Object.defineProperties(obj, {
|
|
118
|
+
toNative: {
|
|
119
|
+
value: () => ({
|
|
120
|
+
sql: this.client.positionBindings(obj.sql),
|
|
121
|
+
bindings: this.client.prepBindings(obj.bindings),
|
|
122
|
+
}),
|
|
123
|
+
enumerable: false,
|
|
124
|
+
},
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
return obj;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
// Workaround to avoid circular dependency between wrappingFormatter.unwrapRaw and rawFormatter
|
|
132
|
+
Raw.prototype.isRawInstance = true;
|
|
133
|
+
|
|
134
|
+
// Allow the `Raw` object to be utilized with full access to the relevant
|
|
135
|
+
// promise API.
|
|
136
|
+
augmentWithBuilderInterface(Raw);
|
|
137
|
+
helpers.addQueryContext(Raw);
|
|
138
|
+
|
|
139
|
+
module.exports = Raw;
|
package/lib/ref.js
CHANGED
|
@@ -1,39 +1,39 @@
|
|
|
1
|
-
const Raw = require('./raw');
|
|
2
|
-
|
|
3
|
-
class Ref extends Raw {
|
|
4
|
-
constructor(client, ref) {
|
|
5
|
-
super(client);
|
|
6
|
-
|
|
7
|
-
this.ref = ref;
|
|
8
|
-
this._schema = null;
|
|
9
|
-
this._alias = null;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
|
-
withSchema(schema) {
|
|
13
|
-
this._schema = schema;
|
|
14
|
-
|
|
15
|
-
return this;
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
as(alias) {
|
|
19
|
-
this._alias = alias;
|
|
20
|
-
|
|
21
|
-
return this;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
toSQL() {
|
|
25
|
-
const string = this._schema ? `${this._schema}.${this.ref}` : this.ref;
|
|
26
|
-
|
|
27
|
-
const formatter = this.client.formatter(this);
|
|
28
|
-
|
|
29
|
-
const ref = formatter.columnize(string);
|
|
30
|
-
|
|
31
|
-
const sql = this._alias ? `${ref} as ${formatter.wrap(this._alias)}` : ref;
|
|
32
|
-
|
|
33
|
-
this.set(sql, []);
|
|
34
|
-
|
|
35
|
-
return super.toSQL(...arguments);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
module.exports = Ref;
|
|
1
|
+
const Raw = require('./raw');
|
|
2
|
+
|
|
3
|
+
class Ref extends Raw {
|
|
4
|
+
constructor(client, ref) {
|
|
5
|
+
super(client);
|
|
6
|
+
|
|
7
|
+
this.ref = ref;
|
|
8
|
+
this._schema = null;
|
|
9
|
+
this._alias = null;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
withSchema(schema) {
|
|
13
|
+
this._schema = schema;
|
|
14
|
+
|
|
15
|
+
return this;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
as(alias) {
|
|
19
|
+
this._alias = alias;
|
|
20
|
+
|
|
21
|
+
return this;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
toSQL() {
|
|
25
|
+
const string = this._schema ? `${this._schema}.${this.ref}` : this.ref;
|
|
26
|
+
|
|
27
|
+
const formatter = this.client.formatter(this);
|
|
28
|
+
|
|
29
|
+
const ref = formatter.columnize(string);
|
|
30
|
+
|
|
31
|
+
const sql = this._alias ? `${ref} as ${formatter.wrap(this._alias)}` : ref;
|
|
32
|
+
|
|
33
|
+
this.set(sql, []);
|
|
34
|
+
|
|
35
|
+
return super.toSQL(...arguments);
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
module.exports = Ref;
|
package/lib/schema/builder.js
CHANGED
|
@@ -1,115 +1,115 @@
|
|
|
1
|
-
const { EventEmitter } = require('events');
|
|
2
|
-
const toArray = require('lodash/toArray');
|
|
3
|
-
const assign = require('lodash/assign');
|
|
4
|
-
const { addQueryContext } = require('../util/helpers');
|
|
5
|
-
const saveAsyncStack = require('../util/save-async-stack');
|
|
6
|
-
const {
|
|
7
|
-
augmentWithBuilderInterface,
|
|
8
|
-
} = require('../builder-interface-augmenter');
|
|
9
|
-
|
|
10
|
-
// Constructor for the builder instance, typically called from
|
|
11
|
-
// `knex.builder`, accepting the current `knex` instance,
|
|
12
|
-
// and pulling out the `client` and `grammar` from the current
|
|
13
|
-
// knex instance.
|
|
14
|
-
class SchemaBuilder extends EventEmitter {
|
|
15
|
-
constructor(client) {
|
|
16
|
-
super();
|
|
17
|
-
this.client = client;
|
|
18
|
-
this._sequence = [];
|
|
19
|
-
|
|
20
|
-
if (client.config) {
|
|
21
|
-
this._debug = client.config.debug;
|
|
22
|
-
saveAsyncStack(this, 4);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
withSchema(schemaName) {
|
|
27
|
-
this._schema = schemaName;
|
|
28
|
-
return this;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
toString() {
|
|
32
|
-
return this.toQuery();
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
toSQL() {
|
|
36
|
-
return this.client.schemaCompiler(this).toSQL();
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async generateDdlCommands() {
|
|
40
|
-
return await this.client.schemaCompiler(this).generateDdlCommands();
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Each of the schema builder methods just add to the
|
|
45
|
-
// "_sequence" array for consistency.
|
|
46
|
-
[
|
|
47
|
-
'createTable',
|
|
48
|
-
'createTableIfNotExists',
|
|
49
|
-
'createTableLike',
|
|
50
|
-
'createView',
|
|
51
|
-
'createViewOrReplace',
|
|
52
|
-
'createMaterializedView',
|
|
53
|
-
'refreshMaterializedView',
|
|
54
|
-
'dropView',
|
|
55
|
-
'dropViewIfExists',
|
|
56
|
-
'dropMaterializedView',
|
|
57
|
-
'dropMaterializedViewIfExists',
|
|
58
|
-
'createSchema',
|
|
59
|
-
'createSchemaIfNotExists',
|
|
60
|
-
'dropSchema',
|
|
61
|
-
'dropSchemaIfExists',
|
|
62
|
-
'createExtension',
|
|
63
|
-
'createExtensionIfNotExists',
|
|
64
|
-
'dropExtension',
|
|
65
|
-
'dropExtensionIfExists',
|
|
66
|
-
'table',
|
|
67
|
-
'alterTable',
|
|
68
|
-
'view',
|
|
69
|
-
'alterView',
|
|
70
|
-
'hasTable',
|
|
71
|
-
'hasColumn',
|
|
72
|
-
'dropTable',
|
|
73
|
-
'renameTable',
|
|
74
|
-
'renameView',
|
|
75
|
-
'dropTableIfExists',
|
|
76
|
-
'raw',
|
|
77
|
-
].forEach(function (method) {
|
|
78
|
-
SchemaBuilder.prototype[method] = function () {
|
|
79
|
-
if (method === 'createTableIfNotExists') {
|
|
80
|
-
this.client.logger.warn(
|
|
81
|
-
[
|
|
82
|
-
'Use async .hasTable to check if table exists and then use plain .createTable. Since ',
|
|
83
|
-
'.createTableIfNotExists actually just generates plain "CREATE TABLE IF NOT EXIST..." ',
|
|
84
|
-
'query it will not work correctly if there are any alter table queries generated for ',
|
|
85
|
-
'columns afterwards. To not break old migrations this function is left untouched for now',
|
|
86
|
-
', but it should not be used when writing new code and it is removed from documentation.',
|
|
87
|
-
].join('')
|
|
88
|
-
);
|
|
89
|
-
}
|
|
90
|
-
if (method === 'table') method = 'alterTable';
|
|
91
|
-
if (method === 'view') method = 'alterView';
|
|
92
|
-
this._sequence.push({
|
|
93
|
-
method,
|
|
94
|
-
args: toArray(arguments),
|
|
95
|
-
});
|
|
96
|
-
return this;
|
|
97
|
-
};
|
|
98
|
-
});
|
|
99
|
-
|
|
100
|
-
SchemaBuilder.extend = (methodName, fn) => {
|
|
101
|
-
if (
|
|
102
|
-
Object.prototype.hasOwnProperty.call(SchemaBuilder.prototype, methodName)
|
|
103
|
-
) {
|
|
104
|
-
throw new Error(
|
|
105
|
-
`Can't extend SchemaBuilder with existing method ('${methodName}').`
|
|
106
|
-
);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
assign(SchemaBuilder.prototype, { [methodName]: fn });
|
|
110
|
-
};
|
|
111
|
-
|
|
112
|
-
augmentWithBuilderInterface(SchemaBuilder);
|
|
113
|
-
addQueryContext(SchemaBuilder);
|
|
114
|
-
|
|
115
|
-
module.exports = SchemaBuilder;
|
|
1
|
+
const { EventEmitter } = require('events');
|
|
2
|
+
const toArray = require('lodash/toArray');
|
|
3
|
+
const assign = require('lodash/assign');
|
|
4
|
+
const { addQueryContext } = require('../util/helpers');
|
|
5
|
+
const saveAsyncStack = require('../util/save-async-stack');
|
|
6
|
+
const {
|
|
7
|
+
augmentWithBuilderInterface,
|
|
8
|
+
} = require('../builder-interface-augmenter');
|
|
9
|
+
|
|
10
|
+
// Constructor for the builder instance, typically called from
|
|
11
|
+
// `knex.builder`, accepting the current `knex` instance,
|
|
12
|
+
// and pulling out the `client` and `grammar` from the current
|
|
13
|
+
// knex instance.
|
|
14
|
+
class SchemaBuilder extends EventEmitter {
|
|
15
|
+
constructor(client) {
|
|
16
|
+
super();
|
|
17
|
+
this.client = client;
|
|
18
|
+
this._sequence = [];
|
|
19
|
+
|
|
20
|
+
if (client.config) {
|
|
21
|
+
this._debug = client.config.debug;
|
|
22
|
+
saveAsyncStack(this, 4);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
withSchema(schemaName) {
|
|
27
|
+
this._schema = schemaName;
|
|
28
|
+
return this;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
toString() {
|
|
32
|
+
return this.toQuery();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
toSQL() {
|
|
36
|
+
return this.client.schemaCompiler(this).toSQL();
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async generateDdlCommands() {
|
|
40
|
+
return await this.client.schemaCompiler(this).generateDdlCommands();
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Each of the schema builder methods just add to the
|
|
45
|
+
// "_sequence" array for consistency.
|
|
46
|
+
[
|
|
47
|
+
'createTable',
|
|
48
|
+
'createTableIfNotExists',
|
|
49
|
+
'createTableLike',
|
|
50
|
+
'createView',
|
|
51
|
+
'createViewOrReplace',
|
|
52
|
+
'createMaterializedView',
|
|
53
|
+
'refreshMaterializedView',
|
|
54
|
+
'dropView',
|
|
55
|
+
'dropViewIfExists',
|
|
56
|
+
'dropMaterializedView',
|
|
57
|
+
'dropMaterializedViewIfExists',
|
|
58
|
+
'createSchema',
|
|
59
|
+
'createSchemaIfNotExists',
|
|
60
|
+
'dropSchema',
|
|
61
|
+
'dropSchemaIfExists',
|
|
62
|
+
'createExtension',
|
|
63
|
+
'createExtensionIfNotExists',
|
|
64
|
+
'dropExtension',
|
|
65
|
+
'dropExtensionIfExists',
|
|
66
|
+
'table',
|
|
67
|
+
'alterTable',
|
|
68
|
+
'view',
|
|
69
|
+
'alterView',
|
|
70
|
+
'hasTable',
|
|
71
|
+
'hasColumn',
|
|
72
|
+
'dropTable',
|
|
73
|
+
'renameTable',
|
|
74
|
+
'renameView',
|
|
75
|
+
'dropTableIfExists',
|
|
76
|
+
'raw',
|
|
77
|
+
].forEach(function (method) {
|
|
78
|
+
SchemaBuilder.prototype[method] = function () {
|
|
79
|
+
if (method === 'createTableIfNotExists') {
|
|
80
|
+
this.client.logger.warn(
|
|
81
|
+
[
|
|
82
|
+
'Use async .hasTable to check if table exists and then use plain .createTable. Since ',
|
|
83
|
+
'.createTableIfNotExists actually just generates plain "CREATE TABLE IF NOT EXIST..." ',
|
|
84
|
+
'query it will not work correctly if there are any alter table queries generated for ',
|
|
85
|
+
'columns afterwards. To not break old migrations this function is left untouched for now',
|
|
86
|
+
', but it should not be used when writing new code and it is removed from documentation.',
|
|
87
|
+
].join('')
|
|
88
|
+
);
|
|
89
|
+
}
|
|
90
|
+
if (method === 'table') method = 'alterTable';
|
|
91
|
+
if (method === 'view') method = 'alterView';
|
|
92
|
+
this._sequence.push({
|
|
93
|
+
method,
|
|
94
|
+
args: toArray(arguments),
|
|
95
|
+
});
|
|
96
|
+
return this;
|
|
97
|
+
};
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
SchemaBuilder.extend = (methodName, fn) => {
|
|
101
|
+
if (
|
|
102
|
+
Object.prototype.hasOwnProperty.call(SchemaBuilder.prototype, methodName)
|
|
103
|
+
) {
|
|
104
|
+
throw new Error(
|
|
105
|
+
`Can't extend SchemaBuilder with existing method ('${methodName}').`
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
assign(SchemaBuilder.prototype, { [methodName]: fn });
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
augmentWithBuilderInterface(SchemaBuilder);
|
|
113
|
+
addQueryContext(SchemaBuilder);
|
|
114
|
+
|
|
115
|
+
module.exports = SchemaBuilder;
|