@stamhoofd/sql 2.83.5 → 2.84.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 (176) hide show
  1. package/dist/index.d.ts +1 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +9 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/src/QueryableModel.d.ts +1 -0
  6. package/dist/src/QueryableModel.d.ts.map +1 -1
  7. package/dist/src/QueryableModel.js +20 -2
  8. package/dist/src/QueryableModel.js.map +1 -1
  9. package/dist/src/SQL.d.ts +9 -16
  10. package/dist/src/SQL.d.ts.map +1 -1
  11. package/dist/src/SQL.js +16 -13
  12. package/dist/src/SQL.js.map +1 -1
  13. package/dist/src/SQLDelete.d.ts +2 -2
  14. package/dist/src/SQLDelete.d.ts.map +1 -1
  15. package/dist/src/SQLDelete.js +13 -3
  16. package/dist/src/SQLDelete.js.map +1 -1
  17. package/dist/src/SQLExpression.d.ts +3 -0
  18. package/dist/src/SQLExpression.d.ts.map +1 -1
  19. package/dist/src/SQLExpression.js.map +1 -1
  20. package/dist/src/SQLExpressions.d.ts +17 -6
  21. package/dist/src/SQLExpressions.d.ts.map +1 -1
  22. package/dist/src/SQLExpressions.js +20 -12
  23. package/dist/src/SQLExpressions.js.map +1 -1
  24. package/dist/src/SQLJoin.d.ts +3 -3
  25. package/dist/src/SQLJoin.d.ts.map +1 -1
  26. package/dist/src/SQLJoin.js +5 -1
  27. package/dist/src/SQLJoin.js.map +1 -1
  28. package/dist/src/SQLJsonExpressions.d.ts +22 -0
  29. package/dist/src/SQLJsonExpressions.d.ts.map +1 -1
  30. package/dist/src/SQLJsonExpressions.js +56 -4
  31. package/dist/src/SQLJsonExpressions.js.map +1 -1
  32. package/dist/src/SQLSelect.d.ts +10 -4
  33. package/dist/src/SQLSelect.d.ts.map +1 -1
  34. package/dist/src/SQLSelect.js +25 -11
  35. package/dist/src/SQLSelect.js.map +1 -1
  36. package/dist/src/SQLWhere.d.ts +29 -1
  37. package/dist/src/SQLWhere.d.ts.map +1 -1
  38. package/dist/src/SQLWhere.js +181 -12
  39. package/dist/src/SQLWhere.js.map +1 -1
  40. package/dist/src/filters/SQLFilter.d.ts +1 -0
  41. package/dist/src/filters/SQLFilter.d.ts.map +1 -1
  42. package/dist/src/filters/SQLFilter.js +8 -0
  43. package/dist/src/filters/SQLFilter.js.map +1 -1
  44. package/dist/src/filters/modern/SQLModernFilter.d.ts +73 -0
  45. package/dist/src/filters/modern/SQLModernFilter.d.ts.map +1 -0
  46. package/dist/src/filters/modern/SQLModernFilter.js +200 -0
  47. package/dist/src/filters/modern/SQLModernFilter.js.map +1 -0
  48. package/dist/src/filters/modern/compilers/contains.d.ts +4 -0
  49. package/dist/src/filters/modern/compilers/contains.d.ts.map +1 -0
  50. package/dist/src/filters/modern/compilers/contains.js +28 -0
  51. package/dist/src/filters/modern/compilers/contains.js.map +1 -0
  52. package/dist/src/filters/modern/compilers/equals.d.ts +4 -0
  53. package/dist/src/filters/modern/compilers/equals.d.ts.map +1 -0
  54. package/dist/src/filters/modern/compilers/equals.js +46 -0
  55. package/dist/src/filters/modern/compilers/equals.js.map +1 -0
  56. package/dist/src/filters/modern/compilers/greater.d.ts +4 -0
  57. package/dist/src/filters/modern/compilers/greater.d.ts.map +1 -0
  58. package/dist/src/filters/modern/compilers/greater.js +17 -0
  59. package/dist/src/filters/modern/compilers/greater.js.map +1 -0
  60. package/dist/src/filters/modern/compilers/in.d.ts +4 -0
  61. package/dist/src/filters/modern/compilers/in.d.ts.map +1 -0
  62. package/dist/src/filters/modern/compilers/in.js +50 -0
  63. package/dist/src/filters/modern/compilers/in.js.map +1 -0
  64. package/dist/src/filters/modern/compilers/index.d.ts +5 -0
  65. package/dist/src/filters/modern/compilers/index.d.ts.map +1 -0
  66. package/dist/src/filters/modern/compilers/index.js +8 -0
  67. package/dist/src/filters/modern/compilers/index.js.map +1 -0
  68. package/dist/src/filters/modern/compilers/less.d.ts +4 -0
  69. package/dist/src/filters/modern/compilers/less.d.ts.map +1 -0
  70. package/dist/src/filters/modern/compilers/less.js +17 -0
  71. package/dist/src/filters/modern/compilers/less.js.map +1 -0
  72. package/dist/src/filters/modern/helpers/isJSONColumn.d.ts +4 -0
  73. package/dist/src/filters/modern/helpers/isJSONColumn.d.ts.map +1 -0
  74. package/dist/src/filters/modern/helpers/isJSONColumn.js +16 -0
  75. package/dist/src/filters/modern/helpers/isJSONColumn.js.map +1 -0
  76. package/dist/src/filters/modern/helpers/normalizeCompareValue.d.ts +9 -0
  77. package/dist/src/filters/modern/helpers/normalizeCompareValue.d.ts.map +1 -0
  78. package/dist/src/filters/modern/helpers/normalizeCompareValue.js +82 -0
  79. package/dist/src/filters/modern/helpers/normalizeCompareValue.js.map +1 -0
  80. package/dist/tests/filters/$and.test.d.ts +2 -0
  81. package/dist/tests/filters/$and.test.d.ts.map +1 -0
  82. package/dist/tests/filters/$and.test.js +185 -0
  83. package/dist/tests/filters/$and.test.js.map +1 -0
  84. package/dist/tests/filters/$contains.test.d.ts +2 -0
  85. package/dist/tests/filters/$contains.test.d.ts.map +1 -0
  86. package/dist/tests/filters/$contains.test.js +701 -0
  87. package/dist/tests/filters/$contains.test.js.map +1 -0
  88. package/dist/tests/filters/$eq.test.d.ts +2 -0
  89. package/dist/tests/filters/$eq.test.d.ts.map +1 -0
  90. package/dist/tests/filters/$eq.test.js +986 -0
  91. package/dist/tests/filters/$eq.test.js.map +1 -0
  92. package/dist/tests/filters/$gt.test.d.ts +2 -0
  93. package/dist/tests/filters/$gt.test.d.ts.map +1 -0
  94. package/dist/tests/filters/$gt.test.js +463 -0
  95. package/dist/tests/filters/$gt.test.js.map +1 -0
  96. package/dist/tests/filters/$gte.test.d.ts +2 -0
  97. package/dist/tests/filters/$gte.test.d.ts.map +1 -0
  98. package/dist/tests/filters/$gte.test.js +433 -0
  99. package/dist/tests/filters/$gte.test.js.map +1 -0
  100. package/dist/tests/filters/$in.test.d.ts +2 -0
  101. package/dist/tests/filters/$in.test.d.ts.map +1 -0
  102. package/dist/tests/filters/$in.test.js +590 -0
  103. package/dist/tests/filters/$in.test.js.map +1 -0
  104. package/dist/tests/filters/$lt.test.d.ts +2 -0
  105. package/dist/tests/filters/$lt.test.d.ts.map +1 -0
  106. package/dist/tests/filters/$lt.test.js +433 -0
  107. package/dist/tests/filters/$lt.test.js.map +1 -0
  108. package/dist/tests/filters/$lte.test.d.ts +2 -0
  109. package/dist/tests/filters/$lte.test.d.ts.map +1 -0
  110. package/dist/tests/filters/$lte.test.js +472 -0
  111. package/dist/tests/filters/$lte.test.js.map +1 -0
  112. package/dist/tests/filters/$neq.test.d.ts +2 -0
  113. package/dist/tests/filters/$neq.test.d.ts.map +1 -0
  114. package/dist/tests/filters/$neq.test.js +32 -0
  115. package/dist/tests/filters/$neq.test.js.map +1 -0
  116. package/dist/tests/filters/$not.test.d.ts +2 -0
  117. package/dist/tests/filters/$not.test.d.ts.map +1 -0
  118. package/dist/tests/filters/$not.test.js +50 -0
  119. package/dist/tests/filters/$not.test.js.map +1 -0
  120. package/dist/tests/filters/$or.test.d.ts +2 -0
  121. package/dist/tests/filters/$or.test.d.ts.map +1 -0
  122. package/dist/tests/filters/$or.test.js +185 -0
  123. package/dist/tests/filters/$or.test.js.map +1 -0
  124. package/dist/tests/filters/dot-syntax.test.d.ts +2 -0
  125. package/dist/tests/filters/dot-syntax.test.d.ts.map +1 -0
  126. package/dist/tests/filters/dot-syntax.test.js +210 -0
  127. package/dist/tests/filters/dot-syntax.test.js.map +1 -0
  128. package/dist/tests/filters/exists.test.d.ts +2 -0
  129. package/dist/tests/filters/exists.test.d.ts.map +1 -0
  130. package/dist/tests/filters/exists.test.js +106 -0
  131. package/dist/tests/filters/exists.test.js.map +1 -0
  132. package/dist/tests/filters/joined-relations.test.d.ts +2 -0
  133. package/dist/tests/filters/joined-relations.test.d.ts.map +1 -0
  134. package/dist/tests/filters/joined-relations.test.js +167 -0
  135. package/dist/tests/filters/joined-relations.test.js.map +1 -0
  136. package/dist/tests/filters/special-cases.test.d.ts +2 -0
  137. package/dist/tests/filters/special-cases.test.d.ts.map +1 -0
  138. package/dist/tests/filters/special-cases.test.js +114 -0
  139. package/dist/tests/filters/special-cases.test.js.map +1 -0
  140. package/dist/tests/filters/wildcard.test.d.ts +2 -0
  141. package/dist/tests/filters/wildcard.test.d.ts.map +1 -0
  142. package/dist/tests/filters/wildcard.test.js +67 -0
  143. package/dist/tests/filters/wildcard.test.js.map +1 -0
  144. package/dist/tests/jest.global.setup.d.ts +3 -0
  145. package/dist/tests/jest.global.setup.d.ts.map +1 -0
  146. package/dist/tests/jest.global.setup.js +7 -0
  147. package/dist/tests/jest.global.setup.js.map +1 -0
  148. package/dist/tests/jest.setup.d.ts +2 -0
  149. package/dist/tests/jest.setup.d.ts.map +1 -0
  150. package/dist/tests/jest.setup.js +5 -0
  151. package/dist/tests/jest.setup.js.map +1 -0
  152. package/dist/tests/utils/index.d.ts +57 -0
  153. package/dist/tests/utils/index.d.ts.map +1 -0
  154. package/dist/tests/utils/index.js +206 -0
  155. package/dist/tests/utils/index.js.map +1 -0
  156. package/dist/tsconfig.tsbuildinfo +1 -1
  157. package/package.json +4 -3
  158. package/src/QueryableModel.ts +22 -2
  159. package/src/SQL.ts +21 -30
  160. package/src/SQLDelete.ts +26 -15
  161. package/src/SQLExpression.ts +4 -0
  162. package/src/SQLExpressions.ts +23 -14
  163. package/src/SQLJoin.ts +8 -4
  164. package/src/SQLJsonExpressions.ts +65 -4
  165. package/src/SQLSelect.ts +31 -15
  166. package/src/SQLWhere.ts +208 -13
  167. package/src/filters/SQLFilter.ts +8 -0
  168. package/src/filters/modern/SQLModernFilter.ts +256 -0
  169. package/src/filters/modern/compilers/contains.ts +43 -0
  170. package/src/filters/modern/compilers/equals.ts +72 -0
  171. package/src/filters/modern/compilers/greater.ts +20 -0
  172. package/src/filters/modern/compilers/in.ts +62 -0
  173. package/src/filters/modern/compilers/index.ts +4 -0
  174. package/src/filters/modern/compilers/less.ts +19 -0
  175. package/src/filters/modern/helpers/isJSONColumn.ts +13 -0
  176. package/src/filters/modern/helpers/normalizeCompareValue.ts +95 -0
