remult 0.17.3 → 0.18.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 (163) hide show
  1. package/SseSubscriptionServer.d.ts +23 -0
  2. package/SseSubscriptionServer.js +143 -0
  3. package/ably.d.ts +13 -0
  4. package/ably.js +59 -0
  5. package/esm/SseSubscriptionServer.d.ts +23 -0
  6. package/esm/SseSubscriptionServer.js +102 -0
  7. package/esm/ably.d.ts +13 -0
  8. package/esm/ably.js +28 -0
  9. package/esm/index.d.ts +7 -4
  10. package/esm/index.js +4 -2
  11. package/esm/live-query/data-provider-live-query-storage.d.ts +23 -0
  12. package/esm/live-query/data-provider-live-query-storage.js +78 -0
  13. package/esm/myLog.d.ts +1 -0
  14. package/esm/myLog.js +5 -0
  15. package/esm/postgres/postgres-data-provider.d.ts +4 -2
  16. package/esm/postgres/postgres-data-provider.js +18 -6
  17. package/esm/postgres/schema-builder.d.ts +2 -1
  18. package/esm/postgres/schema-builder.js +49 -29
  19. package/esm/remult-knex/index.d.ts +10 -32
  20. package/esm/remult-knex/index.js +75 -51
  21. package/esm/remult-mongo.d.ts +9 -2
  22. package/esm/remult-mongo.js +24 -8
  23. package/esm/remult-next.d.ts +11 -0
  24. package/esm/remult-next.js +27 -0
  25. package/esm/server/core.d.ts +2 -0
  26. package/esm/server/core.js +2 -0
  27. package/esm/server/expressBridge.d.ts +19 -7
  28. package/esm/server/expressBridge.js +135 -31
  29. package/esm/server/index.d.ts +2 -1
  30. package/esm/server/index.js +2 -1
  31. package/esm/server/initDataProvider.d.ts +2 -0
  32. package/esm/server/initDataProvider.js +14 -0
  33. package/esm/src/buildRestDataProvider.d.ts +31 -0
  34. package/esm/src/buildRestDataProvider.js +110 -0
  35. package/esm/src/column-interfaces.d.ts +44 -8
  36. package/esm/src/column.d.ts +3 -3
  37. package/esm/src/context.d.ts +39 -36
  38. package/esm/src/context.js +87 -117
  39. package/esm/src/data-api.d.ts +9 -3
  40. package/esm/src/data-api.js +130 -63
  41. package/esm/src/data-interfaces.d.ts +5 -1
  42. package/esm/src/data-providers/array-entity-data-provider.d.ts +1 -1
  43. package/esm/src/data-providers/array-entity-data-provider.js +2 -17
  44. package/esm/src/data-providers/rest-data-provider.d.ts +4 -3
  45. package/esm/src/data-providers/rest-data-provider.js +64 -23
  46. package/esm/src/data-providers/sql-database.d.ts +7 -3
  47. package/esm/src/data-providers/sql-database.js +60 -17
  48. package/esm/src/data-providers/web-sql-data-provider.d.ts +3 -0
  49. package/esm/src/data-providers/web-sql-data-provider.js +23 -9
  50. package/esm/src/entity.d.ts +2 -2
  51. package/esm/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  52. package/esm/src/filter/filter-consumer-bridge-to-sql-request.js +29 -21
  53. package/esm/src/filter/filter-interfaces.d.ts +5 -5
  54. package/esm/src/filter/filter-interfaces.js +31 -26
  55. package/esm/src/live-query/LiveQueryClient.d.ts +1 -0
  56. package/esm/src/live-query/LiveQueryClient.js +184 -0
  57. package/esm/src/live-query/SseSubscriptionClient.d.ts +5 -0
  58. package/esm/src/live-query/SseSubscriptionClient.js +86 -0
  59. package/esm/src/live-query/SubscriptionChannel.d.ts +41 -0
  60. package/esm/src/live-query/SubscriptionChannel.js +121 -0
  61. package/esm/src/live-query/SubscriptionServer.d.ts +38 -0
  62. package/esm/src/live-query/SubscriptionServer.js +108 -0
  63. package/esm/src/remult-proxy.d.ts +1 -1
  64. package/esm/src/remult-proxy.js +52 -7
  65. package/esm/src/remult3/RepositoryImplementation.d.ts +14 -5
  66. package/esm/src/remult3/RepositoryImplementation.js +124 -44
  67. package/esm/src/remult3/getId.d.ts +2 -0
  68. package/esm/src/remult3/getId.js +7 -0
  69. package/esm/src/remult3/remult3.d.ts +67 -10
  70. package/esm/src/remult3/remult3.js +1 -0
  71. package/esm/src/server-action.d.ts +5 -1
  72. package/esm/src/server-action.js +11 -12
  73. package/esm/src/shared-tests/db-tests-setup.d.ts +12 -5
  74. package/esm/src/shared-tests/db-tests-setup.js +14 -6
  75. package/esm/src/shared-tests/db-tests.db-tests.js +71 -10
  76. package/esm/src/sort.d.ts +1 -0
  77. package/esm/src/sort.js +18 -0
  78. package/esm/src/sql-command.d.ts +5 -2
  79. package/esm/src/tests/entityForCustomFilter.d.ts +6 -6
  80. package/esm/src/tests/entityForCustomFilter.js +20 -21
  81. package/esm/src/tests/frontend-database-tests-setup.spec.js +3 -4
  82. package/esm/src/tests/testHelper.spec.d.ts +3 -1
  83. package/esm/src/tests/testHelper.spec.js +63 -60
  84. package/esm/src/valueConverters.js +15 -7
  85. package/index.d.ts +7 -4
  86. package/index.js +7 -3
  87. package/live-query/data-provider-live-query-storage.d.ts +23 -0
  88. package/live-query/data-provider-live-query-storage.js +236 -0
  89. package/myLog.d.ts +1 -0
  90. package/myLog.js +20 -0
  91. package/package.json +18 -1
  92. package/postgres/postgres-data-provider.d.ts +4 -2
  93. package/postgres/postgres-data-provider.js +54 -39
  94. package/postgres/schema-builder.d.ts +2 -1
  95. package/postgres/schema-builder.js +118 -70
  96. package/remult-express.js +1 -1
  97. package/remult-knex/index.d.ts +10 -32
  98. package/remult-knex/index.js +134 -87
  99. package/remult-mongo.d.ts +9 -2
  100. package/remult-mongo.js +39 -7
  101. package/remult-next.d.ts +11 -0
  102. package/remult-next.js +73 -0
  103. package/server/JsonEntityFileStorage.js +2 -2
  104. package/server/core.d.ts +2 -0
  105. package/server/core.js +5 -1
  106. package/server/expressBridge.d.ts +19 -7
  107. package/server/expressBridge.js +283 -69
  108. package/server/index.d.ts +2 -1
  109. package/server/index.js +3 -1
  110. package/server/initDataProvider.d.ts +2 -0
  111. package/server/initDataProvider.js +26 -0
  112. package/src/buildRestDataProvider.d.ts +31 -0
  113. package/src/buildRestDataProvider.js +162 -0
  114. package/src/column-interfaces.d.ts +44 -8
  115. package/src/column.d.ts +3 -3
  116. package/src/context.d.ts +39 -36
  117. package/src/context.js +171 -166
  118. package/src/data-api.d.ts +9 -3
  119. package/src/data-api.js +233 -88
  120. package/src/data-interfaces.d.ts +5 -1
  121. package/src/data-providers/array-entity-data-provider.d.ts +1 -1
  122. package/src/data-providers/array-entity-data-provider.js +2 -17
  123. package/src/data-providers/rest-data-provider.d.ts +4 -3
  124. package/src/data-providers/rest-data-provider.js +105 -39
  125. package/src/data-providers/sql-database.d.ts +7 -3
  126. package/src/data-providers/sql-database.js +89 -16
  127. package/src/data-providers/web-sql-data-provider.d.ts +3 -0
  128. package/src/data-providers/web-sql-data-provider.js +56 -11
  129. package/src/entity.d.ts +2 -2
  130. package/src/filter/filter-consumer-bridge-to-sql-request.d.ts +16 -16
  131. package/src/filter/filter-consumer-bridge-to-sql-request.js +59 -50
  132. package/src/filter/filter-interfaces.d.ts +5 -5
  133. package/src/filter/filter-interfaces.js +31 -26
  134. package/src/live-query/LiveQueryClient.d.ts +1 -0
  135. package/src/live-query/LiveQueryClient.js +283 -0
  136. package/src/live-query/SseSubscriptionClient.d.ts +5 -0
  137. package/src/live-query/SseSubscriptionClient.js +150 -0
  138. package/src/live-query/SubscriptionChannel.d.ts +41 -0
  139. package/src/live-query/SubscriptionChannel.js +209 -0
  140. package/src/live-query/SubscriptionServer.d.ts +38 -0
  141. package/src/live-query/SubscriptionServer.js +258 -0
  142. package/src/remult-proxy.d.ts +1 -1
  143. package/src/remult-proxy.js +153 -8
  144. package/src/remult3/RepositoryImplementation.d.ts +14 -5
  145. package/src/remult3/RepositoryImplementation.js +200 -85
  146. package/src/remult3/getId.d.ts +2 -0
  147. package/src/remult3/getId.js +11 -0
  148. package/src/remult3/remult3.d.ts +67 -10
  149. package/src/remult3/remult3.js +1 -0
  150. package/src/server-action.d.ts +5 -1
  151. package/src/server-action.js +11 -11
  152. package/src/shared-tests/db-tests-setup.d.ts +12 -5
  153. package/src/shared-tests/db-tests-setup.js +17 -8
  154. package/src/shared-tests/db-tests.db-tests.js +140 -8
  155. package/src/sort.d.ts +1 -0
  156. package/src/sort.js +18 -0
  157. package/src/sql-command.d.ts +5 -2
  158. package/src/tests/entityForCustomFilter.d.ts +6 -6
  159. package/src/tests/entityForCustomFilter.js +30 -31
  160. package/src/tests/frontend-database-tests-setup.spec.js +5 -6
  161. package/src/tests/testHelper.spec.d.ts +3 -1
  162. package/src/tests/testHelper.spec.js +104 -100
  163. package/src/valueConverters.js +15 -7
