remult 2.7.34 → 3.0.0-next.2

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 (57) hide show
  1. package/README.md +2 -2
  2. package/esm/remult-express.js +3 -1
  3. package/esm/remult-fastify.js +3 -1
  4. package/esm/remult-hapi.js +3 -1
  5. package/esm/remult-hono.js +3 -1
  6. package/esm/remult-next.js +2 -1
  7. package/esm/remult-nuxt.js +2 -1
  8. package/esm/remult-solid-start.js +2 -1
  9. package/esm/remult-sveltekit.js +2 -1
  10. package/esm/server/get-remult-admin-html.js +1 -1
  11. package/esm/src/buildRestDataProvider.js +2 -26
  12. package/esm/src/context.js +4 -2
  13. package/esm/src/data-providers/rest-data-provider-using-fetch.js +78 -0
  14. package/esm/src/data-providers/rest-data-provider.js +1 -78
  15. package/esm/src/data-providers/retry.js +25 -0
  16. package/esm/src/filter/entityDbName.js +18 -0
  17. package/esm/src/filter/fieldDbName.js +40 -0
  18. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +2 -58
  19. package/esm/src/remult3/RepositoryImplementation.js +2 -1
  20. package/esm/src/validators.js +1 -1
  21. package/package.json +1 -1
  22. package/remult-express.d.ts +4 -3
  23. package/remult-express.js +5 -2
  24. package/remult-fastify.d.ts +2 -1
  25. package/remult-fastify.js +5 -2
  26. package/remult-hapi.d.ts +2 -1
  27. package/remult-hapi.js +5 -2
  28. package/remult-hono.d.ts +2 -1
  29. package/remult-hono.js +5 -2
  30. package/remult-next.d.ts +2 -1
  31. package/remult-next.js +4 -2
  32. package/remult-nuxt.d.ts +2 -1
  33. package/remult-nuxt.js +4 -2
  34. package/remult-solid-start.d.ts +2 -1
  35. package/remult-solid-start.js +4 -2
  36. package/remult-sveltekit.d.ts +2 -1
  37. package/remult-sveltekit.js +4 -2
  38. package/server/get-remult-admin-html.js +1 -1
  39. package/server/remult-api-server.d.ts +1 -1
  40. package/src/buildRestDataProvider.d.ts +0 -1
  41. package/src/buildRestDataProvider.js +6 -46
  42. package/src/context.js +5 -2
  43. package/src/data-providers/rest-data-provider-using-fetch.d.ts +13 -0
  44. package/src/data-providers/rest-data-provider-using-fetch.js +119 -0
  45. package/src/data-providers/rest-data-provider.d.ts +0 -12
  46. package/src/data-providers/rest-data-provider.js +1 -115
  47. package/src/data-providers/retry.d.ts +1 -0
  48. package/src/data-providers/retry.js +44 -0
  49. package/src/entity.d.ts +13 -0
  50. package/src/filter/entityDbName.d.ts +2 -0
  51. package/src/filter/entityDbName.js +32 -0
  52. package/src/filter/fieldDbName.d.ts +3 -0
  53. package/src/filter/fieldDbName.js +58 -0
  54. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +0 -2
  55. package/src/filter/filter-consumer-bridge-to-sql-request.js +4 -86
  56. package/src/remult3/RepositoryImplementation.js +4 -3
  57. package/src/validators.js +2 -2
