crud-query-parser 0.1.0 → 1.1.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.
Files changed (72) hide show
  1. package/README.md +154 -35
  2. package/dist/adapters/array/index.d.mts +90 -0
  3. package/dist/adapters/array/index.d.ts +90 -0
  4. package/dist/adapters/array/index.js +2 -0
  5. package/dist/adapters/array/index.js.map +1 -0
  6. package/dist/adapters/array/index.mjs +2 -0
  7. package/dist/adapters/array/index.mjs.map +1 -0
  8. package/dist/adapters/dynamodb/index.d.mts +239 -0
  9. package/dist/adapters/dynamodb/index.d.ts +239 -0
  10. package/dist/adapters/dynamodb/index.js +2 -0
  11. package/dist/adapters/dynamodb/index.js.map +1 -0
  12. package/dist/adapters/dynamodb/index.mjs +2 -0
  13. package/dist/adapters/dynamodb/index.mjs.map +1 -0
  14. package/dist/adapters/mongodb/index.d.mts +163 -0
  15. package/dist/adapters/mongodb/index.d.ts +163 -0
  16. package/dist/adapters/mongodb/index.js +2 -0
  17. package/dist/adapters/mongodb/index.js.map +1 -0
  18. package/dist/adapters/mongodb/index.mjs +2 -0
  19. package/dist/adapters/mongodb/index.mjs.map +1 -0
  20. package/dist/adapters/sequelize/index.d.mts +190 -0
  21. package/dist/adapters/sequelize/index.d.ts +190 -0
  22. package/dist/adapters/sequelize/index.js +2 -0
  23. package/dist/adapters/sequelize/index.js.map +1 -0
  24. package/dist/adapters/sequelize/index.mjs +2 -0
  25. package/dist/adapters/sequelize/index.mjs.map +1 -0
  26. package/dist/adapters/typeorm/index.d.mts +4 -4
  27. package/dist/adapters/typeorm/index.d.ts +4 -4
  28. package/dist/adapters/typeorm/index.js +1 -1
  29. package/dist/adapters/typeorm/index.js.map +1 -1
  30. package/dist/adapters/typeorm/index.mjs +1 -1
  31. package/dist/adapters/typeorm/index.mjs.map +1 -1
  32. package/dist/crud-request-9u0s-DnI.d.mts +193 -0
  33. package/dist/crud-request-9u0s-DnI.d.ts +193 -0
  34. package/dist/{crud-request-where.builder-B5241Aht.d.ts → crud-request-where.builder-Cq0DKiuS.d.ts} +1 -1
  35. package/dist/{crud-request-where.builder-BwWLx0Bh.d.mts → crud-request-where.builder-D_V4JtjY.d.mts} +1 -1
  36. package/dist/filters/index.d.mts +1 -1
  37. package/dist/filters/index.d.ts +1 -1
  38. package/dist/filters/index.js +1 -1
  39. package/dist/filters/index.js.map +1 -1
  40. package/dist/filters/index.mjs +1 -1
  41. package/dist/filters/index.mjs.map +1 -1
  42. package/dist/helpers/express/index.d.mts +30 -0
  43. package/dist/helpers/express/index.d.ts +30 -0
  44. package/dist/helpers/express/index.js +2 -0
  45. package/dist/helpers/express/index.js.map +1 -0
  46. package/dist/helpers/express/index.mjs +2 -0
  47. package/dist/helpers/express/index.mjs.map +1 -0
  48. package/dist/helpers/nestjs/index.d.mts +4 -3
  49. package/dist/helpers/nestjs/index.d.ts +4 -3
  50. package/dist/helpers/nestjs/index.js +1 -1
  51. package/dist/helpers/nestjs/index.js.map +1 -1
  52. package/dist/helpers/nestjs/index.mjs +1 -1
  53. package/dist/helpers/nestjs/index.mjs.map +1 -1
  54. package/dist/index.d.mts +12 -4
  55. package/dist/index.d.ts +12 -4
  56. package/dist/index.js +1 -1
  57. package/dist/index.js.map +1 -1
  58. package/dist/index.mjs +1 -1
  59. package/dist/index.mjs.map +1 -1
  60. package/dist/parsers/crud/index.d.mts +44 -5
  61. package/dist/parsers/crud/index.d.ts +44 -5
  62. package/dist/parsers/crud/index.js +1 -1
  63. package/dist/parsers/crud/index.js.map +1 -1
  64. package/dist/parsers/crud/index.mjs +1 -1
  65. package/dist/parsers/crud/index.mjs.map +1 -1
  66. package/dist/{query-adapter-CEcyFcWr.d.ts → query-adapter-CZ_oD6Ui.d.ts} +3 -3
  67. package/dist/{query-adapter-CeTK3yxp.d.mts → query-adapter-HqVhBKtl.d.mts} +3 -3
  68. package/dist/{request-parser-BxVulcsX.d.ts → request-parser-C-cBNlki.d.ts} +4 -4
  69. package/dist/{request-parser-BMkszvGr.d.mts → request-parser-DYVGG34f.d.mts} +4 -4
  70. package/package.json +101 -4
  71. package/dist/crud-request-x16CuDRF.d.mts +0 -84
  72. package/dist/crud-request-x16CuDRF.d.ts +0 -84