@@ -0,0 +1,162 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.processHttpException = exports.toPromise = exports.retry = exports.HttpProviderBridgeToRestDataProviderHttpProvider = exports.isExternalHttpProvider = exports.buildRestDataProvider = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var rest_data_provider_1 = require("./data-providers/rest-data-provider");
6
+ function buildRestDataProvider(provider) {
7
+ if (!provider)
8
+ return new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch();
9
+ var httpDataProvider;
10
+ if (!httpDataProvider) {
11
+ if (isExternalHttpProvider(provider)) {
12
+ httpDataProvider = new HttpProviderBridgeToRestDataProviderHttpProvider(provider);
13
+ }
14
+ }
15
+ if (!httpDataProvider) {
16
+ if (typeof provider === "function") {
17
+ httpDataProvider = new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch(provider);
18
+ }
19
+ }
20
+ return httpDataProvider;
21
+ }
22
+ exports.buildRestDataProvider = buildRestDataProvider;
23
+ function isExternalHttpProvider(item) {
24
+ var http = item;
25
+ if (http && http.get && http.put && http.post && http.delete)
26
+ return true;
27
+ return false;
28
+ }
29
+ exports.isExternalHttpProvider = isExternalHttpProvider;
30
+ var HttpProviderBridgeToRestDataProviderHttpProvider = /** @class */ (function () {
31
+ function HttpProviderBridgeToRestDataProviderHttpProvider(http) {
32
+ this.http = http;
33
+ }
34
+ HttpProviderBridgeToRestDataProviderHttpProvider.prototype.post = function (url, data) {
35
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
36
+ var _this = this;
37
+ return tslib_1.__generator(this, function (_a) {
38
+ switch (_a.label) {
39
+ case 0: return [4 /*yield*/, retry(function () { return toPromise(_this.http.post(url, data)); })];
40
+ case 1: return [2 /*return*/, _a.sent()];
41
+ }
42
+ });
43
+ });
44
+ };
45
+ HttpProviderBridgeToRestDataProviderHttpProvider.prototype.delete = function (url) {
46
+ return toPromise(this.http.delete(url));
47
+ };
48
+ HttpProviderBridgeToRestDataProviderHttpProvider.prototype.put = function (url, data) {
49
+ return toPromise(this.http.put(url, data));
50
+ };
51
+ HttpProviderBridgeToRestDataProviderHttpProvider.prototype.get = function (url) {
52
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
53
+ var _this = this;
54
+ return tslib_1.__generator(this, function (_a) {
55
+ switch (_a.label) {
56
+ case 0: return [4 /*yield*/, retry(function () { return toPromise(_this.http.get(url)); })];
57
+ case 1: return [2 /*return*/, _a.sent()];
58
+ }
59
+ });
60
+ });
61
+ };
62
+ return HttpProviderBridgeToRestDataProviderHttpProvider;
63
+ }());
64
+ exports.HttpProviderBridgeToRestDataProviderHttpProvider = HttpProviderBridgeToRestDataProviderHttpProvider;
65
+ function retry(what) {
66
+ var _a, _b, _c, _d;
67
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
68
+ var err_1;
69
+ return tslib_1.__generator(this, function (_e) {
70
+ switch (_e.label) {
71
+ case 0:
72
+ if (!true) return [3 /*break*/, 7];
73
+ _e.label = 1;
74
+ case 1:
75
+ _e.trys.push([1, 3, , 6]);
76
+ return [4 /*yield*/, what()];
77
+ case 2: return [2 /*return*/, _e.sent()];
78
+ case 3:
79
+ err_1 = _e.sent();
80
+ if (!(((_a = err_1.message) === null || _a === void 0 ? void 0 : _a.startsWith("Error occurred while trying to proxy")) || ((_b = err_1.message) === null || _b === void 0 ? void 0 : _b.startsWith("Error occured while trying to proxy")) || ((_c = err_1.message) === null || _c === void 0 ? void 0 : _c.includes("http proxy error")) || ((_d = err_1.message) === null || _d === void 0 ? void 0 : _d.startsWith("Gateway Timeout")))) return [3 /*break*/, 5];
81
+ return [4 /*yield*/, new Promise(function (res, req) {
82
+ setTimeout(function () {
83
+ res({});
84
+ }, 250);
85
+ })];
86
+ case 4:
87
+ _e.sent();
88
+ return [3 /*break*/, 0];
89
+ case 5: throw err_1;
90
+ case 6: return [3 /*break*/, 0];
91
+ case 7: return [2 /*return*/];
92
+ }
93
+ });
94
+ });
95
+ }
96
+ exports.retry = retry;
97
+ function toPromise(p) {
98
+ var _this = this;
99
+ var r;
100
+ if (p["toPromise"] !== undefined) {
101
+ r = p["toPromise"]();
102
+ }
103
+ //@ts-ignore
104
+ else
105
+ r = p;
106
+ return r.then(function (x) {
107
+ if (x && (x.status == 200 || x.status == 201) && x.headers && x.request && x.data) //for axios
108
+ return x.data;
109
+ return x;
110
+ }).catch(function (ex) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
111
+ return tslib_1.__generator(this, function (_a) {
112
+ switch (_a.label) {
113
+ case 0: return [4 /*yield*/, processHttpException(ex)];
114
+ case 1: throw _a.sent();
115
+ }
116
+ });
117
+ }); });
118
+ }
119
+ exports.toPromise = toPromise;
120
+ function processHttpException(ex) {
121
+ var _a, _b, _c;
122
+ return tslib_1.__awaiter(this, void 0, void 0, function () {
123
+ var z, error, httpStatusCode, result;
124
+ return tslib_1.__generator(this, function (_d) {
125
+ switch (_d.label) {
126
+ case 0: return [4 /*yield*/, ex];
127
+ case 1:
128
+ z = _d.sent();
129
+ if (z.error)
130
+ error = z.error;
131
+ else if (z.isAxiosError) {
132
+ if (typeof ((_a = z.response) === null || _a === void 0 ? void 0 : _a.data) === "string")
133
+ error = z.response.data;
134
+ else
135
+ error = (_b = z === null || z === void 0 ? void 0 : z.response) === null || _b === void 0 ? void 0 : _b.data;
136
+ }
137
+ if (!error)
138
+ error = z.message;
139
+ if (z.status == 0 && z.error.isTrusted)
140
+ error = "Network Error";
141
+ if (typeof error === 'string') {
142
+ error = {
143
+ message: error,
144
+ };
145
+ }
146
+ if (z.modelState)
147
+ error.modelState = z.modelState;
148
+ httpStatusCode = z.status;
149
+ if (httpStatusCode === undefined)
150
+ httpStatusCode = (_c = z.response) === null || _c === void 0 ? void 0 : _c.status;
151
+ if (httpStatusCode !== undefined && httpStatusCode !== null) {
152
+ error.httpStatusCode = httpStatusCode;
153
+ }
154
+ result = Object.assign(error, {
155
+ // exception: ex disabled for now because JSON.stringify crashed with this
156
+ });
157
+ return [2 /*return*/, result];
158
+ }
159
+ });
160
+ });
161
+ }
162
+ exports.processHttpException = processHttpException;
@@ -2,7 +2,10 @@ import { ClassType } from '../classType';
2
2
  import { Allowed, AllowedForInstance } from './context';
