remult 0.14.7 → 0.14.10

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,264 @@
1
+ import { customDatabaseFilterToken, Filter } from '../filter/filter-interfaces';
2
+ import { CompoundIdField } from '../column';
3
+ export class ArrayEntityDataProvider {
4
+ constructor(entity, rows) {
5
+ this.entity = entity;
6
+ this.rows = rows;
7
+ if (!rows)
8
+ rows = [];
9
+ else {
10
+ for (const r of rows) {
11
+ this.verifyThatRowHasAllNotNullColumns(r);
12
+ }
13
+ }
14
+ }
15
+ static customFilter(filter) {
16
+ return {
17
+ [customDatabaseFilterToken]: {
18
+ arrayFilter: filter
19
+ }
20
+ };
21
+ }
22
+ verifyThatRowHasAllNotNullColumns(r) {
23
+ for (const f of this.entity.fields) {
24
+ if (!f.isServerExpression)
25
+ if (!f.allowNull) {
26
+ if (r[f.key] === undefined || r[f.key] === null) {
27
+ let val = undefined;
28
+ if (f.valueType === Boolean)
29
+ val = false;
30
+ else if (f.valueType === Number)
31
+ val = 0;
32
+ else if (f.valueType === String)
33
+ val = '';
34
+ r[f.key] = val;
35
+ }
36
+ }
37
+ else if (r[f.key] === undefined)
38
+ r[f.key] = null;
39
+ }
40
+ }
41
+ async count(where) {
42
+ let rows = this.rows;
43
+ let j = 0;
44
+ for (let i = 0; i < rows.length; i++) {
45
+ if (!where) {
46
+ j++;
47
+ }
48
+ else {
49
+ let x = new FilterConsumerBridgeToObject(rows[i]);
50
+ where.__applyToConsumer(x);
51
+ if (x.ok)
52
+ j++;
53
+ }
54
+ }
55
+ return j;
56
+ }
57
+ async find(options) {
58
+ let rows = this.rows;
59
+ if (options) {
60
+ if (options.where) {
61
+ rows = rows.filter(i => {
62
+ let x = new FilterConsumerBridgeToObject(i);
63
+ options.where.__applyToConsumer(x);
64
+ return x.ok;
65
+ });
66
+ }
67
+ if (options.orderBy) {
68
+ rows = rows.sort((a, b) => {
69
+ let r = 0;
70
+ for (let i = 0; i < options.orderBy.Segments.length; i++) {
71
+ let seg = options.orderBy.Segments[i];
72
+ let left = a[seg.field.key];
73
+ let right = b[seg.field.key];
74
+ if (left > right)
75
+ r = 1;
76
+ else if (left < right)
77
+ r = -1;
78
+ if (r != 0) {
79
+ if (seg.isDescending)
80
+ r *= -1;
81
+ return r;
82
+ }
83
+ }
84
+ return r;
85
+ });
86
+ }
87
+ rows = pageArray(rows, options);
88
+ }
89
+ if (rows)
90
+ return rows.map(i => {
91
+ return this.translateFromJson(i);
92
+ });
93
+ }
94
+ translateFromJson(row) {
95
+ let result = {};
96
+ for (const col of this.entity.fields) {
97
+ result[col.key] = col.valueConverter.fromJson(row[col.key]);
98
+ }
99
+ return result;
100
+ }
101
+ translateToJson(row) {
102
+ let result = {};
103
+ for (const col of this.entity.fields) {
104
+ result[col.key] = col.valueConverter.toJson(row[col.key]);
105
+ }
106
+ return result;
107
+ }
108
+ idMatches(id) {
109
+ return item => {
110
+ let x = new FilterConsumerBridgeToObject(item);
111
+ Filter.fromEntityFilter(this.entity, this.entity.idMetadata.getIdFilter(id)).__applyToConsumer(x);
112
+ return x.ok;
113
+ };
114
+ }
115
+ update(id, data) {
116
+ let idMatches = this.idMatches(id);
117
+ let keys = Object.keys(data);
118
+ for (let i = 0; i < this.rows.length; i++) {
119
+ let r = this.rows[i];
120
+ if (idMatches(r)) {
121
+ let newR = { ...r };
122
+ for (const f of this.entity.fields) {
123
+ if (!f.dbReadOnly && !f.isServerExpression) {
124
+ if (keys.includes(f.key)) {
125
+ newR[f.key] = f.valueConverter.toJson(data[f.key]);
126
+ }
127
+ }
128
+ }
129
+ this.verifyThatRowHasAllNotNullColumns(newR);
130
+ this.rows[i] = newR;
131
+ return Promise.resolve(this.translateFromJson(this.rows[i]));
132
+ }
133
+ }
134
+ throw new Error("couldn't find id to update: " + id);
135
+ }
136
+ delete(id) {
137
+ let idMatches = this.idMatches(id);
138
+ for (let i = 0; i < this.rows.length; i++) {
139
+ if (idMatches(this.rows[i])) {
140
+ this.rows.splice(i, 1);
141
+ return Promise.resolve();
142
+ }
143
+ }
144
+ throw new Error("couldn't find id to delete: " + id);
145
+ }
146
+ async insert(data) {
147
+ let idf = this.entity.idMetadata.field;
148
+ if (!(idf instanceof CompoundIdField)) {
149
+ if (idf.options.valueConverter?.fieldTypeInDb === 'autoincrement') {
150
+ data[idf.key] = 1;
151
+ for (const row of this.rows) {
152
+ if (row[idf.key] >= data[idf.key])
153
+ data[idf.key] = row[idf.key] + 1;
154
+ }
155
+ }
156
+ if (data[idf.key])
157
+ this.rows.forEach(i => {
158
+ if (data[idf.key] == i[idf.key])
159
+ throw Error("id already exists");
160
+ });
161
+ }
162
+ let j = this.translateToJson(data);
163
+ this.verifyThatRowHasAllNotNullColumns(j);
164
+ this.rows.push(j);
165
+ return Promise.resolve(this.translateFromJson(j));
166
+ }
167
+ }
168
+ function pageArray(rows, options) {
169
+ if (!options)
170
+ return rows;
171
+ if (!options.limit)
172
+ return rows;
173
+ let page = 1;
174
+ if (options.page)
175
+ page = options.page;
176
+ if (page < 1)
177
+ page = 1;
178
+ let x = 0;
179
+ return rows.filter(i => {
180
+ x++;
181
+ let max = page * options.limit;
182
+ let min = max - options.limit;
183
+ return x > min && x <= max;
184
+ });
185
+ }
186
+ class FilterConsumerBridgeToObject {
187
+ constructor(row) {
188
+ this.row = row;
189
+ this.ok = true;
190
+ }
191
+ databaseCustom(databaseCustom) {
192
+ if (databaseCustom && databaseCustom.arrayFilter) {
193
+ if (!databaseCustom.arrayFilter(this.row))
194
+ this.ok = false;
195
+ }
196
+ }
197
+ custom(key, customItem) {
198
+ throw new Error('Custom Filter should be translated before it gets here');
199
+ }
200
+ or(orElements) {
201
+ for (const element of orElements) {
202
+ let filter = new FilterConsumerBridgeToObject(this.row);
203
+ element.__applyToConsumer(filter);
204
+ if (filter.ok) {
205
+ return;
206
+ }
207
+ }
208
+ this.ok = false;
209
+ }
210
+ isNull(col) {
211
+ if (this.row[col.key] != null)
212
+ this.ok = false;
213
+ }
214
+ isNotNull(col) {
215
+ if (this.row[col.key] == null)
216
+ this.ok = false;
217
+ }
218
+ isIn(col, val) {
219
+ for (const v of val) {
220
+ if (this.row[col.key] == col.valueConverter.toJson(v)) {
221
+ return;
222
+ }
223
+ }
224
+ this.ok = false;
225
+ }
226
+ isEqualTo(col, val) {
227
+ if (this.row[col.key] != col.valueConverter.toJson(val))
228
+ this.ok = false;
229
+ }
230
+ isDifferentFrom(col, val) {
231
+ if (this.row[col.key] == col.valueConverter.toJson(val))
232
+ this.ok = false;
233
+ }
234
+ isGreaterOrEqualTo(col, val) {
235
+ if (this.row[col.key] < col.valueConverter.toJson(val))
236
+ this.ok = false;
237
+ }
238
+ isGreaterThan(col, val) {
239
+ if (this.row[col.key] <= col.valueConverter.toJson(val))
240
+ this.ok = false;
241
+ }
242
+ isLessOrEqualTo(col, val) {
243
+ if (this.row[col.key] > col.valueConverter.toJson(val))
244
+ this.ok = false;
245
+ }
246
+ isLessThan(col, val) {
247
+ if (this.row[col.key] >= col.valueConverter.toJson(val))
248
+ this.ok = false;
249
+ }
250
+ containsCaseInsensitive(col, val) {
251
+ let v = this.row[col.key];
252
+ if (!v) {
253
+ this.ok = false;
254
+ return;
255
+ }
256
+ let s = '' + v;
257
+ if (val)
258
+ val = col.valueConverter.toJson(val);
259
+ if (val)
260
+ val = val.toString().toLowerCase();
261
+ if (s.toLowerCase().indexOf(val) < 0)
262
+ this.ok = false;
263
+ }
264
+ }
@@ -0,0 +1,9 @@
1
+ import { DataProvider, EntityDataProvider } from '../data-interfaces';
2
+ import { __RowsOfDataForTesting } from "../__RowsOfDataForTesting";
3
+ import { EntityMetadata } from '../remult3';
4
+ export declare class InMemoryDataProvider implements DataProvider, __RowsOfDataForTesting {
5
+ transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
6
+ rows: any;
7
+ getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
8
+ toString(): string;
9
+ }
@@ -0,0 +1,16 @@
1
+ import { ArrayEntityDataProvider } from './array-entity-data-provider';
2
+ export class InMemoryDataProvider {
3
+ constructor() {
4
+ this.rows = {};
5
+ }
6
+ async transaction(action) {
7
+ await action(this);
8
+ }
9
+ getEntityDataProvider(entity) {
10
+ let name = entity.key;
11
+ if (!this.rows[name])
12
+ this.rows[name] = [];
13
+ return new ArrayEntityDataProvider(entity, this.rows[name]);
14
+ }
15
+ toString() { return "InMemoryDataProvider"; }
16
+ }
@@ -0,0 +1,12 @@
1
+ import { EntityDataProvider, DataProvider } from '../data-interfaces';
2
+ import { EntityMetadata } from '../remult3';
3
+ export interface JsonEntityStorage {
4
+ getItem(entityDbName: string): string | null;
5
+ setItem(entityDbName: string, json: string): any;
6
+ }
7
+ export declare class JsonDataProvider implements DataProvider {
8
+ private storage;
9
+ constructor(storage: JsonEntityStorage);
10
+ getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
11
+ transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
12
+ }
@@ -0,0 +1,52 @@
1
+ import { ArrayEntityDataProvider } from './array-entity-data-provider';
2
+ export class JsonDataProvider {
3
+ constructor(storage) {
4
+ this.storage = storage;
5
+ }
6
+ getEntityDataProvider(entity) {
7
+ return new JsonEntityDataProvider(entity, this.storage);
8
+ }
9
+ async transaction(action) {
10
+ await action(this);
11
+ }
12
+ }
13
+ class JsonEntityDataProvider {
14
+ constructor(entity, helper) {
15
+ this.entity = entity;
16
+ this.helper = helper;
17
+ this.p = Promise.resolve();
18
+ }
19
+ async loadEntityData(what) {
20
+ let data = [];
21
+ let dbName = await this.entity.getDbName();
22
+ let s = this.helper.getItem(dbName);
23
+ if (s)
24
+ data = JSON.parse(s);
25
+ let dp = new ArrayEntityDataProvider(this.entity, data);
26
+ return what(dp, () => this.helper.setItem(dbName, JSON.stringify(data, undefined, 2)));
27
+ }
28
+ find(options) {
29
+ return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.find(options)));
30
+ }
31
+ count(where) {
32
+ return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.count(where)));
33
+ }
34
+ update(id, data) {
35
+ return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.update(id, data).then(x => {
36
+ save();
37
+ return x;
38
+ })));
39
+ }
40
+ delete(id) {
41
+ return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.delete(id).then(x => {
42
+ save();
43
+ return x;
44
+ })));
45
+ }
46
+ async insert(data) {
47
+ return this.p = this.p.then(() => this.loadEntityData((dp, save) => dp.insert(data).then(x => {
48
+ save();
49
+ return x;
50
+ })));
51
+ }
52
+ }
@@ -0,0 +1,35 @@
1
+ import { EntityDataProvider, DataProvider, EntityDataProviderFindOptions, RestDataProviderHttpProvider } from '../data-interfaces';
2
+ import { UrlBuilder } from '../../urlBuilder';
3
+ import { Filter } from '../filter/filter-interfaces';
4
+ import { EntityMetadata } from '../remult3';
5
+ export declare class RestDataProvider implements DataProvider {
6
+ private url;
7
+ private http;
8
+ constructor(url: string, http: RestDataProviderHttpProvider);
9
+ getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
10
+ transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
11
+ supportsCustomFilter: boolean;
12
+ }
13
+ export declare class RestEntityDataProvider implements EntityDataProvider {
14
+ private url;
15
+ private http;
16
+ private entity;
17
+ constructor(url: string, http: RestDataProviderHttpProvider, entity: EntityMetadata);
18
+ translateFromJson(row: any): {};
19
+ translateToJson(row: any): {};
20
+ count(where: Filter): Promise<number>;
21
+ find(options: EntityDataProviderFindOptions): Promise<Array<any>>;
22
+ update(id: any, data: any): Promise<any>;
23
+ delete(id: any): Promise<void>;
24
+ insert(data: any): Promise<any>;
25
+ }
26
+ export declare class RestDataProviderHttpProviderUsingFetch implements RestDataProviderHttpProvider {
27
+ private fetch?;
28
+ constructor(fetch?: (input: RequestInfo, init?: RequestInit) => Promise<Response>);
29
+ get(url: string): Promise<any>;
30
+ put(url: string, data: any): Promise<any>;
31
+ delete(url: string): Promise<any>;
32
+ post(url: string, data: any): Promise<any>;
33
+ myFetch(url: string, init?: RequestInit): Promise<any>;
34
+ }
35
+ export declare function addFilterToUrlAndReturnTrueIfSuccessful(filter: any, url: UrlBuilder): boolean;
@@ -0,0 +1,188 @@
1
+ import { UrlBuilder } from '../../urlBuilder';
2
+ import { customUrlToken } from '../filter/filter-interfaces';
3
+ import { retry } from '../context';
4
+ export class RestDataProvider {
5
+ constructor(url, http) {
6
+ this.url = url;
7
+ this.http = http;
8
+ this.supportsCustomFilter = true;
9
+ }
10
+ getEntityDataProvider(entity) {
11
+ return new RestEntityDataProvider(this.url + '/' + entity.key, this.http, entity);
12
+ }
13
+ async transaction(action) {
14
+ throw new Error("Method not implemented.");
15
+ }
16
+ }
17
+ export class RestEntityDataProvider {
18
+ constructor(url, http, entity) {
19
+ this.url = url;
20
+ this.http = http;
21
+ this.entity = entity;
22
+ }
23
+ translateFromJson(row) {
24
+ let result = {};
25
+ for (const col of this.entity.fields) {
26
+ result[col.key] = col.valueConverter.fromJson(row[col.key]);
27
+ }
28
+ return result;
29
+ }
30
+ translateToJson(row) {
31
+ let result = {};
32
+ for (const col of this.entity.fields) {
33
+ result[col.key] = col.valueConverter.toJson(row[col.key]);
34
+ }
35
+ return result;
36
+ }
37
+ async count(where) {
38
+ let url = new UrlBuilder(this.url);
39
+ url.add("__action", "count");
40
+ let filterObject;
41
+ if (where) {
42
+ filterObject = where.toJson();
43
+ if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url))
44
+ filterObject = undefined;
45
+ }
46
+ if (filterObject)
47
+ return this.http.post(url.url, filterObject).then(r => +(r.count));
48
+ else
49
+ return this.http.get(url.url).then(r => +(r.count));
50
+ }
51
+ find(options) {
52
+ let url = new UrlBuilder(this.url);
53
+ let filterObject;
54
+ if (options) {
55
+ if (options.where) {
56
+ filterObject = options.where.toJson(); // options.where.__applyToConsumer(new FilterConsumnerBridgeToUrlBuilder(url));
57
+ if (addFilterToUrlAndReturnTrueIfSuccessful(filterObject, url))
58
+ filterObject = undefined;
59
+ }
60
+ if (options.orderBy && options.orderBy.Segments) {
61
+ let sort = '';
62
+ let order = '';
63
+ options.orderBy.Segments.forEach(c => {
64
+ if (sort.length > 0) {
65
+ sort += ",";
66
+ order += ",";
67
+ }
68
+ sort += c.field.key;
69
+ order += c.isDescending ? "desc" : "asc";
70
+ });
71
+ url.add('_sort', sort);
72
+ url.add('_order', order);
73
+ }
74
+ if (options.limit)
75
+ url.add('_limit', options.limit);
76
+ if (options.page)
77
+ url.add('_page', options.page);
78
+ }
79
+ if (filterObject) {
80
+ url.add("__action", "get");
81
+ return this.http.post(url.url, filterObject).then(x => x.map(y => this.translateFromJson(y)));
82
+ }
83
+ else
84
+ return this.http.get(url.url).then(x => x.map(y => this.translateFromJson(y)));
85
+ ;
86
+ }
87
+ update(id, data) {
88
+ let result = {};
89
+ let keys = Object.keys(data);
90
+ for (const col of this.entity.fields) {
91
+ if (keys.includes(col.key))
92
+ result[col.key] = col.valueConverter.toJson(data[col.key]);
93
+ }
94
+ return this.http.put(this.url + '/' + encodeURIComponent(id), result).then(y => this.translateFromJson(y));
95
+ }
96
+ delete(id) {
97
+ return this.http.delete(this.url + '/' + encodeURIComponent(id));
98
+ }
99
+ insert(data) {
100
+ return this.http.post(this.url, this.translateToJson(data)).then(y => this.translateFromJson(y));
101
+ }
102
+ }
103
+ export class RestDataProviderHttpProviderUsingFetch {
104
+ constructor(fetch) {
105
+ this.fetch = fetch;
106
+ }
107
+ async get(url) {
108
+ return await retry(async () => this.myFetch(url).then(r => {
109
+ return r;
110
+ }));
111
+ }
112
+ put(url, data) {
113
+ return this.myFetch(url, {
114
+ method: 'put',
115
+ body: JSON.stringify(data)
116
+ });
117
+ }
118
+ delete(url) {
119
+ return this.myFetch(url, { method: 'delete', credentials: 'include' });
120
+ }
121
+ async post(url, data) {
122
+ return await retry(() => this.myFetch(url, {
123
+ method: 'post',
124
+ body: JSON.stringify(data)
125
+ }));
126
+ }
127
+ myFetch(url, init) {
128
+ if (!init)
129
+ init = {};
130
+ if (!init.headers)
131
+ init.headers = new Headers();
132
+ var h = init.headers;
133
+ h.append('Content-type', "application/json");
134
+ init.credentials = 'include';
135
+ return (this.fetch || fetch)(url, init).then(response => {
136
+ return onSuccess(response);
137
+ }).catch(async (error) => {
138
+ let r = await error;
139
+ throw r;
140
+ });
141
+ }
142
+ }
143
+ function onSuccess(response) {
144
+ if (response.status == 204)
145
+ return;
146
+ if (response.status >= 200 && response.status < 300)
147
+ return response.json();
148
+ else {
149
+ throw response.json().then(x => {
150
+ return { ...x, message: x.message || response.statusText, url: response.url, status: response.status };
151
+ }).catch(() => {
152
+ throw {
153
+ message: response.statusText,
154
+ url: response.url,
155
+ status: response.status
156
+ };
157
+ });
158
+ }
159
+ }
160
+ export function addFilterToUrlAndReturnTrueIfSuccessful(filter, url) {
161
+ for (const key in filter) {
162
+ if (Object.prototype.hasOwnProperty.call(filter, key)) {
163
+ const element = filter[key];
164
+ if (Array.isArray(element)) {
165
+ if (element.length > 0 && typeof element[0] === 'object')
166
+ return false;
167
+ if (element.length > 10)
168
+ return false;
169
+ }
170
+ }
171
+ }
172
+ for (const key in filter) {
173
+ if (Object.prototype.hasOwnProperty.call(filter, key)) {
174
+ const element = filter[key];
175
+ if (Array.isArray(element)) {
176
+ if (key.endsWith("_in"))
177
+ url.add(key, JSON.stringify(element));
178
+ else
179
+ element.forEach(e => url.add(key, e));
180
+ }
181
+ else if (key.startsWith(customUrlToken))
182
+ url.add(key, JSON.stringify(element));
183
+ else
184
+ url.add(key, element);
185
+ }
186
+ }
187
+ return true;
188
+ }
@@ -0,0 +1,16 @@
1
+ import { EntityDataProvider, DataProvider } from "../data-interfaces";
2
+ import { SqlCommand, SqlImplementation, SqlResult } from "../sql-command";
3
+ import { CustomSqlFilterBuilderFunction } from "../filter/filter-consumer-bridge-to-sql-request";
4
+ import { EntityMetadata, EntityFilter } from "../remult3";
5
+ export declare class SqlDatabase implements DataProvider {
6
+ private sql;
7
+ createCommand(): SqlCommand;
8
+ execute(sql: string): Promise<SqlResult>;
9
+ getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
10
+ transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
11
+ static customFilter(build: CustomSqlFilterBuilderFunction): EntityFilter<any>;
12
+ static LogToConsole: boolean;
13
+ static durationThreshold: number;
14
+ constructor(sql: SqlImplementation);
15
+ private createdEntities;
16
+ }