@@ -0,0 +1,986 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const SQLModernFilter_1 = require("../../src/filters/modern/SQLModernFilter");
4
+ const SQL_1 = require("../../src/SQL");
5
+ const utils_1 = require("../utils");
6
+ describe('$eq', () => {
7
+ /**
8
+ * Tests that should be repeated for all filter types
9
+ */
10
+ describe('Common checks', () => {
11
+ it('Cannot be used at the root level', async () => {
12
+ const filters = {
13
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
14
+ };
15
+ await (0, utils_1.testMultipleErrors)({
16
+ testFilters: [
17
+ {
18
+ $eq: 'value',
19
+ },
20
+ {
21
+ $and: [
22
+ {
23
+ $eq: 'value',
24
+ },
25
+ ],
26
+ },
27
+ 'value',
28
+ ],
29
+ filters,
30
+ error: 'Cannot compare at root level',
31
+ });
32
+ });
33
+ });
34
+ it('removes caps when filtering strings', async () => {
35
+ const filters = {
36
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
37
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
38
+ };
39
+ // Caps are removed
40
+ await (0, utils_1.test)({
41
+ filter: {
42
+ name: {
43
+ $eq: 'John Doe',
44
+ },
45
+ },
46
+ filters,
47
+ query: {
48
+ query: '`default`.`name` = ?',
49
+ params: ['john doe'],
50
+ },
51
+ });
52
+ });
53
+ it('converts true to 1', async () => {
54
+ const filters = {
55
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
56
+ enabled: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('enabled'), type: SQLModernFilter_1.SQLModernValueType.Boolean, nullable: false }),
57
+ };
58
+ await (0, utils_1.testMultiple)({
59
+ testFilters: [
60
+ {
61
+ enabled: true,
62
+ },
63
+ {
64
+ enabled: {
65
+ $eq: true,
66
+ },
67
+ },
68
+ ],
69
+ filters,
70
+ query: {
71
+ query: '`default`.`enabled` = ?',
72
+ params: [1],
73
+ },
74
+ });
75
+ });
76
+ it('converts false to 0', async () => {
77
+ const filters = {
78
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
79
+ enabled: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('enabled'), type: SQLModernFilter_1.SQLModernValueType.Boolean, nullable: false }),
80
+ };
81
+ await (0, utils_1.testMultiple)({
82
+ testFilters: [
83
+ {
84
+ enabled: false,
85
+ },
86
+ {
87
+ enabled: {
88
+ $eq: false,
89
+ },
90
+ },
91
+ ],
92
+ filters,
93
+ query: {
94
+ query: '`default`.`enabled` = ?',
95
+ params: [0],
96
+ },
97
+ });
98
+ });
99
+ it('allows 1 as true', async () => {
100
+ const filters = {
101
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
102
+ enabled: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('enabled'), type: SQLModernFilter_1.SQLModernValueType.Boolean, nullable: false }),
103
+ };
104
+ await (0, utils_1.testMultiple)({
105
+ testFilters: [
106
+ {
107
+ enabled: 1,
108
+ },
109
+ {
110
+ enabled: {
111
+ $eq: 1,
112
+ },
113
+ },
114
+ ],
115
+ filters,
116
+ query: {
117
+ query: '`default`.`enabled` = ?',
118
+ params: [1],
119
+ },
120
+ });
121
+ });
122
+ it('allows 0 as false', async () => {
123
+ const filters = {
124
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
125
+ enabled: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('enabled'), type: SQLModernFilter_1.SQLModernValueType.Boolean, nullable: false }),
126
+ };
127
+ await (0, utils_1.testMultiple)({
128
+ testFilters: [
129
+ {
130
+ enabled: 0,
131
+ },
132
+ {
133
+ enabled: {
134
+ $eq: 0,
135
+ },
136
+ },
137
+ ],
138
+ filters,
139
+ query: {
140
+ query: '`default`.`enabled` = ?',
141
+ params: [0],
142
+ },
143
+ });
144
+ });
145
+ it('does not allow numbers as boolean value', async () => {
146
+ const filters = {
147
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
148
+ enabled: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('enabled'), type: SQLModernFilter_1.SQLModernValueType.Boolean, nullable: false }),
149
+ };
150
+ await (0, utils_1.testMultipleErrors)({
151
+ testFilters: [
152
+ {
153
+ enabled: 2,
154
+ },
155
+ {
156
+ enabled: {
157
+ $eq: 2,
158
+ },
159
+ },
160
+ {
161
+ enabled: {
162
+ $eq: -1,
163
+ },
164
+ },
165
+ {
166
+ enabled: {
167
+ $eq: NaN,
168
+ },
169
+ },
170
+ {
171
+ enabled: {
172
+ $eq: Infinity,
173
+ },
174
+ },
175
+ ],
176
+ filters,
177
+ error: 'Cannot compare a number with a boolean column',
178
+ });
179
+ });
180
+ it('cannot compare a number with a string', async () => {
181
+ const filters = {
182
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
183
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
184
+ };
185
+ await (0, utils_1.testError)({
186
+ filter: {
187
+ name: {
188
+ $eq: 5,
189
+ },
190
+ },
191
+ filters,
192
+ error: 'Cannot compare a number with a non-number column',
193
+ });
194
+ });
195
+ it('cannot compare a string with a number', async () => {
196
+ const filters = {
197
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
198
+ age: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('age'), type: SQLModernFilter_1.SQLModernValueType.Number, nullable: false }),
199
+ };
200
+ await (0, utils_1.testError)({
201
+ filter: {
202
+ age: {
203
+ $eq: 'John Doe',
204
+ },
205
+ },
206
+ filters,
207
+ error: 'Cannot compare a string with a non-string column',
208
+ });
209
+ });
210
+ it('cannot compare a number with a date', async () => {
211
+ const filters = {
212
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
213
+ createdAt: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('createdAt'), type: SQLModernFilter_1.SQLModernValueType.Datetime, nullable: false }),
214
+ };
215
+ await (0, utils_1.testError)({
216
+ filter: {
217
+ createdAt: {
218
+ $eq: 5,
219
+ },
220
+ },
221
+ filters,
222
+ error: 'Cannot compare a number with a non-number column',
223
+ });
224
+ });
225
+ it('cannot compare a date with a string', async () => {
226
+ const filters = {
227
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
228
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
229
+ };
230
+ await (0, utils_1.testError)({
231
+ filter: {
232
+ name: {
233
+ $eq: new Date(),
234
+ },
235
+ },
236
+ filters,
237
+ error: 'Cannot compare a date with a non-datetime column',
238
+ });
239
+ });
240
+ it('cannot compare a date magic variable with a string', async () => {
241
+ const filters = {
242
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
243
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
244
+ };
245
+ await (0, utils_1.testError)({
246
+ filter: {
247
+ name: {
248
+ $eq: {
249
+ $: '$now',
250
+ },
251
+ },
252
+ },
253
+ filters,
254
+ error: 'Cannot compare a date with a non-datetime column',
255
+ });
256
+ });
257
+ it('$eq filter is interpreted automatically for numbers', async () => {
258
+ const filters = {
259
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
260
+ age: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('age'), type: SQLModernFilter_1.SQLModernValueType.Number, nullable: false }),
261
+ };
262
+ await (0, utils_1.test)({
263
+ filter: {
264
+ age: 5,
265
+ },
266
+ filters,
267
+ query: {
268
+ query: '`default`.`age` = ?',
269
+ params: [5],
270
+ },
271
+ });
272
+ });
273
+ it('$eq filter is interpreted automatically for strings', async () => {
274
+ const filters = {
275
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
276
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: false }),
277
+ };
278
+ await (0, utils_1.test)({
279
+ filter: {
280
+ name: 'John Doe',
281
+ },
282
+ filters,
283
+ query: {
284
+ query: '`default`.`name` = ?',
285
+ params: ['john doe'],
286
+ },
287
+ });
288
+ });
289
+ it('$eq filter is interpreted automatically for null', async () => {
290
+ const filters = {
291
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
292
+ name: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('name'), type: SQLModernFilter_1.SQLModernValueType.String, nullable: true }),
293
+ };
294
+ await (0, utils_1.test)({
295
+ filter: {
296
+ name: null,
297
+ },
298
+ filters,
299
+ query: {
300
+ query: '`default`.`name` IS NULL',
301
+ params: [],
302
+ },
303
+ });
304
+ });
305
+ it('$eq filter is interpreted automatically for magic variables', async () => {
306
+ const filters = {
307
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
308
+ createdAt: (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('createdAt'), type: SQLModernFilter_1.SQLModernValueType.Datetime, nullable: false }),
309
+ };
310
+ await (0, utils_1.test)({
311
+ filter: {
312
+ createdAt: {
313
+ $: '$now',
314
+ },
315
+ },
316
+ filters,
317
+ query: {
318
+ query: '`default`.`createdAt` = ?',
319
+ params: [
320
+ new Date(),
321
+ ],
322
+ },
323
+ });
324
+ });
325
+ describe('JSON', () => {
326
+ const tableDefinition = {
327
+ settings: {
328
+ type: 'json',
329
+ nullable: true,
330
+ },
331
+ };
332
+ const filters = {
333
+ ...SQLModernFilter_1.baseModernSQLFilterCompilers,
334
+ 'settings.name': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.name'), type: SQLModernFilter_1.SQLModernValueType.JSONString, nullable: false }),
335
+ // wip:
336
+ 'settings.parents[*].name': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.parents[*].name'), type: SQLModernFilter_1.SQLModernValueType.JSONArray, nullable: false }),
337
+ 'settings.parents[*].age': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.parents[*].age'), type: SQLModernFilter_1.SQLModernValueType.JSONArray, nullable: false }),
338
+ 'settings.randomValues': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.randomValues'), type: SQLModernFilter_1.SQLModernValueType.JSONArray, nullable: true }),
339
+ 'settings': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.column('settings'), type: SQLModernFilter_1.SQLModernValueType.JSONObject, nullable: true }),
340
+ 'settings.enabled': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.enabled'), type: SQLModernFilter_1.SQLModernValueType.JSONBoolean, nullable: true }),
341
+ 'settings.age': (0, SQLModernFilter_1.createColumnFilter)({ expression: SQL_1.SQL.jsonValue(SQL_1.SQL.column('settings'), '$.age'), type: SQLModernFilter_1.SQLModernValueType.JSONNumber, nullable: true }),
342
+ };
343
+ it('JSON strings match case insensitive and whole string', async () => {
344
+ await (0, utils_1.testMatch)({
345
+ tableDefinition,
346
+ filters,
347
+ rows: [
348
+ {
349
+ settings: {
350
+ name: 'John Doe',
351
+ },
352
+ },
353
+ ],
354
+ doMatch: [
355
+ {
356
+ 'settings.name': 'John Doe',
357
+ },
358
+ {
359
+ 'settings.name': {
360
+ $eq: 'John Doe',
361
+ },
362
+ },
363
+ {
364
+ 'settings.name': 'john doe',
365
+ },
366
+ {
367
+ 'settings.name': 'jOhn dOe',
368
+ },
369
+ ],
370
+ doNotMatch: [
371
+ {
372
+ 'settings.name': 'Jane Doe',
373
+ },
374
+ {
375
+ 'settings.name': 'John',
376
+ },
377
+ {
378
+ 'settings.name': 'john',
379
+ },
380
+ ],
381
+ });
382
+ });
383
+ it('Can search strings in a string array', async () => {
384
+ await (0, utils_1.testMatch)({
385
+ tableDefinition,
386
+ filters,
387
+ rows: [
388
+ {
389
+ settings: {
390
+ name: 'Junior Doe',
391
+ parents: [
392
+ { name: 'John Doe' },
393
+ { name: 'Jane Doe' },
394
+ ],
395
+ },
396
+ },
397
+ ],
398
+ doMatch: [
399
+ {
400
+ 'settings.parents[*].name': 'John Doe',
401
+ },
402
+ {
403
+ 'settings.parents[*].name': 'Jane Doe',
404
+ },
405
+ {
406
+ 'settings.parents[*].name': 'jane doe',
407
+ },
408
+ {
409
+ 'settings.parents[*].name': 'john doe',
410
+ },
411
+ ],
412
+ doNotMatch: [
413
+ {
414
+ 'settings.parents[*].name': 'John',
415
+ },
416
+ {
417
+ 'settings.parents[*].name': 'Jane',
418
+ },
419
+ {
420
+ 'settings.parents[*].name': 'jane',
421
+ },
422
+ {
423
+ 'settings.parents[*].name': 'john',
424
+ },
425
+ {
426
+ 'settings.parents[*].name': 'Jane Doe ',
427
+ },
428
+ {
429
+ 'settings.parents[*].name': 5,
430
+ },
431
+ {
432
+ 'settings.parents[*].name': true,
433
+ },
434
+ ],
435
+ });
436
+ });
437
+ it('Can search numbers in a number array', async () => {
438
+ await (0, utils_1.testMatch)({
439
+ tableDefinition,
440
+ filters,
441
+ rows: [
442
+ {
443
+ settings: {
444
+ name: 'Junior Doe',
445
+ parents: [
446
+ { name: 'John Doe', age: 50 },
447
+ { name: 'Jane Doe', age: 45 },
448
+ ],
449
+ },
450
+ },
451
+ ],
452
+ doMatch: [
453
+ {
454
+ 'settings.parents[*].age': 50,
455
+ },
456
+ {
457
+ 'settings.parents[*].age': 45,
458
+ },
459
+ ],
460
+ doNotMatch: [
461
+ {
462
+ 'settings.parents[*].age': 51,
463
+ },
464
+ {
465
+ 'settings.parents[*].age': 49,
466
+ },
467
+ {
468
+ 'settings.parents[*].age': 45.1,
469
+ },
470
+ {
471
+ 'settings.parents[*].age': '49',
472
+ },
473
+ {
474
+ 'settings.parents[*].age': 'test',
475
+ },
476
+ ],
477
+ });
478
+ });
479
+ it('Can search in a mixed array', async () => {
480
+ await (0, utils_1.testMatch)({
481
+ tableDefinition,
482
+ filters,
483
+ rows: [
484
+ {
485
+ settings: {
486
+ name: 'Junior Doe',
487
+ randomValues: [true, 0, 'tesT'],
488
+ },
489
+ },
490
+ ],
491
+ doMatch: [
492
+ {
493
+ 'settings.randomValues': true,
494
+ },
495
+ {
496
+ 'settings.randomValues': 0,
497
+ },
498
+ {
499
+ 'settings.randomValues': 'tesT',
500
+ },
501
+ {
502
+ 'settings.randomValues': 'Test',
503
+ },
504
+ ],
505
+ doNotMatch: [
506
+ {
507
+ 'settings.randomValues': false,
508
+ },
509
+ {
510
+ 'settings.randomValues': 1,
511
+ },
512
+ {
513
+ 'settings.randomValues': 'tes',
514
+ },
515
+ ],
516
+ });
517
+ });
518
+ it('Can search null in a JSON array', async () => {
519
+ await (0, utils_1.testMatch)({
520
+ tableDefinition,
521
+ filters,
522
+ rows: [
523
+ {
524
+ settings: {
525
+ name: 'Junior Doe',
526
+ parents: [
527
+ { name: null, age: 50 },
528
+ { name: 'Jane Doe', age: null },
529
+ ],
530
+ },
531
+ },
532
+ ],
533
+ doMatch: [
534
+ {
535
+ 'settings.parents[*].age': null,
536
+ },
537
+ {
538
+ 'settings.parents[*].name': null,
539
+ },
540
+ ],
541
+ });
542
+ await (0, utils_1.testMatch)({
543
+ tableDefinition,
544
+ filters,
545
+ rows: [
546
+ {
547
+ settings: {
548
+ name: 'Junior Doe',
549
+ parents: [
550
+ { name: 'Set', age: 50 },
551
+ { name: 'Jane Doe', age: 45 },
552
+ ],
553
+ },
554
+ },
555
+ ],
556
+ doNotMatch: [
557
+ {
558
+ 'settings.parents[*].age': null,
559
+ },
560
+ {
561
+ 'settings.parents[*].name': null,
562
+ },
563
+ ],
564
+ });
565
+ });
566
+ it('Can check JSON booleans', async () => {
567
+ await (0, utils_1.testMatch)({
568
+ tableDefinition,
569
+ filters,
570
+ rows: [
571
+ {
572
+ settings: {
573
+ enabled: true,
574
+ },
575
+ },
576
+ ],
577
+ doMatch: [
578
+ {
579
+ 'settings.enabled': true,
580
+ },
581
+ {
582
+ 'settings.enabled': 1,
583
+ },
584
+ ],
585
+ doNotMatch: [
586
+ {
587
+ 'settings.enabled': false,
588
+ },
589
+ {
590
+ 'settings.enabled': null,
591
+ },
592
+ ],
593
+ });
594
+ await (0, utils_1.testMatch)({
595
+ tableDefinition,
596
+ filters,
597
+ rows: [
598
+ {
599
+ settings: {
600
+ enabled: false,
601
+ },
602
+ },
603
+ ],
604
+ doMatch: [
605
+ {
606
+ 'settings.enabled': false,
607
+ },
608
+ {
609
+ 'settings.enabled': 0,
610
+ },
611
+ ],
612
+ doNotMatch: [
613
+ {
614
+ 'settings.enabled': true,
615
+ },
616
+ {
617
+ 'settings.enabled': null,
618
+ },
619
+ ],
620
+ });
621
+ await (0, utils_1.testMatch)({
622
+ tableDefinition,
623
+ filters,
624
+ rows: [
625
+ {
626
+ settings: {
627
+ enabled: null,
628
+ },
629
+ },
630
+ {
631
+ settings: {},
632
+ },
633
+ {
634
+ settings: null,
635
+ },
636
+ {
637
+ settings: 'null',
638
+ },
639
+ ],
640
+ doMatch: [
641
+ {
642
+ 'settings.enabled': null,
643
+ },
644
+ ],
645
+ doNotMatch: [
646
+ {
647
+ 'settings.enabled': true,
648
+ },
649
+ {
650
+ 'settings.enabled': false,
651
+ },
652
+ ],
653
+ });
654
+ });
655
+ it('Can compare JSON numbers', async () => {
656
+ await (0, utils_1.testMatch)({
657
+ tableDefinition,
658
+ filters,
659
+ rows: [
660
+ {
661
+ settings: {
662
+ age: 10,
663
+ },
664
+ },
665
+ ],
666
+ doMatch: [
667
+ {
668
+ 'settings.age': 10,
669
+ },
670
+ ],
671
+ doNotMatch: [
672
+ {
673
+ 'settings.age': 11,
674
+ },
675
+ {
676
+ 'settings.age': 9,
677
+ },
678
+ ],
679
+ });
680
+ await (0, utils_1.testMatch)({
681
+ tableDefinition,
682
+ filters,
683
+ rows: [
684
+ {
685
+ settings: {
686
+ age: null,
687
+ },
688
+ },
689
+ {
690
+ settings: {},
691
+ },
692
+ {
693
+ settings: null,
694
+ },
695
+ {
696
+ settings: 'null',
697
+ },
698
+ ],
699
+ doMatch: [
700
+ {
701
+ 'settings.age': null,
702
+ },
703
+ ],
704
+ doNotMatch: [
705
+ {
706
+ 'settings.age': 0,
707
+ },
708
+ ],
709
+ });
710
+ await (0, utils_1.testMatch)({
711
+ tableDefinition,
712
+ filters,
713
+ rows: [
714
+ {
715
+ settings: {
716
+ enabled: null,
717
+ },
718
+ },
719
+ {
720
+ settings: {},
721
+ },
722
+ {
723
+ settings: null,
724
+ },
725
+ {
726
+ settings: 'null',
727
+ },
728
+ ],
729
+ doMatch: [
730
+ {
731
+ 'settings.enabled': null,
732
+ },
733
+ ],
734
+ doNotMatch: [
735
+ {
736
+ 'settings.enabled': true,
737
+ },
738
+ {
739
+ 'settings.enabled': false,
740
+ },
741
+ ],
742
+ });
743
+ });
744
+ it('Checking a json value for null also matches if the key does not exist', async () => {
745
+ await (0, utils_1.testMatch)({
746
+ tableDefinition,
747
+ filters,
748
+ rows: [
749
+ {
750
+ settings: null,
751
+ },
752
+ {
753
+ settings: {
754
+ something: false,
755
+ },
756
+ },
757
+ {
758
+ settings: {
759
+ name: null,
760
+ },
761
+ },
762
+ {
763
+ settings: {
764
+ parents: [
765
+ { name: null },
766
+ ],
767
+ },
768
+ },
769
+ {
770
+ settings: {
771
+ parents: [
772
+ { age: null },
773
+ ],
774
+ },
775
+ },
776
+ ],
777
+ doMatch: [
778
+ {
779
+ 'settings.name': null,
780
+ },
781
+ {
782
+ 'settings.parents[*].age': null,
783
+ },
784
+ {
785
+ 'settings.parents[*].name': null,
786
+ },
787
+ ],
788
+ });
789
+ });
790
+ it('Can check if a json string is null', async () => {
791
+ await (0, utils_1.testMatch)({
792
+ tableDefinition,
793
+ filters,
794
+ rows: [
795
+ {
796
+ settings: {
797
+ name: null,
798
+ },
799
+ },
800
+ {
801
+ settings: null,
802
+ },
803
+ {
804
+ settings: {},
805
+ },
806
+ ],
807
+ doMatch: [
808
+ {
809
+ 'settings.name': null,
810
+ },
811
+ ],
812
+ });
813
+ });
814
+ it('Can check if a json number is null', async () => {
815
+ await (0, utils_1.testMatch)({
816
+ tableDefinition,
817
+ filters,
818
+ rows: [
819
+ {
820
+ settings: {
821
+ age: null,
822
+ },
823
+ },
824
+ {
825
+ settings: null,
826
+ },
827
+ {
828
+ settings: {},
829
+ },
830
+ ],
831
+ doMatch: [
832
+ {
833
+ 'settings.age': null,
834
+ },
835
+ ],
836
+ });
837
+ });
838
+ it('Can differentiate null string vs json null when comparing to null', async () => {
839
+ await (0, utils_1.testMatch)({
840
+ tableDefinition,
841
+ filters,
842
+ rows: [
843
+ {
844
+ settings: {
845
+ name: 'null',
846
+ },
847
+ },
848
+ ],
849
+ doNotMatch: [
850
+ {
851
+ 'settings.name': null,
852
+ },
853
+ ],
854
+ });
855
+ });
856
+ it('Can differentiate 0 number vs json null when comparing to null', async () => {
857
+ await (0, utils_1.testMatch)({
858
+ tableDefinition,
859
+ filters,
860
+ rows: [
861
+ {
862
+ settings: {
863
+ age: 0,
864
+ },
865
+ },
866
+ ],
867
+ doNotMatch: [
868
+ {
869
+ 'settings.age': null,
870
+ },
871
+ ],
872
+ });
873
+ });
874
+ it('can check if a json object column is null', async () => {
875
+ await (0, utils_1.testMatch)({
876
+ tableDefinition,
877
+ filters,
878
+ rows: [
879
+ {
880
+ settings: 'null',
881
+ },
882
+ {
883
+ settings: null,
884
+ },
885
+ ],
886
+ doMatch: [
887
+ {
888
+ settings: {
889
+ $eq: null,
890
+ },
891
+ },
892
+ {
893
+ settings: null,
894
+ },
895
+ ],
896
+ });
897
+ await (0, utils_1.testMatch)({
898
+ tableDefinition,
899
+ filters,
900
+ rows: [
901
+ {
902
+ settings: {},
903
+ },
904
+ ],
905
+ doNotMatch: [
906
+ {
907
+ settings: {
908
+ $eq: null,
909
+ },
910
+ },
911
+ {
912
+ settings: null,
913
+ },
914
+ ],
915
+ });
916
+ });
917
+ it('can check if a JSON array column is null', async () => {
918
+ await (0, utils_1.testMatch)({
919
+ tableDefinition,
920
+ filters,
921
+ rows: [
922
+ {
923
+ settings: 'null',
924
+ },
925
+ {
926
+ settings: null,
927
+ },
928
+ {
929
+ settings: {},
930
+ },
931
+ {
932
+ settings: {
933
+ randomValues: null,
934
+ },
935
+ },
936
+ ],
937
+ doMatch: [
938
+ {
939
+ 'settings.randomValues': {
940
+ $eq: null,
941
+ },
942
+ },
943
+ {
944
+ 'settings.randomValues': null,
945
+ },
946
+ ],
947
+ doNotMatch: [
948
+ {
949
+ 'settings.randomValues': {
950
+ $neq: null,
951
+ },
952
+ },
953
+ ],
954
+ });
955
+ await (0, utils_1.testMatch)({
956
+ tableDefinition,
957
+ filters,
958
+ rows: [
959
+ {
960
+ settings: {
961
+ randomValues: [],
962
+ },
963
+ },
964
+ ],
965
+ doNotMatch: [
966
+ {
967
+ 'settings.randomValues': {
968
+ $eq: null,
969
+ },
970
+ },
971
+ {
972
+ 'settings.randomValues': null,
973
+ },
974
+ ],
975
+ doMatch: [
976
+ {
977
+ 'settings.randomValues': {
978
+ $neq: null,
979
+ },
980
+ },
981
+ ],
982
+ });
983
+ });
984
+ });
985
+ });
986
+ //# sourceMappingURL=$eq.test.js.map