@villedemontreal/utils-knex 7.0.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 (66) hide show
  1. package/README.md +236 -0
  2. package/dist/src/config/configs.d.ts +19 -0
  3. package/dist/src/config/configs.d.ts.map +1 -0
  4. package/dist/src/config/configs.js +27 -0
  5. package/dist/src/config/configs.js.map +1 -0
  6. package/dist/src/config/constants.d.ts +21 -0
  7. package/dist/src/config/constants.d.ts.map +1 -0
  8. package/dist/src/config/constants.js +21 -0
  9. package/dist/src/config/constants.js.map +1 -0
  10. package/dist/src/config/init.d.ts +16 -0
  11. package/dist/src/config/init.d.ts.map +1 -0
  12. package/dist/src/config/init.js +33 -0
  13. package/dist/src/config/init.js.map +1 -0
  14. package/dist/src/databaseContext.d.ts +9 -0
  15. package/dist/src/databaseContext.d.ts.map +1 -0
  16. package/dist/src/databaseContext.js +3 -0
  17. package/dist/src/databaseContext.js.map +1 -0
  18. package/dist/src/index.d.ts +5 -0
  19. package/dist/src/index.d.ts.map +1 -0
  20. package/dist/src/index.js +26 -0
  21. package/dist/src/index.js.map +1 -0
  22. package/dist/src/knexUtils.d.ts +134 -0
  23. package/dist/src/knexUtils.d.ts.map +1 -0
  24. package/dist/src/knexUtils.js +349 -0
  25. package/dist/src/knexUtils.js.map +1 -0
  26. package/dist/src/knexUtils.test.d.ts +2 -0
  27. package/dist/src/knexUtils.test.d.ts.map +1 -0
  28. package/dist/src/knexUtils.test.js +897 -0
  29. package/dist/src/knexUtils.test.js.map +1 -0
  30. package/dist/src/transactionManager.d.ts +34 -0
  31. package/dist/src/transactionManager.d.ts.map +1 -0
  32. package/dist/src/transactionManager.js +75 -0
  33. package/dist/src/transactionManager.js.map +1 -0
  34. package/dist/src/transactionManager.test.d.ts +10 -0
  35. package/dist/src/transactionManager.test.d.ts.map +1 -0
  36. package/dist/src/transactionManager.test.js +255 -0
  37. package/dist/src/transactionManager.test.js.map +1 -0
  38. package/dist/src/utils/logger.d.ts +12 -0
  39. package/dist/src/utils/logger.d.ts.map +1 -0
  40. package/dist/src/utils/logger.js +53 -0
  41. package/dist/src/utils/logger.js.map +1 -0
  42. package/dist/src/utils/testingConfigurations.d.ts +9 -0
  43. package/dist/src/utils/testingConfigurations.d.ts.map +1 -0
  44. package/dist/src/utils/testingConfigurations.js +16 -0
  45. package/dist/src/utils/testingConfigurations.js.map +1 -0
  46. package/dist/testing/testClient.d.ts +15 -0
  47. package/dist/testing/testClient.d.ts.map +1 -0
  48. package/dist/testing/testClient.js +55 -0
  49. package/dist/testing/testClient.js.map +1 -0
  50. package/dist/testing/testRepo.d.ts +8 -0
  51. package/dist/testing/testRepo.d.ts.map +1 -0
  52. package/dist/testing/testRepo.js +31 -0
  53. package/dist/testing/testRepo.js.map +1 -0
  54. package/dist/tsconfig.tsbuildinfo +1 -0
  55. package/package.json +76 -0
  56. package/src/config/configs.ts +34 -0
  57. package/src/config/constants.ts +33 -0
  58. package/src/config/init.ts +33 -0
  59. package/src/databaseContext.ts +9 -0
  60. package/src/index.ts +9 -0
  61. package/src/knexUtils.test.ts +1526 -0
  62. package/src/knexUtils.ts +459 -0
  63. package/src/transactionManager.test.ts +302 -0
  64. package/src/transactionManager.ts +94 -0
  65. package/src/utils/logger.ts +60 -0
  66. package/src/utils/testingConfigurations.ts +13 -0
