@zintrust/core 1.7.1 → 1.7.3
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/package.json +2 -2
- package/src/index.js +3 -3
- package/src/orm/Model.d.ts +9 -1
- package/src/orm/Model.d.ts.map +1 -1
- package/src/orm/Model.js +22 -1
- package/src/orm/QueryBuilder.d.ts +11 -0
- package/src/orm/QueryBuilder.d.ts.map +1 -1
- package/src/orm/QueryBuilder.js +158 -39
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zintrust/core",
|
|
3
|
-
"version": "1.7.
|
|
3
|
+
"version": "1.7.3",
|
|
4
4
|
"description": "Production-grade TypeScript backend framework for JavaScript",
|
|
5
5
|
"homepage": "https://zintrust.com",
|
|
6
6
|
"repository": {
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"dependencies": {
|
|
60
60
|
"@cloudflare/containers": "^0.3.3",
|
|
61
61
|
"bcryptjs": "^3.0.3",
|
|
62
|
-
"bullmq": "^5.76.
|
|
62
|
+
"bullmq": "^5.76.5",
|
|
63
63
|
"chalk": "^5.6.2",
|
|
64
64
|
"commander": "^14.0.3",
|
|
65
65
|
"inquirer": "^13.4.2",
|
package/src/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @zintrust/core v1.7.
|
|
2
|
+
* @zintrust/core v1.7.3
|
|
3
3
|
*
|
|
4
4
|
* ZinTrust Framework - Production-Grade TypeScript Backend
|
|
5
5
|
* Built for performance, type safety, and exceptional developer experience
|
|
6
6
|
*
|
|
7
7
|
* Build Information:
|
|
8
|
-
* Built: 2026-05-
|
|
8
|
+
* Built: 2026-05-04T05:40:54.708Z
|
|
9
9
|
* Node: >=20.0.0
|
|
10
10
|
* License: MIT
|
|
11
11
|
*
|
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
* Available at runtime for debugging and health checks
|
|
22
22
|
*/
|
|
23
23
|
export const ZINTRUST_VERSION = '0.1.41';
|
|
24
|
-
export const ZINTRUST_BUILD_DATE = '2026-05-
|
|
24
|
+
export const ZINTRUST_BUILD_DATE = '2026-05-04T05:40:54.665Z'; // Replaced during build
|
|
25
25
|
export { Application } from './boot/Application.js';
|
|
26
26
|
export { AwsSigV4 } from './common/index.js';
|
|
27
27
|
export { SignedRequest } from './security/SignedRequest.js';
|
package/src/orm/Model.d.ts
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Full ORM capabilities with eager/lazy loading
|
|
4
4
|
*/
|
|
5
5
|
import type { Paginator } from '../database/Paginator';
|
|
6
|
-
import type { EagerLoadConstraints, IQueryBuilder, InsertResult, PaginationOptions } from './QueryBuilder';
|
|
6
|
+
import type { EagerLoadConstraints, IQueryBuilder, InsertResult, NormalizedTextOptions, PaginationOptions } from './QueryBuilder';
|
|
7
7
|
import type { IRelationship } from './Relationships';
|
|
8
8
|
export interface ModelConfig {
|
|
9
9
|
table: string;
|
|
@@ -27,6 +27,10 @@ export interface ModelConfig {
|
|
|
27
27
|
deleted?: (model: IModel) => void | Promise<void>;
|
|
28
28
|
}>;
|
|
29
29
|
connection?: string;
|
|
30
|
+
primaryKey?: {
|
|
31
|
+
key?: string;
|
|
32
|
+
strategy?: 'uuid';
|
|
33
|
+
};
|
|
30
34
|
}
|
|
31
35
|
type ModelObserver = NonNullable<ModelConfig['observers']>[number];
|
|
32
36
|
export type PrimaryKeyObserverOptions = {
|
|
@@ -105,6 +109,10 @@ export type DefinedModel<T extends BoundModelMethods> = {
|
|
|
105
109
|
where: (column: string, operator: string | number | boolean | null, value?: unknown) => IQueryBuilder;
|
|
106
110
|
andWhere: (column: string, operator: string, value?: unknown) => IQueryBuilder;
|
|
107
111
|
orWhere: (column: string, operator: string, value?: unknown) => IQueryBuilder;
|
|
112
|
+
whereGroup: (callback: (builder: IQueryBuilder) => unknown) => IQueryBuilder;
|
|
113
|
+
orWhereGroup: (callback: (builder: IQueryBuilder) => unknown) => IQueryBuilder;
|
|
114
|
+
whereNormalized: (column: string, value: unknown, options?: NormalizedTextOptions) => IQueryBuilder;
|
|
115
|
+
orWhereNormalized: (column: string, value: unknown, options?: NormalizedTextOptions) => IQueryBuilder;
|
|
108
116
|
whereIn: (column: string, values: unknown[]) => IQueryBuilder;
|
|
109
117
|
whereNotIn: (column: string, values: unknown[]) => IQueryBuilder;
|
|
110
118
|
select: (...columns: string[]) => IQueryBuilder;
|
package/src/orm/Model.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../../src/orm/Model.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAIrD,OAAO,KAAK,EACV,oBAAoB,EACpB,aAAa,EACb,YAAY,EACZ,iBAAiB,EAElB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAqBxD,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC;IACxF,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,CAAC;IACvF,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,OAAO,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,aAAa,CAAC,CAAC;IACvF,SAAS,CAAC,EAAE,KAAK,CAAC;QAChB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAChD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAClD,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACnD,CAAC,CAAC;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"Model.d.ts","sourceRoot":"","sources":["../../../src/orm/Model.ts"],"names":[],"mappings":"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"}
|
package/src/orm/Model.js
CHANGED
|
@@ -216,6 +216,22 @@ const ModelPrimaryKey = Object.freeze({
|
|
|
216
216
|
using: (options) => createPrimaryKeyObserver(options),
|
|
217
217
|
uuid: (key = 'id') => createPrimaryKeyObserver({ key, whenMissing: true, generate: generateUuid }),
|
|
218
218
|
});
|
|
219
|
+
const buildPrimaryKeyObservers = (config) => {
|
|
220
|
+
if (config.primaryKey?.strategy !== 'uuid') {
|
|
221
|
+
return [];
|
|
222
|
+
}
|
|
223
|
+
return [ModelPrimaryKey.uuid(config.primaryKey.key ?? 'id')];
|
|
224
|
+
};
|
|
225
|
+
const normalizeModelConfig = (config) => {
|
|
226
|
+
const generatedObservers = buildPrimaryKeyObservers(config);
|
|
227
|
+
if (generatedObservers.length === 0) {
|
|
228
|
+
return config;
|
|
229
|
+
}
|
|
230
|
+
return {
|
|
231
|
+
...config,
|
|
232
|
+
observers: [...generatedObservers, ...(config.observers ?? [])],
|
|
233
|
+
};
|
|
234
|
+
};
|
|
219
235
|
const persistNewModel = async (config, db, attrs) => {
|
|
220
236
|
const builder = QueryBuilder.create(config.table, db, buildSoftDeleteOptions(config));
|
|
221
237
|
const result = await builder.insert({ ...attrs });
|
|
@@ -673,6 +689,10 @@ const createQueryBuilderMethods = (cfg, hydrateModel) => {
|
|
|
673
689
|
where: (column, operator, value) => wrappedBuilder().where(column, operator, value),
|
|
674
690
|
andWhere: (column, operator, value) => wrappedBuilder().andWhere(column, operator, value),
|
|
675
691
|
orWhere: (column, operator, value) => wrappedBuilder().orWhere(column, operator, value),
|
|
692
|
+
whereGroup: (callback) => wrappedBuilder().whereGroup(callback),
|
|
693
|
+
orWhereGroup: (callback) => wrappedBuilder().orWhereGroup(callback),
|
|
694
|
+
whereNormalized: (column, value, options) => wrappedBuilder().whereNormalized(column, value, options),
|
|
695
|
+
orWhereNormalized: (column, value, options) => wrappedBuilder().orWhereNormalized(column, value, options),
|
|
676
696
|
whereIn: (column, values) => wrappedBuilder().whereIn(column, values),
|
|
677
697
|
whereNotIn: (column, values) => wrappedBuilder().whereNotIn(column, values),
|
|
678
698
|
select: (...columns) => wrappedBuilder().select(...columns),
|
|
@@ -757,6 +777,7 @@ const createDefinedModelInternal = (cfg, methodsOrPlan, attach, resolveMethods)
|
|
|
757
777
|
};
|
|
758
778
|
};
|
|
759
779
|
export function define(config, methodsOrPlan) {
|
|
780
|
+
const normalizedConfig = normalizeModelConfig(config);
|
|
760
781
|
const plan = typeof methodsOrPlan === 'function' ? methodsOrPlan : undefined;
|
|
761
782
|
const unboundMethods = typeof methodsOrPlan === 'function' ? undefined : methodsOrPlan;
|
|
762
783
|
const resolveMethods = (model) => {
|
|
@@ -766,7 +787,7 @@ export function define(config, methodsOrPlan) {
|
|
|
766
787
|
const methods = resolveMethods(model);
|
|
767
788
|
return extendModel(model, methods);
|
|
768
789
|
};
|
|
769
|
-
return createDefinedModelInternal(
|
|
790
|
+
return createDefinedModelInternal(normalizedConfig, methodsOrPlan, attach, resolveMethods);
|
|
770
791
|
}
|
|
771
792
|
/**
|
|
772
793
|
* Insert a single or multiple records into the database
|
|
@@ -9,6 +9,13 @@ export interface WhereClause {
|
|
|
9
9
|
column: string;
|
|
10
10
|
operator: string;
|
|
11
11
|
value: unknown;
|
|
12
|
+
boolean?: 'AND' | 'OR';
|
|
13
|
+
expression?: 'normalized-text';
|
|
14
|
+
normalization?: NormalizedTextOptions;
|
|
15
|
+
}
|
|
16
|
+
export interface NormalizedTextOptions {
|
|
17
|
+
trim?: boolean;
|
|
18
|
+
lowercase?: boolean;
|
|
12
19
|
}
|
|
13
20
|
/**
|
|
14
21
|
* Result returned from INSERT operations
|
|
@@ -37,6 +44,10 @@ export interface IQueryBuilder {
|
|
|
37
44
|
where(column: string, operator: string | number | boolean | null, value?: unknown): IQueryBuilder;
|
|
38
45
|
andWhere(column: string, operator: string, value?: unknown): IQueryBuilder;
|
|
39
46
|
orWhere(column: string, operator: string, value?: unknown): IQueryBuilder;
|
|
47
|
+
whereGroup(callback: (builder: IQueryBuilder) => unknown): IQueryBuilder;
|
|
48
|
+
orWhereGroup(callback: (builder: IQueryBuilder) => unknown): IQueryBuilder;
|
|
49
|
+
whereNormalized(column: string, value: unknown, options?: NormalizedTextOptions): IQueryBuilder;
|
|
50
|
+
orWhereNormalized(column: string, value: unknown, options?: NormalizedTextOptions): IQueryBuilder;
|
|
40
51
|
whereNull(column: string): IQueryBuilder;
|
|
41
52
|
whereIn(column: string, values: unknown[]): IQueryBuilder;
|
|
42
53
|
whereNotIn(column: string, values: unknown[]): IQueryBuilder;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/orm/QueryBuilder.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGtE,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAGzC,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"QueryBuilder.d.ts","sourceRoot":"","sources":["../../../src/orm/QueryBuilder.ts"],"names":[],"mappings":"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"}
|
package/src/orm/QueryBuilder.js
CHANGED
|
@@ -80,6 +80,36 @@ const normalizeOrderDirection = (direction) => {
|
|
|
80
80
|
return normalized;
|
|
81
81
|
throw ErrorFactory.createDatabaseError('Unsafe ORDER BY direction');
|
|
82
82
|
};
|
|
83
|
+
const normalizeClauseBoolean = (value) => value === 'OR' ? 'OR' : 'AND';
|
|
84
|
+
const normalizeTextOptions = (options) => ({
|
|
85
|
+
trim: options?.trim !== false,
|
|
86
|
+
lowercase: options?.lowercase !== false,
|
|
87
|
+
});
|
|
88
|
+
const normalizeTextComparisonValue = (value, options) => {
|
|
89
|
+
if (value === null || value === undefined)
|
|
90
|
+
return value;
|
|
91
|
+
const normalizedOptions = normalizeTextOptions(options);
|
|
92
|
+
let normalized = String(value);
|
|
93
|
+
if (normalizedOptions.trim) {
|
|
94
|
+
normalized = normalized.trim();
|
|
95
|
+
}
|
|
96
|
+
if (normalizedOptions.lowercase) {
|
|
97
|
+
normalized = normalized.toLowerCase();
|
|
98
|
+
}
|
|
99
|
+
return normalized;
|
|
100
|
+
};
|
|
101
|
+
const buildNormalizedColumnSql = (column, dialect, options) => {
|
|
102
|
+
const normalizedOptions = normalizeTextOptions(options);
|
|
103
|
+
let sql = escapeIdentifier(column, dialect);
|
|
104
|
+
if (normalizedOptions.trim) {
|
|
105
|
+
sql = `TRIM(${sql})`;
|
|
106
|
+
}
|
|
107
|
+
if (normalizedOptions.lowercase) {
|
|
108
|
+
sql = `LOWER(${sql})`;
|
|
109
|
+
}
|
|
110
|
+
return sql;
|
|
111
|
+
};
|
|
112
|
+
const isWhereGroupClause = (value) => 'kind' in value && value.kind === 'group';
|
|
83
113
|
const normalizeOperator = (operator) => operator.trim().toUpperCase();
|
|
84
114
|
const ALLOWED_OPERATORS = new Set([
|
|
85
115
|
'=',
|
|
@@ -200,43 +230,66 @@ const buildSelectClause = (columns, dialect) => {
|
|
|
200
230
|
}
|
|
201
231
|
return out.join(', ');
|
|
202
232
|
};
|
|
203
|
-
const
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
const
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if (!Array.isArray(clause.value) || clause.value.length === 0) {
|
|
213
|
-
throw ErrorFactory.createDatabaseError('IN operator requires a non-empty array');
|
|
214
|
-
}
|
|
215
|
-
const values = clause.value;
|
|
216
|
-
const placeholders = values.map(() => '?').join(', ');
|
|
217
|
-
for (const v of values)
|
|
218
|
-
parameters.push(v);
|
|
219
|
-
return `${columnSql} ${operator} (${placeholders})`;
|
|
233
|
+
const compileSingleWhereClause = (clause, dialect) => {
|
|
234
|
+
assertSafeIdentifierPath(clause.column, 'where column');
|
|
235
|
+
const operator = assertSafeOperator(clause.operator);
|
|
236
|
+
const columnSql = clause.expression === 'normalized-text'
|
|
237
|
+
? buildNormalizedColumnSql(clause.column, dialect, clause.normalization)
|
|
238
|
+
: escapeIdentifier(clause.column, dialect);
|
|
239
|
+
if (operator === 'IN' || operator === 'NOT IN') {
|
|
240
|
+
if (!Array.isArray(clause.value) || clause.value.length === 0) {
|
|
241
|
+
throw ErrorFactory.createDatabaseError('IN operator requires a non-empty array');
|
|
220
242
|
}
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
243
|
+
const values = clause.value;
|
|
244
|
+
return {
|
|
245
|
+
sql: `${columnSql} ${operator} (${values.map(() => '?').join(', ')})`,
|
|
246
|
+
parameters: values,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
if (operator === 'BETWEEN' || operator === 'NOT BETWEEN') {
|
|
250
|
+
if (!Array.isArray(clause.value) || clause.value.length !== 2) {
|
|
251
|
+
throw ErrorFactory.createDatabaseError('BETWEEN operator requires a 2-item array');
|
|
228
252
|
}
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
253
|
+
const range = clause.value;
|
|
254
|
+
return {
|
|
255
|
+
sql: `${columnSql} ${operator} ? AND ?`,
|
|
256
|
+
parameters: range,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
if (operator === 'IS' || operator === 'IS NOT') {
|
|
260
|
+
if (clause.value === null || clause.value === undefined) {
|
|
261
|
+
return { sql: `${columnSql} ${operator} NULL`, parameters: [] };
|
|
235
262
|
}
|
|
236
|
-
parameters
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
263
|
+
return { sql: `${columnSql} ${operator} ?`, parameters: [clause.value] };
|
|
264
|
+
}
|
|
265
|
+
const value = clause.expression === 'normalized-text'
|
|
266
|
+
? normalizeTextComparisonValue(clause.value, clause.normalization)
|
|
267
|
+
: clause.value;
|
|
268
|
+
return { sql: `${columnSql} ${operator} ?`, parameters: [value] };
|
|
269
|
+
};
|
|
270
|
+
const compileWhereFragments = (conditions, dialect) => {
|
|
271
|
+
if (conditions.length === 0)
|
|
272
|
+
return { sql: '', parameters: [] };
|
|
273
|
+
const parameters = [];
|
|
274
|
+
const fragments = [];
|
|
275
|
+
for (const condition of conditions) {
|
|
276
|
+
const compiled = isWhereGroupClause(condition)
|
|
277
|
+
? compileWhereFragments(condition.conditions, dialect)
|
|
278
|
+
: compileSingleWhereClause(condition, dialect);
|
|
279
|
+
if (compiled.sql.length === 0)
|
|
280
|
+
continue;
|
|
281
|
+
parameters.push(...compiled.parameters);
|
|
282
|
+
const fragment = isWhereGroupClause(condition) ? `(${compiled.sql})` : compiled.sql;
|
|
283
|
+
const boolean = normalizeClauseBoolean(condition.boolean);
|
|
284
|
+
fragments.push(fragments.length === 0 ? fragment : `${boolean} ${fragment}`);
|
|
285
|
+
}
|
|
286
|
+
return { sql: fragments.join(' '), parameters };
|
|
287
|
+
};
|
|
288
|
+
const compileWhere = (conditions, dialect) => {
|
|
289
|
+
const compiled = compileWhereFragments(conditions, dialect);
|
|
290
|
+
return compiled.sql.length === 0
|
|
291
|
+
? { sql: '', parameters: [] }
|
|
292
|
+
: { sql: ` WHERE ${compiled.sql}`, parameters: compiled.parameters };
|
|
240
293
|
};
|
|
241
294
|
const buildSoftDeleteWhereClause = (column, mode) => {
|
|
242
295
|
const col = column.trim();
|
|
@@ -309,7 +362,7 @@ const buildCountQuery = (state) => {
|
|
|
309
362
|
const sql = `SELECT COUNT(*) AS total${fromClause}${where.sql}`;
|
|
310
363
|
return { sql, parameters: where.parameters };
|
|
311
364
|
};
|
|
312
|
-
const applyWhereCondition = (state, column, operator, value) => {
|
|
365
|
+
const applyWhereCondition = (state, column, operator, value, boolean = 'AND', extra = {}) => {
|
|
313
366
|
const col = String(column).trim();
|
|
314
367
|
assertSafeIdentifierPath(col, 'where column');
|
|
315
368
|
let op;
|
|
@@ -326,7 +379,48 @@ const applyWhereCondition = (state, column, operator, value) => {
|
|
|
326
379
|
op = assertSafeOperator(operator);
|
|
327
380
|
val = value;
|
|
328
381
|
}
|
|
329
|
-
state.whereConditions.push({
|
|
382
|
+
state.whereConditions.push({
|
|
383
|
+
column: col,
|
|
384
|
+
operator: op,
|
|
385
|
+
value: val,
|
|
386
|
+
boolean,
|
|
387
|
+
...extra,
|
|
388
|
+
});
|
|
389
|
+
};
|
|
390
|
+
const createPredicateState = (dialect) => ({
|
|
391
|
+
tableName: '',
|
|
392
|
+
whereConditions: [],
|
|
393
|
+
selectColumns: ['*'],
|
|
394
|
+
orderByClauses: [],
|
|
395
|
+
joins: [],
|
|
396
|
+
eagerLoads: [],
|
|
397
|
+
eagerLoadConstraints: {},
|
|
398
|
+
eagerLoadCounts: [],
|
|
399
|
+
dialect,
|
|
400
|
+
});
|
|
401
|
+
const applyWhereGroup = (state, callback, boolean) => {
|
|
402
|
+
const groupState = createPredicateState(state.dialect);
|
|
403
|
+
const groupBuilder = createBuilder(groupState);
|
|
404
|
+
callback(groupBuilder);
|
|
405
|
+
if (groupState.whereConditions.length === 0) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
state.whereConditions.push({
|
|
409
|
+
kind: 'group',
|
|
410
|
+
boolean,
|
|
411
|
+
conditions: groupState.whereConditions,
|
|
412
|
+
});
|
|
413
|
+
};
|
|
414
|
+
const flattenWherePredicates = (conditions) => {
|
|
415
|
+
const flattened = [];
|
|
416
|
+
for (const condition of conditions) {
|
|
417
|
+
if (isWhereGroupClause(condition)) {
|
|
418
|
+
flattened.push(...flattenWherePredicates(condition.conditions));
|
|
419
|
+
continue;
|
|
420
|
+
}
|
|
421
|
+
flattened.push(condition);
|
|
422
|
+
}
|
|
423
|
+
return flattened;
|
|
330
424
|
};
|
|
331
425
|
const applyOrderByClause = (state, column, direction) => {
|
|
332
426
|
const col = String(column).trim();
|
|
@@ -501,11 +595,36 @@ function attachSelectMethods(builder, state) {
|
|
|
501
595
|
}
|
|
502
596
|
function attachWhereMethods(builder, state) {
|
|
503
597
|
builder.where = (column, operator, value) => {
|
|
504
|
-
applyWhereCondition(state, column, operator, value);
|
|
598
|
+
applyWhereCondition(state, column, operator, value, 'AND');
|
|
505
599
|
return builder;
|
|
506
600
|
};
|
|
507
601
|
builder.andWhere = (column, operator, value) => builder.where(column, operator, value);
|
|
508
|
-
builder.orWhere = (column, operator, value) =>
|
|
602
|
+
builder.orWhere = (column, operator, value) => {
|
|
603
|
+
applyWhereCondition(state, column, operator, value, 'OR');
|
|
604
|
+
return builder;
|
|
605
|
+
};
|
|
606
|
+
builder.whereGroup = (callback) => {
|
|
607
|
+
applyWhereGroup(state, callback, 'AND');
|
|
608
|
+
return builder;
|
|
609
|
+
};
|
|
610
|
+
builder.orWhereGroup = (callback) => {
|
|
611
|
+
applyWhereGroup(state, callback, 'OR');
|
|
612
|
+
return builder;
|
|
613
|
+
};
|
|
614
|
+
builder.whereNormalized = (column, value, options) => {
|
|
615
|
+
applyWhereCondition(state, column, '=', value, 'AND', {
|
|
616
|
+
expression: 'normalized-text',
|
|
617
|
+
normalization: options,
|
|
618
|
+
});
|
|
619
|
+
return builder;
|
|
620
|
+
};
|
|
621
|
+
builder.orWhereNormalized = (column, value, options) => {
|
|
622
|
+
applyWhereCondition(state, column, '=', value, 'OR', {
|
|
623
|
+
expression: 'normalized-text',
|
|
624
|
+
normalization: options,
|
|
625
|
+
});
|
|
626
|
+
return builder;
|
|
627
|
+
};
|
|
509
628
|
builder.whereNull = (column) => builder.where(column, 'IS', null);
|
|
510
629
|
builder.whereIn = (column, values) => {
|
|
511
630
|
builder.where(column, 'IN', values);
|
|
@@ -565,7 +684,7 @@ function attachJoinOrderPagingMethods(builder, state) {
|
|
|
565
684
|
};
|
|
566
685
|
}
|
|
567
686
|
function attachIntrospectionMethods(builder, state) {
|
|
568
|
-
builder.getWhereClauses = () => state.whereConditions;
|
|
687
|
+
builder.getWhereClauses = () => flattenWherePredicates(state.whereConditions);
|
|
569
688
|
builder.getSelectColumns = () => state.selectColumns;
|
|
570
689
|
builder.getTable = () => state.tableName;
|
|
571
690
|
builder.getLimit = () => state.limitValue;
|