@expo/entity-database-adapter-knex 0.57.0 → 0.58.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 +13 -7
- package/build/src/SQLOperator.js +12 -2
- 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 +36 -9
- package/src/__integration-tests__/PostgresEntityIntegration-test.ts +2 -2
- package/src/__tests__/SQLOperator-test.ts +40 -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":";;;AAAA,yCAKsB;AAGtB,2FAO6C;AAC7C,iDAAqE;AAGrE,sFAAmF;AAEnF,MAAa,6BAGX,SAAQ,qEAAoD;IAGzC;IAFnB,YACE,mBAA2D,EAC1C,uBAAmE,EAAE;QAEtF,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAFV,yBAAoB,GAApB,oBAAoB,CAAiD;IAGxF,CAAC;IAED,IAAa,qBAAqB;QAChC,OAAO,IAAI,CAAC,oBAAoB,CAAC,qBAAqB,CAAC;IACzD,CAAC;IAES,sBAAsB;QAC9B,OAAO,IAAI,GAAG,CAAgC;YAC5C;gBACE,6BAAc,CAAC,IAAI;gBACnB;oBACE;;;uBAGG;oBACH,KAAK,EAAE,CAAC,GAAU,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC;iBAC3C;aACF;YACD;gBACE,kCAAmB,CAAC,IAAI;gBACxB;oBACE;;;;uBAIG;oBACH,KAAK,EAAE,CAAC,GAAgB,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;iBAC9E;aACF;SACF,CAAC,CAAC;IACL,CAAC;IAES,KAAK,CAAC,2BAA2B,CACzC,cAAoB,EACpB,SAAiB,EACjB,YAA+B,EAC/B,WAAoB;QAEpB,yEAAyE;QACzE,iDAAiD;QACjD,gFAAgF;QAChF,yFAAyF;QACzF,kCAAkC;QAClC,EAAE;QACF,gFAAgF;QAChF,4GAA4G;QAC5G,wHAAwH;QACxH,iEAAiE;QACjE,kHAAkH;QAClH,gCAAgC;QAChC,EAAE;QACF,gGAAgG;QAChG,iGAAiG;QACjG,wGAAwG;QACxG,0BAA0B;QAC1B,EAAE;QACF,iHAAiH;QACjH,sDAAsD;QAEtD,IAAI,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC9B,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAC5C,cAAc;iBACX,MAAM,EAAE;iBACR,IAAI,CAAC,SAAS,CAAC;iBACf,QAAQ,CAAC,eAAe,EAAE;gBACzB,YAAY,CAAC,CAAC,CAAC;gBACf,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;aAC/C,CAAC,CACL,CAAC;QACJ,CAAC;QAED,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAC5C,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,OAAO,CAAC,YAAY,EAAE,WAAW,CAAC,CAC3E,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,0BAA0B,CACxC,cAAoB,EACpB,SAAiB,EACjB,YAA+B,EAC/B,UAA0B;QAE1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gDAAgD,CACzE,cAAc,EACd,SAAS,EACT,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;YACnC,UAAU,EAAE,MAAM;YAClB,UAAU,EAAE,UAAU,CAAC,KAAK,CAAC;SAC9B,CAAC,CAAC,EACH,EAAE,EACF,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,CACpD,CAAC;QACF,OAAO,OAAO,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC;IAC5B,CAAC;IAEO,0BAA0B,CAChC,KAAwB,EACxB,uBAA8D;QAE9D,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,uBAAuB,CAAC;QAE3D,IAAI,GAAG,GAAG,KAAK,CAAC;QAEhB,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;YAC1B,KAAK,MAAM,oBAAoB,IAAI,OAAO,EAAE,CAAC;gBAC3C,IAAI,YAAY,IAAI,oBAAoB,EAAE,CAAC;oBACzC,GAAG,GAAG,GAAG,CAAC,OAAO,CACf,oBAAoB,CAAC,UAAU,EAC/B,oBAAoB,CAAC,KAAK,EAC1B,oBAAoB,CAAC,KAAK,CAC3B,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,MAAM,cAAc,GAClB,oBAAoB,CAAC,KAAK,KAAK,mDAAe,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;oBAC5E,MAAM,WAAW,GAAG,oBAAoB,CAAC,KAAK;wBAC5C,CAAC,CAAC,UAAU,oBAAoB,CAAC,KAAK,KAAK,iDAAa,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,EAAE;wBACnF,CAAC,CAAC,EAAE,CAAC;oBACP,GAAG,GAAG,GAAG,CAAC,UAAU,CAClB,IAAI,oBAAoB,CAAC,cAAc,CAAC,GAAG,KAAK,cAAc,GAAG,WAAW,EAAE,EAC9E,oBAAoB,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,EAAE,CAChE,IAAA,uCAA8B,EAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,CACpE,CACF,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACzB,CAAC;QAED,OAAO,GAAG,CAAC;IACb,CAAC;IAES,KAAK,CAAC,gDAAgD,CAC9D,cAAoB,EACpB,SAAiB,EACjB,qCAA+E,EAC/E,oCAA6E,EAC7E,uBAA8D;QAE9D,IAAI,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEpD,IAAI,qCAAqC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACrD,MAAM,WAAW,GAA2B,EAAE,CAAC;YAC/C,MAAM,4CAA4C,GAChD,qCAAqC,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;YACxF,MAAM,yCAAyC,GAC7C,qCAAqC,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;YAExF,IAAI,4CAA4C,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC5D,KAAK,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,IAAI,4CAA4C,EAAE,CAAC;oBACtF,WAAW,CAAC,UAAU,CAAC,GAAG,UAAU,CAAC;gBACvC,CAAC;gBACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;YACnC,CAAC;YACD,IAAI,yCAAyC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACzD,KAAK,MAAM,EAAE,UAAU,EAAE,IAAI,yCAAyC,EAAE,CAAC;oBACvE,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,oCAAoC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,KAAK,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,IAAI,oCAAoC,EAAE,CAAC;gBAC/E,MAAM,kBAAkB,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;gBACnF,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,EAAE;oBAC9B,OAAO,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,UAAU,EAAE,CAAC,GAAG,kBAAkB,CAAC,CAAC,CAAC,CAAC;oBACvE,kEAAkE;oBAClE,IAAI,kBAAkB,CAAC,MAAM,KAAK,WAAW,CAAC,MAAM,EAAE,CAAC;wBACrD,OAAO,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QACxE,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAES,KAAK,CAAC,sCAAsC,CACpD,cAAoB,EACpB,SAAiB,EACjB,cAAsB,EACtB,QAAwB,EACxB,uBAA8D;QAE9D,IAAI,KAAK,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;QACvF,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QACxE,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAES,KAAK,CAAC,mCAAmC,CACjD,cAAoB,EACpB,SAAiB,EACjB,WAAiC,EACjC,uBAA8D;QAE9D,IAAI,KAAK,GAAG,cAAc;aACvB,MAAM,EAAE;aACR,IAAI,CAAC,SAAS,CAAC;aACf,QAAQ,CACP,WAAW,CAAC,GAAG,EACf,WAAW,CAAC,eAAe,CAAC,CAAC,SAAS,EAAE,EAAE,CACxC,IAAA,uCAA8B,EAAC,IAAI,CAAC,mBAAmB,EAAE,SAAS,CAAC,CACpE,CACF,CAAC;QACJ,KAAK,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,EAAE,uBAAuB,CAAC,CAAC;QACxE,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IACxD,CAAC;IAES,KAAK,CAAC,mBAAmB,CACjC,cAAoB,EACpB,SAAiB,EACjB,MAAc;QAEd,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAC5C,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAC7D,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,mBAAmB,CACjC,cAAoB,EACpB,SAAiB,EACjB,YAAoB,EACpB,EAAO,EACP,MAAc;QAEd,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAC5C,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CACrF,CAAC;IACJ,CAAC;IAES,KAAK,CAAC,mBAAmB,CACjC,cAAoB,EACpB,SAAiB,EACjB,YAAoB,EACpB,EAAO;QAEP,OAAO,MAAM,IAAA,yDAA2B,EAAC,GAAG,EAAE,CAC5C,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,CAC7D,CAAC;IACJ,CAAC;CACF;AAhQD,sEAgQC"}
|
|
@@ -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
|
*/
|
|
@@ -139,6 +139,12 @@ export declare function sql<TFields extends Record<string, any>>(strings: Templa
|
|
|
139
139
|
type PickSupportedSQLValueKeys<T> = {
|
|
140
140
|
[K in keyof T]: T[K] extends SupportedSQLValue ? K : never;
|
|
141
141
|
}[keyof T];
|
|
142
|
+
type PickStringValueKeys<T> = {
|
|
143
|
+
[K in keyof T]: T[K] extends string | null | undefined ? K : never;
|
|
144
|
+
}[keyof T];
|
|
145
|
+
type JsonSerializable = string | number | boolean | null | undefined | readonly JsonSerializable[] | {
|
|
146
|
+
readonly [key: string]: JsonSerializable;
|
|
147
|
+
};
|
|
142
148
|
/**
|
|
143
149
|
* Common SQL helper functions for building queries
|
|
144
150
|
*/
|
|
@@ -180,19 +186,19 @@ export declare const SQLFragmentHelpers: {
|
|
|
180
186
|
* // Generates: ?? LIKE ? with entityField binding for 'name' and value binding
|
|
181
187
|
* ```
|
|
182
188
|
*/
|
|
183
|
-
like<TFields extends Record<string, any>>(fieldName:
|
|
189
|
+
like<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
184
190
|
/**
|
|
185
191
|
* NOT LIKE helper
|
|
186
192
|
*/
|
|
187
|
-
notLike<TFields extends Record<string, any>>(fieldName:
|
|
193
|
+
notLike<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
188
194
|
/**
|
|
189
195
|
* ILIKE helper for case-insensitive matching
|
|
190
196
|
*/
|
|
191
|
-
ilike<TFields extends Record<string, any>>(fieldName:
|
|
197
|
+
ilike<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
192
198
|
/**
|
|
193
199
|
* NOT ILIKE helper for case-insensitive non-matching
|
|
194
200
|
*/
|
|
195
|
-
notIlike<TFields extends Record<string, any>>(fieldName:
|
|
201
|
+
notIlike<TFields extends Record<string, any>>(fieldName: PickStringValueKeys<TFields>, pattern: string): SQLFragment<TFields>;
|
|
196
202
|
/**
|
|
197
203
|
* NULL check helper
|
|
198
204
|
*/
|
|
@@ -228,11 +234,11 @@ export declare const SQLFragmentHelpers: {
|
|
|
228
234
|
/**
|
|
229
235
|
* JSON contains operator (\@\>)
|
|
230
236
|
*/
|
|
231
|
-
jsonContains<TFields extends Record<string, any>>(fieldName: keyof TFields, value:
|
|
237
|
+
jsonContains<TFields extends Record<string, any>>(fieldName: keyof TFields, value: JsonSerializable): SQLFragment<TFields>;
|
|
232
238
|
/**
|
|
233
239
|
* JSON contained by operator (\<\@\)
|
|
234
240
|
*/
|
|
235
|
-
jsonContainedBy<TFields extends Record<string, any>>(fieldName: keyof TFields, value:
|
|
241
|
+
jsonContainedBy<TFields extends Record<string, any>>(fieldName: keyof TFields, value: JsonSerializable): SQLFragment<TFields>;
|
|
236
242
|
/**
|
|
237
243
|
* JSON path extraction helper (-\>)
|
|
238
244
|
*/
|
package/build/src/SQLOperator.js
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
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
6
|
exports.SQLFragmentHelpers = exports.SQLUnsafeRaw = exports.SQLEntityField = exports.SQLIdentifier = exports.SQLFragment = void 0;
|
|
4
7
|
exports.identifier = identifier;
|
|
5
8
|
exports.entityField = entityField;
|
|
6
9
|
exports.unsafeRaw = unsafeRaw;
|
|
7
10
|
exports.sql = sql;
|
|
11
|
+
const assert_1 = __importDefault(require("assert"));
|
|
8
12
|
/**
|
|
9
13
|
* SQL Fragment class that safely handles parameterized queries.
|
|
10
14
|
*/
|
|
@@ -406,13 +410,19 @@ exports.SQLFragmentHelpers = {
|
|
|
406
410
|
* JSON contains operator (\@\>)
|
|
407
411
|
*/
|
|
408
412
|
jsonContains(fieldName, value) {
|
|
409
|
-
|
|
413
|
+
const serialized = JSON.stringify(value);
|
|
414
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
415
|
+
(0, assert_1.default)(serialized !== undefined || value === undefined, 'jsonContains: value is not JSON-serializable');
|
|
416
|
+
return sql `${entityField(fieldName)} @> ${serialized}::jsonb`;
|
|
410
417
|
},
|
|
411
418
|
/**
|
|
412
419
|
* JSON contained by operator (\<\@\)
|
|
413
420
|
*/
|
|
414
421
|
jsonContainedBy(fieldName, value) {
|
|
415
|
-
|
|
422
|
+
const serialized = JSON.stringify(value);
|
|
423
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
424
|
+
(0, assert_1.default)(serialized !== undefined || value === undefined, 'jsonContainedBy: value is not JSON-serializable');
|
|
425
|
+
return sql `${entityField(fieldName)} <@ ${serialized}::jsonb`;
|
|
416
426
|
},
|
|
417
427
|
/**
|
|
418
428
|
* JSON path extraction helper (-\>)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLOperator.js","sourceRoot":"","sources":["../../src/SQLOperator.ts"],"names":[],"mappings":"
|
|
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.58.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.58.0",
|
|
32
32
|
"knex": "^3.1.0"
|
|
33
33
|
},
|
|
34
34
|
"devDependencies": {
|
|
35
|
-
"@expo/entity-testing-utils": "^0.
|
|
35
|
+
"@expo/entity-testing-utils": "^0.58.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": "7dab49a36dafae2adba126ba6084512abab1afe1"
|
|
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':
|
|
@@ -312,6 +314,19 @@ type PickSupportedSQLValueKeys<T> = {
|
|
|
312
314
|
[K in keyof T]: T[K] extends SupportedSQLValue ? K : never;
|
|
313
315
|
}[keyof T];
|
|
314
316
|
|
|
317
|
+
type PickStringValueKeys<T> = {
|
|
318
|
+
[K in keyof T]: T[K] extends string | null | undefined ? K : never;
|
|
319
|
+
}[keyof T];
|
|
320
|
+
|
|
321
|
+
type JsonSerializable =
|
|
322
|
+
| string
|
|
323
|
+
| number
|
|
324
|
+
| boolean
|
|
325
|
+
| null
|
|
326
|
+
| undefined
|
|
327
|
+
| readonly JsonSerializable[]
|
|
328
|
+
| { readonly [key: string]: JsonSerializable };
|
|
329
|
+
|
|
315
330
|
/**
|
|
316
331
|
* Common SQL helper functions for building queries
|
|
317
332
|
*/
|
|
@@ -388,7 +403,7 @@ export const SQLFragmentHelpers = {
|
|
|
388
403
|
* ```
|
|
389
404
|
*/
|
|
390
405
|
like<TFields extends Record<string, any>>(
|
|
391
|
-
fieldName:
|
|
406
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
392
407
|
pattern: string,
|
|
393
408
|
): SQLFragment<TFields> {
|
|
394
409
|
return sql`${entityField(fieldName)} LIKE ${pattern}`;
|
|
@@ -398,7 +413,7 @@ export const SQLFragmentHelpers = {
|
|
|
398
413
|
* NOT LIKE helper
|
|
399
414
|
*/
|
|
400
415
|
notLike<TFields extends Record<string, any>>(
|
|
401
|
-
fieldName:
|
|
416
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
402
417
|
pattern: string,
|
|
403
418
|
): SQLFragment<TFields> {
|
|
404
419
|
return sql`${entityField(fieldName)} NOT LIKE ${pattern}`;
|
|
@@ -408,7 +423,7 @@ export const SQLFragmentHelpers = {
|
|
|
408
423
|
* ILIKE helper for case-insensitive matching
|
|
409
424
|
*/
|
|
410
425
|
ilike<TFields extends Record<string, any>>(
|
|
411
|
-
fieldName:
|
|
426
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
412
427
|
pattern: string,
|
|
413
428
|
): SQLFragment<TFields> {
|
|
414
429
|
return sql`${entityField(fieldName)} ILIKE ${pattern}`;
|
|
@@ -418,7 +433,7 @@ export const SQLFragmentHelpers = {
|
|
|
418
433
|
* NOT ILIKE helper for case-insensitive non-matching
|
|
419
434
|
*/
|
|
420
435
|
notIlike<TFields extends Record<string, any>>(
|
|
421
|
-
fieldName:
|
|
436
|
+
fieldName: PickStringValueKeys<TFields>,
|
|
422
437
|
pattern: string,
|
|
423
438
|
): SQLFragment<TFields> {
|
|
424
439
|
return sql`${entityField(fieldName)} NOT ILIKE ${pattern}`;
|
|
@@ -509,9 +524,15 @@ export const SQLFragmentHelpers = {
|
|
|
509
524
|
*/
|
|
510
525
|
jsonContains<TFields extends Record<string, any>>(
|
|
511
526
|
fieldName: keyof TFields,
|
|
512
|
-
value:
|
|
527
|
+
value: JsonSerializable,
|
|
513
528
|
): SQLFragment<TFields> {
|
|
514
|
-
|
|
529
|
+
const serialized = JSON.stringify(value);
|
|
530
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
531
|
+
assert(
|
|
532
|
+
serialized !== undefined || value === undefined,
|
|
533
|
+
'jsonContains: value is not JSON-serializable',
|
|
534
|
+
);
|
|
535
|
+
return sql`${entityField(fieldName)} @> ${serialized}::jsonb`;
|
|
515
536
|
},
|
|
516
537
|
|
|
517
538
|
/**
|
|
@@ -519,9 +540,15 @@ export const SQLFragmentHelpers = {
|
|
|
519
540
|
*/
|
|
520
541
|
jsonContainedBy<TFields extends Record<string, any>>(
|
|
521
542
|
fieldName: keyof TFields,
|
|
522
|
-
value:
|
|
543
|
+
value: JsonSerializable,
|
|
523
544
|
): SQLFragment<TFields> {
|
|
524
|
-
|
|
545
|
+
const serialized = JSON.stringify(value);
|
|
546
|
+
// JSON.stringify returns undefined for unsupported types, but we also want to allow undefined as a value
|
|
547
|
+
assert(
|
|
548
|
+
serialized !== undefined || value === undefined,
|
|
549
|
+
'jsonContainedBy: value is not JSON-serializable',
|
|
550
|
+
);
|
|
551
|
+
return sql`${entityField(fieldName)} <@ ${serialized}::jsonb`;
|
|
525
552
|
},
|
|
526
553
|
|
|
527
554
|
/**
|
|
@@ -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
|
{
|
|
@@ -692,6 +692,26 @@ describe('SQLOperator', () => {
|
|
|
692
692
|
'{"premium":true}',
|
|
693
693
|
]);
|
|
694
694
|
});
|
|
695
|
+
|
|
696
|
+
it('generates JSON contains for null and undefined values', () => {
|
|
697
|
+
const fragmentNull = SQLFragmentHelpers.jsonContains('stringField', null);
|
|
698
|
+
const fragmentUndefined = SQLFragmentHelpers.jsonContains('stringField', undefined);
|
|
699
|
+
|
|
700
|
+
expect(fragmentNull.sql).toBe('?? @> ?::jsonb');
|
|
701
|
+
expect(fragmentNull.getKnexBindings(getColumnForField)).toEqual(['string_field', 'null']);
|
|
702
|
+
|
|
703
|
+
expect(fragmentUndefined.sql).toBe('?? @> ?::jsonb');
|
|
704
|
+
expect(fragmentUndefined.getKnexBindings(getColumnForField)).toEqual([
|
|
705
|
+
'string_field',
|
|
706
|
+
undefined,
|
|
707
|
+
]);
|
|
708
|
+
});
|
|
709
|
+
|
|
710
|
+
it('throws when value is not JSON-serializable', () => {
|
|
711
|
+
expect(() => SQLFragmentHelpers.jsonContains('stringField', (() => {}) as any)).toThrow(
|
|
712
|
+
'jsonContains: value is not JSON-serializable',
|
|
713
|
+
);
|
|
714
|
+
});
|
|
695
715
|
});
|
|
696
716
|
|
|
697
717
|
describe(SQLFragmentHelpers.jsonContainedBy, () => {
|
|
@@ -707,6 +727,26 @@ describe('SQLOperator', () => {
|
|
|
707
727
|
'{"theme":"dark","lang":"en"}',
|
|
708
728
|
]);
|
|
709
729
|
});
|
|
730
|
+
|
|
731
|
+
it('generates JSON contained by for null and undefined values', () => {
|
|
732
|
+
const fragmentNull = SQLFragmentHelpers.jsonContainedBy('stringField', null);
|
|
733
|
+
const fragmentUndefined = SQLFragmentHelpers.jsonContainedBy('stringField', undefined);
|
|
734
|
+
|
|
735
|
+
expect(fragmentNull.sql).toBe('?? <@ ?::jsonb');
|
|
736
|
+
expect(fragmentNull.getKnexBindings(getColumnForField)).toEqual(['string_field', 'null']);
|
|
737
|
+
|
|
738
|
+
expect(fragmentUndefined.sql).toBe('?? <@ ?::jsonb');
|
|
739
|
+
expect(fragmentUndefined.getKnexBindings(getColumnForField)).toEqual([
|
|
740
|
+
'string_field',
|
|
741
|
+
undefined,
|
|
742
|
+
]);
|
|
743
|
+
});
|
|
744
|
+
|
|
745
|
+
it('throws when value is not JSON-serializable', () => {
|
|
746
|
+
expect(() => SQLFragmentHelpers.jsonContainedBy('stringField', (() => {}) as any)).toThrow(
|
|
747
|
+
'jsonContainedBy: value is not JSON-serializable',
|
|
748
|
+
);
|
|
749
|
+
});
|
|
710
750
|
});
|
|
711
751
|
|
|
712
752
|
describe(SQLFragmentHelpers.jsonPath, () => {
|