@@ -0,0 +1,349 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.knexUtils = exports.KnexUtils = void 0;
4
+ // ==========================================
5
+ // Knex utilities
6
+ //
7
+ // Ok in test files
8
+ // tslint:disable:no-string-literal
9
+ // ==========================================
10
+ const general_utils_1 = require("@villedemontreal/general-utils");
11
+ const bluebird_1 = require("bluebird");
12
+ const knex_1 = require("knex");
13
+ const _ = require("lodash");
14
+ const sinon = require("sinon");
15
+ const uuid_1 = require("uuid");
16
+ const logger_1 = require("./utils/logger");
17
+ const logger = (0, logger_1.createLogger)('knexUtils');
18
+ /**
19
+ * Knex utilities
20
+ */
21
+ class KnexUtils {
22
+ constructor() {
23
+ /**
24
+ * Creates a mocked Knex client, linked to a dummy database.
25
+ * The client allows you to define stubs that will simulate
26
+ * the result from the DB.
27
+ *
28
+ * Useful for testing!
29
+ */
30
+ this.createKnexMockedClient = async () => {
31
+ const knexMockedClient = (0, knex_1.default)({
32
+ client: 'sqlite',
33
+ connection: {
34
+ filename: './mydb.sqlite',
35
+ },
36
+ useNullAsDefault: true,
37
+ });
38
+ // ==========================================
39
+ // We add stubs that will allow to change the
40
+ // mocked result of a query.
41
+ // ==========================================
42
+ knexMockedClient.resultStub = sinon.stub();
43
+ knexMockedClient.resultStub.returns([]);
44
+ knexMockedClient.totalCountStub = sinon.stub();
45
+ knexMockedClient.totalCountStub.returns(0);
46
+ knexMockedClient.beforeQuerySpy = sinon.spy();
47
+ // ==========================================
48
+ // Returns a dummy connection object
49
+ // ==========================================
50
+ knexMockedClient.client.acquireConnection = () => {
51
+ // ==========================================
52
+ // We have to use a BlueBird Promise because
53
+ // this is what Knex is expecting and some functions
54
+ // specific to BlueBird promises are called.
55
+ // ==========================================
56
+ const promiseLike = new bluebird_1.Promise((resolve, reject) => {
57
+ resolve({
58
+ // The "__knexUid" property is required by Knex
59
+ __knexUid: (0, uuid_1.v4)(),
60
+ });
61
+ });
62
+ return promiseLike;
63
+ };
64
+ // ==========================================
65
+ // Called when the query is actually executed
66
+ // by Knex. We simply return the values from
67
+ // our stubs!
68
+ // ==========================================
69
+ knexMockedClient.client.query = (knexUuid, builder) => {
70
+ // The spy...
71
+ knexMockedClient.beforeQuerySpy(builder);
72
+ // ==========================================
73
+ // Query for the "totalCount" part of our "paginate()"
74
+ // function... We return the value from the
75
+ // *totalCount stub*.
76
+ // ==========================================
77
+ if (builder.options && builder.options[KnexUtils.TOTAL_COUNT_BUILDER_OPTION_NAME]) {
78
+ const theResult = knexMockedClient.totalCountStub();
79
+ const resultRow = {};
80
+ resultRow[KnexUtils.KNEX_TOTAL_COUNT_QUERY_COLUMN_NAME] = theResult;
81
+ return Promise.resolve(resultRow);
82
+ }
83
+ // ==========================================
84
+ // Regular query
85
+ // ==========================================
86
+ // The stub....
87
+ const result = knexMockedClient.resultStub();
88
+ return Promise.resolve(result);
89
+ };
90
+ // ==========================================
91
+ // Called by Knex to transform the result returned
92
+ // by the DB. We return our mocked result as is...
93
+ // ==========================================
94
+ knexMockedClient.client.processResponse = (obj, runner) => {
95
+ return obj;
96
+ };
97
+ // ==========================================
98
+ // When using a transaction, a new "client"
99
+ // is created. We replace it by our mocked client.
100
+ // ==========================================
101
+ knexMockedClient['context'].transaction = (transactionScope, config) => {
102
+ return transactionScope !== null ? transactionScope(knexMockedClient) : undefined;
103
+ };
104
+ return knexMockedClient;
105
+ };
106
+ }
107
+ /**
108
+ * Takes a Knex.QueryBuilder, which is the object created
109
+ * when defining a Knex query, an returns the rows total count.
110
+ *
111
+ * This function is useful when you already have a SELECT Knex query,
112
+ * but you only need the rows total count instead of the rows themselves!
113
+ *
114
+ * Warning!! This function only works with SELECT queries, and
115
+ * may fail in some untested complex situations... It only has
116
+ * been tested with simple select/from/where/orderBy queries.
117
+ *
118
+ * Example :
119
+ *
120
+ * const queryBuilder = client
121
+ * .from(BOOKS_TABLE_NAME)
122
+ * .orderBy("author");
123
+ *
124
+ * ... and then, instead of executing the query, by using
125
+ * "then()" or "await", you pass the builder to the
126
+ * "totalCount()" function :
127
+ *
128
+ * let totalCount: number = await knexUtils.totalCount(client, queryBuilder);
129
+ *
130
+ */
131
+ async totalCount(knex, selectBuilder) {
132
+ const result = await this.paginateOrTotalCount(knex, selectBuilder, -1, -1, true);
133
+ return result.paging.totalCount;
134
+ }
135
+ /**
136
+ * Takes a Knex.QueryBuilder, which is the object created
137
+ * when defining a Knex query, a limit and a current
138
+ * page, then return a IPaginatedResult.
139
+ *
140
+ * In other words, instead of executing the query you
141
+ * are building with Knex directly, you pass the unsent
142
+ * builder to this function and you get :
143
+ * - Pagination for your query
144
+ * - The total number of elements your query would return if it
145
+ * wasn't paginated.
146
+ *
147
+ * Warning!! This function only works with SELECT queries, and
148
+ * may fail in some untested complex situations... It only has
149
+ * been tested with simple select/from/where/orderBy queries.
150
+ *
151
+ * If this function fails for one of your query, you'll have to
152
+ * duplicate the code of that query to make two separate queries :
153
+ * one for the rows only and one for the total count only.
154
+ *
155
+ * For example, to get 3 items starting at offset 9 :
156
+ *
157
+ * const paginatedResult = await knexUtils.paginate(
158
+ * client,
159
+ * client
160
+ * .select("id", "author", "title")
161
+ * .from(BOOKS_TABLE_NAME)
162
+ * .orderBy("author"),
163
+ * 9, 3);
164
+ */
165
+ async paginate(knex, selectBuilder, offset, limit) {
166
+ const result = await this.paginateOrTotalCount(knex, selectBuilder, offset, limit);
167
+ return result;
168
+ }
169
+ /**
170
+ * For Oracle.
171
+ * Wraps a column name (or a "?") with LOWER or with a CONVERT function
172
+ * which will strip accents.
173
+ */
174
+ wrapWithOracleModificationkeywords(columnNameOrInterrogationMark, isConvert, isLower) {
175
+ if (isConvert && isLower) {
176
+ return `LOWER(CONVERT(${columnNameOrInterrogationMark}, 'US7ASCII', 'WE8ISO8859P1'))`;
177
+ }
178
+ if (isConvert) {
179
+ return `CONVERT(${columnNameOrInterrogationMark}, 'US7ASCII', 'WE8ISO8859P1')`;
180
+ }
181
+ if (isLower) {
182
+ return `LOWER(${columnNameOrInterrogationMark})`;
183
+ }
184
+ return columnNameOrInterrogationMark;
185
+ }
186
+ /**
187
+ * For Oracle.
188
+ * Adds a LIKE clause, where the values can be compared lowercased (isLower), by removing the
189
+ * accents first (isConvert), and where the "val" can starts or ends with a "*" wildcard.
190
+ */
191
+ addOracleLikeClause(queryBuilder, columnName, val, isConvert, isLower) {
192
+ let valClean = val;
193
+ let wildcardPrefix = '';
194
+ let wildcardSuffix = '';
195
+ if (val.startsWith('*')) {
196
+ wildcardPrefix = "'%' || ";
197
+ valClean = _.trimStart(valClean, '*');
198
+ }
199
+ if (valClean.endsWith('*')) {
200
+ wildcardSuffix = " || '%'";
201
+ valClean = _.trimEnd(valClean, '*');
202
+ }
203
+ let queryBuilderClean = queryBuilder;
204
+ if (wildcardPrefix === '' && wildcardSuffix === '' && !isConvert && !isLower) {
205
+ queryBuilderClean = queryBuilderClean.where(columnName, valClean);
206
+ }
207
+ else {
208
+ const clause = `${this.wrapWithOracleModificationkeywords(columnName, isConvert, isLower)} LIKE ${wildcardPrefix}${this.wrapWithOracleModificationkeywords('?', isConvert, isLower)}${wildcardSuffix}`;
209
+ queryBuilderClean = queryBuilderClean.whereRaw(clause, valClean);
210
+ }
211
+ return queryBuilderClean;
212
+ }
213
+ /**
214
+ * For SQL Server.
215
+ * Wraps a column name (or a "?") with LOWER and/or with a CAST function
216
+ * which will strip accents.
217
+ */
218
+ wrapWithSqlServerModificationKeywords(columnNameOrInterrogationMark, isConvert, isLower) {
219
+ if (!isLower && !isConvert) {
220
+ return columnNameOrInterrogationMark;
221
+ }
222
+ if (isLower && !isConvert) {
223
+ return `LOWER(${columnNameOrInterrogationMark})`;
224
+ }
225
+ // ==========================================
226
+ // There is no magic method in SQL Server to strip accents.
227
+ // This is the best I found : https://stackoverflow.com/a/3578644/843699
228
+ // ... I added "œ" and "æ" management too, which don't work with the
229
+ // Stack Overflow trick.
230
+ // ==========================================
231
+ const cast = `CAST(` +
232
+ `REPLACE(REPLACE(REPLACE(REPLACE(${columnNameOrInterrogationMark}, 'œ', 'oe'), 'Œ', 'OE'), 'æ', 'ae'), 'Æ', 'AE')` +
233
+ `AS VARCHAR(max)) COLLATE SQL_Latin1_General_Cp1251_CS_AS`;
234
+ if (!isLower) {
235
+ return cast;
236
+ }
237
+ return `LOWER(${cast})`;
238
+ }
239
+ /**
240
+ * For SQL Server.
241
+ * Adds a LIKE clause, where the values can be compared lowercased (lower), by removing the
242
+ * accents first (removeAccent), and where the "val" can starts or ends with a "*" wildcard
243
+ * (acceptWildcard).
244
+ */
245
+ addSqlServerLikeClause(queryBuilder, columnName, val, acceptWildcard, removeAccents, lower) {
246
+ let valClean = val;
247
+ let wildcardPrefix = '';
248
+ let wildcardSuffix = '';
249
+ if (acceptWildcard) {
250
+ if (val.startsWith('*')) {
251
+ wildcardPrefix = "'%' + ";
252
+ valClean = _.trimStart(valClean, '*');
253
+ }
254
+ if (valClean.endsWith('*')) {
255
+ wildcardSuffix = " + '%'";
256
+ valClean = _.trimEnd(valClean, '*');
257
+ }
258
+ }
259
+ let queryBuilderClean = queryBuilder;
260
+ if (wildcardPrefix === '' && wildcardSuffix === '' && !removeAccents && !lower) {
261
+ queryBuilderClean = queryBuilderClean.where(columnName, valClean);
262
+ }
263
+ else {
264
+ const clause = `${this.wrapWithSqlServerModificationKeywords(columnName, removeAccents, lower)} LIKE ${wildcardPrefix}${this.wrapWithSqlServerModificationKeywords('?', removeAccents, lower)}${wildcardSuffix}`;
265
+ queryBuilderClean = queryBuilderClean.whereRaw(clause, valClean);
266
+ }
267
+ return queryBuilderClean;
268
+ }
269
+ /**
270
+ * @param totalCountOnly if true, only the request to get the total count will
271
+ * be made and an empty array will be returned as the rows.
272
+ */
273
+ async paginateOrTotalCount(knex, selectBuilder, offset, limit, totalCountOnly = false) {
274
+ // eslint-disable-next-line @typescript-eslint/no-misused-promises
275
+ if (!selectBuilder) {
276
+ throw new Error('A Knex SELECT query builder is required.');
277
+ }
278
+ if (selectBuilder['_method'] !== 'select') {
279
+ throw new Error("The 'paginate()' and 'totalCount()' functions are only available on a SELECT query builder!");
280
+ }
281
+ let offsetClean = offset;
282
+ if (!general_utils_1.utils.isIntegerValue(offsetClean, true, true)) {
283
+ logger.debug(`Invalid offset "${offsetClean}", 0 will be used instead`);
284
+ offsetClean = 0;
285
+ }
286
+ offsetClean = Number(offsetClean);
287
+ let limitClean = limit;
288
+ if (!general_utils_1.utils.isIntegerValue(limitClean, true, false)) {
289
+ logger.debug(`Invalid limit "${limitClean}", 1 will be used instead`);
290
+ limitClean = 1;
291
+ }
292
+ limitClean = Number(limitClean);
293
+ // ==========================================
294
+ // We wrap the original select query in a
295
+ // "count()" query. We also add an option to this
296
+ // new query so we can later know this is the "totalCount"
297
+ // generated query.
298
+ // ==========================================
299
+ let countBuilder = knex.count(`* AS ${KnexUtils.KNEX_TOTAL_COUNT_QUERY_COLUMN_NAME}`);
300
+ const options = {};
301
+ options[KnexUtils.TOTAL_COUNT_BUILDER_OPTION_NAME] = true;
302
+ countBuilder = countBuilder.options(options);
303
+ // ==========================================
304
+ // For the subquery, we clone the
305
+ // original query but remove the "order by"
306
+ // clause, the limit and the offset.
307
+ // ==========================================
308
+ const countBuilderSubSelect = selectBuilder.clone();
309
+ delete countBuilderSubSelect['_single'].offset;
310
+ delete countBuilderSubSelect['_single'].limit;
311
+ if (countBuilderSubSelect['_statements']) {
312
+ const totalCountStatements = [];
313
+ for (const statement of countBuilderSubSelect['_statements']) {
314
+ if (statement.grouping !== 'order') {
315
+ totalCountStatements.push(statement);
316
+ }
317
+ }
318
+ countBuilderSubSelect['_statements'] = totalCountStatements;
319
+ }
320
+ countBuilder = countBuilder.from(countBuilderSubSelect.as('_knexSub'));
321
+ // ==========================================
322
+ // Are we simply interested in the total count,
323
+ // or the actual rows too?
324
+ // We do not use something like Promise.all() to
325
+ // run both queries because of :
326
+ // https://github.com/tediousjs/node-mssql/issues/491
327
+ // ==========================================
328
+ const rs = await countBuilder.first();
329
+ const totalCount = Number(rs[KnexUtils.KNEX_TOTAL_COUNT_QUERY_COLUMN_NAME]);
330
+ let rows;
331
+ if (!totalCountOnly) {
332
+ rows = await selectBuilder.offset(offsetClean).limit(limitClean);
333
+ }
334
+ const result = {
335
+ items: rows,
336
+ paging: {
337
+ totalCount,
338
+ limit: limitClean,
339
+ offset: offsetClean,
340
+ },
341
+ };
342
+ return result;
343
+ }
344
+ }
345
+ exports.KnexUtils = KnexUtils;
346
+ KnexUtils.KNEX_TOTAL_COUNT_QUERY_COLUMN_NAME = 'count';
347
+ KnexUtils.TOTAL_COUNT_BUILDER_OPTION_NAME = 'isTotalCountBuilder';
348
+ exports.knexUtils = new KnexUtils();
349
+ //# sourceMappingURL=knexUtils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knexUtils.js","sourceRoot":"","sources":["../../src/knexUtils.ts"],"names":[],"mappings":";;;AAAA,6CAA6C;AAC7C,iBAAiB;AACjB,EAAE;AACF,mBAAmB;AACnB,mCAAmC;AACnC,6CAA6C;AAC7C,kEAAyE;AACzE,uCAAgD;AAChD,+BAAkC;AAClC,4BAA4B;AAC5B,+BAA+B;AAC/B,+BAAkC;AAClC,2CAA8C;AAE9C,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,WAAW,CAAC,CAAC;AAEzC;;GAEG;AACH,MAAa,SAAS;IAAtB;QAyEE;;;;;;WAMG;QACI,2BAAsB,GAAG,KAAK,IAAgC,EAAE;YACrE,MAAM,gBAAgB,GAAsB,IAAA,cAAI,EAAC;gBAC/C,MAAM,EAAE,QAAQ;gBAChB,UAAU,EAAE;oBACV,QAAQ,EAAE,eAAe;iBAC1B;gBACD,gBAAgB,EAAE,IAAI;aACvB,CAAQ,CAAC;YAEV,6CAA6C;YAC7C,6CAA6C;YAC7C,4BAA4B;YAC5B,6CAA6C;YAC7C,gBAAgB,CAAC,UAAU,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3C,gBAAgB,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YAExC,gBAAgB,CAAC,cAAc,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/C,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;YAE3C,gBAAgB,CAAC,cAAc,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;YAE9C,6CAA6C;YAC7C,oCAAoC;YACpC,6CAA6C;YAC7C,gBAAgB,CAAC,MAAM,CAAC,iBAAiB,GAAG,GAAG,EAAE;gBAC/C,6CAA6C;gBAC7C,4CAA4C;gBAC5C,oDAAoD;gBACpD,4CAA4C;gBAC5C,6CAA6C;gBAC7C,MAAM,WAAW,GAAG,IAAI,kBAAS,CAAC,CAAC,OAAY,EAAE,MAAW,EAAE,EAAE;oBAC9D,OAAO,CAAC;wBACN,+CAA+C;wBAC/C,SAAS,EAAE,IAAA,SAAI,GAAE;qBAClB,CAAC,CAAC;gBACL,CAAC,CAAC,CAAC;gBACH,OAAO,WAAW,CAAC;YACrB,CAAC,CAAC;YAEF,6CAA6C;YAC7C,6CAA6C;YAC7C,4CAA4C;YAC5C,aAAa;YACb,6CAA6C;YAC7C,gBAAgB,CAAC,MAAM,CAAC,KAAK,GAAG,CAAC,QAAgB,EAAE,OAAY,EAAE,EAAE;gBACjE,aAAa;gBACb,gBAAgB,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;gBAEzC,6CAA6C;gBAC7C,sDAAsD;gBACtD,2CAA2C;gBAC3C,qBAAqB;gBACrB,6CAA6C;gBAC7C,IAAI,OAAO,CAAC,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,+BAA+B,CAAC,EAAE,CAAC;oBAClF,MAAM,SAAS,GAAG,gBAAgB,CAAC,cAAc,EAAE,CAAC;oBACpD,MAAM,SAAS,GAAG,EAAE,CAAC;oBACpB,SAAiB,CAAC,SAAS,CAAC,kCAAkC,CAAC,GAAG,SAAS,CAAC;oBAC7E,OAAO,OAAO,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;gBACpC,CAAC;gBAED,6CAA6C;gBAC7C,gBAAgB;gBAChB,6CAA6C;gBAE7C,eAAe;gBACf,MAAM,MAAM,GAAG,gBAAgB,CAAC,UAAU,EAAE,CAAC;gBAC7C,OAAO,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;YACjC,CAAC,CAAC;YAEF,6CAA6C;YAC7C,kDAAkD;YAClD,kDAAkD;YAClD,6CAA6C;YAC7C,gBAAgB,CAAC,MAAM,CAAC,eAAe,GAAG,CAAC,GAAQ,EAAE,MAAW,EAAE,EAAE;gBAClE,OAAO,GAAG,CAAC;YACb,CAAC,CAAC;YAEF,6CAA6C;YAC7C,2CAA2C;YAC3C,kDAAkD;YAClD,6CAA6C;YAC5C,gBAAwB,CAAC,SAAS,CAAC,CAAC,WAAW,GAAG,CAAC,gBAAuB,EAAE,MAAY,EAAE,EAAE;gBAC3F,OAAO,gBAAgB,KAAK,IAAI,CAAC,CAAC,CAAE,gBAAwB,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC7F,CAAC,CAAC;YAEF,OAAO,gBAAgB,CAAC;QAC1B,CAAC,CAAC;IAiPJ,CAAC;IAnZC;;;;;;;;;;;;;;;;;;;;;;;OAuBG;IACI,KAAK,CAAC,UAAU,CAAC,IAAU,EAAE,aAAgC;QAClE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;QAClF,OAAO,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;IAClC,CAAC;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA6BG;IACI,KAAK,CAAC,QAAQ,CACnB,IAAU,EACV,aAAgC,EAChC,MAAc,EACd,KAAa;QAEb,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,aAAa,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACnF,OAAO,MAAM,CAAC;IAChB,CAAC;IAiGD;;;;OAIG;IACI,kCAAkC,CACvC,6BAAqC,EACrC,SAAkB,EAClB,OAAgB;QAEhB,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC;YACzB,OAAO,iBAAiB,6BAA6B,gCAAgC,CAAC;QACxF,CAAC;QACD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,WAAW,6BAA6B,+BAA+B,CAAC;QACjF,CAAC;QACD,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO,SAAS,6BAA6B,GAAG,CAAC;QACnD,CAAC;QACD,OAAO,6BAA6B,CAAC;IACvC,CAAC;IAED;;;;OAIG;IACI,mBAAmB,CACxB,YAA+B,EAC/B,UAAkB,EAClB,GAAW,EACX,SAAkB,EAClB,OAAgB;QAEhB,IAAI,QAAQ,GAAG,GAAG,CAAC;QACnB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,cAAc,GAAG,SAAS,CAAC;YAC3B,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACxC,CAAC;QACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,cAAc,GAAG,SAAS,CAAC;YAC3B,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,iBAAiB,GAAG,YAAY,CAAC;QACrC,IAAI,cAAc,KAAK,EAAE,IAAI,cAAc,KAAK,EAAE,IAAI,CAAC,SAAS,IAAI,CAAC,OAAO,EAAE,CAAC;YAC7E,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,kCAAkC,CACvD,UAAU,EACV,SAAS,EACT,OAAO,CACR,SAAS,cAAc,GAAG,IAAI,CAAC,kCAAkC,CAChE,GAAG,EACH,SAAS,EACT,OAAO,CACR,GAAG,cAAc,EAAE,CAAC;YACrB,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED;;;;OAIG;IACI,qCAAqC,CAC1C,6BAAqC,EACrC,SAAkB,EAClB,OAAgB;QAEhB,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YAC3B,OAAO,6BAA6B,CAAC;QACvC,CAAC;QAED,IAAI,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;YAC1B,OAAO,SAAS,6BAA6B,GAAG,CAAC;QACnD,CAAC;QAED,6CAA6C;QAC7C,2DAA2D;QAC3D,wEAAwE;QACxE,oEAAoE;QACpE,wBAAwB;QACxB,6CAA6C;QAC7C,MAAM,IAAI,GACR,OAAO;YACP,mCAAmC,6BAA6B,kDAAkD;YAClH,0DAA0D,CAAC;QAE7D,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,SAAS,IAAI,GAAG,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACI,sBAAsB,CAC3B,YAA+B,EAC/B,UAAkB,EAClB,GAAW,EACX,cAAuB,EACvB,aAAsB,EACtB,KAAc;QAEd,IAAI,QAAQ,GAAG,GAAG,CAAC;QACnB,IAAI,cAAc,GAAG,EAAE,CAAC;QACxB,IAAI,cAAc,GAAG,EAAE,CAAC;QAExB,IAAI,cAAc,EAAE,CAAC;YACnB,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,cAAc,GAAG,QAAQ,CAAC;gBAC1B,QAAQ,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACxC,CAAC;YACD,IAAI,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC3B,cAAc,GAAG,QAAQ,CAAC;gBAC1B,QAAQ,GAAG,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;QAED,IAAI,iBAAiB,GAAG,YAAY,CAAC;QACrC,IAAI,cAAc,KAAK,EAAE,IAAI,cAAc,KAAK,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/E,iBAAiB,GAAG,iBAAiB,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,MAAM,MAAM,GAAG,GAAG,IAAI,CAAC,qCAAqC,CAC1D,UAAU,EACV,aAAa,EACb,KAAK,CACN,SAAS,cAAc,GAAG,IAAI,CAAC,qCAAqC,CACnE,GAAG,EACH,aAAa,EACb,KAAK,CACN,GAAG,cAAc,EAAE,CAAC;YACrB,iBAAiB,GAAG,iBAAiB,CAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACnE,CAAC;QAED,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,oBAAoB,CAClC,IAAU,EACV,aAAgC,EAChC,MAAc,EACd,KAAa,EACb,cAAc,GAAG,KAAK;QAEtB,kEAAkE;QAClE,IAAI,CAAC,aAAa,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAC9D,CAAC;QAED,IAAK,aAAqB,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CACb,6FAA6F,CAC9F,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,GAAG,MAAM,CAAC;QACzB,IAAI,CAAC,qBAAK,CAAC,cAAc,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,mBAAmB,WAAW,2BAA2B,CAAC,CAAC;YACxE,WAAW,GAAG,CAAC,CAAC;QAClB,CAAC;QACD,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC;QAClC,IAAI,UAAU,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,qBAAK,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,KAAK,CAAC,kBAAkB,UAAU,2BAA2B,CAAC,CAAC;YACtE,UAAU,GAAG,CAAC,CAAC;QACjB,CAAC;QACD,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC;QAEhC,6CAA6C;QAC7C,yCAAyC;QACzC,iDAAiD;QACjD,0DAA0D;QAC1D,mBAAmB;QACnB,6CAA6C;QAC7C,IAAI,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,SAAS,CAAC,kCAAkC,EAAE,CAAC,CAAC;QACtF,MAAM,OAAO,GAAQ,EAAE,CAAC;QACxB,OAAO,CAAC,SAAS,CAAC,+BAA+B,CAAC,GAAG,IAAI,CAAC;QAC1D,YAAY,GAAG,YAAY,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAE7C,6CAA6C;QAC7C,iCAAiC;QACjC,2CAA2C;QAC3C,oCAAoC;QACpC,6CAA6C;QAC7C,MAAM,qBAAqB,GAAsB,aAAa,CAAC,KAAK,EAAE,CAAC;QACvE,OAAQ,qBAA6B,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC;QACxD,OAAQ,qBAA6B,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC;QACvD,IAAK,qBAA6B,CAAC,aAAa,CAAC,EAAE,CAAC;YAClD,MAAM,oBAAoB,GAAG,EAAE,CAAC;YAChC,KAAK,MAAM,SAAS,IAAK,qBAA6B,CAAC,aAAa,CAAC,EAAE,CAAC;gBACtE,IAAI,SAAS,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;oBACnC,oBAAoB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACvC,CAAC;YACH,CAAC;YACA,qBAA6B,CAAC,aAAa,CAAC,GAAG,oBAAoB,CAAC;QACvE,CAAC;QACD,YAAY,GAAG,YAAY,CAAC,IAAI,CAAC,qBAAqB,CAAC,EAAE,CAAC,UAAU,CAAQ,CAAC,CAAC;QAE9E,6CAA6C;QAC7C,+CAA+C;QAC/C,0BAA0B;QAC1B,gDAAgD;QAChD,gCAAgC;QAChC,qDAAqD;QACrD,6CAA6C;QAC7C,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,SAAS,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAE5E,IAAI,IAAW,CAAC;QAChB,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,IAAI,GAAG,MAAM,aAAa,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACnE,CAAC;QAED,MAAM,MAAM,GAA0B;YACpC,KAAK,EAAE,IAAI;YACX,MAAM,EAAE;gBACN,UAAU;gBACV,KAAK,EAAE,UAAU;gBACjB,MAAM,EAAE,WAAW;aACpB;SACF,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;;AAtZH,8BAuZC;AAtZkB,4CAAkC,GAAG,OAAO,AAAV,CAAW;AAC7C,yCAA+B,GAAG,qBAAqB,AAAxB,CAAyB;AAsZ9D,QAAA,SAAS,GAAc,IAAI,SAAS,EAAE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=knexUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"knexUtils.test.d.ts","sourceRoot":"","sources":["../../src/knexUtils.test.ts"],"names":[],"mappings":""}