remult 0.14.7 → 0.14.8

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/esm/assign.d.ts +1 -0
  3. package/esm/assign.js +5 -0
  4. package/esm/classType.d.ts +3 -0
  5. package/esm/classType.js +1 -0
  6. package/esm/graphql.d.ts +5 -0
  7. package/esm/graphql.js +102 -0
  8. package/esm/index.d.ts +36 -0
  9. package/esm/index.js +30 -0
  10. package/esm/inputTypes.d.ts +9 -0
  11. package/esm/inputTypes.js +9 -0
  12. package/esm/postgres/index.d.ts +2 -0
  13. package/esm/postgres/index.js +2 -0
  14. package/esm/postgres/postgres-data-provider.d.ts +28 -0
  15. package/esm/postgres/postgres-data-provider.js +97 -0
  16. package/esm/postgres/schema-builder.d.ts +15 -0
  17. package/esm/postgres/schema-builder.js +128 -0
  18. package/esm/remult-express.d.ts +5 -0
  19. package/esm/remult-express.js +16 -0
  20. package/esm/remult-knex/index.d.ts +51 -0
  21. package/esm/remult-knex/index.js +381 -0
  22. package/esm/remult-middleware.d.ts +2 -0
  23. package/esm/remult-middleware.js +63 -0
  24. package/esm/remult-mongo.d.ts +9 -0
  25. package/esm/remult-mongo.js +220 -0
  26. package/esm/server/JsonEntityFileStorage.d.ts +7 -0
  27. package/esm/server/JsonEntityFileStorage.js +20 -0
  28. package/esm/server/expressBridge.d.ts +140 -0
  29. package/esm/server/expressBridge.js +668 -0
  30. package/esm/server/index.d.ts +4 -0
  31. package/esm/server/index.js +4 -0
  32. package/esm/server/register-actions-on-server.d.ts +3 -0
  33. package/esm/server/register-actions-on-server.js +24 -0
  34. package/esm/server/register-entities-on-server.d.ts +3 -0
  35. package/esm/server/register-entities-on-server.js +15 -0
  36. package/esm/src/__EntityValueProvider.d.ts +10 -0
  37. package/esm/src/__EntityValueProvider.js +1 -0
  38. package/esm/src/__RowsOfDataForTesting.d.ts +3 -0
  39. package/esm/src/__RowsOfDataForTesting.js +1 -0
  40. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.d.ts +5 -0
  41. package/esm/src/backend-tests/backend-database-test-setup.backend-spec.js +113 -0
  42. package/esm/src/backend-tests/my-test.backend-spec.d.ts +1 -0
  43. package/esm/src/backend-tests/my-test.backend-spec.js +49 -0
  44. package/esm/src/column-interfaces.d.ts +95 -0
  45. package/esm/src/column-interfaces.js +7 -0
  46. package/esm/src/column.d.ts +49 -0
  47. package/esm/src/column.js +133 -0
  48. package/esm/src/context.d.ts +124 -0
  49. package/esm/src/context.js +285 -0
  50. package/esm/src/data-api.d.ts +33 -0
  51. package/esm/src/data-api.js +204 -0
  52. package/esm/src/data-interfaces.d.ts +37 -0
  53. package/esm/src/data-interfaces.js +12 -0
  54. package/esm/src/data-providers/array-entity-data-provider.d.ts +22 -0
  55. package/esm/src/data-providers/array-entity-data-provider.js +264 -0
  56. package/esm/src/data-providers/in-memory-database.d.ts +9 -0
  57. package/esm/src/data-providers/in-memory-database.js +16 -0
  58. package/esm/src/data-providers/json-data-provider.d.ts +12 -0
  59. package/esm/src/data-providers/json-data-provider.js +52 -0
  60. package/esm/src/data-providers/rest-data-provider.d.ts +35 -0
  61. package/esm/src/data-providers/rest-data-provider.js +188 -0
  62. package/esm/src/data-providers/sql-database.d.ts +16 -0
  63. package/esm/src/data-providers/sql-database.js +261 -0
  64. package/esm/src/data-providers/web-sql-data-provider.d.ts +18 -0
  65. package/esm/src/data-providers/web-sql-data-provider.js +121 -0
  66. package/esm/src/entity.d.ts +82 -0
  67. package/esm/src/entity.js +1 -0
  68. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +50 -0
  69. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +139 -0
  70. package/esm/src/filter/filter-consumer-bridge-to-url-builder.d.ts +1 -0
  71. package/esm/src/filter/filter-consumer-bridge-to-url-builder.js +1 -0
  72. package/esm/src/filter/filter-interfaces.d.ts +85 -0
  73. package/esm/src/filter/filter-interfaces.js +467 -0
  74. package/esm/src/id-entity.d.ts +4 -0
  75. package/esm/src/id-entity.js +8 -0
  76. package/esm/src/remult3/RepositoryImplementation.d.ts +326 -0
  77. package/esm/src/remult3/RepositoryImplementation.js +1806 -0
  78. package/esm/src/remult3/index.d.ts +2 -0
  79. package/esm/src/remult3/index.js +2 -0
  80. package/esm/src/remult3/remult3.d.ts +312 -0
  81. package/esm/src/remult3/remult3.js +1 -0
  82. package/esm/src/server-action.d.ts +70 -0
  83. package/esm/src/server-action.js +365 -0
  84. package/esm/src/shared-tests/db-tests-setup.d.ts +23 -0
  85. package/esm/src/shared-tests/db-tests-setup.js +66 -0
  86. package/esm/src/shared-tests/db-tests.db-tests.d.ts +26 -0
  87. package/esm/src/shared-tests/db-tests.db-tests.js +723 -0
  88. package/esm/src/shared-tests/deleteAll.d.ts +2 -0
  89. package/esm/src/shared-tests/deleteAll.js +4 -0
  90. package/esm/src/shared-tests/entityWithValidations.d.ts +14 -0
  91. package/esm/src/shared-tests/entityWithValidations.js +53 -0
  92. package/esm/src/shared-tests/index.d.ts +4 -0
  93. package/esm/src/shared-tests/index.js +4 -0
  94. package/esm/src/shared-tests/test-custom-id-column.spec.d.ts +1 -0
  95. package/esm/src/shared-tests/test-custom-id-column.spec.js +62 -0
  96. package/esm/src/shared-tests/test-special-value.spec.d.ts +10 -0
  97. package/esm/src/shared-tests/test-special-value.spec.js +88 -0
  98. package/esm/src/shared-tests/test-update-with-null.spec.d.ts +1 -0
  99. package/esm/src/shared-tests/test-update-with-null.spec.js +47 -0
  100. package/esm/src/sort.d.ts +15 -0
  101. package/esm/src/sort.js +82 -0
  102. package/esm/src/sql-command.d.ts +15 -0
  103. package/esm/src/sql-command.js +1 -0
  104. package/esm/src/tests/Done.d.ts +5 -0
  105. package/esm/src/tests/Done.js +11 -0
  106. package/esm/src/tests/TestDataApiResponse.d.ts +10 -0
  107. package/esm/src/tests/TestDataApiResponse.js +22 -0
  108. package/esm/src/tests/c.d.ts +8 -0
  109. package/esm/src/tests/c.js +22 -0
  110. package/esm/src/tests/createData.d.ts +7 -0
  111. package/esm/src/tests/createData.js +22 -0
  112. package/esm/src/tests/d.d.ts +6 -0
  113. package/esm/src/tests/d.js +19 -0
  114. package/esm/src/tests/dWithPrefilter.d.ts +7 -0
  115. package/esm/src/tests/dWithPrefilter.js +32 -0
  116. package/esm/src/tests/entityForCustomFilter.d.ts +16 -0
  117. package/esm/src/tests/entityForCustomFilter.js +44 -0
  118. package/esm/src/tests/entityWithValidationsOnColumn.d.ts +5 -0
  119. package/esm/src/tests/entityWithValidationsOnColumn.js +21 -0
  120. package/esm/src/tests/frontend-database-tests-setup.spec.d.ts +4 -0
  121. package/esm/src/tests/frontend-database-tests-setup.spec.js +38 -0
  122. package/esm/src/tests/h.d.ts +6 -0
  123. package/esm/src/tests/h.js +35 -0
  124. package/esm/src/tests/remult-3-entities.d.ts +23 -0
  125. package/esm/src/tests/remult-3-entities.js +72 -0
  126. package/esm/src/tests/tasks.d.ts +6 -0
  127. package/esm/src/tests/tasks.js +24 -0
  128. package/esm/src/tests/testHelper.spec.d.ts +34 -0
  129. package/esm/src/tests/testHelper.spec.js +217 -0
  130. package/esm/src/tests/testModel/models.d.ts +16 -0
  131. package/esm/src/tests/testModel/models.js +31 -0
  132. package/esm/src/validators.d.ts +14 -0
  133. package/esm/src/validators.js +33 -0
  134. package/esm/urlBuilder.d.ts +6 -0
  135. package/esm/urlBuilder.js +19 -0
  136. package/esm/valueConverters.d.ts +12 -0
  137. package/esm/valueConverters.js +169 -0
  138. package/index.d.ts +1 -0
  139. package/index.js +1 -0
  140. package/package.json +22 -1
  141. package/postgres/index.d.ts +1 -0
  142. package/postgres/index.js +1 -0
  143. package/postgres/postgres-data-provider.d.ts +1 -13
  144. package/postgres/postgres-data-provider.js +28 -262
  145. package/postgres/schema-builder.d.ts +15 -0
  146. package/postgres/schema-builder.js +270 -0
  147. package/readme.md +68 -30
  148. package/src/data-providers/web-sql-data-provider.js +4 -3
  149. package/src/entity.d.ts +9 -2
  150. package/src/remult3/RepositoryImplementation.js +11 -3
  151. package/src/shared-tests/test-update-with-null.spec.js +38 -0
  152. package/valueConverters.js +4 -0
