@expo/entity-database-adapter-knex 0.57.0 → 0.59.0
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/build/src/AuthorizationResultBasedKnexEntityLoader.d.ts +1 -2
- package/build/src/AuthorizationResultBasedKnexEntityLoader.js.map +1 -1
- package/build/src/PostgresEntityDatabaseAdapter.js +2 -1
- package/build/src/PostgresEntityDatabaseAdapter.js.map +1 -1
- package/build/src/SQLOperator.d.ts +47 -8
- package/build/src/SQLOperator.js +63 -3
- package/build/src/SQLOperator.js.map +1 -1
- package/package.json +5 -5
- package/src/AuthorizationResultBasedKnexEntityLoader.ts +1 -2
- package/src/PostgresEntityDatabaseAdapter.ts +4 -1
- package/src/SQLOperator.ts +87 -9
- package/src/__integration-tests__/PostgresEntityIntegration-test.ts +2 -2
- package/src/__tests__/SQLOperator-test.ts +81 -0
|
@@ -55,8 +55,7 @@ export interface EntityLoaderQuerySelectionModifiers<TFields extends Record<stri
|
|
|
55
55
|
export type EntityLoaderFieldNameConstructorFn<TFields extends Record<string, any>, TSelectedFields extends keyof TFields = keyof TFields> = (fieldName: TSelectedFields) => SQLFragment<TFields>;
|
|
56
56
|
/**
|
|
57
57
|
* Specification for a search field that is a manually constructed SQLFragment. Useful for complex search fields that require
|
|
58
|
-
* transformations
|
|
59
|
-
* to search by display name with fallback to full name.
|
|
58
|
+
* transformations to make nullable fields non-null or to make combinations of multiple fields.
|
|
60
59
|
*/
|
|
61
60
|
export type EntityLoaderSearchFieldSQLFragmentFnSpecification<TFields extends Record<string, any>, TSelectedFields extends keyof TFields = keyof TFields> = {
|
|
62
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AuthorizationResultBasedKnexEntityLoader.js","sourceRoot":"","sources":["../../src/AuthorizationResultBasedKnexEntityLoader.ts"],"names":[],"mappings":";;;AAUA,2FAK6C;AAC7C,+DAA4D;
|
|
1
|
+
{"version":3,"file":"AuthorizationResultBasedKnexEntityLoader.js","sourceRoot":"","sources":["../../src/AuthorizationResultBasedKnexEntityLoader.ts"],"names":[],"mappings":"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"}
|
|
@@ -87,10 +87,11 @@ class PostgresEntityDatabaseAdapter extends BasePostgresEntityDatabaseAdapter_1.
|
|
|
87
87
|
ret = ret.orderBy(orderBySpecification.columnName, orderBySpecification.order, orderBySpecification.nulls);
|
|
88
88
|
}
|
|
89
89
|
else {
|
|
90
|
+
const orderDirection = orderBySpecification.order === BasePostgresEntityDatabaseAdapter_1.OrderByOrdering.ASCENDING ? 'ASC' : 'DESC';
|
|
90
91
|
const nullsSuffix = orderBySpecification.nulls
|
|
91
92
|
? ` NULLS ${orderBySpecification.nulls === BasePostgresEntityDatabaseAdapter_1.NullsOrdering.FIRST ? 'FIRST' : 'LAST'}`
|
|
92
93
|
: '';
|
|
93
|
-
ret = ret.orderByRaw(`(${orderBySpecification.columnFragment.sql}) ${
|
|
94
|
+
ret = ret.orderByRaw(`(${orderBySpecification.columnFragment.sql}) ${orderDirection}${nullsSuffix}`, orderBySpecification.columnFragment.getKnexBindings((fieldName) => (0, entity_1.getDatabaseFieldForEntityField)(this.entityConfiguration, fieldName)));
|
|
94
95
|
}
|
|
95
96
|
}
|
|
96
97
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresEntityDatabaseAdapter.js","sourceRoot":"","sources":["../../src/PostgresEntityDatabaseAdapter.ts"],"names":[],"mappings":";;;AAAA,yCAKsB;AAGtB,
|
|
1
|
+
{"version":3,"file":"PostgresEntityDatabaseAdapter.js","sourceRoot":"","sources":["../../src/PostgresEntityDatabaseAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -31,7 +31,7 @@ export declare class SQLFragment<TFields extends Record<string, any>> {
|
|
|
31
31
|
*
|
|
32
32
|
* @param getColumnForField - function that resolves an entity field name to its database column name
|
|
33
33
|
*/
|
|
34
|
-
getKnexBindings(getColumnForField: (fieldName: keyof TFields) => string): readonly
|
|
34
|
+
getKnexBindings(getColumnForField: (fieldName: keyof TFields) => string): readonly SupportedSQLValue[];
|
|
35
35
|
/**
|
|
36
36
|
* Combine SQL fragments
|
|
37
37
|
*/
|
|
@@ -85,6 +85,15 @@ export declare class SQLEntityField<TFields extends Record<string, any>> {
|
|
|
85
85
|
readonly fieldName: keyof TFields;
|
|
86
86
|
constructor(fieldName: keyof TFields);
|
|
87
87
|
}
|
|
88
|
+
/**
|
|
89
|
+
* Helper for passing an array as a single bound parameter (e.g. for PostgreSQL's = ANY(?)).
|
|
90
|
+
* Unlike bare arrays interpolated in the sql template (which expand to (?, ?, ?) for IN clauses),
|
|
91
|
+
* this binds the entire array as one parameter, letting knex handle the array encoding.
|
|
92
|
+
*/
|
|
93
|
+
export declare class SQLArrayValue {
|
|
94
|
+
readonly values: readonly SupportedSQLValue[];
|
|
95
|
+
constructor(values: readonly SupportedSQLValue[]);
|
|
96
|
+
}
|
|
88
97
|
/**
|
|
89
98
|
* Helper for raw SQL that should not be parameterized
|
|
90
99
|
* WARNING: Only use this with trusted input to avoid SQL injection
|
|
@@ -111,6 +120,18 @@ export declare function identifier(name: string): SQLIdentifier;
|
|
|
111
120
|
* @param fieldName - The entity field name to reference.
|
|
112
121
|
*/
|
|
113
122
|
export declare function entityField<TFields extends Record<string, any>>(fieldName: keyof TFields): SQLEntityField<TFields>;
|
|
123
|
+
/**
|
|
124
|
+
* Wrap an array so it is bound as a single parameter rather than expanded for IN clauses.
|
|
125
|
+
* Generates PostgreSQL's = ANY(?) syntax.
|
|
126
|
+
*
|
|
127
|
+
* @example
|
|
128
|
+
* ```ts
|
|
129
|
+
* const statuses = ['active', 'pending'];
|
|
130
|
+
* const query = sql`${entityField('status')} = ANY(${arrayValue(statuses)})`;
|
|
131
|
+
* // Generates: ?? = ANY(?) with the array bound as a single parameter
|
|
132
|
+
* ```
|
|
133
|
+
*/
|
|
134
|
+
export declare function arrayValue(values: readonly SupportedSQLValue[]): SQLArrayValue;
|
|
114
135
|
/**
|
|
115
136
|
* Insert raw SQL that will not be parameterized
|
|
116
137
|
* WARNING: This bypasses SQL injection protection. Only use with trusted input.
|
|
@@ -135,10 +156,16 @@ export declare function unsafeRaw(sqlString: string): SQLUnsafeRaw;
|
|
|
135
156
|
* const query = sql`age >= ${age} AND status = ${'active'}`;
|
|
136
157
|
* ```
|
|
137
158
|
*/
|
|
138
|
-
export declare function sql<TFields extends Record<string, any>>(strings: TemplateStringsArray, ...values: readonly (SupportedSQLValue | SQLFragment<TFields> | SQLIdentifier | SQLUnsafeRaw | SQLEntityField<TFields>)[]): SQLFragment<TFields>;
|
|
159
|
+
export declare function sql<TFields extends Record<string, any>>(strings: TemplateStringsArray, ...values: readonly (SupportedSQLValue | SQLFragment<TFields> | SQLIdentifier | SQLUnsafeRaw | SQLEntityField<TFields> | SQLArrayValue)[]): SQLFragment<TFields>;
|
|
139
160
|
type PickSupportedSQLValueKeys<T> = {
|
|
140
161
|
[K in keyof T]: T[K] extends SupportedSQLValue ? K : never;
|
|
141
162
|
}[keyof T];
|
|
163
|
+
type PickStringValueKeys<T> = {
|
|
164
|
+
[K in keyof T]: T[K] extends string | null | undefined ? K : never;
|
|
165
|
+
}[keyof T];
|
|
166
|
+
type JsonSerializable = string | number | boolean | null | undefined | readonly JsonSerializable[] | {
|
|
167
|
+
readonly [key: string]: JsonSerializable;
|
|
168
|
+
};
|
|
142
169
|
/**
|
|
143
170
|
* Common SQL helper functions for building queries
|
|
144
171
|
*/
|
|
@@ -153,6 +180,18 @@ export declare const SQLFragmentHelpers: {
|
|
|
153
180
|
* ```
|
|
154
181
|
*/
|
|
155
182
|
inArray<TFields extends Record<string, any>, N extends PickSupportedSQLValueKeys<TFields>>(fieldName: N, values: readonly TFields[N][]): SQLFragment<TFields>;
|
|
183
|
+
/**
|
|
184
|
+
* = ANY() clause helper. Binds the array as a single parameter instead of expanding it.
|
|
185
|
+
* Semantically equivalent to IN for most cases, but retains a consistent query shape for
|
|
186
|
+
* query metrics.
|
|
187
|
+
*
|
|
188
|
+
* @example
|
|
189
|
+
* ```ts
|
|
190
|
+
* const query = SQLFragmentHelpers.anyArray('status', ['active', 'pending']);
|
|
191
|
+
* // Generates: ?? = ANY(?) with entityField binding for 'status' and a single array value binding
|
|
192
|
+
* ```
|
|
193
|
+
*/
|
|
194
|
+
anyArray<TFields extends Record<string, any>, N extends PickSupportedSQLValueKeys<TFields>>(fieldName: N, values: readonly TFields[N][]): SQLFragment<TFields>;
|
|
156
195
|
/**
|
|
157
196
|
* NOT IN clause helper
|
|
158
197
|
*/
|
|
@@ -180,19 +219,19 @@ export declare const SQLFragmentHelpers: {
|
|
|
180
219
|
* // Generates: ?? LIKE ? with entityField binding for 'name' and value binding
|
|
181
220
|
* ```
|
|
182
221
|
*/
|
|
183
|
-
like<TFields extends Record<string, any>>(fieldName:
|
|
222
|
+
like<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
184
223
|
/**
|
|
185
224
|
* NOT LIKE helper
|
|
186
225
|
*/
|
|
187
|
-
notLike<TFields extends Record<string, any>>(fieldName:
|
|
226
|
+
notLike<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
188
227
|
/**
|
|
189
228
|
* ILIKE helper for case-insensitive matching
|
|
190
229
|
*/
|
|
191
|
-
ilike<TFields extends Record<string, any>>(fieldName:
|
|
230
|
+
ilike<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
192
231
|
/**
|
|
193
232
|
* NOT ILIKE helper for case-insensitive non-matching
|
|
194
233
|
*/
|
|
195
|
-
notIlike<TFields extends Record<string, any>>(fieldName:
|
|
234
|
+
notIlike<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
196
235
|
/**
|
|
197
236
|
* NULL check helper
|
|
198
237
|
*/
|
|
@@ -228,11 +267,11 @@ export declare const SQLFragmentHelpers: {
|
|
|
228
267
|
/**
|
|
229
268
|
* JSON contains operator (\@\>)
|
|
230
269
|
*/
|
|
231
|
-
jsonContains<TFields extends Record<string, any>>(fieldName: keyof TFields, value:
|
|
270
|
+
jsonContains<TFields extends Record<string, any>>(fieldName: keyof TFields, value: JsonSerializable): SQLFragment<TFields>;
|
|
232
271
|
/**
|
|
233
272
|
* JSON contained by operator (\<\@\)
|
|
234
273
|
*/
|
|
235
|
-
jsonContainedBy<TFields extends Record<string, any>>(fieldName: keyof TFields, value:
|
|
274
|
+
jsonContainedBy<TFields extends Record<string, any>>(fieldName: keyof TFields, value: JsonSerializable): SQLFragment<TFields>;
|
|
236
275
|
/**
|
|
237
276
|
* JSON path extraction helper (-\>)
|
|
238
277
|
*/
|
package/build/src/SQLOperator.js
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
2
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SQLFragmentHelpers = exports.SQLUnsafeRaw = exports.SQLEntityField = exports.SQLIdentifier = exports.SQLFragment = void 0;
|
|
6
|
+
exports.SQLFragmentHelpers = exports.SQLUnsafeRaw = exports.SQLArrayValue = exports.SQLEntityField = exports.SQLIdentifier = exports.SQLFragment = void 0;
|
|
4
7
|
exports.identifier = identifier;
|
|
5
8
|
exports.entityField = entityField;
|
|
9
|
+
exports.arrayValue = arrayValue;
|
|
6
10
|
exports.unsafeRaw = unsafeRaw;
|
|
7
11
|
exports.sql = sql;
|
|
12
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
13
|
/**
|
|
9
14
|
* SQL Fragment class that safely handles parameterized queries.
|
|
10
15
|
*/
|
|
@@ -171,6 +176,18 @@ class SQLEntityField {
|
|
|
171
176
|
}
|
|
172
177
|
}
|
|
173
178
|
exports.SQLEntityField = SQLEntityField;
|
|
179
|
+
/**
|
|
180
|
+
* Helper for passing an array as a single bound parameter (e.g. for PostgreSQL's = ANY(?)).
|
|
181
|
+
* Unlike bare arrays interpolated in the sql template (which expand to (?, ?, ?) for IN clauses),
|
|
182
|
+
* this binds the entire array as one parameter, letting knex handle the array encoding.
|
|
183
|
+
*/
|
|
184
|
+
class SQLArrayValue {
|
|
185
|
+
values;
|
|
186
|
+
constructor(values) {
|
|
187
|
+
this.values = values;
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
exports.SQLArrayValue = SQLArrayValue;
|
|
174
191
|
/**
|
|
175
192
|
* Helper for raw SQL that should not be parameterized
|
|
176
193
|
* WARNING: Only use this with trusted input to avoid SQL injection
|
|
@@ -204,6 +221,20 @@ function identifier(name) {
|
|
|
204
221
|
function entityField(fieldName) {
|
|
205
222
|
return new SQLEntityField(fieldName);
|
|
206
223
|
}
|
|
224
|
+
/**
|
|
225
|
+
* Wrap an array so it is bound as a single parameter rather than expanded for IN clauses.
|
|
226
|
+
* Generates PostgreSQL's = ANY(?) syntax.
|
|
227
|
+
*
|
|
228
|
+
* @example
|
|
229
|
+
* ```ts
|
|
230
|
+
* const statuses = ['active', 'pending'];
|
|
231
|
+
* const query = sql`${entityField('status')} = ANY(${arrayValue(statuses)})`;
|
|
232
|
+
* // Generates: ?? = ANY(?) with the array bound as a single parameter
|
|
233
|
+
* ```
|
|
234
|
+
*/
|
|
235
|
+
function arrayValue(values) {
|
|
236
|
+
return new SQLArrayValue(values);
|
|
237
|
+
}
|
|
207
238
|
/**
|
|
208
239
|
* Insert raw SQL that will not be parameterized
|
|
209
240
|
* WARNING: This bypasses SQL injection protection. Only use with trusted input.
|
|
@@ -252,6 +283,11 @@ function sql(strings, ...values) {
|
|
|
252
283
|
sqlString += '??';
|
|
253
284
|
bindings.push({ type: 'entityField', fieldName: value.fieldName });
|
|
254
285
|
}
|
|
286
|
+
else if (value instanceof SQLArrayValue) {
|
|
287
|
+
// Handle array as a single bound parameter (for = ANY(?), etc.)
|
|
288
|
+
sqlString += '?';
|
|
289
|
+
bindings.push({ type: 'value', value: value.values });
|
|
290
|
+
}
|
|
255
291
|
else if (value instanceof SQLUnsafeRaw) {
|
|
256
292
|
// Handle raw SQL (WARNING: no parameterization)
|
|
257
293
|
sqlString += value.rawSql;
|
|
@@ -290,6 +326,24 @@ exports.SQLFragmentHelpers = {
|
|
|
290
326
|
}
|
|
291
327
|
return sql `${entityField(fieldName)} IN ${values}`;
|
|
292
328
|
},
|
|
329
|
+
/**
|
|
330
|
+
* = ANY() clause helper. Binds the array as a single parameter instead of expanding it.
|
|
331
|
+
* Semantically equivalent to IN for most cases, but retains a consistent query shape for
|
|
332
|
+
* query metrics.
|
|
333
|
+
*
|
|
334
|
+
* @example
|
|
335
|
+
* ```ts
|
|
336
|
+
* const query = SQLFragmentHelpers.anyArray('status', ['active', 'pending']);
|
|
337
|
+
* // Generates: ?? = ANY(?) with entityField binding for 'status' and a single array value binding
|
|
338
|
+
* ```
|
|
339
|
+
*/
|
|
340
|
+
anyArray(fieldName, values) {
|
|
341
|
+
if (values.length === 0) {
|
|
342
|
+
// Handle empty array case - always false
|
|
343
|
+
return sql `1 = 0`;
|
|
344
|
+
}
|
|
345
|
+
return sql `${entityField(fieldName)} = ANY(${arrayValue(values)})`;
|
|
346
|
+
},
|
|
293
347
|
/**
|
|
294
348
|
* NOT IN clause helper
|
|
295
349
|
*/
|
|
@@ -406,13 +460,19 @@ exports.SQLFragmentHelpers = {
|
|
|
406
460
|
* JSON contains operator (\@\>)
|
|
407
461
|
*/
|
|
408
462
|
jsonContains(fieldName, value) {
|
|
409
|
-
|
|
463
|
+
const serialized = JSON.stringify(value);
|
|
464
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
465
|
+
(0, assert_1.default)(serialized !== undefined || value === undefined, 'jsonContains: value is not JSON-serializable');
|
|
466
|
+
return sql `${entityField(fieldName)} @> ${serialized}::jsonb`;
|
|
410
467
|
},
|
|
411
468
|
/**
|
|
412
469
|
* JSON contained by operator (\<\@\)
|
|
413
470
|
*/
|
|
414
471
|
jsonContainedBy(fieldName, value) {
|
|
415
|
-
|
|
472
|
+
const serialized = JSON.stringify(value);
|
|
473
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
474
|
+
(0, assert_1.default)(serialized !== undefined || value === undefined, 'jsonContainedBy: value is not JSON-serializable');
|
|
475
|
+
return sql `${entityField(fieldName)} <@ ${serialized}::jsonb`;
|
|
416
476
|
},
|
|
417
477
|
/**
|
|
418
478
|
* JSON path extraction helper (-\>)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLOperator.js","sourceRoot":"","sources":["../../src/SQLOperator.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SQLOperator.js","sourceRoot":"","sources":["../../src/SQLOperator.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@expo/entity-database-adapter-knex",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.59.0",
|
|
4
4
|
"description": "Knex database adapter for @expo/entity",
|
|
5
5
|
"files": [
|
|
6
6
|
"build",
|
|
@@ -28,15 +28,15 @@
|
|
|
28
28
|
"author": "Expo",
|
|
29
29
|
"license": "MIT",
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@expo/entity": "^0.
|
|
31
|
+
"@expo/entity": "^0.59.0",
|
|
32
32
|
"knex": "^3.1.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@expo/entity-testing-utils": "^0.
|
|
35
|
+
"@expo/entity-testing-utils": "^0.59.0",
|
|
36
36
|
"@jest/globals": "30.2.0",
|
|
37
|
-
"pg": "8.
|
|
37
|
+
"pg": "8.19.0",
|
|
38
38
|
"ts-mockito": "2.6.1",
|
|
39
39
|
"typescript": "5.9.3"
|
|
40
40
|
},
|
|
41
|
-
"gitHead": "
|
|
41
|
+
"gitHead": "bfe1aad035985e65e3a704f3f9a9bc53d3fe7e98"
|
|
42
42
|
}
|
|
@@ -95,8 +95,7 @@ export type EntityLoaderFieldNameConstructorFn<
|
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
97
|
* Specification for a search field that is a manually constructed SQLFragment. Useful for complex search fields that require
|
|
98
|
-
* transformations
|
|
99
|
-
* to search by display name with fallback to full name.
|
|
98
|
+
* transformations to make nullable fields non-null or to make combinations of multiple fields.
|
|
100
99
|
*/
|
|
101
100
|
export type EntityLoaderSearchFieldSQLFragmentFnSpecification<
|
|
102
101
|
TFields extends Record<string, any>,
|
|
@@ -9,6 +9,7 @@ import { Knex } from 'knex';
|
|
|
9
9
|
import {
|
|
10
10
|
BasePostgresEntityDatabaseAdapter,
|
|
11
11
|
NullsOrdering,
|
|
12
|
+
OrderByOrdering,
|
|
12
13
|
TableFieldMultiValueEqualityCondition,
|
|
13
14
|
TableFieldSingleValueEqualityCondition,
|
|
14
15
|
TableQuerySelectionModifiers,
|
|
@@ -139,11 +140,13 @@ export class PostgresEntityDatabaseAdapter<
|
|
|
139
140
|
orderBySpecification.nulls,
|
|
140
141
|
);
|
|
141
142
|
} else {
|
|
143
|
+
const orderDirection =
|
|
144
|
+
orderBySpecification.order === OrderByOrdering.ASCENDING ? 'ASC' : 'DESC';
|
|
142
145
|
const nullsSuffix = orderBySpecification.nulls
|
|
143
146
|
? ` NULLS ${orderBySpecification.nulls === NullsOrdering.FIRST ? 'FIRST' : 'LAST'}`
|
|
144
147
|
: '';
|
|
145
148
|
ret = ret.orderByRaw(
|
|
146
|
-
`(${orderBySpecification.columnFragment.sql}) ${
|
|
149
|
+
`(${orderBySpecification.columnFragment.sql}) ${orderDirection}${nullsSuffix}`,
|
|
147
150
|
orderBySpecification.columnFragment.getKnexBindings((fieldName) =>
|
|
148
151
|
getDatabaseFieldForEntityField(this.entityConfiguration, fieldName),
|
|
149
152
|
),
|
package/src/SQLOperator.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import assert from 'assert';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Supported SQL value types that can be safely parameterized.
|
|
3
5
|
* This ensures type safety and prevents passing unsupported types to SQL queries.
|
|
@@ -39,7 +41,7 @@ export class SQLFragment<TFields extends Record<string, any>> {
|
|
|
39
41
|
*/
|
|
40
42
|
getKnexBindings(
|
|
41
43
|
getColumnForField: (fieldName: keyof TFields) => string,
|
|
42
|
-
): readonly
|
|
44
|
+
): readonly SupportedSQLValue[] {
|
|
43
45
|
return this.bindings.map((b) => {
|
|
44
46
|
switch (b.type) {
|
|
45
47
|
case 'entityField':
|
|
@@ -199,6 +201,15 @@ export class SQLEntityField<TFields extends Record<string, any>> {
|
|
|
199
201
|
constructor(public readonly fieldName: keyof TFields) {}
|
|
200
202
|
}
|
|
201
203
|
|
|
204
|
+
/**
|
|
205
|
+
* Helper for passing an array as a single bound parameter (e.g. for PostgreSQL's = ANY(?)).
|
|
206
|
+
* Unlike bare arrays interpolated in the sql template (which expand to (?, ?, ?) for IN clauses),
|
|
207
|
+
* this binds the entire array as one parameter, letting knex handle the array encoding.
|
|
208
|
+
*/
|
|
209
|
+
export class SQLArrayValue {
|
|
210
|
+
constructor(public readonly values: readonly SupportedSQLValue[]) {}
|
|
211
|
+
}
|
|
212
|
+
|
|
202
213
|
/**
|
|
203
214
|
* Helper for raw SQL that should not be parameterized
|
|
204
215
|
* WARNING: Only use this with trusted input to avoid SQL injection
|
|
@@ -233,6 +244,21 @@ export function entityField<TFields extends Record<string, any>>(
|
|
|
233
244
|
return new SQLEntityField(fieldName);
|
|
234
245
|
}
|
|
235
246
|
|
|
247
|
+
/**
|
|
248
|
+
* Wrap an array so it is bound as a single parameter rather than expanded for IN clauses.
|
|
249
|
+
* Generates PostgreSQL's = ANY(?) syntax.
|
|
250
|
+
*
|
|
251
|
+
* @example
|
|
252
|
+
* ```ts
|
|
253
|
+
* const statuses = ['active', 'pending'];
|
|
254
|
+
* const query = sql`${entityField('status')} = ANY(${arrayValue(statuses)})`;
|
|
255
|
+
* // Generates: ?? = ANY(?) with the array bound as a single parameter
|
|
256
|
+
* ```
|
|
257
|
+
*/
|
|
258
|
+
export function arrayValue(values: readonly SupportedSQLValue[]): SQLArrayValue {
|
|
259
|
+
return new SQLArrayValue(values);
|
|
260
|
+
}
|
|
261
|
+
|
|
236
262
|
/**
|
|
237
263
|
* Insert raw SQL that will not be parameterized
|
|
238
264
|
* WARNING: This bypasses SQL injection protection. Only use with trusted input.
|
|
@@ -268,6 +294,7 @@ export function sql<TFields extends Record<string, any>>(
|
|
|
268
294
|
| SQLIdentifier
|
|
269
295
|
| SQLUnsafeRaw
|
|
270
296
|
| SQLEntityField<TFields>
|
|
297
|
+
| SQLArrayValue
|
|
271
298
|
)[]
|
|
272
299
|
): SQLFragment<TFields> {
|
|
273
300
|
let sqlString = '';
|
|
@@ -290,6 +317,10 @@ export function sql<TFields extends Record<string, any>>(
|
|
|
290
317
|
// Handle entity field references by treating them as identifiers
|
|
291
318
|
sqlString += '??';
|
|
292
319
|
bindings.push({ type: 'entityField', fieldName: value.fieldName });
|
|
320
|
+
} else if (value instanceof SQLArrayValue) {
|
|
321
|
+
// Handle array as a single bound parameter (for = ANY(?), etc.)
|
|
322
|
+
sqlString += '?';
|
|
323
|
+
bindings.push({ type: 'value', value: value.values as SupportedSQLValue });
|
|
293
324
|
} else if (value instanceof SQLUnsafeRaw) {
|
|
294
325
|
// Handle raw SQL (WARNING: no parameterization)
|
|
295
326
|
sqlString += value.rawSql;
|
|
@@ -312,6 +343,19 @@ type PickSupportedSQLValueKeys<T> = {
|
|
|
312
343
|
[K in keyof T]: T[K] extends SupportedSQLValue ? K : never;
|
|
313
344
|
}[keyof T];
|
|
314
345
|
|
|
346
|
+
type PickStringValueKeys<T> = {
|
|
347
|
+
[K in keyof T]: T[K] extends string | null | undefined ? K : never;
|
|
348
|
+
}[keyof T];
|
|
349
|
+
|
|
350
|
+
type JsonSerializable =
|
|
351
|
+
| string
|
|
352
|
+
| number
|
|
353
|
+
| boolean
|
|
354
|
+
| null
|
|
355
|
+
| undefined
|
|
356
|
+
| readonly JsonSerializable[]
|
|
357
|
+
| { readonly [key: string]: JsonSerializable };
|
|
358
|
+
|
|
315
359
|
/**
|
|
316
360
|
* Common SQL helper functions for building queries
|
|
317
361
|
*/
|
|
@@ -336,6 +380,28 @@ export const SQLFragmentHelpers = {
|
|
|
336
380
|
return sql`${entityField(fieldName)} IN ${values}`;
|
|
337
381
|
},
|
|
338
382
|
|
|
383
|
+
/**
|
|
384
|
+
* = ANY() clause helper. Binds the array as a single parameter instead of expanding it.
|
|
385
|
+
* Semantically equivalent to IN for most cases, but retains a consistent query shape for
|
|
386
|
+
* query metrics.
|
|
387
|
+
*
|
|
388
|
+
* @example
|
|
389
|
+
* ```ts
|
|
390
|
+
* const query = SQLFragmentHelpers.anyArray('status', ['active', 'pending']);
|
|
391
|
+
* // Generates: ?? = ANY(?) with entityField binding for 'status' and a single array value binding
|
|
392
|
+
* ```
|
|
393
|
+
*/
|
|
394
|
+
anyArray<TFields extends Record<string, any>, N extends PickSupportedSQLValueKeys<TFields>>(
|
|
395
|
+
fieldName: N,
|
|
396
|
+
values: readonly TFields[N][],
|
|
397
|
+
): SQLFragment<TFields> {
|
|
398
|
+
if (values.length === 0) {
|
|
399
|
+
// Handle empty array case - always false
|
|
400
|
+
return sql`1 = 0`;
|
|
401
|
+
}
|
|
402
|
+
return sql`${entityField(fieldName)} = ANY(${arrayValue(values)})`;
|
|
403
|
+
},
|
|
404
|
+
|
|
339
405
|
/**
|
|
340
406
|
* NOT IN clause helper
|
|
341
407
|
*/
|
|
@@ -388,7 +454,7 @@ export const SQLFragmentHelpers = {
|
|
|
388
454
|
* ```
|
|
389
455
|
*/
|
|
390
456
|
like<TFields extends Record<string, any>>(
|
|
391
|
-
fieldName:
|
|
457
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
392
458
|
pattern: string,
|
|
393
459
|
): SQLFragment<TFields> {
|
|
394
460
|
return sql`${entityField(fieldName)} LIKE ${pattern}`;
|
|
@@ -398,7 +464,7 @@ export const SQLFragmentHelpers = {
|
|
|
398
464
|
* NOT LIKE helper
|
|
399
465
|
*/
|
|
400
466
|
notLike<TFields extends Record<string, any>>(
|
|
401
|
-
fieldName:
|
|
467
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
402
468
|
pattern: string,
|
|
403
469
|
): SQLFragment<TFields> {
|
|
404
470
|
return sql`${entityField(fieldName)} NOT LIKE ${pattern}`;
|
|
@@ -408,7 +474,7 @@ export const SQLFragmentHelpers = {
|
|
|
408
474
|
* ILIKE helper for case-insensitive matching
|
|
409
475
|
*/
|
|
410
476
|
ilike<TFields extends Record<string, any>>(
|
|
411
|
-
fieldName:
|
|
477
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
412
478
|
pattern: string,
|
|
413
479
|
): SQLFragment<TFields> {
|
|
414
480
|
return sql`${entityField(fieldName)} ILIKE ${pattern}`;
|
|
@@ -418,7 +484,7 @@ export const SQLFragmentHelpers = {
|
|
|
418
484
|
* NOT ILIKE helper for case-insensitive non-matching
|
|
419
485
|
*/
|
|
420
486
|
notIlike<TFields extends Record<string, any>>(
|
|
421
|
-
fieldName:
|
|
487
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
422
488
|
pattern: string,
|
|
423
489
|
): SQLFragment<TFields> {
|
|
424
490
|
return sql`${entityField(fieldName)} NOT ILIKE ${pattern}`;
|
|
@@ -509,9 +575,15 @@ export const SQLFragmentHelpers = {
|
|
|
509
575
|
*/
|
|
510
576
|
jsonContains<TFields extends Record<string, any>>(
|
|
511
577
|
fieldName: keyof TFields,
|
|
512
|
-
value:
|
|
578
|
+
value: JsonSerializable,
|
|
513
579
|
): SQLFragment<TFields> {
|
|
514
|
-
|
|
580
|
+
const serialized = JSON.stringify(value);
|
|
581
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
582
|
+
assert(
|
|
583
|
+
serialized !== undefined || value === undefined,
|
|
584
|
+
'jsonContains: value is not JSON-serializable',
|
|
585
|
+
);
|
|
586
|
+
return sql`${entityField(fieldName)} @> ${serialized}::jsonb`;
|
|
515
587
|
},
|
|
516
588
|
|
|
517
589
|
/**
|
|
@@ -519,9 +591,15 @@ export const SQLFragmentHelpers = {
|
|
|
519
591
|
*/
|
|
520
592
|
jsonContainedBy<TFields extends Record<string, any>>(
|
|
521
593
|
fieldName: keyof TFields,
|
|
522
|
-
value:
|
|
594
|
+
value: JsonSerializable,
|
|
523
595
|
): SQLFragment<TFields> {
|
|
524
|
-
|
|
596
|
+
const serialized = JSON.stringify(value);
|
|
597
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
598
|
+
assert(
|
|
599
|
+
serialized !== undefined || value === undefined,
|
|
600
|
+
'jsonContainedBy: value is not JSON-serializable',
|
|
601
|
+
);
|
|
602
|
+
return sql`${entityField(fieldName)} <@ ${serialized}::jsonb`;
|
|
525
603
|
},
|
|
526
604
|
|
|
527
605
|
/**
|
|
@@ -3668,9 +3668,9 @@ describe('postgres entity integration', () => {
|
|
|
3668
3668
|
}
|
|
3669
3669
|
|
|
3670
3670
|
const paginationSpec: PaginationSpecification<PostgresTestEntityFields> = {
|
|
3671
|
-
strategy: PaginationStrategy.TRIGRAM_SEARCH
|
|
3671
|
+
strategy: PaginationStrategy.TRIGRAM_SEARCH,
|
|
3672
3672
|
term: 'Johnson',
|
|
3673
|
-
fields: ['label'
|
|
3673
|
+
fields: ['label'],
|
|
3674
3674
|
threshold: 0.2,
|
|
3675
3675
|
extraOrderByFields: [
|
|
3676
3676
|
{
|
|
@@ -2,6 +2,7 @@ import { getDatabaseFieldForEntityField } from '@expo/entity';
|
|
|
2
2
|
import { describe, expect, it } from '@jest/globals';
|
|
3
3
|
|
|
4
4
|
import {
|
|
5
|
+
arrayValue,
|
|
5
6
|
entityField,
|
|
6
7
|
identifier,
|
|
7
8
|
unsafeRaw,
|
|
@@ -56,6 +57,27 @@ describe('SQLOperator', () => {
|
|
|
56
57
|
]);
|
|
57
58
|
});
|
|
58
59
|
|
|
60
|
+
it('handles arrayValue as a single bound parameter', () => {
|
|
61
|
+
const values = ['active', 'pending', 'approved'];
|
|
62
|
+
const fragment = sql`status = ANY(${arrayValue(values)})`;
|
|
63
|
+
|
|
64
|
+
expect(fragment.sql).toBe('status = ANY(?)');
|
|
65
|
+
expect(fragment.getKnexBindings(getColumnForField)).toEqual([
|
|
66
|
+
['active', 'pending', 'approved'],
|
|
67
|
+
]);
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('handles arrayValue with entity field for = ANY()', () => {
|
|
71
|
+
const values = ['active', 'pending'];
|
|
72
|
+
const fragment = sql`${entityField<TestFields>('stringField')} = ANY(${arrayValue(values)})`;
|
|
73
|
+
|
|
74
|
+
expect(fragment.sql).toBe('?? = ANY(?)');
|
|
75
|
+
expect(fragment.getKnexBindings(getColumnForField)).toEqual([
|
|
76
|
+
'string_field',
|
|
77
|
+
['active', 'pending'],
|
|
78
|
+
]);
|
|
79
|
+
});
|
|
80
|
+
|
|
59
81
|
it('handles null values', () => {
|
|
60
82
|
const fragment = sql`field = ${null}`;
|
|
61
83
|
|
|
@@ -500,6 +522,25 @@ describe('SQLOperator', () => {
|
|
|
500
522
|
});
|
|
501
523
|
});
|
|
502
524
|
|
|
525
|
+
describe(SQLFragmentHelpers.anyArray, () => {
|
|
526
|
+
it('generates = ANY() clause with values', () => {
|
|
527
|
+
const fragment = SQLFragmentHelpers.anyArray('stringField', ['active', 'pending']);
|
|
528
|
+
|
|
529
|
+
expect(fragment.sql).toBe('?? = ANY(?)');
|
|
530
|
+
expect(fragment.getKnexBindings(getColumnForField)).toEqual([
|
|
531
|
+
'string_field',
|
|
532
|
+
['active', 'pending'],
|
|
533
|
+
]);
|
|
534
|
+
});
|
|
535
|
+
|
|
536
|
+
it('handles empty array', () => {
|
|
537
|
+
const fragment = SQLFragmentHelpers.anyArray('stringField', []);
|
|
538
|
+
|
|
539
|
+
expect(fragment.sql).toBe('1 = 0'); // Always false
|
|
540
|
+
expect(fragment.getKnexBindings(getColumnForField)).toEqual([]);
|
|
541
|
+
});
|
|
542
|
+
});
|
|
543
|
+
|
|
503
544
|
describe(SQLFragmentHelpers.between, () => {
|
|
504
545
|
it('generates BETWEEN clause with numbers', () => {
|
|
505
546
|
const fragment = SQLFragmentHelpers.between('intField', 18, 65);
|
|
@@ -692,6 +733,26 @@ describe('SQLOperator', () => {
|
|
|
692
733
|
'{"premium":true}',
|
|
693
734
|
]);
|
|
694
735
|
});
|
|
736
|
+
|
|
737
|
+
it('generates JSON contains for null and undefined values', () => {
|
|
738
|
+
const fragmentNull = SQLFragmentHelpers.jsonContains('stringField', null);
|
|
739
|
+
const fragmentUndefined = SQLFragmentHelpers.jsonContains('stringField', undefined);
|
|
740
|
+
|
|
741
|
+
expect(fragmentNull.sql).toBe('?? @> ?::jsonb');
|
|
742
|
+
expect(fragmentNull.getKnexBindings(getColumnForField)).toEqual(['string_field', 'null']);
|
|
743
|
+
|
|
744
|
+
expect(fragmentUndefined.sql).toBe('?? @> ?::jsonb');
|
|
745
|
+
expect(fragmentUndefined.getKnexBindings(getColumnForField)).toEqual([
|
|
746
|
+
'string_field',
|
|
747
|
+
undefined,
|
|
748
|
+
]);
|
|
749
|
+
});
|
|
750
|
+
|
|
751
|
+
it('throws when value is not JSON-serializable', () => {
|
|
752
|
+
expect(() => SQLFragmentHelpers.jsonContains('stringField', (() => {}) as any)).toThrow(
|
|
753
|
+
'jsonContains: value is not JSON-serializable',
|
|
754
|
+
);
|
|
755
|
+
});
|
|
695
756
|
});
|
|
696
757
|
|
|
697
758
|
describe(SQLFragmentHelpers.jsonContainedBy, () => {
|
|
@@ -707,6 +768,26 @@ describe('SQLOperator', () => {
|
|
|
707
768
|
'{"theme":"dark","lang":"en"}',
|
|
708
769
|
]);
|
|
709
770
|
});
|
|
771
|
+
|
|
772
|
+
it('generates JSON contained by for null and undefined values', () => {
|
|
773
|
+
const fragmentNull = SQLFragmentHelpers.jsonContainedBy('stringField', null);
|
|
774
|
+
const fragmentUndefined = SQLFragmentHelpers.jsonContainedBy('stringField', undefined);
|
|
775
|
+
|
|
776
|
+
expect(fragmentNull.sql).toBe('?? <@ ?::jsonb');
|
|
777
|
+
expect(fragmentNull.getKnexBindings(getColumnForField)).toEqual(['string_field', 'null']);
|
|
778
|
+
|
|
779
|
+
expect(fragmentUndefined.sql).toBe('?? <@ ?::jsonb');
|
|
780
|
+
expect(fragmentUndefined.getKnexBindings(getColumnForField)).toEqual([
|
|
781
|
+
'string_field',
|
|
782
|
+
undefined,
|
|
783
|
+
]);
|
|
784
|
+
});
|
|
785
|
+
|
|
786
|
+
it('throws when value is not JSON-serializable', () => {
|
|
787
|
+
expect(() => SQLFragmentHelpers.jsonContainedBy('stringField', (() => {}) as any)).toThrow(
|
|
788
|
+
'jsonContainedBy: value is not JSON-serializable',
|
|
789
|
+
);
|
|
790
|
+
});
|
|
710
791
|
});
|
|
711
792
|
|
|
712
793
|
describe(SQLFragmentHelpers.jsonPath, () => {
|