@@ -74,7 +74,7 @@ export interface RemultServerOptions<RequestType> {
74
74
  *
75
75
  * @returns A promise that resolves when the error handling is complete.
76
76
  * @example
77
- * export const api = remultExpress({
77
+ * export const api = remultApi({
78
78
  * error: async (e) => {
79
79
  * if (e.httpStatusCode == 400) {
80
80
  * e.sendError(500, { message: "An error occurred" })
@@ -9,7 +9,6 @@ export declare class HttpProviderBridgeToRestDataProviderHttpProvider implements
9
9
  put(url: string, data: any): Promise<any>;
10
10
  get(url: string): Promise<any>;
11
11
  }
12
- export declare function retry<T>(what: () => Promise<T>): Promise<T>;
13
12
  export declare function toPromise<T>(p: Promise<T> | {
14
13
  toPromise(): Promise<T>;
15
14
  }): Promise<any>;
@@ -3,15 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HttpProviderBridgeToRestDataProviderHttpProvider = void 0;
4
4
  exports.buildRestDataProvider = buildRestDataProvider;
5
5
  exports.isExternalHttpProvider = isExternalHttpProvider;
6
- exports.retry = retry;
7
6
  exports.toPromise = toPromise;
8
7
  exports.processHttpException = processHttpException;
9
8
  var tslib_1 = require("tslib");
10
- var rest_data_provider_js_1 = require("./data-providers/rest-data-provider.js");
11
- var remult3_js_1 = require("./remult3/remult3.js");
9
+ var rest_data_provider_using_fetch_js_1 = require("./data-providers/rest-data-provider-using-fetch.js");
10
+ var retry_js_1 = require("./data-providers/retry.js");
12
11
  function buildRestDataProvider(provider) {
13
12
  if (!provider)
14
- return new rest_data_provider_js_1.RestDataProviderHttpProviderUsingFetch();
13
+ return new rest_data_provider_using_fetch_js_1.RestDataProviderHttpProviderUsingFetch();
15
14
  var httpDataProvider;
16
15
  if (!httpDataProvider) {
17
16
  if (isExternalHttpProvider(provider)) {
@@ -20,7 +19,7 @@ function buildRestDataProvider(provider) {
20
19
  }
21
20
  if (!httpDataProvider) {
22
21
  if (typeof provider === 'function') {
23
- httpDataProvider = new rest_data_provider_js_1.RestDataProviderHttpProviderUsingFetch(provider);
22
+ httpDataProvider = new rest_data_provider_using_fetch_js_1.RestDataProviderHttpProviderUsingFetch(provider);
24
23
  }
25
24
  }
26
25
  return httpDataProvider;
@@ -40,7 +39,7 @@ var HttpProviderBridgeToRestDataProviderHttpProvider = /** @class */ (function (
40
39
  var _this = this;
41
40
  return tslib_1.__generator(this, function (_a) {
42
41
  switch (_a.label) {
43
- case 0: return [4 /*yield*/, retry(function () { return toPromise(_this.http.post(url, data)); })];
42
+ case 0: return [4 /*yield*/, (0, retry_js_1.retry)(function () { return toPromise(_this.http.post(url, data)); })];
44
43
  case 1: return [2 /*return*/, _a.sent()];
45
44
  }
46
45
  });
@@ -57,7 +56,7 @@ var HttpProviderBridgeToRestDataProviderHttpProvider = /** @class */ (function (
57
56
  var _this = this;
58
57
  return tslib_1.__generator(this, function (_a) {
59
58
  switch (_a.label) {
60
- case 0: return [4 /*yield*/, retry(function () { return toPromise(_this.http.get(url)); })];
59
+ case 0: return [4 /*yield*/, (0, retry_js_1.retry)(function () { return toPromise(_this.http.get(url)); })];
61
60
  case 1: return [2 /*return*/, _a.sent()];
62
61
  }
63
62
  });
@@ -66,45 +65,6 @@ var HttpProviderBridgeToRestDataProviderHttpProvider = /** @class */ (function (
66
65
  return HttpProviderBridgeToRestDataProviderHttpProvider;
67
66
  }());
68
67
  exports.HttpProviderBridgeToRestDataProviderHttpProvider = HttpProviderBridgeToRestDataProviderHttpProvider;
69
- function retry(what) {
70
- return tslib_1.__awaiter(this, void 0, void 0, function () {
71
- var i, err_1;
72
- var _a, _b, _c, _d;
73
- return tslib_1.__generator(this, function (_e) {
74
- switch (_e.label) {
75
- case 0:
76
- i = 0;
77
- _e.label = 1;
78
- case 1:
79
- if (!true) return [3 /*break*/, 8];
80
- _e.label = 2;
81
- case 2:
82
- _e.trys.push([2, 4, , 7]);
83
- return [4 /*yield*/, what()];
84
- case 3: return [2 /*return*/, _e.sent()];
85
- case 4:
86
- err_1 = _e.sent();
87
- if (!((((_a = err_1.message) === null || _a === void 0 ? void 0 : _a.startsWith('Error occurred while trying to proxy')) ||
88
- ((_b = err_1.message) === null || _b === void 0 ? void 0 : _b.startsWith('Error occured while trying to proxy')) ||
89
- ((_c = err_1.message) === null || _c === void 0 ? void 0 : _c.includes('http proxy error')) ||
90
- ((_d = err_1.message) === null || _d === void 0 ? void 0 : _d.startsWith('Gateway Timeout')) ||
91
- err_1.status == 500) &&
92
- i++ < remult3_js_1.flags.error500RetryCount)) return [3 /*break*/, 6];
93
- return [4 /*yield*/, new Promise(function (res, req) {
94
- setTimeout(function () {
95
- res({});
96
- }, 500);
97
- })];
98
- case 5:
99
- _e.sent();
100
- return [3 /*break*/, 1];
101
- case 6: throw err_1;
102
- case 7: return [3 /*break*/, 1];
103
- case 8: return [2 /*return*/];
104
- }
105
- });
106
- });
107
- }
108
68
  function toPromise(p) {
109
69
  var _this = this;
110
70
  var r;
package/src/context.js CHANGED
@@ -82,14 +82,17 @@ var Remult = /** @class */ (function () {
82
82
  * @param dataProvider - an optional alternative data provider to use. Useful for writing to offline storage or an alternative data provider
83
83
  */
84
84
  this.repo = function (entity, dataProvider) {
85
+ var _a, _b, _c;
86
+ var info = (0, RepositoryImplementation_js_1.createOldEntity)(entity, _this);
85
87
  if (dataProvider === undefined)
86
- dataProvider = _this.dataProvider;
88
+ dataProvider =
89
+ (_c = (_b = (_a = info === null || info === void 0 ? void 0 : info.options) === null || _a === void 0 ? void 0 : _a.dataProvider) === null || _b === void 0 ? void 0 : _b.call(_a, _this.dataProvider)) !== null && _c !== void 0 ? _c : _this.dataProvider;
87
90
  var dpCache = _this.repCache.get(dataProvider);
88
91
  if (!dpCache)
89
92
  _this.repCache.set(dataProvider, (dpCache = new Map()));
90
93
  var r = dpCache.get(entity);
91
94
  if (!r) {
92
- dpCache.set(entity, (r = new RepositoryImplementation_js_1.RepositoryImplementation(entity, _this, dataProvider, (0, RepositoryImplementation_js_1.createOldEntity)(entity, _this))));
95
+ dpCache.set(entity, (r = new RepositoryImplementation_js_1.RepositoryImplementation(entity, _this, dataProvider, info)));
93
96
  (0, relationInfoMember_js_1.verifyFieldRelationInfo)(r, _this, dataProvider);
94
97
  }
95
98
  return r;
@@ -0,0 +1,13 @@
1
+ import type { RestDataProviderHttpProvider } from '../data-interfaces.js';
2
+ export declare class RestDataProviderHttpProviderUsingFetch implements RestDataProviderHttpProvider {
3
+ private fetch?;
4
+ constructor(fetch?: ((input: RequestInfo, init?: RequestInit) => Promise<Response>) | undefined);
5
+ get(url: string): Promise<any>;
6
+ put(url: string, data: any): Promise<any>;
7
+ delete(url: string): Promise<any>;
8
+ post(url: string, data: any): Promise<any>;
9
+ myFetch(url: string, options?: {
10
+ method?: string;
11
+ body?: string;
12
+ }): Promise<any>;
13
+ }
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RestDataProviderHttpProviderUsingFetch = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var retry_js_1 = require("./retry.js");
6
+ var RestDataProviderHttpProviderUsingFetch = /** @class */ (function () {
7
+ function RestDataProviderHttpProviderUsingFetch(fetch) {
8
+ this.fetch = fetch;
9
+ }
10
+ RestDataProviderHttpProviderUsingFetch.prototype.get = function (url) {
11
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
12
+ var _this = this;
13
+ return tslib_1.__generator(this, function (_a) {
14
+ switch (_a.label) {
15
+ case 0: return [4 /*yield*/, (0, retry_js_1.retry)(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
16
+ return tslib_1.__generator(this, function (_a) {
17
+ return [2 /*return*/, this.myFetch(url).then(function (r) {
18
+ return r;
19
+ })];
20
+ });
21
+ }); })];
22
+ case 1: return [2 /*return*/, _a.sent()];
23
+ }
24
+ });
25
+ });
26
+ };
27
+ RestDataProviderHttpProviderUsingFetch.prototype.put = function (url, data) {
28
+ return this.myFetch(url, {
29
+ method: 'put',
30
+ body: JSON.stringify(data),
31
+ });
32
+ };
33
+ RestDataProviderHttpProviderUsingFetch.prototype.delete = function (url) {
34
+ return this.myFetch(url, { method: 'delete' });
35
+ };
36
+ RestDataProviderHttpProviderUsingFetch.prototype.post = function (url, data) {
37
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
38
+ var _this = this;
39
+ return tslib_1.__generator(this, function (_a) {
40
+ switch (_a.label) {
41
+ case 0: return [4 /*yield*/, (0, retry_js_1.retry)(function () {
42
+ return _this.myFetch(url, {
43
+ method: 'post',
44
+ body: JSON.stringify(data),
45
+ });
46
+ })];
47
+ case 1: return [2 /*return*/, _a.sent()];
48
+ }
49
+ });
50
+ });
51
+ };
52
+ RestDataProviderHttpProviderUsingFetch.prototype.myFetch = function (url, options) {
53
+ var e_1, _a;
54
+ var _this = this;
55
+ var headers = {};
56
+ if (options === null || options === void 0 ? void 0 : options.body)
57
+ headers['Content-type'] = 'application/json';
58
+ if (typeof window !== 'undefined' &&
59
+ typeof window.document !== 'undefined' &&
60
+ typeof (window.document.cookie !== 'undefined'))
61
+ try {
62
+ for (var _b = tslib_1.__values(window.document.cookie.split(';')), _c = _b.next(); !_c.done; _c = _b.next()) {
63
+ var cookie = _c.value;
64
+ if (cookie.trim().startsWith('XSRF-TOKEN=')) {
65
+ headers['X-XSRF-TOKEN'] = cookie.split('=')[1];
66
+ }
67
+ }
68
+ }
69
+ catch (e_1_1) { e_1 = { error: e_1_1 }; }
70
+ finally {
71
+ try {
72
+ if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
73
+ }
74
+ finally { if (e_1) throw e_1.error; }
75
+ }
76
+ return (this.fetch || fetch)(url, {
77
+ credentials: 'include',
78
+ method: options === null || options === void 0 ? void 0 : options.method,
79
+ body: options === null || options === void 0 ? void 0 : options.body,
80
+ headers: headers,
81
+ })
82
+ .then(function (response) {
83
+ return onSuccess(response);
84
+ })
85
+ .catch(function (error) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
86
+ var r;
87
+ return tslib_1.__generator(this, function (_a) {
88
+ switch (_a.label) {
89
+ case 0: return [4 /*yield*/, error];
90
+ case 1:
91
+ r = _a.sent();
92
+ throw r;
93
+ }
94
+ });
95
+ }); });
96
+ };
97
+ return RestDataProviderHttpProviderUsingFetch;
98
+ }());
99
+ exports.RestDataProviderHttpProviderUsingFetch = RestDataProviderHttpProviderUsingFetch;
100
+ function onSuccess(response) {
101
+ if (response.status == 204)
102
+ return;
103
+ if (response.status >= 200 && response.status < 300)
104
+ return response.json();
105
+ else {
106
+ throw response
107
+ .json()
108
+ .then(function (x) {
109
+ return tslib_1.__assign(tslib_1.__assign({}, x), { message: x.message || response.statusText, url: response.url, status: response.status });
110
+ })
111
+ .catch(function () {
112
+ throw {
113
+ message: response.statusText,
114
+ url: response.url,
115
+ status: response.status,
116
+ };
117
+ });
118
+ }
119
+ }
@@ -39,17 +39,5 @@ export declare class RestEntityDataProvider implements EntityDataProvider, Proxy
39
39
  insert(data: any): Promise<any>;
40
40
  insertMany(data: any[]): Promise<any[]>;
41
41
  }
42
- export declare class RestDataProviderHttpProviderUsingFetch implements RestDataProviderHttpProvider {
43
- private fetch?;
44
- constructor(fetch?: ((input: RequestInfo, init?: RequestInit) => Promise<Response>) | undefined);
45
- get(url: string): Promise<any>;
46
- put(url: string, data: any): Promise<any>;
47
- delete(url: string): Promise<any>;
48
- post(url: string, data: any): Promise<any>;
49
- myFetch(url: string, options?: {
50
- method?: string;
51
- body?: string;
52
- }): Promise<any>;
53
- }
54
42
  export declare function addFilterToUrlAndReturnTrueIfSuccessful(filter: any, url: UrlBuilder): boolean;
55
43
  export declare const liveQueryAction = "liveQuery-";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.liveQueryAction = exports.RestDataProviderHttpProviderUsingFetch = exports.RestEntityDataProvider = exports.RestDataProvider = void 0;
3
+ exports.liveQueryAction = exports.RestEntityDataProvider = exports.RestDataProvider = void 0;
4
4
  exports.buildFullUrl = buildFullUrl;
5
5
  exports.findOptionsToJson = findOptionsToJson;
6
6
  exports.findOptionsFromJson = findOptionsFromJson;
@@ -411,120 +411,6 @@ var RestEntityDataProvider = /** @class */ (function () {
411
411
  return RestEntityDataProvider;
412
412
  }());
413
413
  exports.RestEntityDataProvider = RestEntityDataProvider;
414
- var RestDataProviderHttpProviderUsingFetch = /** @class */ (function () {
415
- function RestDataProviderHttpProviderUsingFetch(fetch) {
416
- this.fetch = fetch;
417
- }
418
- RestDataProviderHttpProviderUsingFetch.prototype.get = function (url) {
419
- return tslib_1.__awaiter(this, void 0, void 0, function () {
420
- var _this = this;
421
- return tslib_1.__generator(this, function (_a) {
422
- switch (_a.label) {
423
- case 0: return [4 /*yield*/, (0, buildRestDataProvider_js_1.retry)(function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
424
- return tslib_1.__generator(this, function (_a) {
425
- return [2 /*return*/, this.myFetch(url).then(function (r) {
426
- return r;
427
- })];
428
- });
429
- }); })];
430
- case 1: return [2 /*return*/, _a.sent()];
431
- }
432
- });
433
- });
434
- };
435
- RestDataProviderHttpProviderUsingFetch.prototype.put = function (url, data) {
436
- return this.myFetch(url, {
437
- method: 'put',
438
- body: JSON.stringify(data),
439
- });
440
- };
441
- RestDataProviderHttpProviderUsingFetch.prototype.delete = function (url) {
442
- return this.myFetch(url, { method: 'delete' });
443
- };
444
- RestDataProviderHttpProviderUsingFetch.prototype.post = function (url, data) {
445
- return tslib_1.__awaiter(this, void 0, void 0, function () {
446
- var _this = this;
447
- return tslib_1.__generator(this, function (_a) {
448
- switch (_a.label) {
449
- case 0: return [4 /*yield*/, (0, buildRestDataProvider_js_1.retry)(function () {
450
- return _this.myFetch(url, {
451
- method: 'post',
452
- body: JSON.stringify(data),
453
- });
454
- })];
455
- case 1: return [2 /*return*/, _a.sent()];
456
- }
457
- });
458
- });
459
- };
460
- RestDataProviderHttpProviderUsingFetch.prototype.myFetch = function (url, options) {
461
- var e_6, _a;
462
- var _this = this;
463
- var headers = {};
464
- if (options === null || options === void 0 ? void 0 : options.body)
465
- headers['Content-type'] = 'application/json';
466
- if (typeof window !== 'undefined' &&
467
- typeof window.document !== 'undefined' &&
468
- typeof (window.document.cookie !== 'undefined'))
469
- try {
470
- for (var _b = tslib_1.__values(window.document.cookie.split(';')), _c = _b.next(); !_c.done; _c = _b.next()) {
471
- var cookie = _c.value;
472
- if (cookie.trim().startsWith('XSRF-TOKEN=')) {
473
- headers['X-XSRF-TOKEN'] = cookie.split('=')[1];
474
- }
475
- }
476
- }
477
- catch (e_6_1) { e_6 = { error: e_6_1 }; }
478
- finally {
479
- try {
480
- if (_c && !_c.done && (_a = _b.return)) _a.call(_b);
481
- }
482
- finally { if (e_6) throw e_6.error; }
483
- }
484
- return (this.fetch || fetch)(url, {
485
- credentials: 'include',
486
- method: options === null || options === void 0 ? void 0 : options.method,
487
- body: options === null || options === void 0 ? void 0 : options.body,
488
- headers: headers,
489
- })
490
- .then(function (response) {
491
- return onSuccess(response);
492
- })
493
- .catch(function (error) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
494
- var r;
495
- return tslib_1.__generator(this, function (_a) {
496
- switch (_a.label) {
497
- case 0: return [4 /*yield*/, error];
498
- case 1:
499
- r = _a.sent();
500
- throw r;
501
- }
502
- });
503
- }); });
504
- };
505
- return RestDataProviderHttpProviderUsingFetch;
506
- }());
507
- exports.RestDataProviderHttpProviderUsingFetch = RestDataProviderHttpProviderUsingFetch;
508
- function onSuccess(response) {
509
- if (response.status == 204)
510
- return;
511
- if (response.status >= 200 && response.status < 300)
512
- return response.json();
513
- else {
514
- throw response
515
- .json()
516
- .then(function (x) {
517
- return tslib_1.__assign(tslib_1.__assign({}, x), { message: x.message || response.statusText, url: response.url, status: response.status });
518
- })
519
- .catch(function () {
520
- throw {
521
- message: response.statusText,
522
- url: response.url,
523
- status: response.status,
524
- };
525
- });
526
- }
527
- }
528
414
  function addFilterToUrlAndReturnTrueIfSuccessful(filter, url) {
529
415
  for (var key in filter) {
530
416
  if (Object.prototype.hasOwnProperty.call(filter, key)) {
@@ -0,0 +1 @@
1
+ export declare function retry<T>(what: () => Promise<T>): Promise<T>;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.retry = retry;
4
+ var tslib_1 = require("tslib");
5
+ var remult3_js_1 = require("../remult3/remult3.js");
6
+ function retry(what) {
7
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
8
+ var i, err_1;
9
+ var _a, _b, _c, _d;
10
+ return tslib_1.__generator(this, function (_e) {
11
+ switch (_e.label) {
12
+ case 0:
13
+ i = 0;
14
+ _e.label = 1;
15
+ case 1:
16
+ if (!true) return [3 /*break*/, 8];
17
+ _e.label = 2;
18
+ case 2:
19
+ _e.trys.push([2, 4, , 7]);
20
+ return [4 /*yield*/, what()];
21
+ case 3: return [2 /*return*/, _e.sent()];
22
+ case 4:
23
+ err_1 = _e.sent();
24
+ if (!((((_a = err_1.message) === null || _a === void 0 ? void 0 : _a.startsWith('Error occurred while trying to proxy')) ||
25
+ ((_b = err_1.message) === null || _b === void 0 ? void 0 : _b.startsWith('Error occured while trying to proxy')) ||
26
+ ((_c = err_1.message) === null || _c === void 0 ? void 0 : _c.includes('http proxy error')) ||
27
+ ((_d = err_1.message) === null || _d === void 0 ? void 0 : _d.startsWith('Gateway Timeout')) ||
28
+ err_1.status == 500) &&
29
+ i++ < remult3_js_1.flags.error500RetryCount)) return [3 /*break*/, 6];
30
+ return [4 /*yield*/, new Promise(function (res, req) {
31
+ setTimeout(function () {
32
+ res({});
33
+ }, 500);
34
+ })];
35
+ case 5:
36
+ _e.sent();
37
+ return [3 /*break*/, 1];
38
+ case 6: throw err_1;
39
+ case 7: return [3 /*break*/, 1];
40
+ case 8: return [2 /*return*/];
41
+ }
42
+ });
43
+ });
44
+ }
package/src/entity.d.ts CHANGED
@@ -2,6 +2,7 @@ import type { Allowed, AllowedForInstance } from './context.js';
2
2
  import type { FieldMetadata } from './column-interfaces.js';
3
3
  import type { EntityFilter, EntityIdFields, EntityMetadata, EntityOrderBy, EntityRef, FieldsMetadata, LifecycleEvent, MembersOnly } from './remult3/remult3.js';
4
4
  import type { FilterPreciseValues } from './filter/filter-interfaces.js';
5
+ import type { DataProvider } from './data-interfaces.js';
5
6
  export interface EntityOptions<entityType = unknown> {
6
7
  /**A human readable name for the entity */
7
8
  caption?: string;
@@ -181,6 +182,18 @@ export interface EntityOptions<entityType = unknown> {
181
182
  id?: keyof MembersOnly<entityType> | (keyof MembersOnly<entityType>)[] | EntityIdFields<entityType> | ((entity: FieldsMetadata<entityType>) => FieldMetadata | FieldMetadata[]);
182
183
  entityRefInit?: (ref: EntityRef<entityType>, row: entityType) => void;
183
184
  apiRequireId?: Allowed;
185
+ /**
186
+ * A function that allows customizing the data provider for the entity.
187
+ * @param defaultDataProvider The default data provider defined in the `remult` object.
188
+ * @example
189
+ * dataProvider: (dp) => {
190
+ * if (!dp.isProxy) // usually indicates that we're on the backend
191
+ * return getASpacificDataProvider();
192
+ * return null
193
+ * }
194
+ * @returns A custom data provider for the entity.
195
+ */
196
+ dataProvider?: (defaultDataProvider: DataProvider) => DataProvider | undefined | null;
184
197
  }
185
198
  /**
186
199
  * Provides additional information and utilities for preprocessing filters in API and backend operations.
@@ -0,0 +1,2 @@
1
+ import type { EntityMetadata } from '../remult3/remult3.js';
2
+ export declare function entityDbName(metadata: EntityMetadata, wrapIdentifier?: (name: string) => string): Promise<string>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.entityDbName = entityDbName;
4
+ var tslib_1 = require("tslib");
5
+ function entityDbName(metadata_1) {
6
+ return tslib_1.__awaiter(this, arguments, void 0, function (metadata, wrapIdentifier) {
7
+ var prev;
8
+ if (wrapIdentifier === void 0) { wrapIdentifier = function (x) { return x; }; }
9
+ return tslib_1.__generator(this, function (_a) {
10
+ switch (_a.label) {
11
+ case 0:
12
+ if (!metadata.options.sqlExpression) return [3 /*break*/, 5];
13
+ if (!(typeof metadata.options.sqlExpression === 'string')) return [3 /*break*/, 1];
14
+ return [2 /*return*/, metadata.options.sqlExpression];
15
+ case 1:
16
+ if (!(typeof metadata.options.sqlExpression === 'function')) return [3 /*break*/, 5];
17
+ prev = metadata.options.sqlExpression;
18
+ _a.label = 2;
19
+ case 2:
20
+ _a.trys.push([2, , 4, 5]);
21
+ metadata.options.sqlExpression =
22
+ "recursive sqlExpression call for entity '" + metadata.key + "'. ";
23
+ return [4 /*yield*/, prev(metadata)];
24
+ case 3: return [2 /*return*/, _a.sent()];
25
+ case 4:
26
+ metadata.options.sqlExpression = prev;
27
+ return [7 /*endfinally*/];
28
+ case 5: return [2 /*return*/, wrapIdentifier(metadata.dbName)];
29
+ }
30
+ });
31
+ });
32
+ }
@@ -0,0 +1,3 @@
1
+ import type { EntityMetadata } from "../remult3/remult3.js";
2
+ import type { FieldMetadata } from '../column-interfaces.js';
3
+ export declare function fieldDbName(f: FieldMetadata, meta: EntityMetadata, wrapIdentifier?: (name: string) => string, forceSqlExpression?: boolean): Promise<string>;
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.fieldDbName = fieldDbName;
4
+ var tslib_1 = require("tslib");
5
+ var relationInfoMember_js_1 = require("../remult3/relationInfoMember.js");
6
+ var sqlExpressionInProgressKey = Symbol.for("sqlExpressionInProgressKey");
7
+ function fieldDbName(f_1, meta_1) {
8
+ return tslib_1.__awaiter(this, arguments, void 0, function (f, meta, wrapIdentifier, forceSqlExpression) {
9
+ var result_1, rel, field, fInfo;
10
+ if (wrapIdentifier === void 0) { wrapIdentifier = function (x) { return x; }; }
11
+ if (forceSqlExpression === void 0) { forceSqlExpression = false; }
12
+ return tslib_1.__generator(this, function (_a) {
13
+ switch (_a.label) {
14
+ case 0:
15
+ _a.trys.push([0, , 8, 9]);
16
+ if (!f.options.sqlExpression) return [3 /*break*/, 7];
17
+ if (!(typeof f.options.sqlExpression === 'function')) return [3 /*break*/, 5];
18
+ if (f[sqlExpressionInProgressKey] && !forceSqlExpression) {
19
+ return [2 /*return*/, "recursive sqlExpression call for field '" + f.key + "'. \0"];
20
+ }
21
+ _a.label = 1;
22
+ case 1:
23
+ _a.trys.push([1, , 3, 4]);
24
+ ;
25
+ f[sqlExpressionInProgressKey] = true;
26
+ return [4 /*yield*/, f.options.sqlExpression(meta)];
27
+ case 2:
28
+ result_1 = _a.sent();
29
+ if (!result_1.includes('\0'))
30
+ f.options.sqlExpression = function () { return result_1; };
31
+ return [3 /*break*/, 4];
32
+ case 3:
33
+ delete f[sqlExpressionInProgressKey];
34
+ return [7 /*endfinally*/];
35
+ case 4: return [3 /*break*/, 6];
36
+ case 5:
37
+ result_1 = f.options.sqlExpression;
38
+ _a.label = 6;
39
+ case 6:
40
+ if (!result_1)
41
+ return [2 /*return*/, f.dbName];
42
+ return [2 /*return*/, result_1];
43
+ case 7:
44
+ rel = (0, relationInfoMember_js_1.getRelationFieldInfo)(f);
45
+ field = (rel === null || rel === void 0 ? void 0 : rel.type) === 'toOne' &&
46
+ f.options.field;
47
+ if (field) {
48
+ fInfo = meta.fields.find(field);
49
+ if (fInfo)
50
+ return [2 /*return*/, fieldDbName(fInfo, meta, wrapIdentifier, forceSqlExpression)];
51
+ }
52
+ return [2 /*return*/, wrapIdentifier(f.dbName)];
53
+ case 8: return [7 /*endfinally*/];
54
+ case 9: return [2 /*return*/];
55
+ }
56
+ });
57
+ });
58
+ }
@@ -84,5 +84,3 @@ export interface dbNamesOfOptions {
84
84
  }
85
85
  export declare function dbNamesOf<entityType>(repo: EntityMetadataOverloads<entityType>, wrapIdentifierOrOptions?: ((name: string) => string) | dbNamesOfOptions): Promise<EntityDbNames<entityType>>;
86
86
  export declare function dbNamesOfWithForceSqlExpression<entityType>(repo: EntityMetadataOverloads<entityType>, wrapIdentifierOrOptions?: ((name: string) => string) | dbNamesOfOptions): Promise<EntityDbNames<entityType>>;
87
- export declare function entityDbName(metadata: EntityMetadata, wrapIdentifier?: (name: string) => string): Promise<string>;
88
- export declare function fieldDbName(f: FieldMetadata, meta: EntityMetadata, wrapIdentifier?: (name: string) => string, forceSqlExpression?: boolean): Promise<string>;