@@ -0,0 +1,85 @@
1
+ import { FieldMetadata } from "../column-interfaces";
2
+ import { Remult } from "../context";
3
+ import { EntityMetadata, EntityFilter } from "../remult3";
4
+ export declare class Filter {
5
+ private apply?;
6
+ constructor(apply?: (add: FilterConsumer) => void);
7
+ __applyToConsumer(add: FilterConsumer): void;
8
+ static resolve<entityType>(filter: EntityFilter<entityType> | (() => EntityFilter<entityType> | Promise<EntityFilter<entityType>>)): Promise<EntityFilter<entityType>>;
9
+ static createCustom<entityType>(customFilterTranslator: (r: Remult) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): (() => EntityFilter<entityType>) & customFilterInfo<entityType>;
10
+ static createCustom<entityType, argsType>(customFilterTranslator: (r: Remult, args: argsType) => EntityFilter<entityType> | Promise<EntityFilter<entityType>>, key?: string): ((y: argsType) => EntityFilter<entityType>) & customFilterInfo<entityType>;
11
+ static fromEntityFilter<T>(entity: EntityMetadata<T>, whereItem: EntityFilter<T>): Filter;
12
+ toJson(): any;
13
+ static entityFilterToJson<T>(entityDefs: EntityMetadata<T>, where: EntityFilter<T>): any;
14
+ static entityFilterFromJson<T>(entityDefs: EntityMetadata<T>, packed: any): EntityFilter<T>;
15
+ static translateCustomWhere<T>(r: Filter, entity: EntityMetadata<T>, remult: Remult): Promise<Filter>;
16
+ }
17
+ export declare class filterHelper {
18
+ metadata: FieldMetadata;
19
+ constructor(metadata: FieldMetadata);
20
+ processVal(val: any): any;
21
+ contains(val: string): Filter;
22
+ isLessThan(val: any): Filter;
23
+ isGreaterOrEqualTo(val: any): Filter;
24
+ isNotIn(values: any[]): Filter;
25
+ isDifferentFrom(val: any): Filter;
26
+ isLessOrEqualTo(val: any): Filter;
27
+ isGreaterThan(val: any): Filter;
28
+ isEqualTo(val: any): Filter;
29
+ isIn(val: any[]): Filter;
30
+ }
31
+ export interface FilterConsumer {
32
+ or(orElements: Filter[]): any;
33
+ isEqualTo(col: FieldMetadata, val: any): void;
34
+ isDifferentFrom(col: FieldMetadata, val: any): void;
35
+ isNull(col: FieldMetadata): void;
36
+ isNotNull(col: FieldMetadata): void;
37
+ isGreaterOrEqualTo(col: FieldMetadata, val: any): void;
38
+ isGreaterThan(col: FieldMetadata, val: any): void;
39
+ isLessOrEqualTo(col: FieldMetadata, val: any): void;
40
+ isLessThan(col: FieldMetadata, val: any): void;
41
+ containsCaseInsensitive(col: FieldMetadata, val: any): void;
42
+ isIn(col: FieldMetadata, val: any[]): void;
43
+ custom(key: string, customItem: any): void;
44
+ databaseCustom(databaseCustom: any): void;
45
+ }
46
+ export declare class AndFilter extends Filter {
47
+ readonly filters: Filter[];
48
+ constructor(...filters: Filter[]);
49
+ add(filter: Filter): void;
50
+ }
51
+ export declare class OrFilter extends Filter {
52
+ readonly filters: Filter[];
53
+ constructor(...filters: Filter[]);
54
+ }
55
+ export declare const customUrlToken = "$custom$";
56
+ export declare const customDatabaseFilterToken = "$db$";
57
+ export declare class FilterSerializer implements FilterConsumer {
58
+ result: any;
59
+ constructor();
60
+ databaseCustom(databaseCustom: any): void;
61
+ custom(key: any, customItem: any): void;
62
+ hasUndefined: boolean;
63
+ add(key: string, val: any): void;
64
+ or(orElements: Filter[]): void;
65
+ isNull(col: FieldMetadata): void;
66
+ isNotNull(col: FieldMetadata): void;
67
+ isIn(col: FieldMetadata, val: any[]): void;
68
+ isEqualTo(col: FieldMetadata, val: any): void;
69
+ isDifferentFrom(col: FieldMetadata, val: any): void;
70
+ isGreaterOrEqualTo(col: FieldMetadata, val: any): void;
71
+ isGreaterThan(col: FieldMetadata, val: any): void;
72
+ isLessOrEqualTo(col: FieldMetadata, val: any): void;
73
+ isLessThan(col: FieldMetadata, val: any): void;
74
+ containsCaseInsensitive(col: FieldMetadata, val: any): void;
75
+ }
76
+ export declare function entityFilterToJson<T>(entityDefs: EntityMetadata<T>, where: EntityFilter<T>): any;
77
+ export declare function buildFilterFromRequestParameters(entity: EntityMetadata, filterInfo: {
78
+ get: (key: string) => any;
79
+ }): EntityFilter<any>;
80
+ export interface customFilterInfo<entityType> {
81
+ customFilterInfo: {
82
+ key: string;
83
+ customFilterTranslator: (r: Remult, args: any) => (EntityFilter<entityType> | Promise<EntityFilter<entityType>>);
84
+ };
85
+ }
@@ -0,0 +1,467 @@
1
+ import { getEntityRef, getEntitySettings } from "../remult3";
2
+ export class Filter {
3
+ constructor(apply) {
4
+ this.apply = apply;
5
+ if (!this.apply) {
6
+ this.apply = () => { };
7
+ }
8
+ }
9
+ __applyToConsumer(add) {
10
+ this.apply(add);
11
+ }
12
+ static async resolve(filter) {
13
+ if (typeof filter === "function")
14
+ return await filter();
15
+ return filter;
16
+ }
17
+ static createCustom(customFilterTranslator, key = '') {
18
+ let customFilterInfo = { key: key, customFilterTranslator };
19
+ return Object.assign((x) => {
20
+ let z = {};
21
+ if (x == undefined)
22
+ x = {};
23
+ if (!customFilterInfo.key)
24
+ throw "Usage of custom filter before a key was assigned to it";
25
+ return {
26
+ [customUrlToken + customFilterInfo.key]: x
27
+ };
28
+ }, { customFilterInfo });
29
+ }
30
+ static fromEntityFilter(entity, whereItem) {
31
+ let result = [];
32
+ for (const key in whereItem) {
33
+ if (Object.prototype.hasOwnProperty.call(whereItem, key)) {
34
+ let fieldToFilter = whereItem[key];
35
+ {
36
+ if (key == "$or") {
37
+ result.push(new OrFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
38
+ }
39
+ else if (key == "$and") {
40
+ result.push(new AndFilter(...fieldToFilter.map(x => Filter.fromEntityFilter(entity, x))));
41
+ }
42
+ else if (key.startsWith(customUrlToken)) {
43
+ result.push(new Filter(x => {
44
+ x.custom(key.substring(customUrlToken.length), fieldToFilter);
45
+ }));
46
+ }
47
+ else if (key == customDatabaseFilterToken) {
48
+ result.push(new Filter(x => x.databaseCustom(fieldToFilter)));
49
+ }
50
+ else {
51
+ let fh = new filterHelper(entity.fields[key]);
52
+ let found = false;
53
+ if (fieldToFilter !== undefined && fieldToFilter != null) {
54
+ if (fieldToFilter.$id)
55
+ fieldToFilter = fieldToFilter.$id;
56
+ for (const key in fieldToFilter) {
57
+ if (Object.prototype.hasOwnProperty.call(fieldToFilter, key)) {
58
+ const element = fieldToFilter[key];
59
+ switch (key) {
60
+ case "$gte":
61
+ case ">=":
62
+ result.push(fh.isGreaterOrEqualTo(element));
63
+ found = true;
64
+ break;
65
+ case "$gt":
66
+ case ">":
67
+ result.push(fh.isGreaterThan(element));
68
+ found = true;
69
+ break;
70
+ case "$lte":
71
+ case "<=":
72
+ result.push(fh.isLessOrEqualTo(element));
73
+ found = true;
74
+ break;
75
+ case "$lt":
76
+ case "<":
77
+ result.push(fh.isLessThan(element));
78
+ found = true;
79
+ break;
80
+ case "$ne":
81
+ case "!=":
82
+ found = true;
83
+ if (Array.isArray(element)) {
84
+ result.push(fh.isNotIn(element));
85
+ }
86
+ else
87
+ result.push(fh.isDifferentFrom(element));
88
+ break;
89
+ case "$contains":
90
+ found = true;
91
+ result.push(fh.contains(element));
92
+ break;
93
+ }
94
+ }
95
+ }
96
+ if (Array.isArray(fieldToFilter)) {
97
+ found = true;
98
+ result.push(fh.isIn(fieldToFilter));
99
+ }
100
+ }
101
+ if (!found && fieldToFilter !== undefined) {
102
+ result.push(fh.isEqualTo(fieldToFilter));
103
+ }
104
+ }
105
+ }
106
+ }
107
+ }
108
+ return new AndFilter(...result);
109
+ }
110
+ toJson() {
111
+ let r = new FilterSerializer();
112
+ this.__applyToConsumer(r);
113
+ return r.result;
114
+ }
115
+ static entityFilterToJson(entityDefs, where) {
116
+ return Filter.fromEntityFilter(entityDefs, where).toJson();
117
+ }
118
+ static entityFilterFromJson(entityDefs, packed) {
119
+ return buildFilterFromRequestParameters(entityDefs, { get: (key) => packed[key] });
120
+ }
121
+ static async translateCustomWhere(r, entity, remult) {
122
+ let f = new customTranslator(async (filterKey, custom) => {
123
+ let r = [];
124
+ for (const key in entity.entityType) {
125
+ const element = entity.entityType[key];
126
+ if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
127
+ if (element.customFilterInfo.key == filterKey) {
128
+ r.push(await Filter.fromEntityFilter(entity, await element.customFilterInfo.customFilterTranslator(remult, custom)));
129
+ }
130
+ }
131
+ }
132
+ return r;
133
+ });
134
+ r.__applyToConsumer(f);
135
+ await f.resolve();
136
+ r = new Filter(x => f.applyTo(x));
137
+ return r;
138
+ }
139
+ }
140
+ export class filterHelper {
141
+ constructor(metadata) {
142
+ this.metadata = metadata;
143
+ }
144
+ processVal(val) {
145
+ let ei = getEntitySettings(this.metadata.valueType, false);
146
+ if (ei) {
147
+ if (!val)
148
+ return null;
149
+ if (typeof val === "string" || typeof val === "number")
150
+ return val;
151
+ return getEntityRef(val).getId();
152
+ }
153
+ return val;
154
+ }
155
+ contains(val) {
156
+ return new Filter(add => add.containsCaseInsensitive(this.metadata, val));
157
+ }
158
+ isLessThan(val) {
159
+ val = this.processVal(val);
160
+ return new Filter(add => add.isLessThan(this.metadata, val));
161
+ }
162
+ isGreaterOrEqualTo(val) {
163
+ val = this.processVal(val);
164
+ return new Filter(add => add.isGreaterOrEqualTo(this.metadata, val));
165
+ }
166
+ isNotIn(values) {
167
+ return new Filter(add => {
168
+ for (const v of values) {
169
+ add.isDifferentFrom(this.metadata, this.processVal(v));
170
+ }
171
+ });
172
+ }
173
+ isDifferentFrom(val) {
174
+ val = this.processVal(val);
175
+ if ((val === null || val === undefined) && this.metadata.allowNull)
176
+ return new Filter(add => add.isNotNull(this.metadata));
177
+ return new Filter(add => add.isDifferentFrom(this.metadata, val));
178
+ }
179
+ isLessOrEqualTo(val) {
180
+ val = this.processVal(val);
181
+ return new Filter(add => add.isLessOrEqualTo(this.metadata, val));
182
+ }
183
+ isGreaterThan(val) {
184
+ val = this.processVal(val);
185
+ return new Filter(add => add.isGreaterThan(this.metadata, val));
186
+ }
187
+ isEqualTo(val) {
188
+ val = this.processVal(val);
189
+ if ((val === null || val === undefined) && this.metadata.allowNull)
190
+ return new Filter(add => add.isNull(this.metadata));
191
+ return new Filter(add => add.isEqualTo(this.metadata, val));
192
+ }
193
+ isIn(val) {
194
+ val = val.map(x => this.processVal(x));
195
+ return new Filter(add => add.isIn(this.metadata, val));
196
+ }
197
+ }
198
+ export class AndFilter extends Filter {
199
+ constructor(...filters) {
200
+ super(add => {
201
+ for (const iterator of this.filters) {
202
+ if (iterator)
203
+ iterator.__applyToConsumer(add);
204
+ }
205
+ });
206
+ this.filters = filters;
207
+ }
208
+ add(filter) {
209
+ this.filters.push(filter);
210
+ }
211
+ }
212
+ export class OrFilter extends Filter {
213
+ constructor(...filters) {
214
+ super(add => {
215
+ let f = this.filters.filter(x => x !== undefined);
216
+ if (f.length > 1) {
217
+ add.or(f);
218
+ }
219
+ else if (f.length == 1)
220
+ f[0].__applyToConsumer(add);
221
+ });
222
+ this.filters = filters;
223
+ }
224
+ }
225
+ export const customUrlToken = "$custom$";
226
+ export const customDatabaseFilterToken = "$db$";
227
+ export class FilterSerializer {
228
+ constructor() {
229
+ this.result = {};
230
+ this.hasUndefined = false;
231
+ }
232
+ databaseCustom(databaseCustom) {
233
+ throw new Error("database custom is not allowed with api calls.");
234
+ }
235
+ custom(key, customItem) {
236
+ this.add(customUrlToken + key, customItem);
237
+ }
238
+ add(key, val) {
239
+ if (val === undefined)
240
+ this.hasUndefined = true;
241
+ let r = this.result;
242
+ if (!r[key]) {
243
+ r[key] = val;
244
+ return;
245
+ }
246
+ let v = r[key];
247
+ if (v instanceof Array) {
248
+ v.push(val);
249
+ }
250
+ else
251
+ v = [v, val];
252
+ r[key] = v;
253
+ }
254
+ or(orElements) {
255
+ this.add("OR", orElements.map(x => {
256
+ let f = new FilterSerializer();
257
+ x.__applyToConsumer(f);
258
+ return f.result;
259
+ }));
260
+ }
261
+ isNull(col) {
262
+ this.add(col.key + "_null", true);
263
+ }
264
+ isNotNull(col) {
265
+ this.add(col.key + "_null", false);
266
+ }
267
+ isIn(col, val) {
268
+ this.add(col.key + "_in", val.map(x => col.valueConverter.toJson(x)));
269
+ }
270
+ isEqualTo(col, val) {
271
+ this.add(col.key, col.valueConverter.toJson(val));
272
+ }
273
+ isDifferentFrom(col, val) {
274
+ this.add(col.key + '_ne', col.valueConverter.toJson(val));
275
+ }
276
+ isGreaterOrEqualTo(col, val) {
277
+ this.add(col.key + '_gte', col.valueConverter.toJson(val));
278
+ }
279
+ isGreaterThan(col, val) {
280
+ this.add(col.key + '_gt', col.valueConverter.toJson(val));
281
+ }
282
+ isLessOrEqualTo(col, val) {
283
+ this.add(col.key + '_lte', col.valueConverter.toJson(val));
284
+ }
285
+ isLessThan(col, val) {
286
+ this.add(col.key + '_lt', col.valueConverter.toJson(val));
287
+ }
288
+ containsCaseInsensitive(col, val) {
289
+ this.add(col.key + "_contains", val);
290
+ }
291
+ }
292
+ export function entityFilterToJson(entityDefs, where) {
293
+ if (!where)
294
+ return {};
295
+ return (Filter.fromEntityFilter(entityDefs, where)).toJson();
296
+ }
297
+ export function buildFilterFromRequestParameters(entity, filterInfo) {
298
+ let where = [];
299
+ [...entity.fields].forEach(col => {
300
+ function addFilter(operation, theFilter, jsonArray = false, asString = false) {
301
+ let val = filterInfo.get(col.key + operation);
302
+ if (val !== undefined) {
303
+ let addFilter = (val) => {
304
+ let theVal = val;
305
+ if (jsonArray) {
306
+ let arr;
307
+ if (typeof val === 'string')
308
+ arr = JSON.parse(val);
309
+ else
310
+ arr = val;
311
+ theVal = arr.map(x => asString ? x : col.valueConverter.fromJson(x));
312
+ }
313
+ else {
314
+ theVal = asString ? theVal : col.valueConverter.fromJson(theVal);
315
+ }
316
+ let f = theFilter(theVal);
317
+ if (f !== undefined) {
318
+ where.push({ [col.key]: f });
319
+ }
320
+ };
321
+ if (!jsonArray && val instanceof Array) {
322
+ val.forEach(v => {
323
+ addFilter(v);
324
+ });
325
+ }
326
+ else {
327
+ if (jsonArray) {
328
+ if (typeof val === 'string')
329
+ val = JSON.parse(val);
330
+ }
331
+ const array = separateArrayFromInnerArray(val);
332
+ for (const x of array) {
333
+ addFilter(x);
334
+ }
335
+ }
336
+ }
337
+ }
338
+ let c = new filterHelper(col);
339
+ addFilter('', val => val);
340
+ addFilter('_gt', val => ({ "$gt": val }));
341
+ addFilter('_gte', val => ({ "$gte": val }));
342
+ addFilter('_lt', val => ({ "$lt": val }));
343
+ addFilter('_lte', val => ({ "$lte": val }));
344
+ addFilter('_ne', val => ({ "$ne": val }));
345
+ addFilter('_in', val => val, true);
346
+ var nullFilter = filterInfo.get(col.key + "_null");
347
+ if (nullFilter) {
348
+ nullFilter = nullFilter.toString().trim().toLowerCase();
349
+ switch (nullFilter) {
350
+ case "y":
351
+ case "true":
352
+ case "yes":
353
+ where.push({ [col.key]: null });
354
+ break;
355
+ default:
356
+ where.push({ [col.key]: { "$ne": null } });
357
+ break;
358
+ }
359
+ }
360
+ addFilter('_contains', val => ({ $contains: val }), false, true);
361
+ });
362
+ let val = filterInfo.get('OR');
363
+ if (val) {
364
+ const array = separateArrayFromInnerArray(val);
365
+ where.push({
366
+ $and: array.map(v => ({
367
+ $or: v.map(x => buildFilterFromRequestParameters(entity, { get: (key) => x[key] }))
368
+ }))
369
+ });
370
+ }
371
+ for (const key in entity.entityType) {
372
+ const element = entity.entityType[key];
373
+ if (element && element.customFilterInfo && element.customFilterInfo.customFilterTranslator) {
374
+ let custom = filterInfo.get(customUrlToken + key);
375
+ if (custom !== undefined) {
376
+ where.push({ [customUrlToken + key]: custom });
377
+ }
378
+ }
379
+ }
380
+ return { $and: where };
381
+ function separateArrayFromInnerArray(val) {
382
+ if (!Array.isArray(val))
383
+ return [val];
384
+ const nonArray = [], array = [];
385
+ for (const v of val) {
386
+ if (Array.isArray(v)) {
387
+ array.push(v);
388
+ }
389
+ else
390
+ nonArray.push(v);
391
+ }
392
+ array.push(nonArray);
393
+ return array;
394
+ }
395
+ }
396
+ class customTranslator {
397
+ constructor(translateCustom) {
398
+ this.translateCustom = translateCustom;
399
+ this.commands = [];
400
+ this.promises = [];
401
+ }
402
+ applyTo(x) {
403
+ this.commands.forEach(y => y(x));
404
+ }
405
+ or(orElements) {
406
+ let newOrElements;
407
+ this.promises.push(Promise.all(orElements.map(async (element) => {
408
+ let c = new customTranslator(this.translateCustom);
409
+ element.__applyToConsumer(c);
410
+ await c.resolve();
411
+ return new Filter(x => c.applyTo(x));
412
+ })).then(x => {
413
+ newOrElements = x;
414
+ }));
415
+ this.commands.push(x => x.or(newOrElements));
416
+ }
417
+ isEqualTo(col, val) {
418
+ this.commands.push(x => x.isEqualTo(col, val));
419
+ }
420
+ isDifferentFrom(col, val) {
421
+ this.commands.push(x => x.isDifferentFrom(col, val));
422
+ }
423
+ isNull(col) {
424
+ this.commands.push(x => x.isNull(col));
425
+ }
426
+ isNotNull(col) {
427
+ this.commands.push(x => x.isNotNull(col));
428
+ }
429
+ isGreaterOrEqualTo(col, val) {
430
+ this.commands.push(x => x.isGreaterOrEqualTo(col, val));
431
+ }
432
+ isGreaterThan(col, val) {
433
+ this.commands.push(x => x.isGreaterThan(col, val));
434
+ }
435
+ isLessOrEqualTo(col, val) {
436
+ this.commands.push(x => x.isLessOrEqualTo(col, val));
437
+ }
438
+ isLessThan(col, val) {
439
+ this.commands.push(x => x.isLessThan(col, val));
440
+ }
441
+ containsCaseInsensitive(col, val) {
442
+ this.commands.push(x => x.containsCaseInsensitive(col, val));
443
+ }
444
+ isIn(col, val) {
445
+ this.commands.push(x => x.isIn(col, val));
446
+ }
447
+ custom(key, customItem) {
448
+ this.promises.push((async () => {
449
+ let r = await this.translateCustom(key, customItem);
450
+ if (r)
451
+ if (Array.isArray(r))
452
+ r.forEach(x => x.__applyToConsumer(this));
453
+ else
454
+ r.__applyToConsumer(this);
455
+ })());
456
+ }
457
+ databaseCustom(custom) {
458
+ this.commands.push(x => x.databaseCustom(custom));
459
+ }
460
+ async resolve() {
461
+ while (this.promises.length > 0) {
462
+ let p = this.promises;
463
+ this.promises = [];
464
+ await Promise.all(p);
465
+ }
466
+ }
467
+ }
@@ -0,0 +1,4 @@
1
+ import { EntityBase } from './remult3';
2
+ export declare class IdEntity extends EntityBase {
3
+ id: string;
4
+ }
@@ -0,0 +1,8 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { EntityBase, Fields } from './remult3';
3
+ export class IdEntity extends EntityBase {
4
+ }
5
+ __decorate([
6
+ Fields.uuid(),
7
+ __metadata("design:type", String)
8
+ ], IdEntity.prototype, "id", void 0);