3
3
  import { EntityMetadata, FieldRef } from './remult3';
4
4
  export interface FieldOptions<entityType = any, valueType = any> {
5
- /**A human readable name for the field */
5
+ /** A human readable name for the field. Can be used to achieve a consistent caption for a field throughout the app
6
+ * @example
7
+ * <input placeholder={taskRepo.metadata.fields.title.caption}/>
8
+ */
6
9
  caption?: string;
7
10
  /** If it can store null in the database */
8
11
  allowNull?: boolean;
@@ -32,14 +35,23 @@ export interface FieldOptions<entityType = any, valueType = any> {
32
35
  * }
33
36
  * })
34
37
  */
35
- validate?: ((entity: entityType, col: FieldRef<entityType, valueType>) => (any | Promise<any>)) | ((entity: entityType, col: FieldRef<entityType, valueType>) => (any | Promise<any>))[];
38
+ validate?: ((entity: entityType, fieldRef: FieldRef<entityType, valueType>) => (any | Promise<any>)) | ((entity: entityType, fieldRef: FieldRef<entityType, valueType>) => (any | Promise<any>))[];
36
39
  /** Will be fired before this field is saved to the server/database */
37
- saving?: ((entity: entityType, col: FieldRef<entityType, valueType>) => (any | Promise<any>));
40
+ saving?: ((entity: entityType, fieldRef: FieldRef<entityType, valueType>) => (any | Promise<any>));
38
41
  /** An expression that will determine this fields value on the backend and be provided to the front end*/
