knex 2.3.0 → 2.4.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.
Files changed (187) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/CONTRIBUTING.md +194 -194
  3. package/LICENSE +22 -22
  4. package/README.md +148 -148
  5. package/UPGRADING.md +233 -233
  6. package/bin/cli.js +472 -472
  7. package/bin/utils/cli-config-utils.js +210 -210
  8. package/bin/utils/constants.js +7 -7
  9. package/bin/utils/migrationsLister.js +37 -37
  10. package/knex.js +23 -23
  11. package/lib/builder-interface-augmenter.js +120 -120
  12. package/lib/client.js +475 -470
  13. package/lib/constants.js +61 -61
  14. package/lib/dialects/better-sqlite3/index.js +72 -72
  15. package/lib/dialects/cockroachdb/crdb-columncompiler.js +14 -14
  16. package/lib/dialects/cockroachdb/crdb-querybuilder.js +11 -11
  17. package/lib/dialects/cockroachdb/crdb-querycompiler.js +122 -122
  18. package/lib/dialects/cockroachdb/crdb-tablecompiler.js +37 -37
  19. package/lib/dialects/cockroachdb/crdb-viewcompiler.js +15 -15
  20. package/lib/dialects/cockroachdb/index.js +86 -86
  21. package/lib/dialects/mssql/index.js +495 -495
  22. package/lib/dialects/mssql/mssql-formatter.js +34 -34
  23. package/lib/dialects/mssql/query/mssql-querycompiler.js +600 -600
  24. package/lib/dialects/mssql/schema/mssql-columncompiler.js +185 -185
  25. package/lib/dialects/mssql/schema/mssql-compiler.js +91 -91
  26. package/lib/dialects/mssql/schema/mssql-tablecompiler.js +378 -372
  27. package/lib/dialects/mssql/schema/mssql-viewcompiler.js +55 -55
  28. package/lib/dialects/mssql/transaction.js +176 -176
  29. package/lib/dialects/mysql/index.js +201 -201
  30. package/lib/dialects/mysql/query/mysql-querycompiler.js +274 -248
  31. package/lib/dialects/mysql/schema/mysql-columncompiler.js +193 -193
  32. package/lib/dialects/mysql/schema/mysql-compiler.js +60 -60
  33. package/lib/dialects/mysql/schema/mysql-tablecompiler.js +381 -381
  34. package/lib/dialects/mysql/schema/mysql-viewbuilder.js +21 -21
  35. package/lib/dialects/mysql/schema/mysql-viewcompiler.js +15 -15
  36. package/lib/dialects/mysql/transaction.js +46 -46
  37. package/lib/dialects/mysql2/index.js +33 -33
  38. package/lib/dialects/mysql2/transaction.js +44 -44
  39. package/lib/dialects/oracle/DEAD_CODE.md +5 -5
  40. package/lib/dialects/oracle/index.js +92 -92
  41. package/lib/dialects/oracle/query/oracle-querycompiler.js +342 -342
  42. package/lib/dialects/oracle/schema/internal/incrementUtils.js +20 -20
  43. package/lib/dialects/oracle/schema/internal/trigger.js +135 -135
  44. package/lib/dialects/oracle/schema/oracle-columnbuilder.js +17 -17
  45. package/lib/dialects/oracle/schema/oracle-columncompiler.js +126 -126
  46. package/lib/dialects/oracle/schema/oracle-compiler.js +122 -122
  47. package/lib/dialects/oracle/schema/oracle-tablecompiler.js +190 -190
  48. package/lib/dialects/oracle/utils.js +87 -87
  49. package/lib/dialects/oracledb/index.js +327 -327
  50. package/lib/dialects/oracledb/query/oracledb-querycompiler.js +481 -481
  51. package/lib/dialects/oracledb/schema/oracledb-columncompiler.js +55 -55
  52. package/lib/dialects/oracledb/schema/oracledb-tablecompiler.js +19 -19
  53. package/lib/dialects/oracledb/schema/oracledb-viewbuilder.js +13 -13
  54. package/lib/dialects/oracledb/schema/oracledb-viewcompiler.js +19 -19
  55. package/lib/dialects/oracledb/transaction.js +98 -98
  56. package/lib/dialects/oracledb/utils.js +208 -208
  57. package/lib/dialects/pgnative/index.js +60 -60
  58. package/lib/dialects/postgres/execution/pg-transaction.js +12 -12
  59. package/lib/dialects/postgres/index.js +358 -358
  60. package/lib/dialects/postgres/query/pg-querybuilder.js +38 -38
  61. package/lib/dialects/postgres/query/pg-querycompiler.js +395 -395
  62. package/lib/dialects/postgres/schema/pg-columncompiler.js +156 -156
  63. package/lib/dialects/postgres/schema/pg-compiler.js +136 -136
  64. package/lib/dialects/postgres/schema/pg-tablecompiler.js +299 -275
  65. package/lib/dialects/postgres/schema/pg-viewbuilder.js +21 -21
  66. package/lib/dialects/postgres/schema/pg-viewcompiler.js +35 -35
  67. package/lib/dialects/redshift/index.js +86 -86
  68. package/lib/dialects/redshift/query/redshift-querycompiler.js +163 -163
  69. package/lib/dialects/redshift/schema/redshift-columnbuilder.js +22 -22
  70. package/lib/dialects/redshift/schema/redshift-columncompiler.js +67 -67
  71. package/lib/dialects/redshift/schema/redshift-compiler.js +14 -14
  72. package/lib/dialects/redshift/schema/redshift-tablecompiler.js +122 -122
  73. package/lib/dialects/redshift/schema/redshift-viewcompiler.js +11 -11
  74. package/lib/dialects/redshift/transaction.js +25 -25
  75. package/lib/dialects/sqlite3/execution/sqlite-transaction.js +18 -18
  76. package/lib/dialects/sqlite3/index.js +250 -250
  77. package/lib/dialects/sqlite3/query/sqlite-querybuilder.js +33 -33
  78. package/lib/dialects/sqlite3/query/sqlite-querycompiler.js +334 -334
  79. package/lib/dialects/sqlite3/schema/ddl.js +400 -400
  80. package/lib/dialects/sqlite3/schema/internal/compiler.js +327 -327
  81. package/lib/dialects/sqlite3/schema/internal/parser-combinator.js +161 -161
  82. package/lib/dialects/sqlite3/schema/internal/parser.js +638 -638
  83. package/lib/dialects/sqlite3/schema/internal/sqlite-ddl-operations.js +41 -41
  84. package/lib/dialects/sqlite3/schema/internal/tokenizer.js +38 -38
  85. package/lib/dialects/sqlite3/schema/internal/utils.js +12 -12
  86. package/lib/dialects/sqlite3/schema/sqlite-columncompiler.js +50 -50
  87. package/lib/dialects/sqlite3/schema/sqlite-compiler.js +80 -80
  88. package/lib/dialects/sqlite3/schema/sqlite-tablecompiler.js +347 -341
  89. package/lib/dialects/sqlite3/schema/sqlite-viewcompiler.js +40 -40
  90. package/lib/execution/batch-insert.js +51 -51
  91. package/lib/execution/internal/delay.js +6 -6
  92. package/lib/execution/internal/ensure-connection-callback.js +41 -41
  93. package/lib/execution/internal/query-executioner.js +62 -58
  94. package/lib/execution/runner.js +307 -307
  95. package/lib/execution/transaction.js +401 -401
  96. package/lib/formatter/formatterUtils.js +42 -42
  97. package/lib/formatter/rawFormatter.js +84 -84
  98. package/lib/formatter/wrappingFormatter.js +250 -250
  99. package/lib/formatter.js +25 -25
  100. package/lib/index.js +3 -3
  101. package/lib/knex-builder/FunctionHelper.js +54 -54
  102. package/lib/knex-builder/Knex.js +59 -59
  103. package/lib/knex-builder/internal/config-resolver.js +57 -57
  104. package/lib/knex-builder/internal/parse-connection.js +87 -87
  105. package/lib/knex-builder/make-knex.js +340 -340
  106. package/lib/logger.js +76 -76
  107. package/lib/migrations/common/MigrationsLoader.js +36 -36
  108. package/lib/migrations/migrate/MigrationGenerator.js +82 -82
  109. package/lib/migrations/migrate/Migrator.js +598 -598
  110. package/lib/migrations/migrate/migrate-stub.js +17 -17
  111. package/lib/migrations/migrate/migration-list-resolver.js +33 -33
  112. package/lib/migrations/migrate/migrator-configuration-merger.js +58 -58
  113. package/lib/migrations/migrate/sources/fs-migrations.js +74 -74
  114. package/lib/migrations/migrate/stub/cjs.stub +15 -15
  115. package/lib/migrations/migrate/stub/coffee.stub +13 -13
  116. package/lib/migrations/migrate/stub/eg.stub +14 -14
  117. package/lib/migrations/migrate/stub/js-schema.stub +22 -22
  118. package/lib/migrations/migrate/stub/js.stub +22 -22
  119. package/lib/migrations/migrate/stub/knexfile-coffee.stub +34 -34
  120. package/lib/migrations/migrate/stub/knexfile-eg.stub +43 -43
  121. package/lib/migrations/migrate/stub/knexfile-js.stub +47 -47
  122. package/lib/migrations/migrate/stub/knexfile-ls.stub +35 -35
  123. package/lib/migrations/migrate/stub/knexfile-ts.stub +47 -47
  124. package/lib/migrations/migrate/stub/ls.stub +14 -14
  125. package/lib/migrations/migrate/stub/mjs.stub +23 -15
  126. package/lib/migrations/migrate/stub/ts-schema.stub +21 -21
  127. package/lib/migrations/migrate/stub/ts.stub +21 -21
  128. package/lib/migrations/migrate/table-creator.js +77 -77
  129. package/lib/migrations/migrate/table-resolver.js +27 -27
  130. package/lib/migrations/seed/Seeder.js +137 -137
  131. package/lib/migrations/seed/seed-stub.js +13 -13
  132. package/lib/migrations/seed/seeder-configuration-merger.js +60 -60
  133. package/lib/migrations/seed/sources/fs-seeds.js +65 -65
  134. package/lib/migrations/seed/stub/coffee.stub +9 -9
  135. package/lib/migrations/seed/stub/eg.stub +11 -11
  136. package/lib/migrations/seed/stub/js.stub +13 -13
  137. package/lib/migrations/seed/stub/ls.stub +11 -11
  138. package/lib/migrations/seed/stub/mjs.stub +12 -12
  139. package/lib/migrations/seed/stub/ts.stub +13 -13
  140. package/lib/migrations/util/fs.js +86 -86
  141. package/lib/migrations/util/import-file.js +12 -12
  142. package/lib/migrations/util/is-module-type.js +9 -9
  143. package/lib/migrations/util/template.js +52 -52
  144. package/lib/migrations/util/timestamp.js +14 -14
  145. package/lib/query/analytic.js +52 -52
  146. package/lib/query/constants.js +15 -15
  147. package/lib/query/joinclause.js +270 -270
  148. package/lib/query/method-constants.js +135 -135
  149. package/lib/query/querybuilder.js +1794 -1800
  150. package/lib/query/querycompiler.js +1580 -1580
  151. package/lib/raw.js +139 -139
  152. package/lib/ref.js +39 -39
  153. package/lib/schema/builder.js +114 -114
  154. package/lib/schema/columnbuilder.js +145 -145
  155. package/lib/schema/columncompiler.js +307 -307
  156. package/lib/schema/compiler.js +187 -187
  157. package/lib/schema/internal/helpers.js +55 -55
  158. package/lib/schema/tablebuilder.js +375 -375
  159. package/lib/schema/tablecompiler.js +433 -433
  160. package/lib/schema/viewbuilder.js +93 -93
  161. package/lib/schema/viewcompiler.js +138 -138
  162. package/lib/util/finally-mixin.js +13 -13
  163. package/lib/util/helpers.js +95 -95
  164. package/lib/util/is.js +32 -32
  165. package/lib/util/nanoid.js +40 -40
  166. package/lib/util/noop.js +1 -1
  167. package/lib/util/save-async-stack.js +14 -14
  168. package/lib/util/string.js +190 -190
  169. package/lib/util/timeout.js +29 -29
  170. package/package.json +4 -4
  171. package/scripts/build.js +125 -125
  172. package/scripts/clean.js +29 -29
  173. package/scripts/docker-compose.yml +152 -152
  174. package/scripts/next-release-howto.md +24 -24
  175. package/scripts/oracledb-install-driver-libs.sh +82 -82
  176. package/scripts/release.sh +34 -34
  177. package/scripts/runkit-example.js +34 -34
  178. package/scripts/stress-test/README.txt +18 -18
  179. package/scripts/stress-test/docker-compose.yml +57 -57
  180. package/scripts/stress-test/knex-stress-test.js +208 -208
  181. package/scripts/stress-test/mysql2-random-hanging-every-now-and-then.js +145 -145
  182. package/scripts/stress-test/mysql2-sudden-exit-without-error.js +100 -100
  183. package/scripts/stress-test/reconnect-test-mysql-based-drivers.js +184 -184
  184. package/scripts/update_gitignore_for_tsc_output.js +86 -85
  185. package/types/index.d.ts +3233 -3230
  186. package/types/result.d.ts +27 -27
  187. package/types/tables.d.ts +4 -4
