remult 0.15.4 → 0.16.0-exp.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.
- package/esm/index.d.ts +3 -1
- package/esm/index.js +3 -1
- package/esm/server/expressBridge.js +37 -16
- package/esm/src/backend-tests/test-http-server.backend-spec.js +2 -2
- package/esm/src/context.d.ts +5 -3
- package/esm/src/context.js +44 -18
- package/esm/src/data-interfaces.d.ts +2 -1
- package/esm/src/data-providers/rest-data-provider.d.ts +1 -1
- package/esm/src/data-providers/rest-data-provider.js +5 -2
- package/esm/src/remult-proxy.d.ts +2 -0
- package/esm/src/remult-proxy.js +51 -0
- package/esm/src/server-action.d.ts +1 -2
- package/esm/src/server-action.js +2 -2
- package/esm/src/tests/testHelper.spec.js +2 -2
- package/index.d.ts +3 -1
- package/index.js +7 -3
- package/package.json +1 -1
- package/server/expressBridge.js +63 -26
- package/src/backend-tests/test-http-server.backend-spec.js +1 -1
- package/src/context.d.ts +5 -3
- package/src/context.js +46 -17
- package/src/data-interfaces.d.ts +2 -1
- package/src/data-providers/rest-data-provider.d.ts +1 -1
- package/src/data-providers/rest-data-provider.js +4 -1
- package/src/remult-proxy.d.ts +2 -0
- package/src/remult-proxy.js +97 -0
- package/src/server-action.d.ts +1 -2
- package/src/server-action.js +2 -2
- package/src/tests/testHelper.spec.js +1 -1
package/esm/index.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export { RestDataProvider } from './src/data-providers/rest-data-provider';
|
|
|
8
8
|
export { InMemoryDataProvider } from './src/data-providers/in-memory-database';
|
|
9
9
|
export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider';
|
|
10
10
|
export { WebSqlDataProvider } from './src/data-providers/web-sql-data-provider';
|
|
11
|
-
export { SqlDatabase } from './src/data-providers/sql-database';
|
|
11
|
+
export { SqlDatabase, } from './src/data-providers/sql-database';
|
|
12
|
+
export { CustomSqlFilterObject, CustomSqlFilterBuilder } from './src/filter/filter-consumer-bridge-to-sql-request';
|
|
12
13
|
export { JsonDataProvider, JsonEntityStorage } from './src/data-providers/json-data-provider';
|
|
13
14
|
export { Controller, BackendMethodOptions, BackendMethod, ProgressListener } from './src/server-action';
|
|
14
15
|
export { Allowed, Allow, Remult, isBackend, AllowedForInstance, EventDispatcher, EventSource, HttpProvider, Unobserve, UserInfo } from './src/context';
|
|
@@ -20,3 +21,4 @@ export { FilterConsumerBridgeToSqlRequest } from './src/filter/filter-consumer-b
|
|
|
20
21
|
export { UrlBuilder } from './urlBuilder';
|
|
21
22
|
export { Validators } from './src/validators';
|
|
22
23
|
export { ValueConverters } from './src/valueConverters';
|
|
24
|
+
export { remult } from './src/remult-proxy';
|
package/esm/index.js
CHANGED
|
@@ -6,7 +6,8 @@ export { RestDataProvider } from './src/data-providers/rest-data-provider'; //V
|
|
|
6
6
|
export { InMemoryDataProvider } from './src/data-providers/in-memory-database'; //V
|
|
7
7
|
export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider'; //V
|
|
8
8
|
export { WebSqlDataProvider } from './src/data-providers/web-sql-data-provider'; //V
|
|
9
|
-
export { SqlDatabase } from './src/data-providers/sql-database'; //V
|
|
9
|
+
export { SqlDatabase, } from './src/data-providers/sql-database'; //V
|
|
10
|
+
export { CustomSqlFilterBuilder } from './src/filter/filter-consumer-bridge-to-sql-request';
|
|
10
11
|
export { JsonDataProvider } from './src/data-providers/json-data-provider'; //V
|
|
11
12
|
//export * from './src/data-api'; //reconsider if to make internal
|
|
12
13
|
export { Controller, BackendMethod, ProgressListener } from './src/server-action';
|
|
@@ -19,3 +20,4 @@ export { FilterConsumerBridgeToSqlRequest } from './src/filter/filter-consumer-b
|
|
|
19
20
|
export { UrlBuilder } from './urlBuilder';
|
|
20
21
|
export { Validators } from './src/validators';
|
|
21
22
|
export { ValueConverters } from './src/valueConverters';
|
|
23
|
+
export { remult } from './src/remult-proxy';
|
|
@@ -4,6 +4,8 @@ import { DataApi, serializeError } from '../src/data-api';
|
|
|
4
4
|
import { allEntities, Remult } from '../src/context';
|
|
5
5
|
import { Entity, Fields, getEntityKey } from '../src/remult3';
|
|
6
6
|
import { IdEntity } from '../src/id-entity';
|
|
7
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
8
|
+
import { remult } from '../src/remult-proxy';
|
|
7
9
|
;
|
|
8
10
|
export function createRemultServer(options) {
|
|
9
11
|
if (!options) {
|
|
@@ -32,7 +34,12 @@ export function createRemultServer(options) {
|
|
|
32
34
|
if (options.initApi) {
|
|
33
35
|
dataProvider = dataProvider.then(async (dp) => {
|
|
34
36
|
var remult = new Remult(dp);
|
|
35
|
-
await
|
|
37
|
+
await new Promise((res) => {
|
|
38
|
+
remultObjectStorage.run(remult, async () => {
|
|
39
|
+
await options.initApi(remult);
|
|
40
|
+
res({});
|
|
41
|
+
});
|
|
42
|
+
});
|
|
36
43
|
return dp;
|
|
37
44
|
});
|
|
38
45
|
}
|
|
@@ -53,6 +60,8 @@ export function createRemultServer(options) {
|
|
|
53
60
|
return bridge;
|
|
54
61
|
}
|
|
55
62
|
;
|
|
63
|
+
const remultObjectStorage = new AsyncLocalStorage();
|
|
64
|
+
let remultObjectStorageWasSetup = false;
|
|
56
65
|
class RemultServerImplementation {
|
|
57
66
|
constructor(queue, options, dataProvider) {
|
|
58
67
|
this.queue = queue;
|
|
@@ -62,6 +71,16 @@ class RemultServerImplementation {
|
|
|
62
71
|
this.hasQueue = false;
|
|
63
72
|
/* internal */
|
|
64
73
|
this.backendMethodsOpenApi = [];
|
|
74
|
+
if (!remultObjectStorageWasSetup) {
|
|
75
|
+
remultObjectStorageWasSetup = true;
|
|
76
|
+
remult.remultFactory = () => {
|
|
77
|
+
const r = remultObjectStorage.getStore();
|
|
78
|
+
if (r)
|
|
79
|
+
return r;
|
|
80
|
+
else
|
|
81
|
+
throw "remult object was requested outside of a valid context, try running it within initApi or a remult request cycle";
|
|
82
|
+
};
|
|
83
|
+
}
|
|
65
84
|
}
|
|
66
85
|
handle(req, gRes) {
|
|
67
86
|
if (!this.routeImpl) {
|
|
@@ -134,22 +153,24 @@ class RemultServerImplementation {
|
|
|
134
153
|
let myRes = new ExpressResponseBridgeToDataApiResponse(res, req);
|
|
135
154
|
let remult = new Remult();
|
|
136
155
|
remult.setDataProvider(await this.dataProvider);
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
user
|
|
156
|
+
remultObjectStorage.run(remult, async () => {
|
|
157
|
+
if (req) {
|
|
158
|
+
let user;
|
|
159
|
+
if (this.options.getUser)
|
|
160
|
+
user = await this.options.getUser(req);
|
|
161
|
+
else {
|
|
162
|
+
user = req['user'];
|
|
163
|
+
if (!user)
|
|
164
|
+
user = req['auth'];
|
|
165
|
+
}
|
|
166
|
+
if (user)
|
|
167
|
+
remult.setUser(user);
|
|
145
168
|
}
|
|
146
|
-
if (
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
}
|
|
152
|
-
what(remult, myReq, myRes, req);
|
|
169
|
+
if (this.options.initRequest) {
|
|
170
|
+
await this.options.initRequest(remult, req);
|
|
171
|
+
}
|
|
172
|
+
what(remult, myReq, myRes, req);
|
|
173
|
+
});
|
|
153
174
|
};
|
|
154
175
|
}
|
|
155
176
|
;
|
|
@@ -4,7 +4,7 @@ import { remultFresh } from '../../remult-fresh';
|
|
|
4
4
|
import { HttpProviderBridgeToRestDataProviderHttpProvider, Remult } from '../context';
|
|
5
5
|
import { InMemoryDataProvider } from '../data-providers/in-memory-database';
|
|
6
6
|
import { Entity, Fields } from '../remult3';
|
|
7
|
-
import {
|
|
7
|
+
import { BackendMethod } from '../server-action';
|
|
8
8
|
import { Categories } from '../tests/remult-3-entities';
|
|
9
9
|
Remult.apiBaseUrl = 'http://localhost:3003/api';
|
|
10
10
|
let path = Remult.apiBaseUrl + '/tasks';
|
|
@@ -158,7 +158,7 @@ Task = __decorate([
|
|
|
158
158
|
export { Task };
|
|
159
159
|
async function create3Tasks() {
|
|
160
160
|
const remult = new Remult(axios);
|
|
161
|
-
|
|
161
|
+
Remult.defaultHttpProvider = new HttpProviderBridgeToRestDataProviderHttpProvider(axios);
|
|
162
162
|
const taskRepo = remult.repo(Task);
|
|
163
163
|
for (const task of await taskRepo.find()) {
|
|
164
164
|
await taskRepo.delete(task);
|
package/esm/src/context.d.ts
CHANGED
|
@@ -41,8 +41,6 @@ export declare class Remult {
|
|
|
41
41
|
get user(): UserInfo;
|
|
42
42
|
/** Set's the current user info */
|
|
43
43
|
setUser(info: UserInfo | undefined): Promise<void>;
|
|
44
|
-
private _user;
|
|
45
|
-
private _userChangeEvent;
|
|
46
44
|
/** Checks if a user was authenticated */
|
|
47
45
|
authenticated(): boolean;
|
|
48
46
|
/** checks if the user has any of the roles specified in the parameters
|
|
@@ -59,7 +57,8 @@ export declare class Remult {
|
|
|
59
57
|
isAllowedForInstance(instance: any, allowed?: AllowedForInstance<any>): boolean;
|
|
60
58
|
/** returns a dispatcher object that fires once a user has changed*/
|
|
61
59
|
get userChange(): EventDispatcher;
|
|
62
|
-
|
|
60
|
+
static defaultHttpProvider: RestDataProviderHttpProvider;
|
|
61
|
+
static setDefaultHttpProvider(provider: HttpProvider | typeof fetch): void;
|
|
63
62
|
/** Creates a new instance of the `remult` object.
|
|
64
63
|
*
|
|
65
64
|
* Can receive either an HttpProvider or a DataProvider as a parameter - which will be used to fetch data from.
|
|
@@ -81,6 +80,9 @@ export declare class Remult {
|
|
|
81
80
|
clearAllCache(): any;
|
|
82
81
|
/** A helper callback that is called whenever an entity is created. */
|
|
83
82
|
static entityRefInit?: (ref: EntityRef<any>, row: any) => void;
|
|
83
|
+
readonly state: RemultState;
|
|
84
|
+
}
|
|
85
|
+
export interface RemultState {
|
|
84
86
|
}
|
|
85
87
|
export declare const allEntities: ClassType<any>[];
|
|
86
88
|
export interface ControllerOptions {
|
package/esm/src/context.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { actionInfo } from './server-action';
|
|
2
2
|
import { RestDataProvider, RestDataProviderHttpProviderUsingFetch } from './data-providers/rest-data-provider';
|
|
3
3
|
import { RepositoryImplementation } from "./remult3/RepositoryImplementation";
|
|
4
4
|
export class HttpProviderBridgeToRestDataProviderHttpProvider {
|
|
@@ -97,30 +97,20 @@ export class Remult {
|
|
|
97
97
|
* If no provider is specified, `fetch` will be used as an http provider
|
|
98
98
|
*/
|
|
99
99
|
constructor(provider) {
|
|
100
|
+
/* @internal */
|
|
100
101
|
this._userChangeEvent = new EventSource();
|
|
102
|
+
/* @internal */
|
|
101
103
|
this.repCache = new Map();
|
|
104
|
+
this.state = {};
|
|
102
105
|
if (provider && provider.getEntityDataProvider) {
|
|
103
106
|
this._dataSource = provider;
|
|
104
107
|
return;
|
|
105
108
|
}
|
|
106
|
-
let
|
|
107
|
-
if (!
|
|
108
|
-
|
|
109
|
-
if (http && http.get && http.put && http.post && http.delete) {
|
|
110
|
-
dataProvider = new HttpProviderBridgeToRestDataProviderHttpProvider(http);
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
if (!dataProvider) {
|
|
114
|
-
if (typeof provider === "function") {
|
|
115
|
-
dataProvider = new RestDataProviderHttpProviderUsingFetch(provider);
|
|
116
|
-
}
|
|
109
|
+
let httpDataProvider = buildRestDataProvider(provider);
|
|
110
|
+
if (!httpDataProvider) {
|
|
111
|
+
httpDataProvider = new UseDefaultRestDataProviderHttpProvider();
|
|
117
112
|
}
|
|
118
|
-
|
|
119
|
-
dataProvider = new RestDataProviderHttpProviderUsingFetch();
|
|
120
|
-
}
|
|
121
|
-
this._dataSource = new RestDataProvider(Remult.apiBaseUrl, dataProvider);
|
|
122
|
-
if (!Action.provider)
|
|
123
|
-
Action.provider = dataProvider;
|
|
113
|
+
this._dataSource = new RestDataProvider(null, httpDataProvider);
|
|
124
114
|
}
|
|
125
115
|
/**Return's a `Repository` of the specific entity type
|
|
126
116
|
* @example
|
|
@@ -224,6 +214,12 @@ export class Remult {
|
|
|
224
214
|
get userChange() {
|
|
225
215
|
return this._userChangeEvent.dispatcher;
|
|
226
216
|
}
|
|
217
|
+
static setDefaultHttpProvider(provider) {
|
|
218
|
+
const r = buildRestDataProvider(provider);
|
|
219
|
+
if (!r)
|
|
220
|
+
throw provider + " doesn't patch http provider or fetch interface";
|
|
221
|
+
Remult.defaultHttpProvider = r;
|
|
222
|
+
}
|
|
227
223
|
/** sets the current data provider */
|
|
228
224
|
setDataProvider(dataProvider) {
|
|
229
225
|
this._dataSource = dataProvider;
|
|
@@ -232,6 +228,7 @@ export class Remult {
|
|
|
232
228
|
this.repCache.clear();
|
|
233
229
|
}
|
|
234
230
|
}
|
|
231
|
+
Remult.defaultHttpProvider = new RestDataProviderHttpProviderUsingFetch();
|
|
235
232
|
/** The api Base Url to be used in all remult calls. by default it's set to `/api`.
|
|
236
233
|
*
|
|
237
234
|
* Set this property in case you want to determine a non relative api url
|
|
@@ -239,6 +236,20 @@ export class Remult {
|
|
|
239
236
|
Remult.apiBaseUrl = '/api';
|
|
240
237
|
/** A helper callback that can be used to debug and trace all find operations. Useful in debugging scenarios */
|
|
241
238
|
Remult.onFind = (metadata, options) => { };
|
|
239
|
+
class UseDefaultRestDataProviderHttpProvider {
|
|
240
|
+
post(url, data) {
|
|
241
|
+
return Remult.defaultHttpProvider.post(url, data);
|
|
242
|
+
}
|
|
243
|
+
delete(url) {
|
|
244
|
+
return Remult.defaultHttpProvider.delete(url);
|
|
245
|
+
}
|
|
246
|
+
put(url, data) {
|
|
247
|
+
return Remult.defaultHttpProvider.put(url, data);
|
|
248
|
+
}
|
|
249
|
+
get(url) {
|
|
250
|
+
return Remult.defaultHttpProvider.get(url);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
242
253
|
export const allEntities = [];
|
|
243
254
|
export const classHelpers = new Map();
|
|
244
255
|
export class ClassHelper {
|
|
@@ -251,6 +262,21 @@ export class MethodHelper {
|
|
|
251
262
|
this.classes = new Map();
|
|
252
263
|
}
|
|
253
264
|
}
|
|
265
|
+
function buildRestDataProvider(provider) {
|
|
266
|
+
let httpDataProvider;
|
|
267
|
+
if (!httpDataProvider) {
|
|
268
|
+
let http = provider;
|
|
269
|
+
if (http && http.get && http.put && http.post && http.delete) {
|
|
270
|
+
httpDataProvider = new HttpProviderBridgeToRestDataProviderHttpProvider(http);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
if (!httpDataProvider) {
|
|
274
|
+
if (typeof provider === "function") {
|
|
275
|
+
httpDataProvider = new RestDataProviderHttpProviderUsingFetch(provider);
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return httpDataProvider;
|
|
279
|
+
}
|
|
254
280
|
export function setControllerSettings(target, options) {
|
|
255
281
|
let r = target;
|
|
256
282
|
while (true) {
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Sort } from './sort';
|
|
2
2
|
import { Filter } from './filter/filter-interfaces';
|
|
3
3
|
import { EntityMetadata, OmitEB } from './remult3';
|
|
4
|
+
import { HttpProvider } from './context';
|
|
4
5
|
export interface DataProvider {
|
|
5
6
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
6
7
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
@@ -19,7 +20,7 @@ export interface EntityDataProviderFindOptions {
|
|
|
19
20
|
page?: number;
|
|
20
21
|
orderBy?: Sort;
|
|
21
22
|
}
|
|
22
|
-
export interface RestDataProviderHttpProvider {
|
|
23
|
+
export interface RestDataProviderHttpProvider extends HttpProvider {
|
|
23
24
|
post(url: string, data: any): Promise<any>;
|
|
24
25
|
delete(url: string): Promise<void>;
|
|
25
26
|
put(url: string, data: any): Promise<any>;
|
|
@@ -5,7 +5,7 @@ import { EntityMetadata } from '../remult3';
|
|
|
5
5
|
export declare class RestDataProvider implements DataProvider {
|
|
6
6
|
private url;
|
|
7
7
|
private http;
|
|
8
|
-
constructor(url: string, http: RestDataProviderHttpProvider);
|
|
8
|
+
constructor(url: string | null, http: RestDataProviderHttpProvider);
|
|
9
9
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
10
10
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
11
11
|
supportsCustomFilter: boolean;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { UrlBuilder } from '../../urlBuilder';
|
|
2
2
|
import { customUrlToken } from '../filter/filter-interfaces';
|
|
3
|
-
import { retry } from '../context';
|
|
3
|
+
import { Remult, retry } from '../context';
|
|
4
4
|
export class RestDataProvider {
|
|
5
5
|
constructor(url, http) {
|
|
6
6
|
this.url = url;
|
|
@@ -8,7 +8,10 @@ export class RestDataProvider {
|
|
|
8
8
|
this.supportsCustomFilter = true;
|
|
9
9
|
}
|
|
10
10
|
getEntityDataProvider(entity) {
|
|
11
|
-
|
|
11
|
+
let url = this.url;
|
|
12
|
+
if (url === undefined || url === null)
|
|
13
|
+
url = Remult.apiBaseUrl;
|
|
14
|
+
return new RestEntityDataProvider(url + '/' + entity.key, this.http, entity);
|
|
12
15
|
}
|
|
13
16
|
async transaction(action) {
|
|
14
17
|
throw new Error("Method not implemented.");
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Remult } from "./context";
|
|
2
|
+
let defaultRemult = new Remult();
|
|
3
|
+
/*@internal*/
|
|
4
|
+
export class RemultProxy {
|
|
5
|
+
constructor() {
|
|
6
|
+
/*@internal*/
|
|
7
|
+
this.remultFactory = () => defaultRemult;
|
|
8
|
+
this.repo = (...args) => this.remultFactory().repo(...args);
|
|
9
|
+
}
|
|
10
|
+
get state() {
|
|
11
|
+
return this.instance.state;
|
|
12
|
+
}
|
|
13
|
+
get _user() {
|
|
14
|
+
return this.instance._user;
|
|
15
|
+
}
|
|
16
|
+
;
|
|
17
|
+
get _userChangeEvent() { return this.instance._userChangeEvent; }
|
|
18
|
+
;
|
|
19
|
+
get _dataSource() { return this.instance._dataSource; }
|
|
20
|
+
;
|
|
21
|
+
get repCache() { return this.instance.repCache; }
|
|
22
|
+
;
|
|
23
|
+
setUser(info) {
|
|
24
|
+
return this.instance.setUser(info);
|
|
25
|
+
}
|
|
26
|
+
authenticated() {
|
|
27
|
+
return this.instance.authenticated();
|
|
28
|
+
}
|
|
29
|
+
isAllowed(roles) {
|
|
30
|
+
return this.instance.isAllowed(roles);
|
|
31
|
+
}
|
|
32
|
+
isAllowedForInstance(instance, allowed) {
|
|
33
|
+
return this.instance.isAllowedForInstance(instance, allowed);
|
|
34
|
+
}
|
|
35
|
+
get userChange() {
|
|
36
|
+
return this.instance.userChange;
|
|
37
|
+
}
|
|
38
|
+
setDataProvider(dataProvider) {
|
|
39
|
+
return this.instance.setDataProvider(dataProvider);
|
|
40
|
+
}
|
|
41
|
+
clearAllCache() {
|
|
42
|
+
return this.instance.clearAllCache();
|
|
43
|
+
}
|
|
44
|
+
get instance() {
|
|
45
|
+
return this.remultFactory();
|
|
46
|
+
}
|
|
47
|
+
get user() {
|
|
48
|
+
return this.remultFactory().user;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
export const remult = new RemultProxy();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { Remult, AllowedForInstance } from './context';
|
|
3
3
|
import { DataApiRequest, DataApiResponse } from './data-api';
|
|
4
|
-
import { DataProvider
|
|
4
|
+
import { DataProvider } from './data-interfaces';
|
|
5
5
|
interface inArgs {
|
|
6
6
|
args: any[];
|
|
7
7
|
}
|
|
@@ -14,7 +14,6 @@ export declare abstract class Action<inParam, outParam> {
|
|
|
14
14
|
private allowed;
|
|
15
15
|
constructor(actionUrl: string, queue: boolean, allowed: AllowedForInstance<any>);
|
|
16
16
|
static apiUrlForJobStatus: string;
|
|
17
|
-
static provider: RestDataProviderHttpProvider;
|
|
18
17
|
run(pIn: inParam): Promise<outParam>;
|
|
19
18
|
protected abstract execute(info: inParam, req: Remult, res: DataApiResponse): Promise<outParam>;
|
|
20
19
|
__register(reg: (url: string, queue: boolean, allowed: AllowedForInstance<any>, what: ((data: any, req: Remult, res: DataApiResponse) => void)) => void): void;
|
package/esm/src/server-action.js
CHANGED
|
@@ -9,7 +9,7 @@ export class Action {
|
|
|
9
9
|
this.allowed = allowed;
|
|
10
10
|
}
|
|
11
11
|
async run(pIn) {
|
|
12
|
-
let r = await
|
|
12
|
+
let r = await Remult.defaultHttpProvider.post(Remult.apiBaseUrl + '/' + this.actionUrl, pIn);
|
|
13
13
|
let p = r;
|
|
14
14
|
if (p && p.queuedJobId) {
|
|
15
15
|
let progress = actionInfo.startBusyWithProgress();
|
|
@@ -21,7 +21,7 @@ export class Action {
|
|
|
21
21
|
await new Promise(res => setTimeout(() => {
|
|
22
22
|
res(undefined);
|
|
23
23
|
}, 200));
|
|
24
|
-
runningJob = await
|
|
24
|
+
runningJob = await Remult.defaultHttpProvider.post(Remult.apiBaseUrl + '/' + Action.apiUrlForJobStatus, { queuedJobId: r.queuedJobId });
|
|
25
25
|
if (runningJob.progress) {
|
|
26
26
|
progress.progress(runningJob.progress);
|
|
27
27
|
}
|
|
@@ -5,7 +5,7 @@ import { InMemoryDataProvider } from "../data-providers/in-memory-database";
|
|
|
5
5
|
import { RestEntityDataProvider } from "../data-providers/rest-data-provider";
|
|
6
6
|
import { SqlDatabase } from "../data-providers/sql-database";
|
|
7
7
|
import { WebSqlDataProvider } from "../data-providers/web-sql-data-provider";
|
|
8
|
-
import {
|
|
8
|
+
import { actionInfo, serverActionField } from "../server-action";
|
|
9
9
|
import { testConfiguration } from '../shared-tests/entityWithValidations';
|
|
10
10
|
import { TestDataApiResponse } from './TestDataApiResponse';
|
|
11
11
|
jasmine.DEFAULT_TIMEOUT_INTERVAL = 999999;
|
|
@@ -48,7 +48,7 @@ export async function testAsIfOnBackend(what) {
|
|
|
48
48
|
export const ActionTestConfig = {
|
|
49
49
|
db: new InMemoryDataProvider()
|
|
50
50
|
};
|
|
51
|
-
|
|
51
|
+
Remult.defaultHttpProvider = {
|
|
52
52
|
delete: undefined,
|
|
53
53
|
get: undefined,
|
|
54
54
|
post: async (urlreq, data) => {
|
package/index.d.ts
CHANGED
|
@@ -8,7 +8,8 @@ export { RestDataProvider } from './src/data-providers/rest-data-provider';
|
|
|
8
8
|
export { InMemoryDataProvider } from './src/data-providers/in-memory-database';
|
|
9
9
|
export { ArrayEntityDataProvider } from './src/data-providers/array-entity-data-provider';
|
|
10
10
|
export { WebSqlDataProvider } from './src/data-providers/web-sql-data-provider';
|
|
11
|
-
export { SqlDatabase } from './src/data-providers/sql-database';
|
|
11
|
+
export { SqlDatabase, } from './src/data-providers/sql-database';
|
|
12
|
+
export { CustomSqlFilterObject, CustomSqlFilterBuilder } from './src/filter/filter-consumer-bridge-to-sql-request';
|
|
12
13
|
export { JsonDataProvider, JsonEntityStorage } from './src/data-providers/json-data-provider';
|
|
13
14
|
export { Controller, BackendMethodOptions, BackendMethod, ProgressListener } from './src/server-action';
|
|
14
15
|
export { Allowed, Allow, Remult, isBackend, AllowedForInstance, EventDispatcher, EventSource, HttpProvider, Unobserve, UserInfo } from './src/context';
|
|
@@ -20,3 +21,4 @@ export { FilterConsumerBridgeToSqlRequest } from './src/filter/filter-consumer-b
|
|
|
20
21
|
export { UrlBuilder } from './urlBuilder';
|
|
21
22
|
export { Validators } from './src/validators';
|
|
22
23
|
export { ValueConverters } from './src/valueConverters';
|
|
24
|
+
export { remult } from './src/remult-proxy';
|
package/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.ValueConverters = exports.Validators = exports.UrlBuilder = exports.FilterConsumerBridgeToSqlRequest = exports.Filter = exports.CompoundIdField = exports.OneToMany = exports.Sort = exports.IdEntity = exports.EventSource = exports.isBackend = exports.Remult = exports.Allow = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonDataProvider = exports.SqlDatabase = exports.WebSqlDataProvider = exports.ArrayEntityDataProvider = exports.InMemoryDataProvider = exports.RestDataProvider = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getEntityRef = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.BuildEntity = exports.Entity = exports.Fields = exports.Field = void 0;
|
|
3
|
+
exports.remult = exports.ValueConverters = exports.Validators = exports.UrlBuilder = exports.FilterConsumerBridgeToSqlRequest = exports.Filter = exports.CompoundIdField = exports.OneToMany = exports.Sort = exports.IdEntity = exports.EventSource = exports.isBackend = exports.Remult = exports.Allow = exports.ProgressListener = exports.BackendMethod = exports.Controller = exports.JsonDataProvider = exports.CustomSqlFilterBuilder = exports.SqlDatabase = exports.WebSqlDataProvider = exports.ArrayEntityDataProvider = exports.InMemoryDataProvider = exports.RestDataProvider = exports.CaptionTransformer = exports.ValueListInfo = exports.getValueList = exports.ValueListFieldType = exports.getEntityRef = exports.getFields = exports.FieldType = exports.ControllerBase = exports.EntityBase = exports.BuildEntity = exports.Entity = exports.Fields = exports.Field = void 0;
|
|
4
4
|
/*
|
|
5
5
|
* Public API Surface of remult
|
|
6
6
|
*/
|
|
@@ -28,6 +28,8 @@ var web_sql_data_provider_1 = require("./src/data-providers/web-sql-data-provide
|
|
|
28
28
|
Object.defineProperty(exports, "WebSqlDataProvider", { enumerable: true, get: function () { return web_sql_data_provider_1.WebSqlDataProvider; } });
|
|
29
29
|
var sql_database_1 = require("./src/data-providers/sql-database"); //V
|
|
30
30
|
Object.defineProperty(exports, "SqlDatabase", { enumerable: true, get: function () { return sql_database_1.SqlDatabase; } });
|
|
31
|
+
var filter_consumer_bridge_to_sql_request_1 = require("./src/filter/filter-consumer-bridge-to-sql-request");
|
|
32
|
+
Object.defineProperty(exports, "CustomSqlFilterBuilder", { enumerable: true, get: function () { return filter_consumer_bridge_to_sql_request_1.CustomSqlFilterBuilder; } });
|
|
31
33
|
var json_data_provider_1 = require("./src/data-providers/json-data-provider"); //V
|
|
32
34
|
Object.defineProperty(exports, "JsonDataProvider", { enumerable: true, get: function () { return json_data_provider_1.JsonDataProvider; } });
|
|
33
35
|
//export * from './src/data-api'; //reconsider if to make internal
|
|
@@ -49,11 +51,13 @@ Object.defineProperty(exports, "OneToMany", { enumerable: true, get: function ()
|
|
|
49
51
|
Object.defineProperty(exports, "CompoundIdField", { enumerable: true, get: function () { return column_1.CompoundIdField; } });
|
|
50
52
|
var filter_interfaces_1 = require("./src/filter/filter-interfaces");
|
|
51
53
|
Object.defineProperty(exports, "Filter", { enumerable: true, get: function () { return filter_interfaces_1.Filter; } });
|
|
52
|
-
var
|
|
53
|
-
Object.defineProperty(exports, "FilterConsumerBridgeToSqlRequest", { enumerable: true, get: function () { return
|
|
54
|
+
var filter_consumer_bridge_to_sql_request_2 = require("./src/filter/filter-consumer-bridge-to-sql-request");
|
|
55
|
+
Object.defineProperty(exports, "FilterConsumerBridgeToSqlRequest", { enumerable: true, get: function () { return filter_consumer_bridge_to_sql_request_2.FilterConsumerBridgeToSqlRequest; } });
|
|
54
56
|
var urlBuilder_1 = require("./urlBuilder");
|
|
55
57
|
Object.defineProperty(exports, "UrlBuilder", { enumerable: true, get: function () { return urlBuilder_1.UrlBuilder; } });
|
|
56
58
|
var validators_1 = require("./src/validators");
|
|
57
59
|
Object.defineProperty(exports, "Validators", { enumerable: true, get: function () { return validators_1.Validators; } });
|
|
58
60
|
var valueConverters_1 = require("./src/valueConverters");
|
|
59
61
|
Object.defineProperty(exports, "ValueConverters", { enumerable: true, get: function () { return valueConverters_1.ValueConverters; } });
|
|
62
|
+
var remult_proxy_1 = require("./src/remult-proxy");
|
|
63
|
+
Object.defineProperty(exports, "remult", { enumerable: true, get: function () { return remult_proxy_1.remult; } });
|
package/package.json
CHANGED
package/server/expressBridge.js
CHANGED
|
@@ -7,6 +7,8 @@ var data_api_1 = require("../src/data-api");
|
|
|
7
7
|
var context_1 = require("../src/context");
|
|
8
8
|
var remult3_1 = require("../src/remult3");
|
|
9
9
|
var id_entity_1 = require("../src/id-entity");
|
|
10
|
+
var async_hooks_1 = require("async_hooks");
|
|
11
|
+
var remult_proxy_1 = require("../src/remult-proxy");
|
|
10
12
|
;
|
|
11
13
|
function createRemultServer(options) {
|
|
12
14
|
var _this = this;
|
|
@@ -42,11 +44,24 @@ function createRemultServer(options) {
|
|
|
42
44
|
if (options.initApi) {
|
|
43
45
|
dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
44
46
|
var remult;
|
|
47
|
+
var _this = this;
|
|
45
48
|
return tslib_1.__generator(this, function (_a) {
|
|
46
49
|
switch (_a.label) {
|
|
47
50
|
case 0:
|
|
48
51
|
remult = new context_1.Remult(dp);
|
|
49
|
-
return [4 /*yield*/,
|
|
52
|
+
return [4 /*yield*/, new Promise(function (res) {
|
|
53
|
+
remultObjectStorage.run(remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
54
|
+
return tslib_1.__generator(this, function (_a) {
|
|
55
|
+
switch (_a.label) {
|
|
56
|
+
case 0: return [4 /*yield*/, options.initApi(remult)];
|
|
57
|
+
case 1:
|
|
58
|
+
_a.sent();
|
|
59
|
+
res({});
|
|
60
|
+
return [2 /*return*/];
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}); });
|
|
64
|
+
})];
|
|
50
65
|
case 1:
|
|
51
66
|
_a.sent();
|
|
52
67
|
return [2 /*return*/, dp];
|
|
@@ -72,6 +87,8 @@ function createRemultServer(options) {
|
|
|
72
87
|
}
|
|
73
88
|
exports.createRemultServer = createRemultServer;
|
|
74
89
|
;
|
|
90
|
+
var remultObjectStorage = new async_hooks_1.AsyncLocalStorage();
|
|
91
|
+
var remultObjectStorageWasSetup = false;
|
|
75
92
|
var RemultServerImplementation = /** @class */ (function () {
|
|
76
93
|
function RemultServerImplementation(queue, options, dataProvider) {
|
|
77
94
|
this.queue = queue;
|
|
@@ -81,6 +98,16 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
81
98
|
this.hasQueue = false;
|
|
82
99
|
/* internal */
|
|
83
100
|
this.backendMethodsOpenApi = [];
|
|
101
|
+
if (!remultObjectStorageWasSetup) {
|
|
102
|
+
remultObjectStorageWasSetup = true;
|
|
103
|
+
remult_proxy_1.remult.remultFactory = function () {
|
|
104
|
+
var r = remultObjectStorage.getStore();
|
|
105
|
+
if (r)
|
|
106
|
+
return r;
|
|
107
|
+
else
|
|
108
|
+
throw "remult object was requested outside of a valid context, try running it within initApi or a remult request cycle";
|
|
109
|
+
};
|
|
110
|
+
}
|
|
84
111
|
}
|
|
85
112
|
RemultServerImplementation.prototype.handle = function (req, gRes) {
|
|
86
113
|
if (!this.routeImpl) {
|
|
@@ -195,7 +222,8 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
195
222
|
RemultServerImplementation.prototype.process = function (what) {
|
|
196
223
|
var _this = this;
|
|
197
224
|
return function (req, res) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
198
|
-
var myReq, myRes, remult, _a, _b
|
|
225
|
+
var myReq, myRes, remult, _a, _b;
|
|
226
|
+
var _this = this;
|
|
199
227
|
return tslib_1.__generator(this, function (_c) {
|
|
200
228
|
switch (_c.label) {
|
|
201
229
|
case 0:
|
|
@@ -206,30 +234,39 @@ var RemultServerImplementation = /** @class */ (function () {
|
|
|
206
234
|
return [4 /*yield*/, this.dataProvider];
|
|
207
235
|
case 1:
|
|
208
236
|
_b.apply(_a, [_c.sent()]);
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
237
|
+
remultObjectStorage.run(remult, function () { return tslib_1.__awaiter(_this, void 0, void 0, function () {
|
|
238
|
+
var user;
|
|
239
|
+
return tslib_1.__generator(this, function (_a) {
|
|
240
|
+
switch (_a.label) {
|
|
241
|
+
case 0:
|
|
242
|
+
if (!req) return [3 /*break*/, 4];
|
|
243
|
+
user = void 0;
|
|
244
|
+
if (!this.options.getUser) return [3 /*break*/, 2];
|
|
245
|
+
return [4 /*yield*/, this.options.getUser(req)];
|
|
246
|
+
case 1:
|
|
247
|
+
user = _a.sent();
|
|
248
|
+
return [3 /*break*/, 3];
|
|
249
|
+
case 2:
|
|
250
|
+
user = req['user'];
|
|
251
|
+
if (!user)
|
|
252
|
+
user = req['auth'];
|
|
253
|
+
_a.label = 3;
|
|
254
|
+
case 3:
|
|
255
|
+
if (user)
|
|
256
|
+
remult.setUser(user);
|
|
257
|
+
_a.label = 4;
|
|
258
|
+
case 4:
|
|
259
|
+
if (!this.options.initRequest) return [3 /*break*/, 6];
|
|
260
|
+
return [4 /*yield*/, this.options.initRequest(remult, req)];
|
|
261
|
+
case 5:
|
|
262
|
+
_a.sent();
|
|
263
|
+
_a.label = 6;
|
|
264
|
+
case 6:
|
|
265
|
+
what(remult, myReq, myRes, req);
|
|
266
|
+
return [2 /*return*/];
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
}); });
|
|
233
270
|
return [2 /*return*/];
|
|
234
271
|
}
|
|
235
272
|
});
|
|
@@ -292,7 +292,7 @@ function create3Tasks() {
|
|
|
292
292
|
switch (_f.label) {
|
|
293
293
|
case 0:
|
|
294
294
|
remult = new context_1.Remult(axios_1.default);
|
|
295
|
-
|
|
295
|
+
context_1.Remult.defaultHttpProvider = new context_1.HttpProviderBridgeToRestDataProviderHttpProvider(axios_1.default);
|
|
296
296
|
taskRepo = remult.repo(Task);
|
|
297
297
|
_f.label = 1;
|
|
298
298
|
case 1:
|
package/src/context.d.ts
CHANGED
|
@@ -41,8 +41,6 @@ export declare class Remult {
|
|
|
41
41
|
get user(): UserInfo;
|
|
42
42
|
/** Set's the current user info */
|
|
43
43
|
setUser(info: UserInfo | undefined): Promise<void>;
|
|
44
|
-
private _user;
|
|
45
|
-
private _userChangeEvent;
|
|
46
44
|
/** Checks if a user was authenticated */
|
|
47
45
|
authenticated(): boolean;
|
|
48
46
|
/** checks if the user has any of the roles specified in the parameters
|
|
@@ -59,7 +57,8 @@ export declare class Remult {
|
|
|
59
57
|
isAllowedForInstance(instance: any, allowed?: AllowedForInstance<any>): boolean;
|
|
60
58
|
/** returns a dispatcher object that fires once a user has changed*/
|
|
61
59
|
get userChange(): EventDispatcher;
|
|
62
|
-
|
|
60
|
+
static defaultHttpProvider: RestDataProviderHttpProvider;
|
|
61
|
+
static setDefaultHttpProvider(provider: HttpProvider | typeof fetch): void;
|
|
63
62
|
/** Creates a new instance of the `remult` object.
|
|
64
63
|
*
|
|
65
64
|
* Can receive either an HttpProvider or a DataProvider as a parameter - which will be used to fetch data from.
|
|
@@ -81,6 +80,9 @@ export declare class Remult {
|
|
|
81
80
|
clearAllCache(): any;
|
|
82
81
|
/** A helper callback that is called whenever an entity is created. */
|
|
83
82
|
static entityRefInit?: (ref: EntityRef<any>, row: any) => void;
|
|
83
|
+
readonly state: RemultState;
|
|
84
|
+
}
|
|
85
|
+
export interface RemultState {
|
|
84
86
|
}
|
|
85
87
|
export declare const allEntities: ClassType<any>[];
|
|
86
88
|
export interface ControllerOptions {
|
package/src/context.js
CHANGED
|
@@ -148,30 +148,20 @@ var Remult = /** @class */ (function () {
|
|
|
148
148
|
* If no provider is specified, `fetch` will be used as an http provider
|
|
149
149
|
*/
|
|
150
150
|
function Remult(provider) {
|
|
151
|
+
/* @internal */
|
|
151
152
|
this._userChangeEvent = new EventSource();
|
|
153
|
+
/* @internal */
|
|
152
154
|
this.repCache = new Map();
|
|
155
|
+
this.state = {};
|
|
153
156
|
if (provider && provider.getEntityDataProvider) {
|
|
154
157
|
this._dataSource = provider;
|
|
155
158
|
return;
|
|
156
159
|
}
|
|
157
|
-
var
|
|
158
|
-
if (!
|
|
159
|
-
|
|
160
|
-
if (http && http.get && http.put && http.post && http.delete) {
|
|
161
|
-
dataProvider = new HttpProviderBridgeToRestDataProviderHttpProvider(http);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
if (!dataProvider) {
|
|
165
|
-
if (typeof provider === "function") {
|
|
166
|
-
dataProvider = new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch(provider);
|
|
167
|
-
}
|
|
168
|
-
}
|
|
169
|
-
if (!dataProvider) {
|
|
170
|
-
dataProvider = new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch();
|
|
160
|
+
var httpDataProvider = buildRestDataProvider(provider);
|
|
161
|
+
if (!httpDataProvider) {
|
|
162
|
+
httpDataProvider = new UseDefaultRestDataProviderHttpProvider();
|
|
171
163
|
}
|
|
172
|
-
this._dataSource = new rest_data_provider_1.RestDataProvider(
|
|
173
|
-
if (!server_action_1.Action.provider)
|
|
174
|
-
server_action_1.Action.provider = dataProvider;
|
|
164
|
+
this._dataSource = new rest_data_provider_1.RestDataProvider(null, httpDataProvider);
|
|
175
165
|
}
|
|
176
166
|
/**Return's a `Repository` of the specific entity type
|
|
177
167
|
* @example
|
|
@@ -316,6 +306,12 @@ var Remult = /** @class */ (function () {
|
|
|
316
306
|
enumerable: false,
|
|
317
307
|
configurable: true
|
|
318
308
|
});
|
|
309
|
+
Remult.setDefaultHttpProvider = function (provider) {
|
|
310
|
+
var r = buildRestDataProvider(provider);
|
|
311
|
+
if (!r)
|
|
312
|
+
throw provider + " doesn't patch http provider or fetch interface";
|
|
313
|
+
Remult.defaultHttpProvider = r;
|
|
314
|
+
};
|
|
319
315
|
/** sets the current data provider */
|
|
320
316
|
Remult.prototype.setDataProvider = function (dataProvider) {
|
|
321
317
|
this._dataSource = dataProvider;
|
|
@@ -323,6 +319,7 @@ var Remult = /** @class */ (function () {
|
|
|
323
319
|
Remult.prototype.clearAllCache = function () {
|
|
324
320
|
this.repCache.clear();
|
|
325
321
|
};
|
|
322
|
+
Remult.defaultHttpProvider = new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch();
|
|
326
323
|
/** The api Base Url to be used in all remult calls. by default it's set to `/api`.
|
|
327
324
|
*
|
|
328
325
|
* Set this property in case you want to determine a non relative api url
|
|
@@ -333,6 +330,23 @@ var Remult = /** @class */ (function () {
|
|
|
333
330
|
return Remult;
|
|
334
331
|
}());
|
|
335
332
|
exports.Remult = Remult;
|
|
333
|
+
var UseDefaultRestDataProviderHttpProvider = /** @class */ (function () {
|
|
334
|
+
function UseDefaultRestDataProviderHttpProvider() {
|
|
335
|
+
}
|
|
336
|
+
UseDefaultRestDataProviderHttpProvider.prototype.post = function (url, data) {
|
|
337
|
+
return Remult.defaultHttpProvider.post(url, data);
|
|
338
|
+
};
|
|
339
|
+
UseDefaultRestDataProviderHttpProvider.prototype.delete = function (url) {
|
|
340
|
+
return Remult.defaultHttpProvider.delete(url);
|
|
341
|
+
};
|
|
342
|
+
UseDefaultRestDataProviderHttpProvider.prototype.put = function (url, data) {
|
|
343
|
+
return Remult.defaultHttpProvider.put(url, data);
|
|
344
|
+
};
|
|
345
|
+
UseDefaultRestDataProviderHttpProvider.prototype.get = function (url) {
|
|
346
|
+
return Remult.defaultHttpProvider.get(url);
|
|
347
|
+
};
|
|
348
|
+
return UseDefaultRestDataProviderHttpProvider;
|
|
349
|
+
}());
|
|
336
350
|
exports.allEntities = [];
|
|
337
351
|
exports.classHelpers = new Map();
|
|
338
352
|
var ClassHelper = /** @class */ (function () {
|
|
@@ -349,6 +363,21 @@ var MethodHelper = /** @class */ (function () {
|
|
|
349
363
|
return MethodHelper;
|
|
350
364
|
}());
|
|
351
365
|
exports.MethodHelper = MethodHelper;
|
|
366
|
+
function buildRestDataProvider(provider) {
|
|
367
|
+
var httpDataProvider;
|
|
368
|
+
if (!httpDataProvider) {
|
|
369
|
+
var http = provider;
|
|
370
|
+
if (http && http.get && http.put && http.post && http.delete) {
|
|
371
|
+
httpDataProvider = new HttpProviderBridgeToRestDataProviderHttpProvider(http);
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
if (!httpDataProvider) {
|
|
375
|
+
if (typeof provider === "function") {
|
|
376
|
+
httpDataProvider = new rest_data_provider_1.RestDataProviderHttpProviderUsingFetch(provider);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
return httpDataProvider;
|
|
380
|
+
}
|
|
352
381
|
function setControllerSettings(target, options) {
|
|
353
382
|
var e_3, _a;
|
|
354
383
|
var r = target;
|
package/src/data-interfaces.d.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { Sort } from './sort';
|
|
2
2
|
import { Filter } from './filter/filter-interfaces';
|
|
3
3
|
import { EntityMetadata, OmitEB } from './remult3';
|
|
4
|
+
import { HttpProvider } from './context';
|
|
4
5
|
export interface DataProvider {
|
|
5
6
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
6
7
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
@@ -19,7 +20,7 @@ export interface EntityDataProviderFindOptions {
|
|
|
19
20
|
page?: number;
|
|
20
21
|
orderBy?: Sort;
|
|
21
22
|
}
|
|
22
|
-
export interface RestDataProviderHttpProvider {
|
|
23
|
+
export interface RestDataProviderHttpProvider extends HttpProvider {
|
|
23
24
|
post(url: string, data: any): Promise<any>;
|
|
24
25
|
delete(url: string): Promise<void>;
|
|
25
26
|
put(url: string, data: any): Promise<any>;
|
|
@@ -5,7 +5,7 @@ import { EntityMetadata } from '../remult3';
|
|
|
5
5
|
export declare class RestDataProvider implements DataProvider {
|
|
6
6
|
private url;
|
|
7
7
|
private http;
|
|
8
|
-
constructor(url: string, http: RestDataProviderHttpProvider);
|
|
8
|
+
constructor(url: string | null, http: RestDataProviderHttpProvider);
|
|
9
9
|
getEntityDataProvider(entity: EntityMetadata): EntityDataProvider;
|
|
10
10
|
transaction(action: (dataProvider: DataProvider) => Promise<void>): Promise<void>;
|
|
11
11
|
supportsCustomFilter: boolean;
|
|
@@ -12,7 +12,10 @@ var RestDataProvider = /** @class */ (function () {
|
|
|
12
12
|
this.supportsCustomFilter = true;
|
|
13
13
|
}
|
|
14
14
|
RestDataProvider.prototype.getEntityDataProvider = function (entity) {
|
|
15
|
-
|
|
15
|
+
var url = this.url;
|
|
16
|
+
if (url === undefined || url === null)
|
|
17
|
+
url = context_1.Remult.apiBaseUrl;
|
|
18
|
+
return new RestEntityDataProvider(url + '/' + entity.key, this.http, entity);
|
|
16
19
|
};
|
|
17
20
|
RestDataProvider.prototype.transaction = function (action) {
|
|
18
21
|
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.remult = exports.RemultProxy = void 0;
|
|
4
|
+
var tslib_1 = require("tslib");
|
|
5
|
+
var context_1 = require("./context");
|
|
6
|
+
var defaultRemult = new context_1.Remult();
|
|
7
|
+
/*@internal*/
|
|
8
|
+
var RemultProxy = /** @class */ (function () {
|
|
9
|
+
function RemultProxy() {
|
|
10
|
+
var _this = this;
|
|
11
|
+
/*@internal*/
|
|
12
|
+
this.remultFactory = function () { return defaultRemult; };
|
|
13
|
+
this.repo = function () {
|
|
14
|
+
var _a;
|
|
15
|
+
var args = [];
|
|
16
|
+
for (var _i = 0; _i < arguments.length; _i++) {
|
|
17
|
+
args[_i] = arguments[_i];
|
|
18
|
+
}
|
|
19
|
+
return (_a = _this.remultFactory()).repo.apply(_a, tslib_1.__spread(args));
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
Object.defineProperty(RemultProxy.prototype, "state", {
|
|
23
|
+
get: function () {
|
|
24
|
+
return this.instance.state;
|
|
25
|
+
},
|
|
26
|
+
enumerable: false,
|
|
27
|
+
configurable: true
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(RemultProxy.prototype, "_user", {
|
|
30
|
+
get: function () {
|
|
31
|
+
return this.instance._user;
|
|
32
|
+
},
|
|
33
|
+
enumerable: false,
|
|
34
|
+
configurable: true
|
|
35
|
+
});
|
|
36
|
+
;
|
|
37
|
+
Object.defineProperty(RemultProxy.prototype, "_userChangeEvent", {
|
|
38
|
+
get: function () { return this.instance._userChangeEvent; },
|
|
39
|
+
enumerable: false,
|
|
40
|
+
configurable: true
|
|
41
|
+
});
|
|
42
|
+
;
|
|
43
|
+
Object.defineProperty(RemultProxy.prototype, "_dataSource", {
|
|
44
|
+
get: function () { return this.instance._dataSource; },
|
|
45
|
+
enumerable: false,
|
|
46
|
+
configurable: true
|
|
47
|
+
});
|
|
48
|
+
;
|
|
49
|
+
Object.defineProperty(RemultProxy.prototype, "repCache", {
|
|
50
|
+
get: function () { return this.instance.repCache; },
|
|
51
|
+
enumerable: false,
|
|
52
|
+
configurable: true
|
|
53
|
+
});
|
|
54
|
+
;
|
|
55
|
+
RemultProxy.prototype.setUser = function (info) {
|
|
56
|
+
return this.instance.setUser(info);
|
|
57
|
+
};
|
|
58
|
+
RemultProxy.prototype.authenticated = function () {
|
|
59
|
+
return this.instance.authenticated();
|
|
60
|
+
};
|
|
61
|
+
RemultProxy.prototype.isAllowed = function (roles) {
|
|
62
|
+
return this.instance.isAllowed(roles);
|
|
63
|
+
};
|
|
64
|
+
RemultProxy.prototype.isAllowedForInstance = function (instance, allowed) {
|
|
65
|
+
return this.instance.isAllowedForInstance(instance, allowed);
|
|
66
|
+
};
|
|
67
|
+
Object.defineProperty(RemultProxy.prototype, "userChange", {
|
|
68
|
+
get: function () {
|
|
69
|
+
return this.instance.userChange;
|
|
70
|
+
},
|
|
71
|
+
enumerable: false,
|
|
72
|
+
configurable: true
|
|
73
|
+
});
|
|
74
|
+
RemultProxy.prototype.setDataProvider = function (dataProvider) {
|
|
75
|
+
return this.instance.setDataProvider(dataProvider);
|
|
76
|
+
};
|
|
77
|
+
RemultProxy.prototype.clearAllCache = function () {
|
|
78
|
+
return this.instance.clearAllCache();
|
|
79
|
+
};
|
|
80
|
+
Object.defineProperty(RemultProxy.prototype, "instance", {
|
|
81
|
+
get: function () {
|
|
82
|
+
return this.remultFactory();
|
|
83
|
+
},
|
|
84
|
+
enumerable: false,
|
|
85
|
+
configurable: true
|
|
86
|
+
});
|
|
87
|
+
Object.defineProperty(RemultProxy.prototype, "user", {
|
|
88
|
+
get: function () {
|
|
89
|
+
return this.remultFactory().user;
|
|
90
|
+
},
|
|
91
|
+
enumerable: false,
|
|
92
|
+
configurable: true
|
|
93
|
+
});
|
|
94
|
+
return RemultProxy;
|
|
95
|
+
}());
|
|
96
|
+
exports.RemultProxy = RemultProxy;
|
|
97
|
+
exports.remult = new RemultProxy();
|
package/src/server-action.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import 'reflect-metadata';
|
|
2
2
|
import { Remult, AllowedForInstance } from './context';
|
|
3
3
|
import { DataApiRequest, DataApiResponse } from './data-api';
|
|
4
|
-
import { DataProvider
|
|
4
|
+
import { DataProvider } from './data-interfaces';
|
|
5
5
|
interface inArgs {
|
|
6
6
|
args: any[];
|
|
7
7
|
}
|
|
@@ -14,7 +14,6 @@ export declare abstract class Action<inParam, outParam> {
|
|
|
14
14
|
private allowed;
|
|
15
15
|
constructor(actionUrl: string, queue: boolean, allowed: AllowedForInstance<any>);
|
|
16
16
|
static apiUrlForJobStatus: string;
|
|
17
|
-
static provider: RestDataProviderHttpProvider;
|
|
18
17
|
run(pIn: inParam): Promise<outParam>;
|
|
19
18
|
protected abstract execute(info: inParam, req: Remult, res: DataApiResponse): Promise<outParam>;
|
|
20
19
|
__register(reg: (url: string, queue: boolean, allowed: AllowedForInstance<any>, what: ((data: any, req: Remult, res: DataApiResponse) => void)) => void): void;
|
package/src/server-action.js
CHANGED
|
@@ -18,7 +18,7 @@ var Action = /** @class */ (function () {
|
|
|
18
18
|
var _this = this;
|
|
19
19
|
return tslib_1.__generator(this, function (_a) {
|
|
20
20
|
switch (_a.label) {
|
|
21
|
-
case 0: return [4 /*yield*/,
|
|
21
|
+
case 0: return [4 /*yield*/, context_1.Remult.defaultHttpProvider.post(context_1.Remult.apiBaseUrl + '/' + this.actionUrl, pIn)];
|
|
22
22
|
case 1:
|
|
23
23
|
r = _a.sent();
|
|
24
24
|
p = r;
|
|
@@ -39,7 +39,7 @@ var Action = /** @class */ (function () {
|
|
|
39
39
|
case 1:
|
|
40
40
|
_a.sent();
|
|
41
41
|
_a.label = 2;
|
|
42
|
-
case 2: return [4 /*yield*/,
|
|
42
|
+
case 2: return [4 /*yield*/, context_1.Remult.defaultHttpProvider.post(context_1.Remult.apiBaseUrl + '/' + Action.apiUrlForJobStatus, { queuedJobId: r.queuedJobId })];
|
|
43
43
|
case 3:
|
|
44
44
|
runningJob_1 = _a.sent();
|
|
45
45
|
if (runningJob_1.progress) {
|
|
@@ -65,7 +65,7 @@ exports.testAsIfOnBackend = testAsIfOnBackend;
|
|
|
65
65
|
exports.ActionTestConfig = {
|
|
66
66
|
db: new in_memory_database_1.InMemoryDataProvider()
|
|
67
67
|
};
|
|
68
|
-
|
|
68
|
+
context_1.Remult.defaultHttpProvider = {
|
|
69
69
|
delete: undefined,
|
|
70
70
|
get: undefined,
|
|
71
71
|
post: function (urlreq, data) { return tslib_1.__awaiter(void 0, void 0, void 0, function () {
|