39
42
  serverExpression?: (entity: entityType) => valueType | Promise<valueType>;
40
43
  /** The name of the column in the database that holds the data for this field. If no name is set, the key will be used instead. */
41
44
  dbName?: string;
42
- /** Used or fields that are based on an sql expressions, instead of a physical table column */
45
+ /** Used or fields that are based on an sql expressions, instead of a physical table column
46
+ * @example
47
+ *
48
+ * @Fields.integer({
49
+ * sqlExpression:e=> 'length(title)'
50
+ * })
51
+ * titleLength = 0;
52
+ * @Fields.string()
53
+ * title='';
54
+ */
43
55
  sqlExpression?: string | ((entity: EntityMetadata<entityType>) => string | Promise<string>);
44
56
  /** For fields that shouldn't be part of an update or insert statement */
45
57
  dbReadOnly?: boolean;
@@ -62,18 +74,42 @@ export interface FieldOptions<entityType = any, valueType = any> {
62
74
  /** The key to be used for this field */
63
75
  key?: string;
64
76
  }
77
+ /**Metadata for a `Field`, this metadata can be used in the user interface to provide a richer UI experience */
65
78
  export interface FieldMetadata<valueType = any> {
79
+ /** The field's member name in an object.
80
+ * @example
81
+ * const taskRepo = remult.repo(Task);
82
+ * console.log(taskRepo.metadata.fields.title.key);
83
+ * // result: title
84
+ */
66
85
  readonly key: string;
67
- readonly target: ClassType<valueType>;
68
- readonly valueType: any;
86
+ /** A human readable caption for the field. Can be used to achieve a consistent caption for a field throughout the app
87
+ * @example
88
+ * <input placeholder={taskRepo.metadata.fields.title.caption}/>
89
+ */
69
90
  readonly caption: string;
91
+ /** The field's value type (number,string etc...) */
92
+ readonly valueType: any;
93
+ /** The options sent to this field's decorator */
94
+ readonly options: FieldOptions;
95
+ /** The `inputType` relevant for this field, determined by the options sent to it's decorator and the valueConverter in these options */
70
96
  readonly inputType: string;
97
+ /** if null is allowed for this field */
71
98
  readonly allowNull: boolean;
99
+ /** The class that contains this field
100
+ * @example
101
+ * const taskRepo = remult.repo(Task);
102
+ * Task == taskRepo.metadata.fields.title.target //will return true
103
+ */
104
+ readonly target: ClassType<valueType>;
105
+ /** Returns the dbName - based on it's `dbName` option and it's `sqlExpression` option */
72
106
  getDbName(): Promise<string>;
107
+ /** Indicates if this field is based on a server express */
73
108
  readonly isServerExpression: boolean;
109
+ /** indicates that this field should only be included in select statement, and excluded from update or insert. useful for db generated ids etc... */
74
110
  readonly dbReadOnly: boolean;
111
+ /** the Value converter for this field */
75
112
  readonly valueConverter: ValueConverter<valueType>;
76
- readonly options: FieldOptions;
77
113
  }