package/lib/util/is.js CHANGED
@@ -1,32 +1,32 @@
1
- function isString(value) {
2
- return typeof value === 'string';
3
- }
4
-
5
- function isNumber(value) {
6
- return typeof value === 'number';
7
- }
8
-
9
- function isBoolean(value) {
10
- return typeof value === 'boolean';
11
- }
12
-
13
- function isUndefined(value) {
14
- return typeof value === 'undefined';
15
- }
16
-
17
- function isObject(value) {
18
- return typeof value === 'object' && value !== null;
19
- }
20
-
21
- function isFunction(value) {
22
- return typeof value === 'function';
23
- }
24
-
25
- module.exports = {
26
- isString,
27
- isNumber,
28
- isBoolean,
29
- isUndefined,
30
- isObject,
31
- isFunction,
32
- };
1
+ function isString(value) {
2
+ return typeof value === 'string';
3
+ }
4
+
5
+ function isNumber(value) {
6
+ return typeof value === 'number';
7
+ }
8
+
9
+ function isBoolean(value) {
10
+ return typeof value === 'boolean';
11
+ }
12
+
13
+ function isUndefined(value) {
14
+ return typeof value === 'undefined';
15
+ }
16
+
17
+ function isObject(value) {
18
+ return typeof value === 'object' && value !== null;
19
+ }
20
+
21
+ function isFunction(value) {
22
+ return typeof value === 'function';
23
+ }
24
+
25
+ module.exports = {
26
+ isString,
27
+ isNumber,
28
+ isBoolean,
29
+ isUndefined,
30
+ isObject,
31
+ isFunction,
32
+ };
@@ -1,40 +1,40 @@
1
- // This alphabet uses `A-Za-z0-9_-` symbols. The genetic algorithm helped
2
- // optimize the gzip compression for this alphabet.
3
- const urlAlphabet =
4
- 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW';
5
-
6
- const numberAlphabet = '0123456789';
7
-
8
- /**
9
- * Generate URL-friendly unique ID. This method uses the non-secure
10
- * predictable random generator with bigger collision probability.
11
- * Based on https://github.com/ai/nanoid
12
- *
13
- * ```js
14
- * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
15
- * ```
16
- *
17
- * @param size Size of the ID. The default size is 21.
18
- * @returns A random string.
19
- */
20
- function nanoid(size = 21) {
21
- let id = '';
22
- // A compact alternative for `for (var i = 0; i < step; i++)`.
23
- let i = size;
24
- while (i--) {
25
- // `| 0` is more compact and faster than `Math.floor()`.
26
- id += urlAlphabet[(Math.random() * 64) | 0];
27
- }
28
- return id;
29
- }
30
-
31
- function nanonum(size = 21) {
32
- let id = '';
33
- let i = size;
34
- while (i--) {
35
- id += numberAlphabet[(Math.random() * 10) | 0];
36
- }
37
- return id;
38
- }
39
-
40
- module.exports = { nanoid, nanonum };
1
+ // This alphabet uses `A-Za-z0-9_-` symbols. The genetic algorithm helped
2
+ // optimize the gzip compression for this alphabet.
3
+ const urlAlphabet =
4
+ 'ModuleSymbhasOwnPr-0123456789ABCDEFGHNRVfgctiUvz_KqYTJkLxpZXIjQW';
5
+
6
+ const numberAlphabet = '0123456789';
7
+
8
+ /**
9
+ * Generate URL-friendly unique ID. This method uses the non-secure
10
+ * predictable random generator with bigger collision probability.
11
+ * Based on https://github.com/ai/nanoid
12
+ *
13
+ * ```js
14
+ * model.id = nanoid() //=> "Uakgb_J5m9g-0JDMbcJqL"
15
+ * ```
16
+ *
17
+ * @param size Size of the ID. The default size is 21.
18
+ * @returns A random string.
19
+ */
20
+ function nanoid(size = 21) {
21
+ let id = '';
22
+ // A compact alternative for `for (var i = 0; i < step; i++)`.
23
+ let i = size;
24
+ while (i--) {
25
+ // `| 0` is more compact and faster than `Math.floor()`.
26
+ id += urlAlphabet[(Math.random() * 64) | 0];
27
+ }
28
+ return id;
29
+ }
30
+
31
+ function nanonum(size = 21) {
32
+ let id = '';
33
+ let i = size;
34
+ while (i--) {
35
+ id += numberAlphabet[(Math.random() * 10) | 0];
36
+ }
37
+ return id;
38
+ }
39
+
40
+ module.exports = { nanoid, nanonum };
package/lib/util/noop.js CHANGED
@@ -1 +1 @@
1
- module.exports = function () {};
1
+ module.exports = function () {};
@@ -1,14 +1,14 @@
1
- module.exports = function saveAsyncStack(instance, lines) {
2
- if (instance.client.config.asyncStackTraces) {
3
- // a hack to get a callstack into the client code despite this
4
- // node.js bug https://github.com/nodejs/node/issues/11865
5
-
6
- // Save error here but not error trace
7
- // reading trace with '--enable-source-maps' flag on node can be very costly
8
-
9
- instance._asyncStack = {
10
- error: new Error(),
11
- lines,
12
- };
13
- }
14
- };
1
+ module.exports = function saveAsyncStack(instance, lines) {
2
+ if (instance.client.config.asyncStackTraces) {
3
+ // a hack to get a callstack into the client code despite this
4
+ // node.js bug https://github.com/nodejs/node/issues/11865
5
+
6
+ // Save error here but not error trace
7
+ // reading trace with '--enable-source-maps' flag on node can be very costly
8
+
9
+ instance._asyncStack = {
10
+ error: new Error(),
11
+ lines,
12
+ };
13
+ }
14
+ };
@@ -1,190 +1,190 @@
1
- /*eslint max-len: 0, no-var:0 */
2
-
3
- const charsRegex = /[\0\b\t\n\r\x1a"'\\]/g; // eslint-disable-line no-control-regex
4
- const charsMap = {
5
- '\0': '\\0',
6
- '\b': '\\b',
7
- '\t': '\\t',
8
- '\n': '\\n',
9
- '\r': '\\r',
10
- '\x1a': '\\Z',
11
- '"': '\\"',
12
- "'": "\\'",
13
- '\\': '\\\\',
14
- };
15
-
16
- function wrapEscape(escapeFn) {
17
- return function finalEscape(val, ctx = {}) {
18
- return escapeFn(val, finalEscape, ctx);
19
- };
20
- }
21
-
22
- function makeEscape(config = {}) {
23
- const finalEscapeDate = config.escapeDate || dateToString;
24
- const finalEscapeArray = config.escapeArray || arrayToList;
25
- const finalEscapeBuffer = config.escapeBuffer || bufferToString;
26
- const finalEscapeString = config.escapeString || escapeString;
27
- const finalEscapeObject = config.escapeObject || escapeObject;
28
- const finalWrap = config.wrap || wrapEscape;
29
-
30
- function escapeFn(val, finalEscape, ctx) {
31
- if (val === undefined || val === null) {
32
- return 'NULL';
33
- }
34
- switch (typeof val) {
35
- case 'boolean':
36
- return val ? 'true' : 'false';
37
- case 'number':
38
- return val + '';
39
- case 'object':
40
- if (val instanceof Date) {
41
- val = finalEscapeDate(val, finalEscape, ctx);
42
- } else if (Array.isArray(val)) {
43
- return finalEscapeArray(val, finalEscape, ctx);
44
- } else if (Buffer.isBuffer(val)) {
45
- return finalEscapeBuffer(val, finalEscape, ctx);
46
- } else {
47
- return finalEscapeObject(val, finalEscape, ctx);
48
- }
49
- }
50
- return finalEscapeString(val, finalEscape, ctx);
51
- }
52
-
53
- return finalWrap ? finalWrap(escapeFn) : escapeFn;
54
- }
55
-
56
- function escapeObject(val, finalEscape, ctx) {
57
- if (val && typeof val.toSQL === 'function') {
58
- return val.toSQL(ctx);
59
- } else {
60
- return JSON.stringify(val);
61
- }
62
- }
63
-
64
- function arrayToList(array, finalEscape, ctx) {
65
- let sql = '';
66
- for (let i = 0; i < array.length; i++) {
67
- const val = array[i];
68
- if (Array.isArray(val)) {
69
- sql +=
70
- (i === 0 ? '' : ', ') + '(' + arrayToList(val, finalEscape, ctx) + ')';
71
- } else {
72
- sql += (i === 0 ? '' : ', ') + finalEscape(val, ctx);
73
- }
74
- }
75
- return sql;
76
- }
77
-
78
- function bufferToString(buffer) {
79
- return 'X' + escapeString(buffer.toString('hex'));
80
- }
81
-
82
- function escapeString(val, finalEscape, ctx) {
83
- let chunkIndex = (charsRegex.lastIndex = 0);
84
- let escapedVal = '';
85
- let match;
86
-
87
- while ((match = charsRegex.exec(val))) {
88
- escapedVal += val.slice(chunkIndex, match.index) + charsMap[match[0]];
89
- chunkIndex = charsRegex.lastIndex;
90
- }
91
-
92
- if (chunkIndex === 0) {
93
- // Nothing was escaped
94
- return "'" + val + "'";
95
- }
96
-
97
- if (chunkIndex < val.length) {
98
- return "'" + escapedVal + val.slice(chunkIndex) + "'";
99
- }
100
-
101
- return "'" + escapedVal + "'";
102
- }
103
-
104
- function dateToString(date, finalEscape, ctx = {}) {
105
- const timeZone = ctx.timeZone || 'local';
106
-
107
- const dt = new Date(date);
108
- let year;
109
- let month;
110
- let day;
111
- let hour;
112
- let minute;
113
- let second;
114
- let millisecond;
115
-
116
- if (timeZone === 'local') {
117
- year = dt.getFullYear();
118
- month = dt.getMonth() + 1;
119
- day = dt.getDate();
120
- hour = dt.getHours();
121
- minute = dt.getMinutes();
122
- second = dt.getSeconds();
123
- millisecond = dt.getMilliseconds();
124
- } else {
125
- const tz = convertTimezone(timeZone);
126
-
127
- if (tz !== false && tz !== 0) {
128
- dt.setTime(dt.getTime() + tz * 60000);
129
- }
130
-
131
- year = dt.getUTCFullYear();
132
- month = dt.getUTCMonth() + 1;
133
- day = dt.getUTCDate();
134
- hour = dt.getUTCHours();
135
- minute = dt.getUTCMinutes();
136
- second = dt.getUTCSeconds();
137
- millisecond = dt.getUTCMilliseconds();
138
- }
139
-
140
- // YYYY-MM-DD HH:mm:ss.mmm
141
- return (
142
- zeroPad(year, 4) +
143
- '-' +
144
- zeroPad(month, 2) +
145
- '-' +
146
- zeroPad(day, 2) +
147
- ' ' +
148
- zeroPad(hour, 2) +
149
- ':' +
150
- zeroPad(minute, 2) +
151
- ':' +
152
- zeroPad(second, 2) +
153
- '.' +
154
- zeroPad(millisecond, 3)
155
- );
156
- }
157
-
158
- function zeroPad(number, length) {
159
- number = number.toString();
160
- while (number.length < length) {
161
- number = '0' + number;
162
- }
163
- return number;
164
- }
165
-
166
- function convertTimezone(tz) {
167
- if (tz === 'Z') {
168
- return 0;
169
- }
170
- const m = tz.match(/([+\-\s])(\d\d):?(\d\d)?/);
171
- if (m) {
172
- return (
173
- (m[1] == '-' ? -1 : 1) *
174
- (parseInt(m[2], 10) + (m[3] ? parseInt(m[3], 10) : 0) / 60) *
175
- 60
176
- );
177
- }
178
- return false;
179
- }
180
-
181
- module.exports = {
182
- arrayToList,
183
- bufferToString,
184
- dateToString,
185
- escapeString,
186
- charsRegex,
187
- charsMap,
188
- escapeObject,
189
- makeEscape,
190
- };
1
+ /*eslint max-len: 0, no-var:0 */
2
+
3
+ const charsRegex = /[\0\b\t\n\r\x1a"'\\]/g; // eslint-disable-line no-control-regex
4
+ const charsMap = {
5
+ '\0': '\\0',
6
+ '\b': '\\b',
7
+ '\t': '\\t',
8
+ '\n': '\\n',
9
+ '\r': '\\r',
10
+ '\x1a': '\\Z',
11
+ '"': '\\"',
12
+ "'": "\\'",
13
+ '\\': '\\\\',
14
+ };
15
+
16
+ function wrapEscape(escapeFn) {
17
+ return function finalEscape(val, ctx = {}) {
18
+ return escapeFn(val, finalEscape, ctx);
19
+ };
20
+ }
21
+
22
+ function makeEscape(config = {}) {
23
+ const finalEscapeDate = config.escapeDate || dateToString;
24
+ const finalEscapeArray = config.escapeArray || arrayToList;
25
+ const finalEscapeBuffer = config.escapeBuffer || bufferToString;
26
+ const finalEscapeString = config.escapeString || escapeString;
27
+ const finalEscapeObject = config.escapeObject || escapeObject;
28
+ const finalWrap = config.wrap || wrapEscape;
29
+
30
+ function escapeFn(val, finalEscape, ctx) {
31
+ if (val === undefined || val === null) {
32
+ return 'NULL';
33
+ }
34
+ switch (typeof val) {
35
+ case 'boolean':
36
+ return val ? 'true' : 'false';
37
+ case 'number':
38
+ return val + '';
39
+ case 'object':
40
+ if (val instanceof Date) {
41
+ val = finalEscapeDate(val, finalEscape, ctx);
42
+ } else if (Array.isArray(val)) {
43
+ return finalEscapeArray(val, finalEscape, ctx);
44
+ } else if (Buffer.isBuffer(val)) {
45
+ return finalEscapeBuffer(val, finalEscape, ctx);
46
+ } else {
47
+ return finalEscapeObject(val, finalEscape, ctx);
48
+ }
49
+ }
50
+ return finalEscapeString(val, finalEscape, ctx);
51
+ }
52
+
53
+ return finalWrap ? finalWrap(escapeFn) : escapeFn;
54
+ }
55
+
56
+ function escapeObject(val, finalEscape, ctx) {
57
+ if (val && typeof val.toSQL === 'function') {
58
+ return val.toSQL(ctx);
59
+ } else {
60
+ return JSON.stringify(val);
61
+ }
62
+ }
63
+
64
+ function arrayToList(array, finalEscape, ctx) {
65
+ let sql = '';
66
+ for (let i = 0; i < array.length; i++) {
67
+ const val = array[i];
68
+ if (Array.isArray(val)) {
69
+ sql +=
70
+ (i === 0 ? '' : ', ') + '(' + arrayToList(val, finalEscape, ctx) + ')';
71
+ } else {
72
+ sql += (i === 0 ? '' : ', ') + finalEscape(val, ctx);
73
+ }
74
+ }
75
+ return sql;
76
+ }
77
+
78
+ function bufferToString(buffer) {
79
+ return 'X' + escapeString(buffer.toString('hex'));
80
+ }
81
+
82
+ function escapeString(val, finalEscape, ctx) {
83
+ let chunkIndex = (charsRegex.lastIndex = 0);
84
+ let escapedVal = '';
85
+ let match;
86
+
87
+ while ((match = charsRegex.exec(val))) {
88
+ escapedVal += val.slice(chunkIndex, match.index) + charsMap[match[0]];
89
+ chunkIndex = charsRegex.lastIndex;
90
+ }
91
+
92
+ if (chunkIndex === 0) {
93
+ // Nothing was escaped
94
+ return "'" + val + "'";
95
+ }
96
+
97
+ if (chunkIndex < val.length) {
98
+ return "'" + escapedVal + val.slice(chunkIndex) + "'";
99
+ }
100
+
101
+ return "'" + escapedVal + "'";
102
+ }
103
+
104
+ function dateToString(date, finalEscape, ctx = {}) {
105
+ const timeZone = ctx.timeZone || 'local';
106
+
107
+ const dt = new Date(date);
108
+ let year;
109
+ let month;
110
+ let day;
111
+ let hour;
112
+ let minute;
113
+ let second;
114
+ let millisecond;
115
+
116
+ if (timeZone === 'local') {
117
+ year = dt.getFullYear();
118
+ month = dt.getMonth() + 1;
119
+ day = dt.getDate();
120
+ hour = dt.getHours();
121
+ minute = dt.getMinutes();
122
+ second = dt.getSeconds();
123
+ millisecond = dt.getMilliseconds();
124
+ } else {
125
+ const tz = convertTimezone(timeZone);
126
+
127
+ if (tz !== false && tz !== 0) {
128
+ dt.setTime(dt.getTime() + tz * 60000);
129
+ }
130
+
131
+ year = dt.getUTCFullYear();
132
+ month = dt.getUTCMonth() + 1;
133
+ day = dt.getUTCDate();
134
+ hour = dt.getUTCHours();
135
+ minute = dt.getUTCMinutes();
136
+ second = dt.getUTCSeconds();
137
+ millisecond = dt.getUTCMilliseconds();
138
+ }
139
+
140
+ // YYYY-MM-DD HH:mm:ss.mmm
141
+ return (
142
+ zeroPad(year, 4) +
143
+ '-' +
144
+ zeroPad(month, 2) +
145
+ '-' +
146
+ zeroPad(day, 2) +
147
+ ' ' +
148
+ zeroPad(hour, 2) +
149
+ ':' +
150
+ zeroPad(minute, 2) +
151
+ ':' +
152
+ zeroPad(second, 2) +
153
+ '.' +
154
+ zeroPad(millisecond, 3)
155
+ );
156
+ }
157
+
158
+ function zeroPad(number, length) {
159
+ number = number.toString();
160
+ while (number.length < length) {
161
+ number = '0' + number;
162
+ }
163
+ return number;
164
+ }
165
+
166
+ function convertTimezone(tz) {
167
+ if (tz === 'Z') {
168
+ return 0;
169
+ }
170
+ const m = tz.match(/([+\-\s])(\d\d):?(\d\d)?/);
171
+ if (m) {
172
+ return (
173
+ (m[1] == '-' ? -1 : 1) *
174
+ (parseInt(m[2], 10) + (m[3] ? parseInt(m[3], 10) : 0) / 60) *
175
+ 60
176
+ );
177
+ }
178
+ return false;
179
+ }
180
+
181
+ module.exports = {
182
+ arrayToList,
183
+ bufferToString,
184
+ dateToString,
185
+ escapeString,
186
+ charsRegex,
187
+ charsMap,
188
+ escapeObject,
189
+ makeEscape,
190
+ };
@@ -1,29 +1,29 @@
1
- class KnexTimeoutError extends Error {
2
- constructor(message) {
3
- super(message);
4
- this.name = 'KnexTimeoutError';
5
- }
6
- }
7
-
8
- function timeout(promise, ms) {
9
- return new Promise(function (resolve, reject) {
10
- const id = setTimeout(function () {
11
- reject(new KnexTimeoutError('operation timed out'));
12
- }, ms);
13
-
14
- function wrappedResolve(value) {
15
- clearTimeout(id);
16
- resolve(value);
17
- }
18
-
19
- function wrappedReject(err) {
20
- clearTimeout(id);
21
- reject(err);
22
- }
23
-
24
- promise.then(wrappedResolve, wrappedReject);
25
- });
26
- }
27
-
28
- module.exports.KnexTimeoutError = KnexTimeoutError;
29
- module.exports.timeout = timeout;
1
+ class KnexTimeoutError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = 'KnexTimeoutError';
5
+ }
6
+ }
7
+
8
+ function timeout(promise, ms) {
9
+ return new Promise(function (resolve, reject) {
10
+ const id = setTimeout(function () {
11
+ reject(new KnexTimeoutError('operation timed out'));
12
+ }, ms);
13
+
14
+ function wrappedResolve(value) {
15
+ clearTimeout(id);
16
+ resolve(value);
17
+ }
18
+
19
+ function wrappedReject(err) {
20
+ clearTimeout(id);
21
+ reject(err);
22
+ }
23
+
24
+ promise.then(wrappedResolve, wrappedReject);
25
+ });
26
+ }
27
+
28
+ module.exports.KnexTimeoutError = KnexTimeoutError;
29
+ module.exports.timeout = timeout;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "knex",
3
- "version": "2.3.0",
3
+ "version": "2.4.1",
4
4
  "description": "A batteries-included SQL query & schema builder for PostgresSQL, MySQL, CockroachDB, MSSQL and SQLite3",
5
5
  "main": "knex",
6
6
  "types": "types/index.d.ts",
@@ -132,7 +132,7 @@
132
132
  "pg-query-stream": "^4.2.4",
133
133
  "prettier": "2.6.2",
134
134
  "rimraf": "^3.0.2",
135
- "sinon": "^14.0.0",
135
+ "sinon": "^15.0.1",
136
136
  "sinon-chai": "^3.7.0",
137
137
  "source-map-support": "^0.5.21",
138
138
  "sqlite3": "^5.0.11",
@@ -141,8 +141,8 @@
141
141
  "tedious": "^14.4.0",
142
142
  "toxiproxy-node-client": "^2.0.6",
143
143
  "ts-node": "^10.9.1",
144
- "tsd": "^0.23.0",
145
- "typescript": "4.8.2"
144
+ "tsd": "^0.25.0",
145
+ "typescript": "4.8.3"
146
146
  },
147
147
  "buildDependencies": [
148
148
  "rimraf"