@payloadcms/drizzle 4.0.0-internal.b8e7c89 → 4.0.0-internal.bf4bcce
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/dist/exports/postgres.d.ts +1 -0
- package/dist/exports/postgres.d.ts.map +1 -1
- package/dist/exports/postgres.js +1 -0
- package/dist/exports/postgres.js.map +1 -1
- package/dist/exports/sqlite.d.ts +1 -0
- package/dist/exports/sqlite.d.ts.map +1 -1
- package/dist/exports/sqlite.js +1 -0
- package/dist/exports/sqlite.js.map +1 -1
- package/dist/find/buildPolymorphicJoinQuery.d.ts +38 -0
- package/dist/find/buildPolymorphicJoinQuery.d.ts.map +1 -0
- package/dist/find/buildPolymorphicJoinQuery.js +135 -0
- package/dist/find/buildPolymorphicJoinQuery.js.map +1 -0
- package/dist/find/buildPolymorphicJoinWhere.d.ts +20 -0
- package/dist/find/buildPolymorphicJoinWhere.d.ts.map +1 -0
- package/dist/find/buildPolymorphicJoinWhere.js +301 -0
- package/dist/find/buildPolymorphicJoinWhere.js.map +1 -0
- package/dist/find/createPolymorphicJoinWherePlan.d.ts +37 -0
- package/dist/find/createPolymorphicJoinWherePlan.d.ts.map +1 -0
- package/dist/find/createPolymorphicJoinWherePlan.js +191 -0
- package/dist/find/createPolymorphicJoinWherePlan.js.map +1 -0
- package/dist/find/traverseFields.d.ts.map +1 -1
- package/dist/find/traverseFields.js +19 -191
- package/dist/find/traverseFields.js.map +1 -1
- package/dist/index.d.ts +1 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -8
- package/dist/index.js.map +1 -1
- package/dist/migrate.d.ts.map +1 -1
- package/dist/migrate.js +6 -2
- package/dist/migrate.js.map +1 -1
- package/dist/migrateDown.d.ts.map +1 -1
- package/dist/migrateDown.js +5 -2
- package/dist/migrateDown.js.map +1 -1
- package/dist/migrateFresh.d.ts.map +1 -1
- package/dist/migrateFresh.js +5 -2
- package/dist/migrateFresh.js.map +1 -1
- package/dist/migrateRefresh.d.ts.map +1 -1
- package/dist/migrateRefresh.js +6 -2
- package/dist/migrateRefresh.js.map +1 -1
- package/dist/migrateReset.d.ts.map +1 -1
- package/dist/migrateReset.js +6 -2
- package/dist/migrateReset.js.map +1 -1
- package/dist/postgres/createJSONQuery/index.js +3 -3
- package/dist/postgres/createJSONQuery/index.js.map +1 -1
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts +35 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js +185 -0
- package/dist/postgres/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.d.ts.map +1 -1
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js +8 -4
- package/dist/postgres/predefinedMigrations/v2-v3/fetchAndResave/index.js.map +1 -1
- package/dist/queries/getTableColumnFromPath.d.ts.map +1 -1
- package/dist/queries/getTableColumnFromPath.js +9 -0
- package/dist/queries/getTableColumnFromPath.js.map +1 -1
- package/dist/queries/parseParams.d.ts.map +1 -1
- package/dist/queries/parseParams.js +59 -2
- package/dist/queries/parseParams.js.map +1 -1
- package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js +3 -2
- package/dist/sqlite/createJSONQuery/convertPathToJSONTraversal.js.map +1 -1
- package/dist/sqlite/createJSONQuery/index.d.ts.map +1 -1
- package/dist/sqlite/createJSONQuery/index.js +6 -5
- package/dist/sqlite/createJSONQuery/index.js.map +1 -1
- package/dist/sqlite/insert.d.ts.map +1 -1
- package/dist/sqlite/insert.js +4 -1
- package/dist/sqlite/insert.js.map +1 -1
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts +15 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.d.ts.map +1 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js +114 -0
- package/dist/sqlite/predefinedMigrations/sizes-to-variants/index.js.map +1 -0
- package/dist/transform/write/traverseFields.d.ts.map +1 -1
- package/dist/transform/write/traverseFields.js +5 -14
- package/dist/transform/write/traverseFields.js.map +1 -1
- package/dist/updateOne.d.ts.map +1 -1
- package/dist/updateOne.js +41 -1
- package/dist/updateOne.js.map +1 -1
- package/dist/upsertRow/index.d.ts +1 -1
- package/dist/upsertRow/index.d.ts.map +1 -1
- package/dist/upsertRow/index.js +25 -5
- package/dist/upsertRow/index.js.map +1 -1
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts +15 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.d.ts.map +1 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js +110 -0
- package/dist/utilities/buildDynamicPredefinedSizesToVariantsMigration.js.map +1 -0
- package/dist/utilities/getSizesToVariantsRenames.d.ts +54 -0
- package/dist/utilities/getSizesToVariantsRenames.d.ts.map +1 -0
- package/dist/utilities/getSizesToVariantsRenames.js +251 -0
- package/dist/utilities/getSizesToVariantsRenames.js.map +1 -0
- package/dist/utilities/parseJSONPathSegment.d.ts +9 -0
- package/dist/utilities/parseJSONPathSegment.d.ts.map +1 -0
- package/dist/utilities/parseJSONPathSegment.js +17 -0
- package/dist/utilities/parseJSONPathSegment.js.map +1 -0
- package/package.json +3 -3
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js +0 -91
- package/dist/postgres/query/assertOperatorHandlerExtensionsInstalled.spec.js.map +0 -1
- package/dist/postgres/query/postgresUnaccent.spec.js +0 -71
- package/dist/postgres/query/postgresUnaccent.spec.js.map +0 -1
- package/dist/queries/buildOperatorConstraint.spec.js +0 -348
- package/dist/queries/buildOperatorConstraint.spec.js.map +0 -1
- package/dist/queries/validateOperatorHandlers.spec.js +0 -142
- package/dist/queries/validateOperatorHandlers.spec.js.map +0 -1
- package/dist/schema/buildRawSchema.spec.js +0 -290
- package/dist/schema/buildRawSchema.spec.js.map +0 -1
- package/dist/upsertRow/handleUpsertError.spec.js +0 -42
- package/dist/upsertRow/handleUpsertError.spec.js.map +0 -1
- package/dist/utilities/checkTruncatedIdentifiers.spec.js +0 -301
- package/dist/utilities/checkTruncatedIdentifiers.spec.js.map +0 -1
- package/dist/utilities/isValidStringID.spec.js +0 -15
- package/dist/utilities/isValidStringID.spec.js.map +0 -1
- package/dist/utilities/validateIdentifierLength.spec.js +0 -19
- package/dist/utilities/validateIdentifierLength.spec.js.map +0 -1
|
@@ -1,348 +0,0 @@
|
|
|
1
|
-
import { sql } from 'drizzle-orm';
|
|
2
|
-
import { describe, expect, it, vi } from 'vitest';
|
|
3
|
-
import { buildOperatorConstraint } from './buildOperatorConstraint.js';
|
|
4
|
-
const textField = {
|
|
5
|
-
name: 'title',
|
|
6
|
-
type: 'text'
|
|
7
|
-
};
|
|
8
|
-
const numberField = {
|
|
9
|
-
name: 'age',
|
|
10
|
-
type: 'number'
|
|
11
|
-
};
|
|
12
|
-
describe('buildOperatorConstraint', ()=>{
|
|
13
|
-
it('calls the default operator unchanged when no handlers are configured', ()=>{
|
|
14
|
-
const sentinel = sql`sentinel`;
|
|
15
|
-
const containsOperator = vi.fn().mockReturnValue(sentinel);
|
|
16
|
-
const adapter = {
|
|
17
|
-
operatorHandlers: [],
|
|
18
|
-
operators: {
|
|
19
|
-
contains: containsOperator
|
|
20
|
-
}
|
|
21
|
-
};
|
|
22
|
-
const column = 'col';
|
|
23
|
-
const result = buildOperatorConstraint({
|
|
24
|
-
adapter,
|
|
25
|
-
column,
|
|
26
|
-
field: textField,
|
|
27
|
-
originalOperator: 'contains',
|
|
28
|
-
path: 'title',
|
|
29
|
-
resolvedOperator: 'contains',
|
|
30
|
-
value: 'acido'
|
|
31
|
-
});
|
|
32
|
-
expect(containsOperator).toHaveBeenCalledWith(column, 'acido');
|
|
33
|
-
expect(result).toBe(sentinel);
|
|
34
|
-
});
|
|
35
|
-
it('applies operand-transform handlers in configuration order before the default operator runs', ()=>{
|
|
36
|
-
const calls = [];
|
|
37
|
-
const containsOperator = vi.fn(()=>sql`result`);
|
|
38
|
-
const handlerA = {
|
|
39
|
-
name: 'handler-a',
|
|
40
|
-
operators: [
|
|
41
|
-
'contains'
|
|
42
|
-
],
|
|
43
|
-
transformOperands: ({ column, value })=>{
|
|
44
|
-
calls.push('a');
|
|
45
|
-
return {
|
|
46
|
-
column: `${column}-a`,
|
|
47
|
-
value: `${value}-a`
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
const handlerB = {
|
|
52
|
-
name: 'handler-b',
|
|
53
|
-
operators: [
|
|
54
|
-
'contains'
|
|
55
|
-
],
|
|
56
|
-
transformOperands: ({ column, value })=>{
|
|
57
|
-
calls.push('b');
|
|
58
|
-
return {
|
|
59
|
-
column: `${column}-b`,
|
|
60
|
-
value: `${value}-b`
|
|
61
|
-
};
|
|
62
|
-
}
|
|
63
|
-
};
|
|
64
|
-
const adapter = {
|
|
65
|
-
operatorHandlers: [
|
|
66
|
-
handlerA,
|
|
67
|
-
handlerB
|
|
68
|
-
],
|
|
69
|
-
operators: {
|
|
70
|
-
contains: containsOperator
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
buildOperatorConstraint({
|
|
74
|
-
adapter,
|
|
75
|
-
column: 'base-column',
|
|
76
|
-
field: textField,
|
|
77
|
-
originalOperator: 'contains',
|
|
78
|
-
path: 'title',
|
|
79
|
-
resolvedOperator: 'contains',
|
|
80
|
-
value: 'acido'
|
|
81
|
-
});
|
|
82
|
-
expect(calls).toEqual([
|
|
83
|
-
'a',
|
|
84
|
-
'b'
|
|
85
|
-
]);
|
|
86
|
-
expect(containsOperator).toHaveBeenCalledWith('base-column-a-b', 'acido-a-b');
|
|
87
|
-
});
|
|
88
|
-
it('skips a handler whose operators list excludes the resolved operator', ()=>{
|
|
89
|
-
const transformOperands = vi.fn(({ column, value })=>({
|
|
90
|
-
column,
|
|
91
|
-
value
|
|
92
|
-
}));
|
|
93
|
-
const adapter = {
|
|
94
|
-
operatorHandlers: [
|
|
95
|
-
{
|
|
96
|
-
name: 'like-only',
|
|
97
|
-
operators: [
|
|
98
|
-
'like'
|
|
99
|
-
],
|
|
100
|
-
transformOperands
|
|
101
|
-
}
|
|
102
|
-
],
|
|
103
|
-
operators: {
|
|
104
|
-
contains: vi.fn(()=>sql`result`)
|
|
105
|
-
}
|
|
106
|
-
};
|
|
107
|
-
buildOperatorConstraint({
|
|
108
|
-
adapter,
|
|
109
|
-
column: 'col',
|
|
110
|
-
field: textField,
|
|
111
|
-
originalOperator: 'contains',
|
|
112
|
-
path: 'title',
|
|
113
|
-
resolvedOperator: 'contains',
|
|
114
|
-
value: 'acido'
|
|
115
|
-
});
|
|
116
|
-
expect(transformOperands).not.toHaveBeenCalled();
|
|
117
|
-
});
|
|
118
|
-
it("skips a handler whose fieldTypes excludes the field's type even when operators matches", ()=>{
|
|
119
|
-
const transformOperands = vi.fn(({ column, value })=>({
|
|
120
|
-
column,
|
|
121
|
-
value
|
|
122
|
-
}));
|
|
123
|
-
const adapter = {
|
|
124
|
-
operatorHandlers: [
|
|
125
|
-
{
|
|
126
|
-
name: 'text-only',
|
|
127
|
-
operators: [
|
|
128
|
-
'contains'
|
|
129
|
-
],
|
|
130
|
-
fieldTypes: [
|
|
131
|
-
'text'
|
|
132
|
-
],
|
|
133
|
-
transformOperands
|
|
134
|
-
}
|
|
135
|
-
],
|
|
136
|
-
operators: {
|
|
137
|
-
contains: vi.fn(()=>sql`result`)
|
|
138
|
-
}
|
|
139
|
-
};
|
|
140
|
-
buildOperatorConstraint({
|
|
141
|
-
adapter,
|
|
142
|
-
column: 'col',
|
|
143
|
-
field: numberField,
|
|
144
|
-
originalOperator: 'contains',
|
|
145
|
-
path: 'age',
|
|
146
|
-
resolvedOperator: 'contains',
|
|
147
|
-
value: 5
|
|
148
|
-
});
|
|
149
|
-
expect(transformOperands).not.toHaveBeenCalled();
|
|
150
|
-
});
|
|
151
|
-
it('runs a handler with no fieldTypes for every field type', ()=>{
|
|
152
|
-
const transformOperands = vi.fn(({ column, value })=>({
|
|
153
|
-
column,
|
|
154
|
-
value
|
|
155
|
-
}));
|
|
156
|
-
const adapter = {
|
|
157
|
-
operatorHandlers: [
|
|
158
|
-
{
|
|
159
|
-
name: 'universal',
|
|
160
|
-
operators: [
|
|
161
|
-
'contains'
|
|
162
|
-
],
|
|
163
|
-
transformOperands
|
|
164
|
-
}
|
|
165
|
-
],
|
|
166
|
-
operators: {
|
|
167
|
-
contains: vi.fn(()=>sql`result`)
|
|
168
|
-
}
|
|
169
|
-
};
|
|
170
|
-
buildOperatorConstraint({
|
|
171
|
-
adapter,
|
|
172
|
-
column: 'col',
|
|
173
|
-
field: numberField,
|
|
174
|
-
originalOperator: 'contains',
|
|
175
|
-
path: 'age',
|
|
176
|
-
resolvedOperator: 'contains',
|
|
177
|
-
value: 5
|
|
178
|
-
});
|
|
179
|
-
expect(transformOperands).toHaveBeenCalled();
|
|
180
|
-
});
|
|
181
|
-
it('gives a single matching replacement handler the operands after every transform has run, and uses its result instead of the default operator', ()=>{
|
|
182
|
-
const containsOperator = vi.fn();
|
|
183
|
-
const sentinel = sql`replacement`;
|
|
184
|
-
const build = vi.fn().mockReturnValue(sentinel);
|
|
185
|
-
const transformOperands = vi.fn(({ column, value })=>({
|
|
186
|
-
column: `${column}-t`,
|
|
187
|
-
value: `${value}-t`
|
|
188
|
-
}));
|
|
189
|
-
const adapter = {
|
|
190
|
-
operatorHandlers: [
|
|
191
|
-
{
|
|
192
|
-
name: 'transform',
|
|
193
|
-
operators: [
|
|
194
|
-
'contains'
|
|
195
|
-
],
|
|
196
|
-
transformOperands
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
name: 'replace',
|
|
200
|
-
operators: [
|
|
201
|
-
'contains'
|
|
202
|
-
],
|
|
203
|
-
build
|
|
204
|
-
}
|
|
205
|
-
],
|
|
206
|
-
operators: {
|
|
207
|
-
contains: containsOperator
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
const result = buildOperatorConstraint({
|
|
211
|
-
adapter,
|
|
212
|
-
column: 'col',
|
|
213
|
-
field: textField,
|
|
214
|
-
originalOperator: 'contains',
|
|
215
|
-
path: 'title',
|
|
216
|
-
resolvedOperator: 'contains',
|
|
217
|
-
value: 'acido'
|
|
218
|
-
});
|
|
219
|
-
expect(build).toHaveBeenCalledWith(expect.objectContaining({
|
|
220
|
-
column: 'col-t',
|
|
221
|
-
value: 'acido-t'
|
|
222
|
-
}));
|
|
223
|
-
expect(containsOperator).not.toHaveBeenCalled();
|
|
224
|
-
expect(result).toBe(sentinel);
|
|
225
|
-
});
|
|
226
|
-
it('passes originalOperator, resolvedOperator, field, path, and locale to handlers', ()=>{
|
|
227
|
-
let capturedContext;
|
|
228
|
-
const transformOperands = vi.fn((context)=>{
|
|
229
|
-
capturedContext = context;
|
|
230
|
-
return {
|
|
231
|
-
column: context.column,
|
|
232
|
-
value: context.value
|
|
233
|
-
};
|
|
234
|
-
});
|
|
235
|
-
const adapter = {
|
|
236
|
-
operatorHandlers: [
|
|
237
|
-
{
|
|
238
|
-
name: 'observe',
|
|
239
|
-
operators: [
|
|
240
|
-
'like'
|
|
241
|
-
],
|
|
242
|
-
transformOperands
|
|
243
|
-
}
|
|
244
|
-
],
|
|
245
|
-
operators: {
|
|
246
|
-
like: vi.fn(()=>sql`result`)
|
|
247
|
-
}
|
|
248
|
-
};
|
|
249
|
-
buildOperatorConstraint({
|
|
250
|
-
adapter,
|
|
251
|
-
column: 'col',
|
|
252
|
-
field: textField,
|
|
253
|
-
locale: 'es',
|
|
254
|
-
originalOperator: 'like',
|
|
255
|
-
path: 'title',
|
|
256
|
-
resolvedOperator: 'like',
|
|
257
|
-
value: '%nino%'
|
|
258
|
-
});
|
|
259
|
-
expect(capturedContext).toMatchObject({
|
|
260
|
-
field: textField,
|
|
261
|
-
locale: 'es',
|
|
262
|
-
originalOperator: 'like',
|
|
263
|
-
path: 'title',
|
|
264
|
-
resolvedOperator: 'like'
|
|
265
|
-
});
|
|
266
|
-
});
|
|
267
|
-
it('wraps a handler error with the handler name, path, and resolved operator, retaining the original error as the cause', ()=>{
|
|
268
|
-
const originalError = new Error('boom');
|
|
269
|
-
const transformOperands = vi.fn(()=>{
|
|
270
|
-
throw originalError;
|
|
271
|
-
});
|
|
272
|
-
const adapter = {
|
|
273
|
-
operatorHandlers: [
|
|
274
|
-
{
|
|
275
|
-
name: 'explode',
|
|
276
|
-
operators: [
|
|
277
|
-
'contains'
|
|
278
|
-
],
|
|
279
|
-
transformOperands
|
|
280
|
-
}
|
|
281
|
-
],
|
|
282
|
-
operators: {
|
|
283
|
-
contains: vi.fn()
|
|
284
|
-
}
|
|
285
|
-
};
|
|
286
|
-
let thrown;
|
|
287
|
-
try {
|
|
288
|
-
buildOperatorConstraint({
|
|
289
|
-
adapter,
|
|
290
|
-
column: 'col',
|
|
291
|
-
field: textField,
|
|
292
|
-
originalOperator: 'contains',
|
|
293
|
-
path: 'title',
|
|
294
|
-
resolvedOperator: 'contains',
|
|
295
|
-
value: 'acido'
|
|
296
|
-
});
|
|
297
|
-
} catch (error) {
|
|
298
|
-
thrown = error;
|
|
299
|
-
}
|
|
300
|
-
expect(thrown).toBeInstanceOf(Error);
|
|
301
|
-
const error = thrown;
|
|
302
|
-
expect(error.message).toContain('explode');
|
|
303
|
-
expect(error.message).toContain('title');
|
|
304
|
-
expect(error.message).toContain('contains');
|
|
305
|
-
expect(error.cause).toBe(originalError);
|
|
306
|
-
});
|
|
307
|
-
it('throws a configuration error when a transform handler returns operands missing column or value, before any default operator or replacement runs', ()=>{
|
|
308
|
-
const transformOperands = vi.fn().mockReturnValue({
|
|
309
|
-
column: 'only-column'
|
|
310
|
-
});
|
|
311
|
-
const containsOperator = vi.fn();
|
|
312
|
-
const build = vi.fn();
|
|
313
|
-
const adapter = {
|
|
314
|
-
operatorHandlers: [
|
|
315
|
-
{
|
|
316
|
-
name: 'broken',
|
|
317
|
-
operators: [
|
|
318
|
-
'contains'
|
|
319
|
-
],
|
|
320
|
-
transformOperands
|
|
321
|
-
},
|
|
322
|
-
{
|
|
323
|
-
name: 'replace',
|
|
324
|
-
operators: [
|
|
325
|
-
'contains'
|
|
326
|
-
],
|
|
327
|
-
build
|
|
328
|
-
}
|
|
329
|
-
],
|
|
330
|
-
operators: {
|
|
331
|
-
contains: containsOperator
|
|
332
|
-
}
|
|
333
|
-
};
|
|
334
|
-
expect(()=>buildOperatorConstraint({
|
|
335
|
-
adapter,
|
|
336
|
-
column: 'col',
|
|
337
|
-
field: textField,
|
|
338
|
-
originalOperator: 'contains',
|
|
339
|
-
path: 'title',
|
|
340
|
-
resolvedOperator: 'contains',
|
|
341
|
-
value: 'acido'
|
|
342
|
-
})).toThrow(/broken/);
|
|
343
|
-
expect(containsOperator).not.toHaveBeenCalled();
|
|
344
|
-
expect(build).not.toHaveBeenCalled();
|
|
345
|
-
});
|
|
346
|
-
});
|
|
347
|
-
|
|
348
|
-
//# sourceMappingURL=buildOperatorConstraint.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/buildOperatorConstraint.spec.ts"],"sourcesContent":["import type { Column } from 'drizzle-orm'\nimport type { FlattenedField } from 'payload'\n\nimport { sql } from 'drizzle-orm'\nimport { describe, expect, it, vi } from 'vitest'\n\nimport type { DrizzleAdapter, DrizzleOperandTransformHandler } from '../types.js'\n\nimport { buildOperatorConstraint } from './buildOperatorConstraint.js'\n\nconst textField = { name: 'title', type: 'text' } as unknown as FlattenedField\nconst numberField = { name: 'age', type: 'number' } as unknown as FlattenedField\n\ndescribe('buildOperatorConstraint', () => {\n it('calls the default operator unchanged when no handlers are configured', () => {\n const sentinel = sql`sentinel`\n const containsOperator = vi.fn().mockReturnValue(sentinel)\n const adapter = {\n operatorHandlers: [],\n operators: { contains: containsOperator },\n } as unknown as DrizzleAdapter\n const column = 'col' as unknown as Column\n\n const result = buildOperatorConstraint({\n adapter,\n column,\n field: textField,\n originalOperator: 'contains',\n path: 'title',\n resolvedOperator: 'contains',\n value: 'acido',\n })\n\n expect(containsOperator).toHaveBeenCalledWith(column, 'acido')\n expect(result).toBe(sentinel)\n })\n\n it('applies operand-transform handlers in configuration order before the default operator runs', () => {\n const calls: string[] = []\n const containsOperator = vi.fn(() => sql`result`)\n\n const handlerA: DrizzleOperandTransformHandler = {\n name: 'handler-a',\n operators: ['contains'],\n transformOperands: ({ column, value }) => {\n calls.push('a')\n return { column: `${column}-a` as unknown as Column, value: `${value}-a` }\n },\n }\n const handlerB: DrizzleOperandTransformHandler = {\n name: 'handler-b',\n operators: ['contains'],\n transformOperands: ({ column, value }) => {\n calls.push('b')\n return { column: `${column}-b` as unknown as Column, value: `${value}-b` }\n },\n }\n\n const adapter = {\n operatorHandlers: [handlerA, handlerB],\n operators: { contains: containsOperator },\n } as unknown as DrizzleAdapter\n\n buildOperatorConstraint({\n adapter,\n column: 'base-column' as unknown as Column,\n field: textField,\n originalOperator: 'contains',\n path: 'title',\n resolvedOperator: 'contains',\n value: 'acido',\n })\n\n expect(calls).toEqual(['a', 'b'])\n expect(containsOperator).toHaveBeenCalledWith('base-column-a-b', 'acido-a-b')\n })\n\n it('skips a handler whose operators list excludes the resolved operator', () => {\n const transformOperands = vi.fn(({ column, value }) => ({ column, value }))\n const adapter = {\n operatorHandlers: [{ name: 'like-only', operators: ['like'], transformOperands }],\n operators: { contains: vi.fn(() => sql`result`) },\n } as unknown as DrizzleAdapter\n\n buildOperatorConstraint({\n adapter,\n column: 'col' as unknown as Column,\n field: textField,\n originalOperator: 'contains',\n path: 'title',\n resolvedOperator: 'contains',\n value: 'acido',\n })\n\n expect(transformOperands).not.toHaveBeenCalled()\n })\n\n it(\"skips a handler whose fieldTypes excludes the field's type even when operators matches\", () => {\n const transformOperands = vi.fn(({ column, value }) => ({ column, value }))\n const adapter = {\n operatorHandlers: [\n { name: 'text-only', operators: ['contains'], fieldTypes: ['text'], transformOperands },\n ],\n operators: { contains: vi.fn(() => sql`result`) },\n } as unknown as DrizzleAdapter\n\n buildOperatorConstraint({\n adapter,\n column: 'col' as unknown as Column,\n field: numberField,\n originalOperator: 'contains',\n path: 'age',\n resolvedOperator: 'contains',\n value: 5,\n })\n\n expect(transformOperands).not.toHaveBeenCalled()\n })\n\n it('runs a handler with no fieldTypes for every field type', () => {\n const transformOperands = vi.fn(({ column, value }) => ({ column, value }))\n const adapter = {\n operatorHandlers: [{ name: 'universal', operators: ['contains'], transformOperands }],\n operators: { contains: vi.fn(() => sql`result`) },\n } as unknown as DrizzleAdapter\n\n buildOperatorConstraint({\n adapter,\n column: 'col' as unknown as Column,\n field: numberField,\n originalOperator: 'contains',\n path: 'age',\n resolvedOperator: 'contains',\n value: 5,\n })\n\n expect(transformOperands).toHaveBeenCalled()\n })\n\n it('gives a single matching replacement handler the operands after every transform has run, and uses its result instead of the default operator', () => {\n const containsOperator = vi.fn()\n const sentinel = sql`replacement`\n const build = vi.fn().mockReturnValue(sentinel)\n const transformOperands = vi.fn(({ column, value }) => ({\n column: `${column}-t` as unknown as Column,\n value: `${value}-t`,\n }))\n\n const adapter = {\n operatorHandlers: [\n { name: 'transform', operators: ['contains'], transformOperands },\n { name: 'replace', operators: ['contains'], build },\n ],\n operators: { contains: containsOperator },\n } as unknown as DrizzleAdapter\n\n const result = buildOperatorConstraint({\n adapter,\n column: 'col' as unknown as Column,\n field: textField,\n originalOperator: 'contains',\n path: 'title',\n resolvedOperator: 'contains',\n value: 'acido',\n })\n\n expect(build).toHaveBeenCalledWith(\n expect.objectContaining({ column: 'col-t', value: 'acido-t' }),\n )\n expect(containsOperator).not.toHaveBeenCalled()\n expect(result).toBe(sentinel)\n })\n\n it('passes originalOperator, resolvedOperator, field, path, and locale to handlers', () => {\n let capturedContext: any\n const transformOperands = vi.fn((context) => {\n capturedContext = context\n return { column: context.column, value: context.value }\n })\n\n const adapter = {\n operatorHandlers: [{ name: 'observe', operators: ['like'], transformOperands }],\n operators: { like: vi.fn(() => sql`result`) },\n } as unknown as DrizzleAdapter\n\n buildOperatorConstraint({\n adapter,\n column: 'col' as unknown as Column,\n field: textField,\n locale: 'es',\n originalOperator: 'like',\n path: 'title',\n resolvedOperator: 'like',\n value: '%nino%',\n })\n\n expect(capturedContext).toMatchObject({\n field: textField,\n locale: 'es',\n originalOperator: 'like',\n path: 'title',\n resolvedOperator: 'like',\n })\n })\n\n it('wraps a handler error with the handler name, path, and resolved operator, retaining the original error as the cause', () => {\n const originalError = new Error('boom')\n const transformOperands = vi.fn(() => {\n throw originalError\n })\n\n const adapter = {\n operatorHandlers: [{ name: 'explode', operators: ['contains'], transformOperands }],\n operators: { contains: vi.fn() },\n } as unknown as DrizzleAdapter\n\n let thrown: unknown\n try {\n buildOperatorConstraint({\n adapter,\n column: 'col' as unknown as Column,\n field: textField,\n originalOperator: 'contains',\n path: 'title',\n resolvedOperator: 'contains',\n value: 'acido',\n })\n } catch (error) {\n thrown = error\n }\n\n expect(thrown).toBeInstanceOf(Error)\n const error = thrown as Error\n expect(error.message).toContain('explode')\n expect(error.message).toContain('title')\n expect(error.message).toContain('contains')\n expect(error.cause).toBe(originalError)\n })\n\n it('throws a configuration error when a transform handler returns operands missing column or value, before any default operator or replacement runs', () => {\n const transformOperands = vi.fn().mockReturnValue({ column: 'only-column' })\n const containsOperator = vi.fn()\n const build = vi.fn()\n\n const adapter = {\n operatorHandlers: [\n { name: 'broken', operators: ['contains'], transformOperands },\n { name: 'replace', operators: ['contains'], build },\n ],\n operators: { contains: containsOperator },\n } as unknown as DrizzleAdapter\n\n expect(() =>\n buildOperatorConstraint({\n adapter,\n column: 'col' as unknown as Column,\n field: textField,\n originalOperator: 'contains',\n path: 'title',\n resolvedOperator: 'contains',\n value: 'acido',\n }),\n ).toThrow(/broken/)\n\n expect(containsOperator).not.toHaveBeenCalled()\n expect(build).not.toHaveBeenCalled()\n })\n})\n"],"names":["sql","describe","expect","it","vi","buildOperatorConstraint","textField","name","type","numberField","sentinel","containsOperator","fn","mockReturnValue","adapter","operatorHandlers","operators","contains","column","result","field","originalOperator","path","resolvedOperator","value","toHaveBeenCalledWith","toBe","calls","handlerA","transformOperands","push","handlerB","toEqual","not","toHaveBeenCalled","fieldTypes","build","objectContaining","capturedContext","context","like","locale","toMatchObject","originalError","Error","thrown","error","toBeInstanceOf","message","toContain","cause","toThrow"],"mappings":"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"}
|
|
@@ -1,142 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'vitest';
|
|
2
|
-
import { validateOperatorHandlers } from './validateOperatorHandlers.js';
|
|
3
|
-
const transformHandler = (overrides = {})=>({
|
|
4
|
-
name: 'transform',
|
|
5
|
-
operators: [
|
|
6
|
-
'contains'
|
|
7
|
-
],
|
|
8
|
-
transformOperands: ({ column, value })=>({
|
|
9
|
-
column,
|
|
10
|
-
value
|
|
11
|
-
}),
|
|
12
|
-
...overrides
|
|
13
|
-
});
|
|
14
|
-
const replacementHandler = (overrides = {})=>({
|
|
15
|
-
name: 'replace',
|
|
16
|
-
operators: [
|
|
17
|
-
'contains'
|
|
18
|
-
],
|
|
19
|
-
build: ()=>null,
|
|
20
|
-
...overrides
|
|
21
|
-
});
|
|
22
|
-
describe('validateOperatorHandlers', ()=>{
|
|
23
|
-
it('does not throw when zero handlers are configured', ()=>{
|
|
24
|
-
expect(()=>validateOperatorHandlers([])).not.toThrow();
|
|
25
|
-
});
|
|
26
|
-
it('does not throw for any number of non-conflicting operand-transform handlers', ()=>{
|
|
27
|
-
expect(()=>validateOperatorHandlers([
|
|
28
|
-
transformHandler({
|
|
29
|
-
name: 'a'
|
|
30
|
-
}),
|
|
31
|
-
transformHandler({
|
|
32
|
-
name: 'b'
|
|
33
|
-
}),
|
|
34
|
-
transformHandler({
|
|
35
|
-
name: 'c'
|
|
36
|
-
})
|
|
37
|
-
])).not.toThrow();
|
|
38
|
-
});
|
|
39
|
-
it('throws when two build handlers list the same resolved operator, naming both handlers and the operator', ()=>{
|
|
40
|
-
expect(()=>validateOperatorHandlers([
|
|
41
|
-
replacementHandler({
|
|
42
|
-
name: 'handler-a',
|
|
43
|
-
operators: [
|
|
44
|
-
'contains'
|
|
45
|
-
]
|
|
46
|
-
}),
|
|
47
|
-
replacementHandler({
|
|
48
|
-
name: 'handler-b',
|
|
49
|
-
operators: [
|
|
50
|
-
'contains'
|
|
51
|
-
]
|
|
52
|
-
})
|
|
53
|
-
])).toThrow(/handler-a/);
|
|
54
|
-
expect(()=>validateOperatorHandlers([
|
|
55
|
-
replacementHandler({
|
|
56
|
-
name: 'handler-a',
|
|
57
|
-
operators: [
|
|
58
|
-
'contains'
|
|
59
|
-
]
|
|
60
|
-
}),
|
|
61
|
-
replacementHandler({
|
|
62
|
-
name: 'handler-b',
|
|
63
|
-
operators: [
|
|
64
|
-
'contains'
|
|
65
|
-
]
|
|
66
|
-
})
|
|
67
|
-
])).toThrow(/handler-b/);
|
|
68
|
-
expect(()=>validateOperatorHandlers([
|
|
69
|
-
replacementHandler({
|
|
70
|
-
name: 'handler-a',
|
|
71
|
-
operators: [
|
|
72
|
-
'contains'
|
|
73
|
-
]
|
|
74
|
-
}),
|
|
75
|
-
replacementHandler({
|
|
76
|
-
name: 'handler-b',
|
|
77
|
-
operators: [
|
|
78
|
-
'contains'
|
|
79
|
-
]
|
|
80
|
-
})
|
|
81
|
-
])).toThrow(/contains/);
|
|
82
|
-
});
|
|
83
|
-
it('does not throw when two build handlers target the same operator but declare disjoint fieldTypes', ()=>{
|
|
84
|
-
expect(()=>validateOperatorHandlers([
|
|
85
|
-
replacementHandler({
|
|
86
|
-
name: 'text',
|
|
87
|
-
operators: [
|
|
88
|
-
'contains'
|
|
89
|
-
],
|
|
90
|
-
fieldTypes: [
|
|
91
|
-
'text'
|
|
92
|
-
]
|
|
93
|
-
}),
|
|
94
|
-
replacementHandler({
|
|
95
|
-
name: 'number',
|
|
96
|
-
operators: [
|
|
97
|
-
'contains'
|
|
98
|
-
],
|
|
99
|
-
fieldTypes: [
|
|
100
|
-
'number'
|
|
101
|
-
]
|
|
102
|
-
})
|
|
103
|
-
])).not.toThrow();
|
|
104
|
-
});
|
|
105
|
-
it('throws when two build handlers target the same operator and at least one declares no fieldTypes', ()=>{
|
|
106
|
-
expect(()=>validateOperatorHandlers([
|
|
107
|
-
replacementHandler({
|
|
108
|
-
name: 'unrestricted',
|
|
109
|
-
operators: [
|
|
110
|
-
'contains'
|
|
111
|
-
]
|
|
112
|
-
}),
|
|
113
|
-
replacementHandler({
|
|
114
|
-
name: 'text',
|
|
115
|
-
operators: [
|
|
116
|
-
'contains'
|
|
117
|
-
],
|
|
118
|
-
fieldTypes: [
|
|
119
|
-
'text'
|
|
120
|
-
]
|
|
121
|
-
})
|
|
122
|
-
])).toThrow();
|
|
123
|
-
});
|
|
124
|
-
it('throws when a handler object defines both build and transformOperands', ()=>{
|
|
125
|
-
const malformed = {
|
|
126
|
-
name: 'malformed',
|
|
127
|
-
operators: [
|
|
128
|
-
'contains'
|
|
129
|
-
],
|
|
130
|
-
build: ()=>null,
|
|
131
|
-
transformOperands: ({ column, value })=>({
|
|
132
|
-
column,
|
|
133
|
-
value
|
|
134
|
-
})
|
|
135
|
-
};
|
|
136
|
-
expect(()=>validateOperatorHandlers([
|
|
137
|
-
malformed
|
|
138
|
-
])).toThrow(/malformed/);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
//# sourceMappingURL=validateOperatorHandlers.spec.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/queries/validateOperatorHandlers.spec.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest'\n\nimport type { DrizzleOperatorHandler } from '../types.js'\n\nimport { validateOperatorHandlers } from './validateOperatorHandlers.js'\n\nconst transformHandler = (\n overrides: Partial<DrizzleOperatorHandler> = {},\n): DrizzleOperatorHandler =>\n ({\n name: 'transform',\n operators: ['contains'],\n transformOperands: ({ column, value }) => ({ column, value }),\n ...overrides,\n }) as DrizzleOperatorHandler\n\nconst replacementHandler = (\n overrides: Partial<DrizzleOperatorHandler> = {},\n): DrizzleOperatorHandler =>\n ({\n name: 'replace',\n operators: ['contains'],\n build: () => null as any,\n ...overrides,\n }) as DrizzleOperatorHandler\n\ndescribe('validateOperatorHandlers', () => {\n it('does not throw when zero handlers are configured', () => {\n expect(() => validateOperatorHandlers([])).not.toThrow()\n })\n\n it('does not throw for any number of non-conflicting operand-transform handlers', () => {\n expect(() =>\n validateOperatorHandlers([\n transformHandler({ name: 'a' }),\n transformHandler({ name: 'b' }),\n transformHandler({ name: 'c' }),\n ]),\n ).not.toThrow()\n })\n\n it('throws when two build handlers list the same resolved operator, naming both handlers and the operator', () => {\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'handler-a', operators: ['contains'] }),\n replacementHandler({ name: 'handler-b', operators: ['contains'] }),\n ]),\n ).toThrow(/handler-a/)\n\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'handler-a', operators: ['contains'] }),\n replacementHandler({ name: 'handler-b', operators: ['contains'] }),\n ]),\n ).toThrow(/handler-b/)\n\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'handler-a', operators: ['contains'] }),\n replacementHandler({ name: 'handler-b', operators: ['contains'] }),\n ]),\n ).toThrow(/contains/)\n })\n\n it('does not throw when two build handlers target the same operator but declare disjoint fieldTypes', () => {\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'text', operators: ['contains'], fieldTypes: ['text'] }),\n replacementHandler({ name: 'number', operators: ['contains'], fieldTypes: ['number'] }),\n ]),\n ).not.toThrow()\n })\n\n it('throws when two build handlers target the same operator and at least one declares no fieldTypes', () => {\n expect(() =>\n validateOperatorHandlers([\n replacementHandler({ name: 'unrestricted', operators: ['contains'] }),\n replacementHandler({ name: 'text', operators: ['contains'], fieldTypes: ['text'] }),\n ]),\n ).toThrow()\n })\n\n it('throws when a handler object defines both build and transformOperands', () => {\n const malformed = {\n name: 'malformed',\n operators: ['contains'],\n build: () => null as any,\n transformOperands: ({ column, value }: any) => ({ column, value }),\n } as unknown as DrizzleOperatorHandler\n\n expect(() => validateOperatorHandlers([malformed])).toThrow(/malformed/)\n })\n})\n"],"names":["describe","expect","it","validateOperatorHandlers","transformHandler","overrides","name","operators","transformOperands","column","value","replacementHandler","build","not","toThrow","fieldTypes","malformed"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAQ;AAI7C,SAASC,wBAAwB,QAAQ,gCAA+B;AAExE,MAAMC,mBAAmB,CACvBC,YAA6C,CAAC,CAAC,GAE9C,CAAA;QACCC,MAAM;QACNC,WAAW;YAAC;SAAW;QACvBC,mBAAmB,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAE,GAAM,CAAA;gBAAED;gBAAQC;YAAM,CAAA;QAC3D,GAAGL,SAAS;IACd,CAAA;AAEF,MAAMM,qBAAqB,CACzBN,YAA6C,CAAC,CAAC,GAE9C,CAAA;QACCC,MAAM;QACNC,WAAW;YAAC;SAAW;QACvBK,OAAO,IAAM;QACb,GAAGP,SAAS;IACd,CAAA;AAEFL,SAAS,4BAA4B;IACnCE,GAAG,oDAAoD;QACrDD,OAAO,IAAME,yBAAyB,EAAE,GAAGU,GAAG,CAACC,OAAO;IACxD;IAEAZ,GAAG,+EAA+E;QAChFD,OAAO,IACLE,yBAAyB;gBACvBC,iBAAiB;oBAAEE,MAAM;gBAAI;gBAC7BF,iBAAiB;oBAAEE,MAAM;gBAAI;gBAC7BF,iBAAiB;oBAAEE,MAAM;gBAAI;aAC9B,GACDO,GAAG,CAACC,OAAO;IACf;IAEAZ,GAAG,yGAAyG;QAC1GD,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;gBAChEI,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;aACjE,GACDO,OAAO,CAAC;QAEVb,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;gBAChEI,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;aACjE,GACDO,OAAO,CAAC;QAEVb,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;gBAChEI,mBAAmB;oBAAEL,MAAM;oBAAaC,WAAW;wBAAC;qBAAW;gBAAC;aACjE,GACDO,OAAO,CAAC;IACZ;IAEAZ,GAAG,mGAAmG;QACpGD,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAQC,WAAW;wBAAC;qBAAW;oBAAEQ,YAAY;wBAAC;qBAAO;gBAAC;gBACjFJ,mBAAmB;oBAAEL,MAAM;oBAAUC,WAAW;wBAAC;qBAAW;oBAAEQ,YAAY;wBAAC;qBAAS;gBAAC;aACtF,GACDF,GAAG,CAACC,OAAO;IACf;IAEAZ,GAAG,mGAAmG;QACpGD,OAAO,IACLE,yBAAyB;gBACvBQ,mBAAmB;oBAAEL,MAAM;oBAAgBC,WAAW;wBAAC;qBAAW;gBAAC;gBACnEI,mBAAmB;oBAAEL,MAAM;oBAAQC,WAAW;wBAAC;qBAAW;oBAAEQ,YAAY;wBAAC;qBAAO;gBAAC;aAClF,GACDD,OAAO;IACX;IAEAZ,GAAG,yEAAyE;QAC1E,MAAMc,YAAY;YAChBV,MAAM;YACNC,WAAW;gBAAC;aAAW;YACvBK,OAAO,IAAM;YACbJ,mBAAmB,CAAC,EAAEC,MAAM,EAAEC,KAAK,EAAO,GAAM,CAAA;oBAAED;oBAAQC;gBAAM,CAAA;QAClE;QAEAT,OAAO,IAAME,yBAAyB;gBAACa;aAAU,GAAGF,OAAO,CAAC;IAC9D;AACF"}
|