@@ -0,0 +1,190 @@
1
+ import { Model, FindOptions, ModelStatic, Attributes, WhereOptions } from 'sequelize';
2
+ import { IncludeOptions, WhereAttributeHashValue } from 'sequelize/types/model';
3
+ import { Q as QueryAdapter, G as GetManyResult } from '../../query-adapter-HqVhBKtl.mjs';
4
+ import { C as CrudRequest, P as ParsedRequestSelect, c as CrudRequestOrder, b as CrudRequestRelation, F as FieldPath, d as CrudRequestWhere, g as CrudRequestWhereField } from '../../crud-request-9u0s-DnI.mjs';
5
+
6
+ interface SequelizeQueryAdapterOptions {
7
+ /**
8
+ * Whether it will use ILIKE for case-insensitive operations.
9
+ *
10
+ * If undefined, it will be enabled by default for postgres databases
11
+ */
12
+ ilike?: boolean;
13
+ /**
14
+ * What it will do when it finds invalid fields.
15
+ *
16
+ * By default, `select` and `order` will ignore invalid fields, and `where` will deny invalid fields.
17
+ */
18
+ invalidFields?: {
19
+ /**
20
+ * What it will do when it finds invalid fields in `select`.
21
+ *
22
+ * If "ignore", it will remove invalid fields
23
+ * If "deny", it will throw an exception for invalid fields
24
+ * If "allow-unsafe", it will not validate any fields. Unsafe: this can allow SQL injection
25
+ * If undefined, it will default to "ignore"
26
+ */
27
+ select?: 'ignore' | 'deny' | 'allow-unsafe';
28
+ /**
29
+ * What it will do when it finds invalid fields in `order`.
30
+ *
31
+ * If "ignore", it will remove invalid fields
32
+ * If "deny", it will throw an exception for invalid fields
33
+ * If "allow-unsafe", it will not validate any fields. Unsafe: this can allow SQL injection
34
+ * If undefined, it will default to "ignore"
35
+ */
36
+ order?: 'ignore' | 'deny' | 'allow-unsafe';
37
+ /**
38
+ * What it will do when it finds invalid fields in `order`.
39
+ *
40
+ * If "ignore", it will remove invalid fields
41
+ * If "deny", it will throw an exception for invalid fields
42
+ * If "allow-unsafe", it will not validate any fields. Unsafe: this can allow SQL injection
43
+ * If undefined, it will default to "deny"
44
+ */
45
+ where?: 'ignore' | 'deny' | 'allow-unsafe';
46
+ /**
47
+ * What it will do when it finds invalid associations in `relations`.
48
+ *
49
+ * If "ignore", it will remove invalid relations
50
+ * If "deny", it will throw an exception for invalid relations
51
+ * If undefined, it will default to "ignore"
52
+ */
53
+ relations?: 'ignore' | 'deny';
54
+ };
55
+ }
56
+ declare class SequelizeQueryAdapter<T extends Model = Model> implements QueryAdapter<FindOptions, T> {
57
+ protected readonly model: ModelStatic<T>;
58
+ protected readonly options: SequelizeQueryAdapterOptions;
59
+ /**
60
+ * Whether it should use the ILIKE operator
61
+ */
62
+ protected ilikeEnabled: boolean;
63
+ constructor(model: ModelStatic<T>, options?: SequelizeQueryAdapterOptions);
64
+ /**
65
+ * @inheritDoc
66
+ */
67
+ build<A>(baseQuery: FindOptions<A>, request: CrudRequest): FindOptions<A>;
68
+ /**
69
+ * @inheritDoc
70
+ */
71
+ getOne<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<E | null>;
72
+ /**
73
+ * @inheritDoc
74
+ */
75
+ getMany<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<GetManyResult<E>>;
76
+ /**
77
+ * Creates the base query, without offset and limit
78
+ *
79
+ * @param baseQuery The base query
80
+ * @param request The request
81
+ */
82
+ protected createBaseQuery(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): FindOptions<Attributes<T>>;
83
+ /**
84
+ * Adapts the request select to Sequelize attributes
85
+ *
86
+ * @param query The Sequelize query
87
+ * @param select The request select fields
88
+ */
89
+ protected adaptSelect(query: FindOptions, select: ParsedRequestSelect): void;
90
+ /**
91
+ * Adapts the request order to Sequelize
92
+ *
93
+ * @param query The Sequelize query
94
+ * @param order The request order list
95
+ */
96
+ protected adaptOrder(query: FindOptions, order: CrudRequestOrder[]): void;
97
+ /**
98
+ * Adapts the request relations to Sequelize associations
99
+ *
100
+ * @param query The Sequelize query
101
+ * @param relations The request relations list
102
+ * @param select The request select fields
103
+ */
104
+ protected adaptRelations(query: FindOptions, relations: CrudRequestRelation[], select: ParsedRequestSelect): void;
105
+ /**
106
+ * Maps a relation based on a base path to a Sequelize include
107
+ *
108
+ * @param base The base path
109
+ * @param relations The request relation list
110
+ * @param select The request select fields
111
+ */
112
+ protected mapRelation(base: FieldPath, relations: CrudRequestRelation[], select: ParsedRequestSelect): IncludeOptions[];
113
+ /**
114
+ * Adapts the request offset and limit to Sequelize
115
+ *
116
+ * @param query The Sequelize query
117
+ * @param offset The offset
118
+ * @param limit The limit
119
+ */
120
+ protected adaptOffsetAndLimit(query: FindOptions, offset: number, limit: number | undefined): void;
121
+ /**
122
+ * Adapts a where condition to Sequelize
123
+ *
124
+ * @param query The Sequelize query
125
+ * @param where The request where condition
126
+ */
127
+ protected adaptWhere(query: FindOptions, where: CrudRequestWhere): void;
128
+ /**
129
+ * Maps a request where condition to a Sequelize where
130
+ *
131
+ * @param where The request where condition
132
+ */
133
+ protected mapWhere(where: CrudRequestWhere): WhereOptions | undefined;
134
+ /**
135
+ * Maps a request condition to its respective Sequelize condition
136
+ *
137
+ * @param where The request field condition
138
+ */
139
+ protected mapWhereOperator(where: CrudRequestWhereField): WhereAttributeHashValue<any>;
140
+ /**
141
+ * Maps a LIKE condition to the lower implementation,
142
+ * being ILIKE in Postgres or LOWER(column) LIKE in other databases.
143
+ *
144
+ * @param field The field path
145
+ * @param column The column name
146
+ * @param value The value
147
+ * @param not Whether it's an inverted condition
148
+ */
149
+ protected mapLowerLike(field: FieldPath, column: string, value: string, not?: boolean): WhereAttributeHashValue<any>;
150
+ /**
151
+ * Maps a LOWER(column) condition
152
+ *
153
+ * @param field The field path
154
+ * @param operator The attribute hash value
155
+ */
156
+ protected mapLowerCondition(field: FieldPath, operator: WhereAttributeHashValue<any>): WhereAttributeHashValue<any>;
157
+ /**
158
+ * Checks whether ILIKE expressions are available for the current database
159
+ */
160
+ protected isILikeEnabled(): boolean;
161
+ /**
162
+ * Checks whether the field is valid
163
+ *
164
+ * @param path The field path
165
+ * @param source The source where the field validation comes from
166
+ */
167
+ protected validateField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean;
168
+ /**
169
+ * Handles an invalid field, returning `true` if it should allow unsafe, `false` if it should ignore,
170
+ * or throwing an exception if it should deny.
171
+ *
172
+ * @param path The field path
173
+ * @param source The source where the field validation comes from
174
+ */
175
+ protected handleInvalidField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean;
176
+ /**
177
+ * Finds a model from a field base path
178
+ *
179
+ * @param base The base path
180
+ */
181
+ protected findFieldModel(base: FieldPath): ModelStatic<any> | null;
182
+ /**
183
+ * Checks whether the field is valid
184
+ *
185
+ * @param path The field path
186
+ */
187
+ protected isFieldValid(path: FieldPath): boolean;
188
+ }
189
+
190
+ export { SequelizeQueryAdapter, type SequelizeQueryAdapterOptions };
@@ -0,0 +1,190 @@
1
+ import { Model, FindOptions, ModelStatic, Attributes, WhereOptions } from 'sequelize';
2
+ import { IncludeOptions, WhereAttributeHashValue } from 'sequelize/types/model';
3
+ import { Q as QueryAdapter, G as GetManyResult } from '../../query-adapter-CZ_oD6Ui.js';
4
+ import { C as CrudRequest, P as ParsedRequestSelect, c as CrudRequestOrder, b as CrudRequestRelation, F as FieldPath, d as CrudRequestWhere, g as CrudRequestWhereField } from '../../crud-request-9u0s-DnI.js';
5
+
6
+ interface SequelizeQueryAdapterOptions {
7
+ /**
8
+ * Whether it will use ILIKE for case-insensitive operations.
9
+ *
10
+ * If undefined, it will be enabled by default for postgres databases
11
+ */
12
+ ilike?: boolean;
13
+ /**
14
+ * What it will do when it finds invalid fields.
15
+ *
16
+ * By default, `select` and `order` will ignore invalid fields, and `where` will deny invalid fields.
17
+ */
18
+ invalidFields?: {
19
+ /**
20
+ * What it will do when it finds invalid fields in `select`.
21
+ *
22
+ * If "ignore", it will remove invalid fields
23
+ * If "deny", it will throw an exception for invalid fields
24
+ * If "allow-unsafe", it will not validate any fields. Unsafe: this can allow SQL injection
25
+ * If undefined, it will default to "ignore"
26
+ */
27
+ select?: 'ignore' | 'deny' | 'allow-unsafe';
28
+ /**
29
+ * What it will do when it finds invalid fields in `order`.
30
+ *
31
+ * If "ignore", it will remove invalid fields
32
+ * If "deny", it will throw an exception for invalid fields
33
+ * If "allow-unsafe", it will not validate any fields. Unsafe: this can allow SQL injection
34
+ * If undefined, it will default to "ignore"
35
+ */
36
+ order?: 'ignore' | 'deny' | 'allow-unsafe';
37
+ /**
38
+ * What it will do when it finds invalid fields in `order`.
39
+ *
40
+ * If "ignore", it will remove invalid fields
41
+ * If "deny", it will throw an exception for invalid fields
42
+ * If "allow-unsafe", it will not validate any fields. Unsafe: this can allow SQL injection
43
+ * If undefined, it will default to "deny"
44
+ */
45
+ where?: 'ignore' | 'deny' | 'allow-unsafe';
46
+ /**
47
+ * What it will do when it finds invalid associations in `relations`.
48
+ *
49
+ * If "ignore", it will remove invalid relations
50
+ * If "deny", it will throw an exception for invalid relations
51
+ * If undefined, it will default to "ignore"
52
+ */
53
+ relations?: 'ignore' | 'deny';
54
+ };
55
+ }
56
+ declare class SequelizeQueryAdapter<T extends Model = Model> implements QueryAdapter<FindOptions, T> {
57
+ protected readonly model: ModelStatic<T>;
58
+ protected readonly options: SequelizeQueryAdapterOptions;
59
+ /**
60
+ * Whether it should use the ILIKE operator
61
+ */
62
+ protected ilikeEnabled: boolean;
63
+ constructor(model: ModelStatic<T>, options?: SequelizeQueryAdapterOptions);
64
+ /**
65
+ * @inheritDoc
66
+ */
67
+ build<A>(baseQuery: FindOptions<A>, request: CrudRequest): FindOptions<A>;
68
+ /**
69
+ * @inheritDoc
70
+ */
71
+ getOne<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<E | null>;
72
+ /**
73
+ * @inheritDoc
74
+ */
75
+ getMany<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<GetManyResult<E>>;
76
+ /**
77
+ * Creates the base query, without offset and limit
78
+ *
79
+ * @param baseQuery The base query
80
+ * @param request The request
81
+ */
82
+ protected createBaseQuery(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): FindOptions<Attributes<T>>;
83
+ /**
84
+ * Adapts the request select to Sequelize attributes
85
+ *
86
+ * @param query The Sequelize query
87
+ * @param select The request select fields
88
+ */
89
+ protected adaptSelect(query: FindOptions, select: ParsedRequestSelect): void;
90
+ /**
91
+ * Adapts the request order to Sequelize
92
+ *
93
+ * @param query The Sequelize query
94
+ * @param order The request order list
95
+ */
96
+ protected adaptOrder(query: FindOptions, order: CrudRequestOrder[]): void;
97
+ /**
98
+ * Adapts the request relations to Sequelize associations
99
+ *
100
+ * @param query The Sequelize query
101
+ * @param relations The request relations list
102
+ * @param select The request select fields
103
+ */
104
+ protected adaptRelations(query: FindOptions, relations: CrudRequestRelation[], select: ParsedRequestSelect): void;
105
+ /**
106
+ * Maps a relation based on a base path to a Sequelize include
107
+ *
108
+ * @param base The base path
109
+ * @param relations The request relation list
110
+ * @param select The request select fields
111
+ */
112
+ protected mapRelation(base: FieldPath, relations: CrudRequestRelation[], select: ParsedRequestSelect): IncludeOptions[];
113
+ /**
114
+ * Adapts the request offset and limit to Sequelize
115
+ *
116
+ * @param query The Sequelize query
117
+ * @param offset The offset
118
+ * @param limit The limit
119
+ */
120
+ protected adaptOffsetAndLimit(query: FindOptions, offset: number, limit: number | undefined): void;
121
+ /**
122
+ * Adapts a where condition to Sequelize
123
+ *
124
+ * @param query The Sequelize query
125
+ * @param where The request where condition
126
+ */
127
+ protected adaptWhere(query: FindOptions, where: CrudRequestWhere): void;
128
+ /**
129
+ * Maps a request where condition to a Sequelize where
130
+ *
131
+ * @param where The request where condition
132
+ */
133
+ protected mapWhere(where: CrudRequestWhere): WhereOptions | undefined;
134
+ /**
135
+ * Maps a request condition to its respective Sequelize condition
136
+ *
137
+ * @param where The request field condition
138
+ */
139
+ protected mapWhereOperator(where: CrudRequestWhereField): WhereAttributeHashValue<any>;
140
+ /**
141
+ * Maps a LIKE condition to the lower implementation,
142
+ * being ILIKE in Postgres or LOWER(column) LIKE in other databases.
143
+ *
144
+ * @param field The field path
145
+ * @param column The column name
146
+ * @param value The value
147
+ * @param not Whether it's an inverted condition
148
+ */
149
+ protected mapLowerLike(field: FieldPath, column: string, value: string, not?: boolean): WhereAttributeHashValue<any>;
150
+ /**
151
+ * Maps a LOWER(column) condition
152
+ *
153
+ * @param field The field path
154
+ * @param operator The attribute hash value
155
+ */
156
+ protected mapLowerCondition(field: FieldPath, operator: WhereAttributeHashValue<any>): WhereAttributeHashValue<any>;
157
+ /**
158
+ * Checks whether ILIKE expressions are available for the current database
159
+ */
160
+ protected isILikeEnabled(): boolean;
161
+ /**
162
+ * Checks whether the field is valid
163
+ *
164
+ * @param path The field path
165
+ * @param source The source where the field validation comes from
166
+ */
167
+ protected validateField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean;
168
+ /**
169
+ * Handles an invalid field, returning `true` if it should allow unsafe, `false` if it should ignore,
170
+ * or throwing an exception if it should deny.
171
+ *
172
+ * @param path The field path
173
+ * @param source The source where the field validation comes from
174
+ */
175
+ protected handleInvalidField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean;
176
+ /**
177
+ * Finds a model from a field base path
178
+ *
179
+ * @param base The base path
180
+ */
181
+ protected findFieldModel(base: FieldPath): ModelStatic<any> | null;
182
+ /**
183
+ * Checks whether the field is valid
184
+ *
185
+ * @param path The field path
186
+ */
187
+ protected isFieldValid(path: FieldPath): boolean;
188
+ }
189
+
190
+ export { SequelizeQueryAdapter, type SequelizeQueryAdapterOptions };
@@ -0,0 +1,2 @@
1
+ "use strict";var L=Object.create;var f=Object.defineProperty;var O=Object.getOwnPropertyDescriptor;var w=Object.getOwnPropertyNames;var R=Object.getPrototypeOf,F=Object.prototype.hasOwnProperty;var s=(i,e)=>f(i,"name",{value:e,configurable:!0});var _=(i,e)=>{for(var t in e)f(i,t,{get:e[t],enumerable:!0})},T=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of w(e))!F.call(i,r)&&r!==t&&f(i,r,{get:()=>e[r],enumerable:!(n=O(e,r))||n.enumerable});return i};var A=(i,e,t)=>(t=i!=null?L(R(i)):{},T(e||!i||!i.__esModule?f(t,"default",{value:i,enumerable:!0}):t,i)),S=i=>T(f({},"__esModule",{value:!0}),i);var x={};_(x,{SequelizeQueryAdapter:()=>y});module.exports=S(x);var o=A(require("sequelize"));function p(i,e){if(typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e instanceof Date)return e;throw new Error(`${i} must be a string, number or boolean`)}s(p,"ensurePrimitive");function m(i,e){if(e==null||typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e instanceof Date)return e;throw new Error(`${i} must be a string, number, boolean or null`)}s(m,"ensurePrimitiveOrNull");function u(i,e,t=0){if(!Array.isArray(e)||e.length<t)throw new Error(`${i} must be an array with at least ${t} items`);return e}s(u,"ensureArray");function h(i){return i!=null}s(h,"isValid");function g(i,e,t){return i??(e&&t?e*(t-1):0)}s(g,"getOffset");function E(i,e,t,n){let r=i.length,l=n??e,a=l>0?Math.floor(t/l)+1:1,c=l>0?Math.ceil(e/l):0;return{data:i,count:r,total:e,page:a,pageCount:c}}s(E,"createGetManyResult");function b(i,e){return i.length-1!==e.length?!1:e.every((t,n)=>i[n]===t)}s(b,"pathHasBase");function N(i){return i.length>0?i[i.length-1]:""}s(N,"pathGetFieldName");var y=class{constructor(e,t={}){this.model=e;this.options=t;this.ilikeEnabled=this.isILikeEnabled()}static{s(this,"SequelizeQueryAdapter")}ilikeEnabled;build(e,t){let n=this.createBaseQuery(e,t),r=g(t.offset,t.limit,t.page);return this.adaptOffsetAndLimit(n,r,t.limit),n}async getOne(e,t){let n=this.createBaseQuery(e,t);return await this.model.findOne(n)}async getMany(e,t){let n=this.createBaseQuery(e,t),r=g(t.offset,t.limit,t.page);this.adaptOffsetAndLimit(n,r,t.limit);let{rows:l,count:a}=await this.model.findAndCountAll(n);return E(l,a,r,t.limit)}createBaseQuery(e,t){let n={...e};return this.adaptSelect(n,t.select),this.adaptOrder(n,t.order),this.adaptRelations(n,t.relations,t.select),this.adaptWhere(n,t.where),n}adaptSelect(e,t){t.length!==0&&(e.attributes=t.filter(n=>n.field.length===1).filter(n=>this.validateField(n.field,"select")).map(n=>n.field[0]))}adaptOrder(e,t){let n=t.filter(r=>this.validateField(r.field,"order")).map(r=>[...r.field,r.order]);n.length!==0&&(e.order=n)}adaptRelations(e,t,n){let r=this.mapRelation([],t,n);r.length!==0&&(e.include=r)}mapRelation(e,t,n){return t.filter(r=>b(r.field,e)).map(r=>{let l=this.findFieldModel(r.field);if(!l)return this.handleInvalidField(r.field,"relations"),null;let a=n.filter(d=>b(d.field,r.field)).filter(d=>this.validateField(d.field,"select")).map(d=>N(d.field)),c=this.mapRelation(r.field,t,n);return{model:l,...c.length>0&&{include:c},...n.length>0&&{attributes:a}}}).filter(r=>!!r)}adaptOffsetAndLimit(e,t,n){t&&(e.offset=t),n&&(e.limit=n)}adaptWhere(e,t){e.where=this.mapWhere(t)}mapWhere(e){if(e.and&&e.and.length>0)return{[o.Op.and]:e.and.map(t=>this.mapWhere(t)).filter(t=>!!t)};if(e.or&&e.or.length>0)return{[o.Op.or]:e.or.map(t=>this.mapWhere(t)).filter(t=>!!t)};if(e.field)return this.validateField(e.field,"where")?this.mapWhereOperator(e):void 0}mapWhereOperator(e){let t=e.field,n=t.length===1?t[0]:`$${t.join(".")}$`,r=e.value;switch(e.operator){case"eq":return{[n]:m("EQ operator",r)};case"neq":return{[n]:{[o.Op.ne]:m("NEQ operator",r)}};case"gt":return{[n]:{[o.Op.gt]:p("GT operator",r)}};case"gte":return{[n]:{[o.Op.gte]:p("GTE operator",r)}};case"lt":return{[n]:{[o.Op.lt]:p("LT operator",r)}};case"lte":return{[n]:{[o.Op.lte]:p("LTE operator",r)}};case"starts":return{[n]:{[o.Op.startsWith]:`${r}`}};case"ends":return{[n]:{[o.Op.endsWith]:`${r}`}};case"contains":return{[n]:{[o.Op.substring]:`${r}`}};case"not_contains":return{[n]:{[o.Op.notLike]:`%${r}%`}};case"in":return{[n]:{[o.Op.in]:u("IN operator",r)}};case"not_in":return{[n]:{[o.Op.notIn]:u("NOT IN operator",r)}};case"between":return{[n]:{[o.Op.between]:u("BETWEEN operator",r,2)}};case"is_null":return{[n]:{[o.Op.eq]:null}};case"not_null":return{[n]:{[o.Op.ne]:null}};case"eq_lower":return this.mapLowerCondition(t,{[o.Op.eq]:r});case"neq_lower":return this.mapLowerCondition(t,{[o.Op.ne]:r});case"starts_lower":return this.mapLowerLike(t,n,`${r}%`);case"ends_lower":return this.mapLowerLike(t,n,`%${r}`);case"contains_lower":return this.mapLowerLike(t,n,`%${r}%`);case"not_contains_lower":return this.mapLowerLike(t,n,`%${r}%`,!0);case"in_lower":return this.mapLowerCondition(t,{[o.Op.in]:u("IN operator",r,1)});case"not_in_lower":return this.mapLowerCondition(t,{[o.Op.notIn]:u("NOT IN operator",r,1)})}throw new Error(`Unsupported operator "${e.operator}"`)}mapLowerLike(e,t,n,r=!1){return this.ilikeEnabled?{[t]:{[r?o.Op.notILike:o.Op.iLike]:n}}:this.mapLowerCondition(e,{[r?o.Op.notLike:o.Op.like]:n})}mapLowerCondition(e,t){return o.default.where(o.default.fn("lower",o.default.col(e.join("."))),t)}isILikeEnabled(){let e=this.options.ilike;return h(e)?e:this.model.options?.sequelize?.getDialect()==="postgres"}validateField(e,t){return this.isFieldValid(e)?!0:this.handleInvalidField(e,t)}handleInvalidField(e,t){let n={select:"ignore",order:"ignore",where:"deny",relations:"ignore"},r=this.options.invalidFields?.[t]||n[t];if(r==="allow-unsafe")return!0;if(r==="deny")throw new Error(`${t} field "${e.join(".")}" is invalid.`);return!1}findFieldModel(e){let t=this.model;for(let n of e){let r=t.associations[n];if(!r)return null;t=r.target}return t}isFieldValid(e){if(e.length===0)return!1;let t=[...e],n=t.pop(),r=this.findFieldModel(t);return r?!!r.getAttributes()[n]:!1}};0&&(module.exports={SequelizeQueryAdapter});
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/sequelize/index.ts","../../../src/adapters/sequelize/sequelize.query-adapter.ts","../../../src/utils/functions.ts","../../../src/utils/objects.ts","../../../src/utils/field-path.ts"],"sourcesContent":["export * from './sequelize.query-adapter';\r\n","import sequelize, { Attributes, FindOptions, Model, ModelStatic, Op, OrderItem, WhereOptions } from 'sequelize';\r\nimport { IncludeOptions, WhereAttributeHashValue } from 'sequelize/types/model';\r\nimport { GetManyResult } from '../../models/get-many-result';\r\nimport { QueryAdapter } from '../../models/query-adapter';\r\nimport { FieldPath } from '../../models/field-path';\r\nimport { CrudRequest, CrudRequestOrder, CrudRequestRelation, ParsedRequestSelect } from '../../models/crud-request';\r\nimport { CrudRequestWhere, CrudRequestWhereField, CrudRequestWhereOperator } from '../../models/crud-request-where';\r\nimport { ensureArray, ensurePrimitive, ensurePrimitiveOrNull, getOffset, isValid } from '../../utils/functions';\r\nimport { createGetManyResult } from '../../utils/objects';\r\nimport { pathGetFieldName, pathHasBase } from '../../utils/field-path';\r\n\r\nexport interface SequelizeQueryAdapterOptions {\r\n /**\r\n * Whether it will use ILIKE for case-insensitive operations.\r\n *\r\n * If undefined, it will be enabled by default for postgres databases\r\n */\r\n ilike?: boolean;\r\n\r\n /**\r\n * What it will do when it finds invalid fields.\r\n *\r\n * By default, `select` and `order` will ignore invalid fields, and `where` will deny invalid fields.\r\n */\r\n invalidFields?: {\r\n /**\r\n * What it will do when it finds invalid fields in `select`.\r\n *\r\n * If \"ignore\", it will remove invalid fields\r\n * If \"deny\", it will throw an exception for invalid fields\r\n * If \"allow-unsafe\", it will not validate any fields. Unsafe: this can allow SQL injection\r\n * If undefined, it will default to \"ignore\"\r\n */\r\n select?: 'ignore' | 'deny' | 'allow-unsafe';\r\n\r\n /**\r\n * What it will do when it finds invalid fields in `order`.\r\n *\r\n * If \"ignore\", it will remove invalid fields\r\n * If \"deny\", it will throw an exception for invalid fields\r\n * If \"allow-unsafe\", it will not validate any fields. Unsafe: this can allow SQL injection\r\n * If undefined, it will default to \"ignore\"\r\n */\r\n order?: 'ignore' | 'deny' | 'allow-unsafe';\r\n\r\n /**\r\n * What it will do when it finds invalid fields in `order`.\r\n *\r\n * If \"ignore\", it will remove invalid fields\r\n * If \"deny\", it will throw an exception for invalid fields\r\n * If \"allow-unsafe\", it will not validate any fields. Unsafe: this can allow SQL injection\r\n * If undefined, it will default to \"deny\"\r\n */\r\n where?: 'ignore' | 'deny' | 'allow-unsafe';\r\n\r\n /**\r\n * What it will do when it finds invalid associations in `relations`.\r\n *\r\n * If \"ignore\", it will remove invalid relations\r\n * If \"deny\", it will throw an exception for invalid relations\r\n * If undefined, it will default to \"ignore\"\r\n */\r\n relations?: 'ignore' | 'deny';\r\n }\r\n}\r\n\r\nexport class SequelizeQueryAdapter<T extends Model = Model> implements QueryAdapter<FindOptions, T> {\r\n /**\r\n * Whether it should use the ILIKE operator\r\n */\r\n protected ilikeEnabled: boolean;\r\n\r\n constructor(\r\n protected readonly model: ModelStatic<T>,\r\n protected readonly options: SequelizeQueryAdapterOptions = {},\r\n ) {\r\n this.ilikeEnabled = this.isILikeEnabled();\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public build<A>(baseQuery: FindOptions<A>, request: CrudRequest): FindOptions<A> {\r\n const query = this.createBaseQuery(baseQuery, request);\r\n\r\n const offset = getOffset(request.offset, request.limit, request.page);\r\n\r\n this.adaptOffsetAndLimit(query, offset, request.limit);\r\n\r\n return query;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public async getOne<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<E | null> {\r\n const query = this.createBaseQuery(baseQuery, request);\r\n\r\n return await this.model.findOne(query) as E | null;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public async getMany<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<GetManyResult<E>> {\r\n const query = this.createBaseQuery(baseQuery, request);\r\n\r\n const offset = getOffset(request.offset, request.limit, request.page);\r\n\r\n this.adaptOffsetAndLimit(query, offset, request.limit);\r\n\r\n const { rows, count } = await this.model.findAndCountAll(query);\r\n\r\n return createGetManyResult<E>(rows as E[], count, offset, request.limit);\r\n }\r\n\r\n /**\r\n * Creates the base query, without offset and limit\r\n *\r\n * @param baseQuery The base query\r\n * @param request The request\r\n */\r\n protected createBaseQuery(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): FindOptions<Attributes<T>> {\r\n const query = { ...baseQuery };\r\n\r\n this.adaptSelect(query, request.select);\r\n this.adaptOrder(query, request.order);\r\n this.adaptRelations(query, request.relations, request.select);\r\n this.adaptWhere(query, request.where);\r\n\r\n return query;\r\n }\r\n\r\n /**\r\n * Adapts the request select to Sequelize attributes\r\n *\r\n * @param query The Sequelize query\r\n * @param select The request select fields\r\n */\r\n protected adaptSelect(query: FindOptions, select: ParsedRequestSelect): void {\r\n if (select.length === 0)\r\n return;\r\n\r\n query.attributes = select\r\n .filter(f => f.field.length === 1)\r\n .filter(f => this.validateField(f.field, 'select'))\r\n .map(f => f.field[0]);\r\n }\r\n\r\n /**\r\n * Adapts the request order to Sequelize\r\n *\r\n * @param query The Sequelize query\r\n * @param order The request order list\r\n */\r\n protected adaptOrder(query: FindOptions, order: CrudRequestOrder[]): void {\r\n const sequelizeOrder = order\r\n .filter(f => this.validateField(f.field, 'order'))\r\n .map(f => [...f.field, f.order] as OrderItem);\r\n\r\n if (sequelizeOrder.length === 0)\r\n return;\r\n\r\n query.order = sequelizeOrder;\r\n }\r\n\r\n /**\r\n * Adapts the request relations to Sequelize associations\r\n *\r\n * @param query The Sequelize query\r\n * @param relations The request relations list\r\n * @param select The request select fields\r\n */\r\n protected adaptRelations(query: FindOptions, relations: CrudRequestRelation[], select: ParsedRequestSelect): void {\r\n const include = this.mapRelation([], relations, select);\r\n\r\n if (include.length === 0)\r\n return;\r\n\r\n query.include = include;\r\n }\r\n\r\n /**\r\n * Maps a relation based on a base path to a Sequelize include\r\n *\r\n * @param base The base path\r\n * @param relations The request relation list\r\n * @param select The request select fields\r\n */\r\n protected mapRelation(\r\n base: FieldPath,\r\n relations: CrudRequestRelation[],\r\n select: ParsedRequestSelect,\r\n ): IncludeOptions[] {\r\n return relations\r\n .filter(relation => pathHasBase(relation.field, base))\r\n .map(relation => {\r\n const model = this.findFieldModel(relation.field);\r\n\r\n if (!model) {\r\n this.handleInvalidField(relation.field, 'relations');\r\n\r\n return null;\r\n }\r\n\r\n const attributes = select\r\n .filter(f => pathHasBase(f.field, relation.field))\r\n .filter(f => this.validateField(f.field, 'select'))\r\n .map(f => pathGetFieldName(f.field));\r\n\r\n const include = this.mapRelation(relation.field, relations, select);\r\n\r\n return {\r\n model,\r\n ...(include.length > 0) && { include },\r\n ...(select.length > 0) && { attributes },\r\n } as IncludeOptions;\r\n })\r\n .filter(relation => !!relation);\r\n }\r\n\r\n /**\r\n * Adapts the request offset and limit to Sequelize\r\n *\r\n * @param query The Sequelize query\r\n * @param offset The offset\r\n * @param limit The limit\r\n */\r\n protected adaptOffsetAndLimit(query: FindOptions, offset: number, limit: number | undefined): void {\r\n if (offset)\r\n query.offset = offset;\r\n\r\n if (limit)\r\n query.limit = limit;\r\n }\r\n\r\n /**\r\n * Adapts a where condition to Sequelize\r\n *\r\n * @param query The Sequelize query\r\n * @param where The request where condition\r\n */\r\n protected adaptWhere(query: FindOptions, where: CrudRequestWhere): void {\r\n query.where = this.mapWhere(where);\r\n }\r\n\r\n /**\r\n * Maps a request where condition to a Sequelize where\r\n *\r\n * @param where The request where condition\r\n */\r\n protected mapWhere(where: CrudRequestWhere): WhereOptions | undefined {\r\n if (where.and && where.and.length > 0) {\r\n return {\r\n [Op.and]: where.and\r\n .map(item => this.mapWhere(item))\r\n .filter(condition => !!condition),\r\n };\r\n }\r\n\r\n if (where.or && where.or.length > 0) {\r\n return {\r\n [Op.or]: where.or\r\n .map(item => this.mapWhere(item))\r\n .filter(condition => !!condition),\r\n };\r\n }\r\n\r\n if (where.field) {\r\n if (!this.validateField(where.field, 'where'))\r\n return undefined;\r\n\r\n return this.mapWhereOperator(where);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Maps a request condition to its respective Sequelize condition\r\n *\r\n * @param where The request field condition\r\n */\r\n protected mapWhereOperator(where: CrudRequestWhereField): WhereAttributeHashValue<any> {\r\n const field = where.field;\r\n const column = field.length === 1 ? field[0] : `$${field.join('.')}$`;\r\n const value = where.value;\r\n\r\n switch (where.operator) {\r\n case CrudRequestWhereOperator.EQ:\r\n return { [column]: ensurePrimitiveOrNull('EQ operator', value) };\r\n\r\n case CrudRequestWhereOperator.NEQ:\r\n return { [column]: { [Op.ne]: ensurePrimitiveOrNull('NEQ operator', value) } };\r\n\r\n case CrudRequestWhereOperator.GT:\r\n return { [column]: { [Op.gt]: ensurePrimitive('GT operator', value) } };\r\n\r\n case CrudRequestWhereOperator.GTE:\r\n return { [column]: { [Op.gte]: ensurePrimitive('GTE operator', value) } };\r\n\r\n case CrudRequestWhereOperator.LT:\r\n return { [column]: { [Op.lt]: ensurePrimitive('LT operator', value) } };\r\n\r\n case CrudRequestWhereOperator.LTE:\r\n return { [column]: { [Op.lte]: ensurePrimitive('LTE operator', value) } };\r\n\r\n case CrudRequestWhereOperator.STARTS:\r\n return { [column]: { [Op.startsWith]: `${value}` } };\r\n\r\n case CrudRequestWhereOperator.ENDS:\r\n return { [column]: { [Op.endsWith]: `${value}` } };\r\n\r\n case CrudRequestWhereOperator.CONTAINS:\r\n return { [column]: { [Op.substring]: `${value}` } };\r\n\r\n case CrudRequestWhereOperator.NOT_CONTAINS:\r\n return { [column]: { [Op.notLike]: `%${value}%` } };\r\n\r\n case CrudRequestWhereOperator.IN:\r\n return { [column]: { [Op.in]: ensureArray('IN operator', value) } };\r\n\r\n case CrudRequestWhereOperator.NOT_IN:\r\n return { [column]: { [Op.notIn]: ensureArray('NOT IN operator', value) } };\r\n\r\n case CrudRequestWhereOperator.BETWEEN:\r\n return { [column]: { [Op.between]: ensureArray('BETWEEN operator', value, 2) } };\r\n\r\n case CrudRequestWhereOperator.IS_NULL:\r\n return { [column]: { [Op.eq]: null } };\r\n\r\n case CrudRequestWhereOperator.NOT_NULL:\r\n return { [column]: { [Op.ne]: null } };\r\n\r\n case CrudRequestWhereOperator.EQ_LOWER:\r\n return this.mapLowerCondition(field, { [Op.eq]: value });\r\n\r\n case CrudRequestWhereOperator.NEQ_LOWER:\r\n return this.mapLowerCondition(field, { [Op.ne]: value });\r\n\r\n case CrudRequestWhereOperator.STARTS_LOWER:\r\n return this.mapLowerLike(field, column, `${value}%`);\r\n\r\n case CrudRequestWhereOperator.ENDS_LOWER:\r\n return this.mapLowerLike(field, column, `%${value}`);\r\n\r\n case CrudRequestWhereOperator.CONTAINS_LOWER:\r\n return this.mapLowerLike(field, column, `%${value}%`);\r\n\r\n case CrudRequestWhereOperator.NOT_CONTAINS_LOWER:\r\n return this.mapLowerLike(field, column, `%${value}%`, true);\r\n\r\n case CrudRequestWhereOperator.IN_LOWER:\r\n return this.mapLowerCondition(field, { [Op.in]: ensureArray('IN operator', value, 1) });\r\n\r\n case CrudRequestWhereOperator.NOT_IN_LOWER:\r\n return this.mapLowerCondition(field, { [Op.notIn]: ensureArray('NOT IN operator', value, 1) });\r\n }\r\n\r\n throw new Error(`Unsupported operator \"${where.operator}\"`);\r\n }\r\n\r\n /**\r\n * Maps a LIKE condition to the lower implementation,\r\n * being ILIKE in Postgres or LOWER(column) LIKE in other databases.\r\n *\r\n * @param field The field path\r\n * @param column The column name\r\n * @param value The value\r\n * @param not Whether it's an inverted condition\r\n */\r\n protected mapLowerLike(\r\n field: FieldPath,\r\n column: string,\r\n value: string,\r\n not: boolean = false,\r\n ): WhereAttributeHashValue<any> {\r\n if (this.ilikeEnabled) {\r\n return { [column]: { [not ? Op.notILike : Op.iLike]: value } };\r\n }\r\n\r\n return this.mapLowerCondition(field, { [not ? Op.notLike : Op.like]: value });\r\n }\r\n\r\n /**\r\n * Maps a LOWER(column) condition\r\n *\r\n * @param field The field path\r\n * @param operator The attribute hash value\r\n */\r\n protected mapLowerCondition(field: FieldPath, operator: WhereAttributeHashValue<any>): WhereAttributeHashValue<any> {\r\n return sequelize.where(\r\n sequelize.fn('lower', sequelize.col(field.join('.'))),\r\n operator,\r\n );\r\n }\r\n\r\n /**\r\n * Checks whether ILIKE expressions are available for the current database\r\n */\r\n protected isILikeEnabled(): boolean {\r\n const ilikeEnabled = this.options.ilike;\r\n\r\n if (isValid(ilikeEnabled))\r\n return ilikeEnabled;\r\n\r\n return this.model.options?.sequelize?.getDialect() === 'postgres';\r\n }\r\n\r\n /**\r\n * Checks whether the field is valid\r\n *\r\n * @param path The field path\r\n * @param source The source where the field validation comes from\r\n */\r\n protected validateField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean {\r\n const isValid = this.isFieldValid(path);\r\n\r\n if (isValid)\r\n return true;\r\n\r\n return this.handleInvalidField(path, source);\r\n }\r\n\r\n /**\r\n * Handles an invalid field, returning `true` if it should allow unsafe, `false` if it should ignore,\r\n * or throwing an exception if it should deny.\r\n *\r\n * @param path The field path\r\n * @param source The source where the field validation comes from\r\n */\r\n protected handleInvalidField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean {\r\n const defaults = {\r\n select: 'ignore',\r\n order: 'ignore',\r\n where: 'deny',\r\n relations: 'ignore',\r\n };\r\n\r\n const rule = this.options.invalidFields?.[source] || defaults[source];\r\n\r\n if (rule === 'allow-unsafe')\r\n return true;\r\n\r\n if (rule === 'deny')\r\n throw new Error(`${source} field \"${path.join('.')}\" is invalid.`);\r\n\r\n // rule === 'ignore'\r\n return false;\r\n }\r\n\r\n /**\r\n * Finds a model from a field base path\r\n *\r\n * @param base The base path\r\n */\r\n protected findFieldModel(base: FieldPath): ModelStatic<any> | null {\r\n let model: ModelStatic<any> = this.model;\r\n\r\n for (const part of base) {\r\n const relation = model.associations[part];\r\n\r\n if (!relation)\r\n return null;\r\n\r\n model = relation.target;\r\n }\r\n\r\n return model;\r\n }\r\n\r\n /**\r\n * Checks whether the field is valid\r\n *\r\n * @param path The field path\r\n */\r\n protected isFieldValid(path: FieldPath): boolean {\r\n if (path.length === 0)\r\n return false;\r\n\r\n const relationPath = [...path];\r\n const field = relationPath.pop()!;\r\n\r\n const model = this.findFieldModel(relationPath);\r\n\r\n if (!model)\r\n return false;\r\n\r\n const attributes = model.getAttributes();\r\n const column = attributes[field];\r\n\r\n return !!column;\r\n }\r\n\r\n}\r\n","export function ensurePrimitive(fieldName: string, data: any): number | string | boolean | Date {\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number or boolean`);\r\n}\r\n\r\nexport function ensurePrimitiveOrNull(fieldName: string, data: any): number | string | boolean | Date | undefined | null {\r\n if (data === null || data === undefined)\r\n return data;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureString(fieldName: string, data: any): string {\r\n if (typeof data === 'string')\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * (page - 1) : 0);\r\n}\r\n\r\nexport interface Type<T> extends Function { new (... args: any[]): T; }\r\n\r\nexport function createInstance<T extends object>(clazzOrInstance: T | Type<T> | undefined): T | undefined {\r\n if (typeof clazzOrInstance === 'function')\r\n return new clazzOrInstance();\r\n\r\n if (typeof clazzOrInstance === 'object')\r\n return clazzOrInstance as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","import { GetManyResult } from '../models/get-many-result';\r\nimport { CrudRequest } from '../models/crud-request';\r\n\r\n/**\r\n * Creates a CrudRequest object, filling required missing properties with empty values\r\n */\r\nexport function createCrudRequest(crudRequest?: Partial<CrudRequest>): CrudRequest {\r\n return {\r\n select: [],\r\n relations: [],\r\n order: [],\r\n where: { and: [] },\r\n ...crudRequest,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a GetManyResult object\r\n *\r\n * @param data The entity list to be returned\r\n * @param total The total amount of entities in the database\r\n * @param offset The offset used for querying\r\n * @param limit The limit used for querying\r\n */\r\nexport function createGetManyResult<T>(data: T[], total: number, offset: number, limit?: number): GetManyResult<T> {\r\n const count = data.length;\r\n const actualLimit = limit ?? total;\r\n const page = actualLimit > 0 ? Math.floor(offset / actualLimit) + 1 : 1;\r\n const pageCount = actualLimit > 0 ? Math.ceil(total / actualLimit) : 0;\r\n\r\n return {\r\n data,\r\n count,\r\n total,\r\n page,\r\n pageCount,\r\n };\r\n}\r\n","import { isValid } from './functions';\r\n\r\n/**\r\n * Parses a path by splitting it by dots\r\n *\r\n * @param value The full path as a string or the parts already split\r\n */\r\nexport function pathParse(value: string | string[]): string[] {\r\n if (typeof value === 'string')\r\n return value.split('.');\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Checks whether two field paths are equal\r\n *\r\n * E.g. [\"path\", \"to\", \"field\"] is equal to [\"path\", \"to\", \"field\"] but not [\"something\", \"else\"]\r\n */\r\nexport function pathEquals(path1: string[], path2: string[]): boolean {\r\n if (path1.length !== path2.length)\r\n return false;\r\n\r\n return path1.every((p1, i) => path2[i] === p1);\r\n}\r\n\r\n/**\r\n * Checks whether a path starts with another path.\r\n *\r\n * E.g. [\"path\", \"to\", \"field\"] starts with [\"path\"] or [\"path\", \"to\"] but not [\"something\", \"else\"]\r\n */\r\nexport function pathStartsWith(path: string[], start: string[]): boolean {\r\n if (path.length < start.length)\r\n return false;\r\n\r\n return start.every((start, i) => path[i] === start);\r\n}\r\n\r\n/**\r\n * Checks whether the base of a path matches.\r\n *\r\n * E.g. [\"path\", \"to\", \"field\"] has a base of [\"path\", \"to\"] but not [\"path\"]\r\n */\r\nexport function pathHasBase(path: string[], base: string[]): boolean {\r\n if (path.length - 1 !== base.length)\r\n return false;\r\n\r\n return base.every((start, i) => path[i] === start);\r\n}\r\n\r\n/**\r\n * Breaks a path into the base part and the field name part\r\n *\r\n * @param path The full path\r\n */\r\nexport function pathGetBaseAndName(path: string[]): [string[], string] {\r\n if (path.length === 0)\r\n throw new Error('Cannot break an empty path');\r\n\r\n const base = [...path];\r\n const name = base.pop()!;\r\n\r\n return [base, name];\r\n}\r\n\r\n\r\n/**\r\n * Gets the last part of the path: the field name\r\n *\r\n * @param path The full path\r\n */\r\nexport function pathGetFieldName(path: string[]): string {\r\n return path.length > 0 ? path[path.length - 1] : '';\r\n}\r\n\r\n/**\r\n * Sets a value for the given path\r\n *\r\n * @param obj The root object\r\n * @param field The full field path\r\n */\r\nexport function pathGetValue(obj: object, field: string[]): any {\r\n let value: any = obj;\r\n\r\n for (let i = 0; i < field.length; i++) {\r\n const name = field[i];\r\n\r\n if (!isValid(value))\r\n return undefined;\r\n\r\n if (typeof value !== 'object')\r\n throw new Error(`Cannot get ${name} as it is not an object (got ${typeof value})`);\r\n\r\n value = value[name];\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Sets a value for the given path\r\n *\r\n * @param obj The root object\r\n * @param field The full field path\r\n * @param value The value to be set\r\n */\r\nexport function pathSetValue(obj: object, field: string[], value: any): void {\r\n let self: any = obj;\r\n\r\n for (let i = 0; i < field.length; i++) {\r\n const name = field[i];\r\n\r\n if (typeof self !== 'object')\r\n throw new Error(`Cannot set ${name} as it is not an object (got ${typeof self})`);\r\n\r\n const isLast = i === field.length - 1;\r\n\r\n if (isLast)\r\n self[name] = value;\r\n else if (!isValid(self[name]))\r\n self = self[name] = {};\r\n else\r\n self = self[name];\r\n }\r\n}\r\n"],"mappings":"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","names":["sequelize_exports","__export","SequelizeQueryAdapter","__toCommonJS","import_sequelize","ensurePrimitive","fieldName","data","__name","ensurePrimitiveOrNull","ensureArray","fieldName","data","minLength","__name","isValid","value","__name","getOffset","offset","limit","page","createGetManyResult","data","total","offset","limit","count","actualLimit","page","pageCount","__name","pathHasBase","path","base","start","i","__name","pathGetFieldName","path","__name","SequelizeQueryAdapter","model","options","__name","baseQuery","request","query","offset","getOffset","rows","count","createGetManyResult","select","f","order","sequelizeOrder","relations","include","base","relation","pathHasBase","attributes","pathGetFieldName","limit","where","item","condition","field","column","value","ensurePrimitiveOrNull","ensurePrimitive","ensureArray","not","operator","sequelize","ilikeEnabled","isValid","path","source","defaults","rule","part","relationPath"]}
@@ -0,0 +1,2 @@
1
+ var N=Object.defineProperty;var s=(o,e)=>N(o,"name",{value:e,configurable:!0});import b,{Op as i}from"sequelize";function f(o,e){if(typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e instanceof Date)return e;throw new Error(`${o} must be a string, number or boolean`)}s(f,"ensurePrimitive");function c(o,e){if(e==null||typeof e=="number"||typeof e=="string"||typeof e=="boolean"||e instanceof Date)return e;throw new Error(`${o} must be a string, number, boolean or null`)}s(c,"ensurePrimitiveOrNull");function u(o,e,t=0){if(!Array.isArray(e)||e.length<t)throw new Error(`${o} must be an array with at least ${t} items`);return e}s(u,"ensureArray");function m(o){return o!=null}s(m,"isValid");function h(o,e,t){return o??(e&&t?e*(t-1):0)}s(h,"getOffset");function y(o,e,t,n){let r=o.length,l=n??e,a=l>0?Math.floor(t/l)+1:1,p=l>0?Math.ceil(e/l):0;return{data:o,count:r,total:e,page:a,pageCount:p}}s(y,"createGetManyResult");function g(o,e){return o.length-1!==e.length?!1:e.every((t,n)=>o[n]===t)}s(g,"pathHasBase");function T(o){return o.length>0?o[o.length-1]:""}s(T,"pathGetFieldName");var E=class{constructor(e,t={}){this.model=e;this.options=t;this.ilikeEnabled=this.isILikeEnabled()}static{s(this,"SequelizeQueryAdapter")}ilikeEnabled;build(e,t){let n=this.createBaseQuery(e,t),r=h(t.offset,t.limit,t.page);return this.adaptOffsetAndLimit(n,r,t.limit),n}async getOne(e,t){let n=this.createBaseQuery(e,t);return await this.model.findOne(n)}async getMany(e,t){let n=this.createBaseQuery(e,t),r=h(t.offset,t.limit,t.page);this.adaptOffsetAndLimit(n,r,t.limit);let{rows:l,count:a}=await this.model.findAndCountAll(n);return y(l,a,r,t.limit)}createBaseQuery(e,t){let n={...e};return this.adaptSelect(n,t.select),this.adaptOrder(n,t.order),this.adaptRelations(n,t.relations,t.select),this.adaptWhere(n,t.where),n}adaptSelect(e,t){t.length!==0&&(e.attributes=t.filter(n=>n.field.length===1).filter(n=>this.validateField(n.field,"select")).map(n=>n.field[0]))}adaptOrder(e,t){let n=t.filter(r=>this.validateField(r.field,"order")).map(r=>[...r.field,r.order]);n.length!==0&&(e.order=n)}adaptRelations(e,t,n){let r=this.mapRelation([],t,n);r.length!==0&&(e.include=r)}mapRelation(e,t,n){return t.filter(r=>g(r.field,e)).map(r=>{let l=this.findFieldModel(r.field);if(!l)return this.handleInvalidField(r.field,"relations"),null;let a=n.filter(d=>g(d.field,r.field)).filter(d=>this.validateField(d.field,"select")).map(d=>T(d.field)),p=this.mapRelation(r.field,t,n);return{model:l,...p.length>0&&{include:p},...n.length>0&&{attributes:a}}}).filter(r=>!!r)}adaptOffsetAndLimit(e,t,n){t&&(e.offset=t),n&&(e.limit=n)}adaptWhere(e,t){e.where=this.mapWhere(t)}mapWhere(e){if(e.and&&e.and.length>0)return{[i.and]:e.and.map(t=>this.mapWhere(t)).filter(t=>!!t)};if(e.or&&e.or.length>0)return{[i.or]:e.or.map(t=>this.mapWhere(t)).filter(t=>!!t)};if(e.field)return this.validateField(e.field,"where")?this.mapWhereOperator(e):void 0}mapWhereOperator(e){let t=e.field,n=t.length===1?t[0]:`$${t.join(".")}$`,r=e.value;switch(e.operator){case"eq":return{[n]:c("EQ operator",r)};case"neq":return{[n]:{[i.ne]:c("NEQ operator",r)}};case"gt":return{[n]:{[i.gt]:f("GT operator",r)}};case"gte":return{[n]:{[i.gte]:f("GTE operator",r)}};case"lt":return{[n]:{[i.lt]:f("LT operator",r)}};case"lte":return{[n]:{[i.lte]:f("LTE operator",r)}};case"starts":return{[n]:{[i.startsWith]:`${r}`}};case"ends":return{[n]:{[i.endsWith]:`${r}`}};case"contains":return{[n]:{[i.substring]:`${r}`}};case"not_contains":return{[n]:{[i.notLike]:`%${r}%`}};case"in":return{[n]:{[i.in]:u("IN operator",r)}};case"not_in":return{[n]:{[i.notIn]:u("NOT IN operator",r)}};case"between":return{[n]:{[i.between]:u("BETWEEN operator",r,2)}};case"is_null":return{[n]:{[i.eq]:null}};case"not_null":return{[n]:{[i.ne]:null}};case"eq_lower":return this.mapLowerCondition(t,{[i.eq]:r});case"neq_lower":return this.mapLowerCondition(t,{[i.ne]:r});case"starts_lower":return this.mapLowerLike(t,n,`${r}%`);case"ends_lower":return this.mapLowerLike(t,n,`%${r}`);case"contains_lower":return this.mapLowerLike(t,n,`%${r}%`);case"not_contains_lower":return this.mapLowerLike(t,n,`%${r}%`,!0);case"in_lower":return this.mapLowerCondition(t,{[i.in]:u("IN operator",r,1)});case"not_in_lower":return this.mapLowerCondition(t,{[i.notIn]:u("NOT IN operator",r,1)})}throw new Error(`Unsupported operator "${e.operator}"`)}mapLowerLike(e,t,n,r=!1){return this.ilikeEnabled?{[t]:{[r?i.notILike:i.iLike]:n}}:this.mapLowerCondition(e,{[r?i.notLike:i.like]:n})}mapLowerCondition(e,t){return b.where(b.fn("lower",b.col(e.join("."))),t)}isILikeEnabled(){let e=this.options.ilike;return m(e)?e:this.model.options?.sequelize?.getDialect()==="postgres"}validateField(e,t){return this.isFieldValid(e)?!0:this.handleInvalidField(e,t)}handleInvalidField(e,t){let n={select:"ignore",order:"ignore",where:"deny",relations:"ignore"},r=this.options.invalidFields?.[t]||n[t];if(r==="allow-unsafe")return!0;if(r==="deny")throw new Error(`${t} field "${e.join(".")}" is invalid.`);return!1}findFieldModel(e){let t=this.model;for(let n of e){let r=t.associations[n];if(!r)return null;t=r.target}return t}isFieldValid(e){if(e.length===0)return!1;let t=[...e],n=t.pop(),r=this.findFieldModel(t);return r?!!r.getAttributes()[n]:!1}};export{E as SequelizeQueryAdapter};
2
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/adapters/sequelize/sequelize.query-adapter.ts","../../../src/utils/functions.ts","../../../src/utils/objects.ts","../../../src/utils/field-path.ts"],"sourcesContent":["import sequelize, { Attributes, FindOptions, Model, ModelStatic, Op, OrderItem, WhereOptions } from 'sequelize';\r\nimport { IncludeOptions, WhereAttributeHashValue } from 'sequelize/types/model';\r\nimport { GetManyResult } from '../../models/get-many-result';\r\nimport { QueryAdapter } from '../../models/query-adapter';\r\nimport { FieldPath } from '../../models/field-path';\r\nimport { CrudRequest, CrudRequestOrder, CrudRequestRelation, ParsedRequestSelect } from '../../models/crud-request';\r\nimport { CrudRequestWhere, CrudRequestWhereField, CrudRequestWhereOperator } from '../../models/crud-request-where';\r\nimport { ensureArray, ensurePrimitive, ensurePrimitiveOrNull, getOffset, isValid } from '../../utils/functions';\r\nimport { createGetManyResult } from '../../utils/objects';\r\nimport { pathGetFieldName, pathHasBase } from '../../utils/field-path';\r\n\r\nexport interface SequelizeQueryAdapterOptions {\r\n /**\r\n * Whether it will use ILIKE for case-insensitive operations.\r\n *\r\n * If undefined, it will be enabled by default for postgres databases\r\n */\r\n ilike?: boolean;\r\n\r\n /**\r\n * What it will do when it finds invalid fields.\r\n *\r\n * By default, `select` and `order` will ignore invalid fields, and `where` will deny invalid fields.\r\n */\r\n invalidFields?: {\r\n /**\r\n * What it will do when it finds invalid fields in `select`.\r\n *\r\n * If \"ignore\", it will remove invalid fields\r\n * If \"deny\", it will throw an exception for invalid fields\r\n * If \"allow-unsafe\", it will not validate any fields. Unsafe: this can allow SQL injection\r\n * If undefined, it will default to \"ignore\"\r\n */\r\n select?: 'ignore' | 'deny' | 'allow-unsafe';\r\n\r\n /**\r\n * What it will do when it finds invalid fields in `order`.\r\n *\r\n * If \"ignore\", it will remove invalid fields\r\n * If \"deny\", it will throw an exception for invalid fields\r\n * If \"allow-unsafe\", it will not validate any fields. Unsafe: this can allow SQL injection\r\n * If undefined, it will default to \"ignore\"\r\n */\r\n order?: 'ignore' | 'deny' | 'allow-unsafe';\r\n\r\n /**\r\n * What it will do when it finds invalid fields in `order`.\r\n *\r\n * If \"ignore\", it will remove invalid fields\r\n * If \"deny\", it will throw an exception for invalid fields\r\n * If \"allow-unsafe\", it will not validate any fields. Unsafe: this can allow SQL injection\r\n * If undefined, it will default to \"deny\"\r\n */\r\n where?: 'ignore' | 'deny' | 'allow-unsafe';\r\n\r\n /**\r\n * What it will do when it finds invalid associations in `relations`.\r\n *\r\n * If \"ignore\", it will remove invalid relations\r\n * If \"deny\", it will throw an exception for invalid relations\r\n * If undefined, it will default to \"ignore\"\r\n */\r\n relations?: 'ignore' | 'deny';\r\n }\r\n}\r\n\r\nexport class SequelizeQueryAdapter<T extends Model = Model> implements QueryAdapter<FindOptions, T> {\r\n /**\r\n * Whether it should use the ILIKE operator\r\n */\r\n protected ilikeEnabled: boolean;\r\n\r\n constructor(\r\n protected readonly model: ModelStatic<T>,\r\n protected readonly options: SequelizeQueryAdapterOptions = {},\r\n ) {\r\n this.ilikeEnabled = this.isILikeEnabled();\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public build<A>(baseQuery: FindOptions<A>, request: CrudRequest): FindOptions<A> {\r\n const query = this.createBaseQuery(baseQuery, request);\r\n\r\n const offset = getOffset(request.offset, request.limit, request.page);\r\n\r\n this.adaptOffsetAndLimit(query, offset, request.limit);\r\n\r\n return query;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public async getOne<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<E | null> {\r\n const query = this.createBaseQuery(baseQuery, request);\r\n\r\n return await this.model.findOne(query) as E | null;\r\n }\r\n\r\n /**\r\n * @inheritDoc\r\n */\r\n public async getMany<E extends T>(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): Promise<GetManyResult<E>> {\r\n const query = this.createBaseQuery(baseQuery, request);\r\n\r\n const offset = getOffset(request.offset, request.limit, request.page);\r\n\r\n this.adaptOffsetAndLimit(query, offset, request.limit);\r\n\r\n const { rows, count } = await this.model.findAndCountAll(query);\r\n\r\n return createGetManyResult<E>(rows as E[], count, offset, request.limit);\r\n }\r\n\r\n /**\r\n * Creates the base query, without offset and limit\r\n *\r\n * @param baseQuery The base query\r\n * @param request The request\r\n */\r\n protected createBaseQuery(baseQuery: FindOptions<Attributes<T>>, request: CrudRequest): FindOptions<Attributes<T>> {\r\n const query = { ...baseQuery };\r\n\r\n this.adaptSelect(query, request.select);\r\n this.adaptOrder(query, request.order);\r\n this.adaptRelations(query, request.relations, request.select);\r\n this.adaptWhere(query, request.where);\r\n\r\n return query;\r\n }\r\n\r\n /**\r\n * Adapts the request select to Sequelize attributes\r\n *\r\n * @param query The Sequelize query\r\n * @param select The request select fields\r\n */\r\n protected adaptSelect(query: FindOptions, select: ParsedRequestSelect): void {\r\n if (select.length === 0)\r\n return;\r\n\r\n query.attributes = select\r\n .filter(f => f.field.length === 1)\r\n .filter(f => this.validateField(f.field, 'select'))\r\n .map(f => f.field[0]);\r\n }\r\n\r\n /**\r\n * Adapts the request order to Sequelize\r\n *\r\n * @param query The Sequelize query\r\n * @param order The request order list\r\n */\r\n protected adaptOrder(query: FindOptions, order: CrudRequestOrder[]): void {\r\n const sequelizeOrder = order\r\n .filter(f => this.validateField(f.field, 'order'))\r\n .map(f => [...f.field, f.order] as OrderItem);\r\n\r\n if (sequelizeOrder.length === 0)\r\n return;\r\n\r\n query.order = sequelizeOrder;\r\n }\r\n\r\n /**\r\n * Adapts the request relations to Sequelize associations\r\n *\r\n * @param query The Sequelize query\r\n * @param relations The request relations list\r\n * @param select The request select fields\r\n */\r\n protected adaptRelations(query: FindOptions, relations: CrudRequestRelation[], select: ParsedRequestSelect): void {\r\n const include = this.mapRelation([], relations, select);\r\n\r\n if (include.length === 0)\r\n return;\r\n\r\n query.include = include;\r\n }\r\n\r\n /**\r\n * Maps a relation based on a base path to a Sequelize include\r\n *\r\n * @param base The base path\r\n * @param relations The request relation list\r\n * @param select The request select fields\r\n */\r\n protected mapRelation(\r\n base: FieldPath,\r\n relations: CrudRequestRelation[],\r\n select: ParsedRequestSelect,\r\n ): IncludeOptions[] {\r\n return relations\r\n .filter(relation => pathHasBase(relation.field, base))\r\n .map(relation => {\r\n const model = this.findFieldModel(relation.field);\r\n\r\n if (!model) {\r\n this.handleInvalidField(relation.field, 'relations');\r\n\r\n return null;\r\n }\r\n\r\n const attributes = select\r\n .filter(f => pathHasBase(f.field, relation.field))\r\n .filter(f => this.validateField(f.field, 'select'))\r\n .map(f => pathGetFieldName(f.field));\r\n\r\n const include = this.mapRelation(relation.field, relations, select);\r\n\r\n return {\r\n model,\r\n ...(include.length > 0) && { include },\r\n ...(select.length > 0) && { attributes },\r\n } as IncludeOptions;\r\n })\r\n .filter(relation => !!relation);\r\n }\r\n\r\n /**\r\n * Adapts the request offset and limit to Sequelize\r\n *\r\n * @param query The Sequelize query\r\n * @param offset The offset\r\n * @param limit The limit\r\n */\r\n protected adaptOffsetAndLimit(query: FindOptions, offset: number, limit: number | undefined): void {\r\n if (offset)\r\n query.offset = offset;\r\n\r\n if (limit)\r\n query.limit = limit;\r\n }\r\n\r\n /**\r\n * Adapts a where condition to Sequelize\r\n *\r\n * @param query The Sequelize query\r\n * @param where The request where condition\r\n */\r\n protected adaptWhere(query: FindOptions, where: CrudRequestWhere): void {\r\n query.where = this.mapWhere(where);\r\n }\r\n\r\n /**\r\n * Maps a request where condition to a Sequelize where\r\n *\r\n * @param where The request where condition\r\n */\r\n protected mapWhere(where: CrudRequestWhere): WhereOptions | undefined {\r\n if (where.and && where.and.length > 0) {\r\n return {\r\n [Op.and]: where.and\r\n .map(item => this.mapWhere(item))\r\n .filter(condition => !!condition),\r\n };\r\n }\r\n\r\n if (where.or && where.or.length > 0) {\r\n return {\r\n [Op.or]: where.or\r\n .map(item => this.mapWhere(item))\r\n .filter(condition => !!condition),\r\n };\r\n }\r\n\r\n if (where.field) {\r\n if (!this.validateField(where.field, 'where'))\r\n return undefined;\r\n\r\n return this.mapWhereOperator(where);\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n /**\r\n * Maps a request condition to its respective Sequelize condition\r\n *\r\n * @param where The request field condition\r\n */\r\n protected mapWhereOperator(where: CrudRequestWhereField): WhereAttributeHashValue<any> {\r\n const field = where.field;\r\n const column = field.length === 1 ? field[0] : `$${field.join('.')}$`;\r\n const value = where.value;\r\n\r\n switch (where.operator) {\r\n case CrudRequestWhereOperator.EQ:\r\n return { [column]: ensurePrimitiveOrNull('EQ operator', value) };\r\n\r\n case CrudRequestWhereOperator.NEQ:\r\n return { [column]: { [Op.ne]: ensurePrimitiveOrNull('NEQ operator', value) } };\r\n\r\n case CrudRequestWhereOperator.GT:\r\n return { [column]: { [Op.gt]: ensurePrimitive('GT operator', value) } };\r\n\r\n case CrudRequestWhereOperator.GTE:\r\n return { [column]: { [Op.gte]: ensurePrimitive('GTE operator', value) } };\r\n\r\n case CrudRequestWhereOperator.LT:\r\n return { [column]: { [Op.lt]: ensurePrimitive('LT operator', value) } };\r\n\r\n case CrudRequestWhereOperator.LTE:\r\n return { [column]: { [Op.lte]: ensurePrimitive('LTE operator', value) } };\r\n\r\n case CrudRequestWhereOperator.STARTS:\r\n return { [column]: { [Op.startsWith]: `${value}` } };\r\n\r\n case CrudRequestWhereOperator.ENDS:\r\n return { [column]: { [Op.endsWith]: `${value}` } };\r\n\r\n case CrudRequestWhereOperator.CONTAINS:\r\n return { [column]: { [Op.substring]: `${value}` } };\r\n\r\n case CrudRequestWhereOperator.NOT_CONTAINS:\r\n return { [column]: { [Op.notLike]: `%${value}%` } };\r\n\r\n case CrudRequestWhereOperator.IN:\r\n return { [column]: { [Op.in]: ensureArray('IN operator', value) } };\r\n\r\n case CrudRequestWhereOperator.NOT_IN:\r\n return { [column]: { [Op.notIn]: ensureArray('NOT IN operator', value) } };\r\n\r\n case CrudRequestWhereOperator.BETWEEN:\r\n return { [column]: { [Op.between]: ensureArray('BETWEEN operator', value, 2) } };\r\n\r\n case CrudRequestWhereOperator.IS_NULL:\r\n return { [column]: { [Op.eq]: null } };\r\n\r\n case CrudRequestWhereOperator.NOT_NULL:\r\n return { [column]: { [Op.ne]: null } };\r\n\r\n case CrudRequestWhereOperator.EQ_LOWER:\r\n return this.mapLowerCondition(field, { [Op.eq]: value });\r\n\r\n case CrudRequestWhereOperator.NEQ_LOWER:\r\n return this.mapLowerCondition(field, { [Op.ne]: value });\r\n\r\n case CrudRequestWhereOperator.STARTS_LOWER:\r\n return this.mapLowerLike(field, column, `${value}%`);\r\n\r\n case CrudRequestWhereOperator.ENDS_LOWER:\r\n return this.mapLowerLike(field, column, `%${value}`);\r\n\r\n case CrudRequestWhereOperator.CONTAINS_LOWER:\r\n return this.mapLowerLike(field, column, `%${value}%`);\r\n\r\n case CrudRequestWhereOperator.NOT_CONTAINS_LOWER:\r\n return this.mapLowerLike(field, column, `%${value}%`, true);\r\n\r\n case CrudRequestWhereOperator.IN_LOWER:\r\n return this.mapLowerCondition(field, { [Op.in]: ensureArray('IN operator', value, 1) });\r\n\r\n case CrudRequestWhereOperator.NOT_IN_LOWER:\r\n return this.mapLowerCondition(field, { [Op.notIn]: ensureArray('NOT IN operator', value, 1) });\r\n }\r\n\r\n throw new Error(`Unsupported operator \"${where.operator}\"`);\r\n }\r\n\r\n /**\r\n * Maps a LIKE condition to the lower implementation,\r\n * being ILIKE in Postgres or LOWER(column) LIKE in other databases.\r\n *\r\n * @param field The field path\r\n * @param column The column name\r\n * @param value The value\r\n * @param not Whether it's an inverted condition\r\n */\r\n protected mapLowerLike(\r\n field: FieldPath,\r\n column: string,\r\n value: string,\r\n not: boolean = false,\r\n ): WhereAttributeHashValue<any> {\r\n if (this.ilikeEnabled) {\r\n return { [column]: { [not ? Op.notILike : Op.iLike]: value } };\r\n }\r\n\r\n return this.mapLowerCondition(field, { [not ? Op.notLike : Op.like]: value });\r\n }\r\n\r\n /**\r\n * Maps a LOWER(column) condition\r\n *\r\n * @param field The field path\r\n * @param operator The attribute hash value\r\n */\r\n protected mapLowerCondition(field: FieldPath, operator: WhereAttributeHashValue<any>): WhereAttributeHashValue<any> {\r\n return sequelize.where(\r\n sequelize.fn('lower', sequelize.col(field.join('.'))),\r\n operator,\r\n );\r\n }\r\n\r\n /**\r\n * Checks whether ILIKE expressions are available for the current database\r\n */\r\n protected isILikeEnabled(): boolean {\r\n const ilikeEnabled = this.options.ilike;\r\n\r\n if (isValid(ilikeEnabled))\r\n return ilikeEnabled;\r\n\r\n return this.model.options?.sequelize?.getDialect() === 'postgres';\r\n }\r\n\r\n /**\r\n * Checks whether the field is valid\r\n *\r\n * @param path The field path\r\n * @param source The source where the field validation comes from\r\n */\r\n protected validateField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean {\r\n const isValid = this.isFieldValid(path);\r\n\r\n if (isValid)\r\n return true;\r\n\r\n return this.handleInvalidField(path, source);\r\n }\r\n\r\n /**\r\n * Handles an invalid field, returning `true` if it should allow unsafe, `false` if it should ignore,\r\n * or throwing an exception if it should deny.\r\n *\r\n * @param path The field path\r\n * @param source The source where the field validation comes from\r\n */\r\n protected handleInvalidField(path: FieldPath, source: 'select' | 'order' | 'where' | 'relations'): boolean {\r\n const defaults = {\r\n select: 'ignore',\r\n order: 'ignore',\r\n where: 'deny',\r\n relations: 'ignore',\r\n };\r\n\r\n const rule = this.options.invalidFields?.[source] || defaults[source];\r\n\r\n if (rule === 'allow-unsafe')\r\n return true;\r\n\r\n if (rule === 'deny')\r\n throw new Error(`${source} field \"${path.join('.')}\" is invalid.`);\r\n\r\n // rule === 'ignore'\r\n return false;\r\n }\r\n\r\n /**\r\n * Finds a model from a field base path\r\n *\r\n * @param base The base path\r\n */\r\n protected findFieldModel(base: FieldPath): ModelStatic<any> | null {\r\n let model: ModelStatic<any> = this.model;\r\n\r\n for (const part of base) {\r\n const relation = model.associations[part];\r\n\r\n if (!relation)\r\n return null;\r\n\r\n model = relation.target;\r\n }\r\n\r\n return model;\r\n }\r\n\r\n /**\r\n * Checks whether the field is valid\r\n *\r\n * @param path The field path\r\n */\r\n protected isFieldValid(path: FieldPath): boolean {\r\n if (path.length === 0)\r\n return false;\r\n\r\n const relationPath = [...path];\r\n const field = relationPath.pop()!;\r\n\r\n const model = this.findFieldModel(relationPath);\r\n\r\n if (!model)\r\n return false;\r\n\r\n const attributes = model.getAttributes();\r\n const column = attributes[field];\r\n\r\n return !!column;\r\n }\r\n\r\n}\r\n","export function ensurePrimitive(fieldName: string, data: any): number | string | boolean | Date {\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number or boolean`);\r\n}\r\n\r\nexport function ensurePrimitiveOrNull(fieldName: string, data: any): number | string | boolean | Date | undefined | null {\r\n if (data === null || data === undefined)\r\n return data;\r\n\r\n if (typeof data === 'number' || typeof data === 'string' || typeof data === 'boolean' || data instanceof Date)\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string, number, boolean or null`);\r\n}\r\n\r\nexport function ensureString(fieldName: string, data: any): string {\r\n if (typeof data === 'string')\r\n return data;\r\n\r\n throw new Error(`${fieldName} must be a string`);\r\n}\r\n\r\nexport function ensureArray<T>(fieldName: string, data: T[] | any, minLength: number = 0): T[] {\r\n if (!Array.isArray(data) || data.length < minLength)\r\n throw new Error(`${fieldName} must be an array with at least ${minLength} items`);\r\n\r\n return data;\r\n}\r\n\r\nexport function ensureEmpty(fieldName: string, data: any) {\r\n if (isValid(data) && data !== true)\r\n throw new Error(`${fieldName} must be true, null or undefined`);\r\n}\r\n\r\nexport function isValid<T>(value: T | undefined | null): value is T {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nexport function getOffset(offset: number | undefined, limit?: number, page?: number): number {\r\n return offset ?? (limit && page ? limit * (page - 1) : 0);\r\n}\r\n\r\nexport interface Type<T> extends Function { new (... args: any[]): T; }\r\n\r\nexport function createInstance<T extends object>(clazzOrInstance: T | Type<T> | undefined): T | undefined {\r\n if (typeof clazzOrInstance === 'function')\r\n return new clazzOrInstance();\r\n\r\n if (typeof clazzOrInstance === 'object')\r\n return clazzOrInstance as T;\r\n\r\n return undefined;\r\n}\r\n\r\nexport function escapeRegex(str: string): string {\r\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\r\n}\r\n","import { GetManyResult } from '../models/get-many-result';\r\nimport { CrudRequest } from '../models/crud-request';\r\n\r\n/**\r\n * Creates a CrudRequest object, filling required missing properties with empty values\r\n */\r\nexport function createCrudRequest(crudRequest?: Partial<CrudRequest>): CrudRequest {\r\n return {\r\n select: [],\r\n relations: [],\r\n order: [],\r\n where: { and: [] },\r\n ...crudRequest,\r\n };\r\n}\r\n\r\n/**\r\n * Creates a GetManyResult object\r\n *\r\n * @param data The entity list to be returned\r\n * @param total The total amount of entities in the database\r\n * @param offset The offset used for querying\r\n * @param limit The limit used for querying\r\n */\r\nexport function createGetManyResult<T>(data: T[], total: number, offset: number, limit?: number): GetManyResult<T> {\r\n const count = data.length;\r\n const actualLimit = limit ?? total;\r\n const page = actualLimit > 0 ? Math.floor(offset / actualLimit) + 1 : 1;\r\n const pageCount = actualLimit > 0 ? Math.ceil(total / actualLimit) : 0;\r\n\r\n return {\r\n data,\r\n count,\r\n total,\r\n page,\r\n pageCount,\r\n };\r\n}\r\n","import { isValid } from './functions';\r\n\r\n/**\r\n * Parses a path by splitting it by dots\r\n *\r\n * @param value The full path as a string or the parts already split\r\n */\r\nexport function pathParse(value: string | string[]): string[] {\r\n if (typeof value === 'string')\r\n return value.split('.');\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Checks whether two field paths are equal\r\n *\r\n * E.g. [\"path\", \"to\", \"field\"] is equal to [\"path\", \"to\", \"field\"] but not [\"something\", \"else\"]\r\n */\r\nexport function pathEquals(path1: string[], path2: string[]): boolean {\r\n if (path1.length !== path2.length)\r\n return false;\r\n\r\n return path1.every((p1, i) => path2[i] === p1);\r\n}\r\n\r\n/**\r\n * Checks whether a path starts with another path.\r\n *\r\n * E.g. [\"path\", \"to\", \"field\"] starts with [\"path\"] or [\"path\", \"to\"] but not [\"something\", \"else\"]\r\n */\r\nexport function pathStartsWith(path: string[], start: string[]): boolean {\r\n if (path.length < start.length)\r\n return false;\r\n\r\n return start.every((start, i) => path[i] === start);\r\n}\r\n\r\n/**\r\n * Checks whether the base of a path matches.\r\n *\r\n * E.g. [\"path\", \"to\", \"field\"] has a base of [\"path\", \"to\"] but not [\"path\"]\r\n */\r\nexport function pathHasBase(path: string[], base: string[]): boolean {\r\n if (path.length - 1 !== base.length)\r\n return false;\r\n\r\n return base.every((start, i) => path[i] === start);\r\n}\r\n\r\n/**\r\n * Breaks a path into the base part and the field name part\r\n *\r\n * @param path The full path\r\n */\r\nexport function pathGetBaseAndName(path: string[]): [string[], string] {\r\n if (path.length === 0)\r\n throw new Error('Cannot break an empty path');\r\n\r\n const base = [...path];\r\n const name = base.pop()!;\r\n\r\n return [base, name];\r\n}\r\n\r\n\r\n/**\r\n * Gets the last part of the path: the field name\r\n *\r\n * @param path The full path\r\n */\r\nexport function pathGetFieldName(path: string[]): string {\r\n return path.length > 0 ? path[path.length - 1] : '';\r\n}\r\n\r\n/**\r\n * Sets a value for the given path\r\n *\r\n * @param obj The root object\r\n * @param field The full field path\r\n */\r\nexport function pathGetValue(obj: object, field: string[]): any {\r\n let value: any = obj;\r\n\r\n for (let i = 0; i < field.length; i++) {\r\n const name = field[i];\r\n\r\n if (!isValid(value))\r\n return undefined;\r\n\r\n if (typeof value !== 'object')\r\n throw new Error(`Cannot get ${name} as it is not an object (got ${typeof value})`);\r\n\r\n value = value[name];\r\n }\r\n\r\n return value;\r\n}\r\n\r\n/**\r\n * Sets a value for the given path\r\n *\r\n * @param obj The root object\r\n * @param field The full field path\r\n * @param value The value to be set\r\n */\r\nexport function pathSetValue(obj: object, field: string[], value: any): void {\r\n let self: any = obj;\r\n\r\n for (let i = 0; i < field.length; i++) {\r\n const name = field[i];\r\n\r\n if (typeof self !== 'object')\r\n throw new Error(`Cannot set ${name} as it is not an object (got ${typeof self})`);\r\n\r\n const isLast = i === field.length - 1;\r\n\r\n if (isLast)\r\n self[name] = value;\r\n else if (!isValid(self[name]))\r\n self = self[name] = {};\r\n else\r\n self = self[name];\r\n }\r\n}\r\n"],"mappings":"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","names":["sequelize","Op","ensurePrimitive","fieldName","data","__name","ensurePrimitiveOrNull","ensureArray","fieldName","data","minLength","__name","isValid","value","__name","getOffset","offset","limit","page","createGetManyResult","data","total","offset","limit","count","actualLimit","page","pageCount","__name","pathHasBase","path","base","start","i","__name","pathGetFieldName","path","__name","SequelizeQueryAdapter","model","options","__name","baseQuery","request","query","offset","getOffset","rows","count","createGetManyResult","select","f","order","sequelizeOrder","relations","include","base","relation","pathHasBase","attributes","pathGetFieldName","limit","where","Op","item","condition","field","column","value","ensurePrimitiveOrNull","ensurePrimitive","ensureArray","not","operator","sequelize","ilikeEnabled","isValid","path","source","defaults","rule","part","relationPath"]}
@@ -1,7 +1,7 @@
1
1
  import { SelectQueryBuilder, ObjectLiteral, WhereExpressionBuilder } from 'typeorm';
2
2
  import { Alias } from 'typeorm/query-builder/Alias';
3
- import { Q as QueryAdapter, G as GetManyResult } from '../../query-adapter-CeTK3yxp.mjs';
4
- import { c as CrudRequest, P as ParsedRequestSelect, a as CrudRequestRelation, b as CrudRequestOrder, d as CrudRequestWhere, F as FieldPath, g as CrudRequestWhereField } from '../../crud-request-x16CuDRF.mjs';
3
+ import { Q as QueryAdapter, G as GetManyResult } from '../../query-adapter-HqVhBKtl.mjs';
4
+ import { C as CrudRequest, P as ParsedRequestSelect, b as CrudRequestRelation, c as CrudRequestOrder, d as CrudRequestWhere, F as FieldPath, g as CrudRequestWhereField } from '../../crud-request-9u0s-DnI.mjs';
5
5
 
6
6
  interface TypeOrmQueryAdapterOptions {
7
7
  /**
@@ -58,11 +58,11 @@ declare class TypeOrmQueryAdapter implements QueryAdapter<SelectQueryBuilder<any
58
58
  /**
59
59
  * @inheritDoc
60
60
  */
61
- getOne<E extends ObjectLiteral>(qb: SelectQueryBuilder<E | any>, request: CrudRequest): Promise<E | null>;
61
+ getOne<E extends ObjectLiteral>(qb: SelectQueryBuilder<E>, request: CrudRequest): Promise<E | null>;
62
62
  /**
63
63
  * @inheritDoc
64
64
  */
65
- getMany<E extends ObjectLiteral>(qb: SelectQueryBuilder<E | any>, request: CrudRequest): Promise<GetManyResult<E>>;
65
+ getMany<E extends ObjectLiteral>(qb: SelectQueryBuilder<E>, request: CrudRequest): Promise<GetManyResult<E>>;
66
66
  /**
67
67
  * Creates a query filtered from the parsed request
68
68
  *
@@ -1,7 +1,7 @@
1
1
  import { SelectQueryBuilder, ObjectLiteral, WhereExpressionBuilder } from 'typeorm';
2
2
  import { Alias } from 'typeorm/query-builder/Alias';
3
- import { Q as QueryAdapter, G as GetManyResult } from '../../query-adapter-CEcyFcWr.js';
4
- import { c as CrudRequest, P as ParsedRequestSelect, a as CrudRequestRelation, b as CrudRequestOrder, d as CrudRequestWhere, F as FieldPath, g as CrudRequestWhereField } from '../../crud-request-x16CuDRF.js';
3
+ import { Q as QueryAdapter, G as GetManyResult } from '../../query-adapter-CZ_oD6Ui.js';
4
+ import { C as CrudRequest, P as ParsedRequestSelect, b as CrudRequestRelation, c as CrudRequestOrder, d as CrudRequestWhere, F as FieldPath, g as CrudRequestWhereField } from '../../crud-request-9u0s-DnI.js';
5
5
 
6
6
  interface TypeOrmQueryAdapterOptions {
7
7
  /**
@@ -58,11 +58,11 @@ declare class TypeOrmQueryAdapter implements QueryAdapter<SelectQueryBuilder<any
58
58
  /**
59
59
  * @inheritDoc
60
60
  */
61
- getOne<E extends ObjectLiteral>(qb: SelectQueryBuilder<E | any>, request: CrudRequest): Promise<E | null>;
61
+ getOne<E extends ObjectLiteral>(qb: SelectQueryBuilder<E>, request: CrudRequest): Promise<E | null>;
62
62
  /**
63
63
  * @inheritDoc
64
64
  */
65
- getMany<E extends ObjectLiteral>(qb: SelectQueryBuilder<E | any>, request: CrudRequest): Promise<GetManyResult<E>>;
65
+ getMany<E extends ObjectLiteral>(qb: SelectQueryBuilder<E>, request: CrudRequest): Promise<GetManyResult<E>>;
66
66
  /**
67
67
  * Creates a query filtered from the parsed request
68
68
  *