78
114
  export interface ValueConverter<valueType> {
79
115
  fromJson?(val: any): valueType;
@@ -86,7 +122,7 @@ export interface ValueConverter<valueType> {
86
122
  readonly fieldTypeInDb?: string;
87
123
  readonly inputType?: string;
88
124
  }
89
- export declare type FieldValidator<entityType = any, valueType = any> = (entity: entityType, col: FieldRef<entityType, valueType>) => void | Promise<void>;
125
+ export declare type FieldValidator<entityType = any, valueType = any> = (entity: entityType, fieldRef: FieldRef<entityType, valueType>) => void | Promise<void>;
90
126
  export declare type ValueOrExpression<valueType> = valueType | (() => valueType);
91
127
  export declare function valueOrExpressionToValue<valueType>(f: ValueOrExpression<valueType>): valueType;
92
128
  export interface ValueListItem {
package/src/column.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { ClassType } from '../classType';
2
2
  import { FieldMetadata, FieldOptions, ValueConverter } from './column-interfaces';
3
3
  import { Filter } from './filter/filter-interfaces';
4
- import { EntityFilter, FindOptions, Repository, RepositoryImplementation } from './remult3';
4
+ import { EntityFilter, FindOptions, idType, Repository, RepositoryImplementation } from './remult3';
5
5
  export declare function makeTitle(name: string): string;
6
6
  export declare class CompoundIdField implements FieldMetadata<string> {
7
7
  fields: FieldMetadata[];
@@ -25,12 +25,12 @@ export declare class CompoundIdField implements FieldMetadata<string> {
25
25
  }
26
26
  export declare class LookupColumn<T> {
27
27
  private repository;
28
- id: string;
28
+ id: idType<T>;
29
29
  setId(val: any): void;
30
30
  waitLoadOf(id: any): Promise<T>;
31
31
  get(id: any): any;
32
32
  set(item: T): void;
33
- constructor(repository: RepositoryImplementation<T>, id: string);
33
+ constructor(repository: RepositoryImplementation<T>, id: idType<T>);
34
34
  get item(): T;
35
35
  waitLoad(): Promise<T>;
36
36
  }
package/src/context.d.ts CHANGED
@@ -1,43 +1,20 @@
1
- import { DataProvider, RestDataProviderHttpProvider } from "./data-interfaces";
2
- import { RestDataProviderHttpProviderUsingFetch } from './data-providers/rest-data-provider';
1
+ import { DataProvider } from "./data-interfaces";
3
2
  import { EntityMetadata, EntityRef, FindOptions, Repository } from "./remult3";
4
3
  import { ClassType } from "../classType";
5
- export interface ExternalHttpProvider {
6
- post(url: string, data: any): Promise<any> | {
7
- toPromise(): Promise<any>;
8
- };
9
- delete(url: string): Promise<void> | {
10
- toPromise(): Promise<void>;
11
- };
12
- put(url: string, data: any): Promise<any> | {
13
- toPromise(): Promise<any>;
14
- };
15
- get(url: string): Promise<any> | {
16
- toPromise(): Promise<any>;
17
- };
18
- }
19
- export declare class HttpProviderBridgeToRestDataProviderHttpProvider implements RestDataProviderHttpProvider {
20
- private http;
21
- constructor(http: ExternalHttpProvider);
22
- post(url: string, data: any): Promise<any>;
23
- delete(url: string): Promise<void>;
24
- put(url: string, data: any): Promise<any>;
25
- get(url: string): Promise<any>;
26
- }
27
- export declare function retry<T>(what: () => Promise<T>): Promise<T>;
28
- export declare function toPromise<T>(p: Promise<T> | {
29
- toPromise(): Promise<T>;
30
- }): Promise<any>;
31
- export declare function processHttpException(ex: any): Promise<any>;
4
+ import type { SubscriptionServer } from "./live-query/SubscriptionServer";
5
+ import { ExternalHttpProvider } from "./buildRestDataProvider";
6
+ import { SubscriptionClient } from "./live-query/SubscriptionChannel";
32
7
  export declare function isBackend(): boolean;
33
8
  export declare class Remult {
34
9
  /**Return's a `Repository` of the specific entity type
35
10
  * @example
36
11
  * const taskRepo = remult.repo(Task);
37
12
  * @see [Repository](https://remult.dev/docs/ref_repository.html)
38
- *
13
+ * @param entity - the entity to use
14
+ * @param dataProvider - an optional alternative data provider to use. Useful for writing to offline storage or an alternative data provider
39
15
  */
40
16
  repo<T>(entity: ClassType<T>, dataProvider?: DataProvider): Repository<T>;
17
+ /** Returns the current user's info */
41
18
  user?: UserInfo;
42
19
  /** Checks if a user was authenticated */
43
20
  authenticated(): boolean;
@@ -53,6 +30,8 @@ export declare class Remult {
53
30
  * [Allowed](https://remult.dev/docs/allowed.html)
54
31
  */
55
32
  isAllowedForInstance(instance: any, allowed?: AllowedForInstance<any>): boolean;
33
+ /** The current data provider */
34
+ dataProvider: DataProvider;
56
35
  /** Creates a new instance of the `remult` object.
57
36
  *
58
37
  * Can receive either an HttpProvider or a DataProvider as a parameter - which will be used to fetch data from.
@@ -62,23 +41,42 @@ export declare class Remult {
62
41
  constructor(http: ExternalHttpProvider | typeof fetch | ApiClient);
63
42
  constructor(p: DataProvider);
64
43
  constructor();
44
+ subscriptionServer?: SubscriptionServer;
45
+ /** Used to call a `backendMethod` using a specific `remult` object
46
+ * @example
47
+ * await remult.call(TasksController.setAll, undefined, true);
48
+ * @param backendMethod - the backend method to call
49
+ * @param classInstance - the class instance of the backend method, for static backend methods use undefined
50
+ * @param args - the arguments to send to the backend method
51
+ */
65
52
  call<T extends ((...args: any[]) => Promise<any>)>(backendMethod: T, classInstance?: any, ...args: GetArguments<T>): ReturnType<T>;
66
- /** The current data provider */
67
- dataProvider: DataProvider;
68
53
  /** A helper callback that can be used to debug and trace all find operations. Useful in debugging scenarios */
69
54
  static onFind: (metadata: EntityMetadata, options: FindOptions<any>) => void;
70
55
  clearAllCache(): any;
71
56
  /** A helper callback that is called whenever an entity is created. */
72
57
  static entityRefInit?: (ref: EntityRef<any>, row: any) => void;
58
+ /** context information that can be used to store custom information that will be disposed as part of the `remult` object */
73
59
  readonly context: RemultContext;
60
+ /** The api client that will be used by `remult` to perform calls to the `api` */
74
61
  apiClient: ApiClient;
75
62
  }
76
63
  export declare type GetArguments<T> = T extends (...args: infer FirstArgument) => any ? FirstArgument : never;
77
64
  export interface RemultContext {
78
65
  }
79
66
  export interface ApiClient {
67
+ /** The http client to use when making api calls.
68
+ * @example
69
+ * remult.apiClient.httpClient = axios;
70
+ * @example
71
+ * remult.apiClient.httpClient = httpClient;//angular http client
72
+ * @example
73
+ * remult.apiClient.httpClient = fetch; //this is the default
74
+ */
80
75
  httpClient?: ExternalHttpProvider | typeof fetch;
76
+ /** The base url to for making api calls */
81
77
  url?: string;
78
+ subscriptionClient?: SubscriptionClient;
79
+ wrapMessageHandling?: (x: VoidFunction) => void;
82
80
  }
83
81
  export declare const allEntities: ClassType<any>[];
84
82
  export interface ControllerOptions {
@@ -88,18 +86,17 @@ export declare const classHelpers: Map<any, ClassHelper>;
88
86
  export declare class ClassHelper {
89
87
  classes: Map<any, ControllerOptions>;
90
88
  }
91
- export declare function buildRestDataProvider(provider: ExternalHttpProvider | typeof fetch): RestDataProviderHttpProvider | RestDataProviderHttpProviderUsingFetch;
92
89
  export declare function setControllerSettings(target: any, options: ControllerOptions): void;
93
90
  export interface UserInfo {
94
91
  id: string;
95
92
  name?: string;
96
93
  roles?: string[];
97
94
  }
98
- export declare type Allowed = boolean | string | string[] | ((c: Remult) => boolean);
99
- export declare type AllowedForInstance<T> = boolean | string | string[] | ((c: Remult, entity?: T) => boolean);
95
+ export declare type Allowed = boolean | string | string[] | ((c?: Remult) => boolean);
96
+ export declare type AllowedForInstance<T> = boolean | string | string[] | ((entity?: T, c?: Remult) => boolean);
100
97
  export declare class Allow {
101
98
  static everyone: () => boolean;
102
- static authenticated: (remult: Remult) => boolean;
99
+ static authenticated: (...args: any[]) => any;
103
100
  }
104
101
  export declare const queryConfig: {
105
102
  defaultPageSize: number;
@@ -113,3 +110,9 @@ export declare class EventSource {
113
110
  fire(): Promise<void>;
114
111
  dispatcher: EventDispatcher;
115
112
  }
113
+ export interface itemChange {
114
+ id: any;
115
+ oldId: any;
116
+ deleted: boolean;
117
+ }
118
+ export declare function doTransaction(remult: Remult, what: () => Promise<void>): Promise<void>;