remult 3.0.5 → 3.0.6-next.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.
@@ -5,6 +5,7 @@ export { SseSubscriptionServer } from '../SseSubscriptionServer.js';
5
5
  export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-query-storage.js';
6
6
  export { JsonEntityFileStorage, JsonFileDataProvider, } from './JsonEntityFileStorage.js';
7
7
  export { TestApiDataProvider } from './test-api-data-provider.js';
8
+ export { Module } from './module.js';
8
9
  export function createRemultServer(options, serverCoreOptions) {
9
10
  initAsyncHooks();
10
11
  return createRemultServerCore(options, serverCoreOptions || {
@@ -0,0 +1,38 @@
1
+ export class Module {
2
+ key;
3
+ priority;
4
+ entities;
5
+ controllers;
6
+ initApi;
7
+ initRequest;
8
+ modules;
9
+ constructor(options) {
10
+ this.key = options.key;
11
+ this.priority = options.priority ?? 0;
12
+ this.entities = options.entities;
13
+ this.controllers = options.controllers;
14
+ this.initRequest = options.initRequest;
15
+ this.initApi = options.initApi;
16
+ this.modules = options.modules;
17
+ }
18
+ }
19
+ /**
20
+ * Full flat and ordered list by index and concatenaining the modules name
21
+ */
22
+ export const modulesFlatAndOrdered = (modules) => {
23
+ const flattenModules = (modules, parentName = '') => {
24
+ return modules.reduce((acc, module) => {
25
+ const fullKey = parentName ? `${parentName}-${module.key}` : module.key;
26
+ // Create a new module object without the 'modules' property
27
+ const { modules: _, ...flatModule } = module;
28
+ const newModule = { ...flatModule, key: fullKey };
29
+ const subModules = module.modules
30
+ ? flattenModules(module.modules, fullKey)
31
+ : [];
32
+ return [...acc, newModule, ...subModules];
33
+ }, []);
34
+ };
35
+ const flatModules = flattenModules(modules);
36
+ flatModules.sort((a, b) => a.priority - b.priority);
37
+ return flatModules;
38
+ };
@@ -14,6 +14,7 @@ import { remultStatic } from '../src/remult-static.js';
14
14
  import remultAdminHtml, { buildEntityInfo } from './remult-admin.js';
15
15
  import { isOfType } from '../src/isOfType.js';
16
16
  import { initDataProviderOrJson } from './initDataProviderOrJson.js';
17
+ import { modulesFlatAndOrdered } from './module.js';
17
18
  export function createRemultServerCore(options, serverCoreOptions) {
18
19
  const safeOptions = options ?? {};
19
20
  if (!safeOptions.entities)
@@ -57,6 +58,9 @@ export class RemultServerImplementation {
57
58
  dataProvider;
58
59
  coreOptions;
59
60
  liveQueryStorage = new InMemoryLiveQueryStorage();
61
+ modulesSorted = [];
62
+ entities = [];
63
+ controllers = [];
60
64
  constructor(queue, options, dataProvider, coreOptions) {
61
65
  this.queue = queue;
62
66
  this.options = options;
@@ -67,6 +71,19 @@ export class RemultServerImplementation {
67
71
  if (options.subscriptionServer)
68
72
  this.subscriptionServer = options.subscriptionServer;
69
73
  const entitiesMetaData = [];
74
+ const modules = options.modules ?? [];
75
+ modules.push({
76
+ key: 'default',
77
+ priority: 0,
78
+ entities: options.entities ?? [],
79
+ controllers: options.controllers ?? [],
80
+ initApi: options.initApi,
81
+ initRequest: options.initRequest,
82
+ modules: [],
83
+ });
84
+ this.modulesSorted = modulesFlatAndOrdered(modules);
85
+ this.entities = this.modulesSorted.flatMap((m) => m.entities ?? []);
86
+ this.controllers = this.modulesSorted.flatMap((m) => m.controllers ?? []);
70
87
  this.dataProvider = dataProvider.then(async (dp) => {
71
88
  await this.runWithRemult(async (remult) => {
72
89
  remult.dataProvider = dp;
@@ -78,8 +95,8 @@ export class RemultServerImplementation {
78
95
  started = true;
79
96
  console.time('Schema ensured');
80
97
  };
81
- if (options.entities)
82
- entitiesMetaData.push(...options.entities.map((e) => remult.repo(e).metadata));
98
+ if (this.entities)
99
+ entitiesMetaData.push(...this.entities.map((e) => remult.repo(e).metadata));
83
100
  if (dp.ensureSchema) {
84
101
  startConsoleLog();
85
102
  await dp.ensureSchema(entitiesMetaData);
@@ -96,8 +113,12 @@ export class RemultServerImplementation {
96
113
  if (started)
97
114
  console.timeEnd('Schema ensured');
98
115
  }
99
- if (options.initApi)
100
- await options.initApi(remult);
116
+ for (let i = 0; i < this.modulesSorted.length; i++) {
117
+ const _initApi = this.modulesSorted[i].initApi;
118
+ if (_initApi) {
119
+ await _initApi(remult);
120
+ }
121
+ }
101
122
  }, { skipDataProvider: true });
102
123
  return dp;
103
124
  });
@@ -124,10 +145,10 @@ export class RemultServerImplementation {
124
145
  getEntities() {
125
146
  //TODO V2 - consider using entitiesMetaData - but it may require making it all awaitable
126
147
  var r = new Remult();
127
- return this.options.entities.map((x) => r.repo(x).metadata);
148
+ return this.entities.map((x) => r.repo(x).metadata);
128
149
  }
129
150
  runWithSerializedJsonContextData = async (jsonContextData, entityKey, what) => {
130
- for (const e of this.options.entities) {
151
+ for (const e of this.entities) {
131
152
  let key = getEntityKey(e);
132
153
  if (key === entityKey) {
133
154
  await this.runWithRemult(async (remult) => {
@@ -173,7 +194,7 @@ export class RemultServerImplementation {
173
194
  throw 'Router already registered';
174
195
  this.registeredRouter = true;
175
196
  {
176
- for (const c of this.options.controllers) {
197
+ for (const c of this.controllers) {
177
198
  let z = c[classBackendMethodsArray];
178
199
  if (z)
179
200
  for (const a of z) {
@@ -211,7 +232,7 @@ export class RemultServerImplementation {
211
232
  if (orig?.params?.id === '__entities-metadata') {
212
233
  res.success(buildEntityInfo({
213
234
  remult,
214
- entities: this.options.entities ?? [],
235
+ entities: this.entities,
215
236
  }));
216
237
  }
217
238
  else {
@@ -259,7 +280,7 @@ export class RemultServerImplementation {
259
280
  res.success(await remult.liveQueryStorage.keepAliveAndReturnUnknownQueryIds(await this.coreOptions.getRequestBody(origReq)));
260
281
  }));
261
282
  }
262
- this.options.entities?.forEach((e) => {
283
+ this.entities.forEach((e) => {
263
284
  this.addEntity(e, getEntityKey(e), r);
264
285
  });
265
286
  }
@@ -351,16 +372,19 @@ export class RemultServerImplementation {
351
372
  }
352
373
  if (user)
353
374
  remult.user = user;
354
- if (this.options.initRequest) {
355
- await this.options.initRequest(req, {
356
- remult,
357
- get liveQueryStorage() {
358
- return remult.liveQueryStorage;
359
- },
360
- set liveQueryStorage(value) {
361
- remult.liveQueryStorage = value;
362
- },
363
- });
375
+ for (let i = 0; i < this.modulesSorted.length; i++) {
376
+ const _initRequest = this.modulesSorted[i].initRequest;
377
+ if (_initRequest) {
378
+ await _initRequest(req, {
379
+ remult,
380
+ get liveQueryStorage() {
381
+ return remult.liveQueryStorage;
382
+ },
383
+ set liveQueryStorage(value) {
384
+ remult.liveQueryStorage = value;
385
+ },
386
+ });
387
+ }
364
388
  }
365
389
  await what(remult, myReq, myRes, genReq, origRes, req);
366
390
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "remult",
3
- "version": "3.0.5",
3
+ "version": "3.0.6-next.0",
4
4
  "description": "A CRUD framework for full-stack TypeScript",
5
5
  "homepage": "https://remult.dev",
6
6
  "repository": {
package/server/index.d.ts CHANGED
@@ -4,4 +4,6 @@ export { DataProviderLiveQueryStorage } from '../live-query/data-provider-live-q
4
4
  export { JsonEntityFileStorage, JsonFileDataProvider, } from './JsonEntityFileStorage.js';
5
5
  export { TestApiDataProvider } from './test-api-data-provider.js';
6
6
  export { GenericRequestHandler, GenericRequestInfo, GenericResponse, GenericRouter, InitRequestOptions, QueueStorage, RemultServer, RemultServerCore, RemultServerOptions, SpecificRoute, queuedJobInfo, } from './remult-api-server.js';
7
+ export { Module } from './module.js';
8
+ export type { ModuleInput } from './module.js';
7
9
  export declare function createRemultServer<RequestType>(options: RemultServerOptions<RequestType>, serverCoreOptions?: ServerCoreOptions<RequestType>): RemultServer<RequestType>;
package/server/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TestApiDataProvider = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = exports.DataProviderLiveQueryStorage = exports.SseSubscriptionServer = void 0;
3
+ exports.Module = exports.TestApiDataProvider = exports.JsonFileDataProvider = exports.JsonEntityFileStorage = exports.DataProviderLiveQueryStorage = exports.SseSubscriptionServer = void 0;
4
4
  exports.createRemultServer = createRemultServer;
5
5
  var tslib_1 = require("tslib");
6
6
  var remult_api_server_js_1 = require("./remult-api-server.js");
@@ -15,6 +15,8 @@ Object.defineProperty(exports, "JsonEntityFileStorage", { enumerable: true, get:
15
15
  Object.defineProperty(exports, "JsonFileDataProvider", { enumerable: true, get: function () { return JsonEntityFileStorage_js_1.JsonFileDataProvider; } });
16
16
  var test_api_data_provider_js_1 = require("./test-api-data-provider.js");
17
17
  Object.defineProperty(exports, "TestApiDataProvider", { enumerable: true, get: function () { return test_api_data_provider_js_1.TestApiDataProvider; } });
18
+ var module_js_1 = require("./module.js");
19
+ Object.defineProperty(exports, "Module", { enumerable: true, get: function () { return module_js_1.Module; } });
18
20
  function createRemultServer(options, serverCoreOptions) {
19
21
  var _this = this;
20
22
  (0, initAsyncHooks_js_1.initAsyncHooks)();
@@ -0,0 +1,26 @@
1
+ import type { ClassType } from '../classType.js';
2
+ import type { RemultServerOptions } from './remult-api-server.js';
3
+ export interface ModuleInput<RequestType> {
4
+ key: string;
5
+ /** @default 0 */
6
+ priority?: number;
7
+ entities?: ClassType<unknown>[];
8
+ controllers?: ClassType<unknown>[];
9
+ initApi?: RemultServerOptions<RequestType>['initApi'];
10
+ initRequest?: RemultServerOptions<RequestType>['initRequest'];
11
+ modules?: Module<RequestType>[];
12
+ }
13
+ export declare class Module<RequestType> {
14
+ key: string;
15
+ priority: number;
16
+ entities?: ClassType<unknown>[];
17
+ controllers?: ClassType<unknown>[];
18
+ initApi?: RemultServerOptions<RequestType>['initApi'];
19
+ initRequest?: RemultServerOptions<RequestType>['initRequest'];
20
+ modules?: Module<RequestType>[];
21
+ constructor(options: ModuleInput<RequestType>);
22
+ }
23
+ /**
24
+ * Full flat and ordered list by index and concatenaining the modules name
25
+ */
26
+ export declare const modulesFlatAndOrdered: <RequestType>(modules: Module<RequestType>[]) => Module<RequestType>[];
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.modulesFlatAndOrdered = exports.Module = void 0;
4
+ var tslib_1 = require("tslib");
5
+ var Module = /** @class */ (function () {
6
+ function Module(options) {
7
+ var _a;
8
+ this.key = options.key;
9
+ this.priority = (_a = options.priority) !== null && _a !== void 0 ? _a : 0;
10
+ this.entities = options.entities;
11
+ this.controllers = options.controllers;
12
+ this.initRequest = options.initRequest;
13
+ this.initApi = options.initApi;
14
+ this.modules = options.modules;
15
+ }
16
+ return Module;
17
+ }());
18
+ exports.Module = Module;
19
+ /**
20
+ * Full flat and ordered list by index and concatenaining the modules name
21
+ */
22
+ var modulesFlatAndOrdered = function (modules) {
23
+ var flattenModules = function (modules, parentName) {
24
+ if (parentName === void 0) { parentName = ''; }
25
+ return modules.reduce(function (acc, module) {
26
+ var fullKey = parentName ? "".concat(parentName, "-").concat(module.key) : module.key;
27
+ // Create a new module object without the 'modules' property
28
+ var _ = module.modules, flatModule = tslib_1.__rest(module, ["modules"]);
29
+ var newModule = tslib_1.__assign(tslib_1.__assign({}, flatModule), { key: fullKey });
30
+ var subModules = module.modules
31
+ ? flattenModules(module.modules, fullKey)
32
+ : [];
33
+ return tslib_1.__spreadArray(tslib_1.__spreadArray(tslib_1.__spreadArray([], tslib_1.__read(acc), false), [newModule], false), tslib_1.__read(subModules), false);
34
+ }, []);
35
+ };
36
+ var flatModules = flattenModules(modules);
37
+ flatModules.sort(function (a, b) { return a.priority - b.priority; });
38
+ return flatModules;
39
+ };
40
+ exports.modulesFlatAndOrdered = modulesFlatAndOrdered;
@@ -6,6 +6,7 @@ import type { LiveQueryStorage, SubscriptionServer } from '../src/live-query/Sub
6
6
  import { IdEntity } from '../src/remult3/IdEntity.js';
7
7
  import type { EntityMetadata, Repository } from '../src/remult3/remult3.js';
8
8
  import type { queuedJobInfoResponse } from '../src/server-action.js';
9
+ import { type Module } from './module.js';
9
10
  export interface RemultServerOptions<RequestType> {
10
11
  /**Entities to use for the api */
11
12
  entities?: ClassType<any>[];
@@ -92,6 +93,24 @@ export interface RemultServerOptions<RequestType> {
92
93
  responseBody: any;
93
94
  sendError: (httpStatusCode: number, body: any) => void;
94
95
  }) => Promise<void> | undefined;
96
+ /**
97
+ * Modules are here to group code by feature.
98
+ *
99
+ * @example
100
+ * import { Module } from 'remult/server'
101
+ *
102
+ * modules: [
103
+ * new Module({
104
+ * key: 'analytics',
105
+ * entities: [AnalyticsEvent],
106
+ * controllers: [AnalyticsController],
107
+ * initApi: () => {
108
+ * console.log('analytics module initialized')
109
+ * },
110
+ * }),
111
+ * ]
112
+ */
113
+ modules?: Module<RequestType>[];
95
114
  }
96
115
  export interface InitRequestOptions {
97
116
  liveQueryStorage: LiveQueryStorage;
@@ -18,6 +18,7 @@ var remult_static_js_1 = require("../src/remult-static.js");
18
18
  var remult_admin_js_1 = tslib_1.__importStar(require("./remult-admin.js"));
19
19
  var isOfType_js_1 = require("../src/isOfType.js");
20
20
  var initDataProviderOrJson_js_1 = require("./initDataProviderOrJson.js");
21
+ var module_js_1 = require("./module.js");
21
22
  function createRemultServerCore(options, serverCoreOptions) {
22
23
  var safeOptions = options !== null && options !== void 0 ? options : {};
23
24
  if (!safeOptions.entities)
@@ -58,11 +59,15 @@ function createRemultServerCore(options, serverCoreOptions) {
58
59
  var RemultServerImplementation = /** @class */ (function () {
59
60
  function RemultServerImplementation(queue, options, dataProvider, coreOptions) {
60
61
  var _this = this;
62
+ var _a, _b, _c;
61
63
  this.queue = queue;
62
64
  this.options = options;
63
65
  this.dataProvider = dataProvider;
64
66
  this.coreOptions = coreOptions;
65
67
  this.liveQueryStorage = new SubscriptionServer_js_1.InMemoryLiveQueryStorage();
68
+ this.modulesSorted = [];
69
+ this.entities = [];
70
+ this.controllers = [];
66
71
  this.runWithSerializedJsonContextData = function (jsonContextData, entityKey, what) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
67
72
  var _loop_1, this_1, _a, _b, e, state_1, e_1_1;
68
73
  var e_1, _c;
@@ -113,7 +118,7 @@ var RemultServerImplementation = /** @class */ (function () {
113
118
  _d.label = 1;
114
119
  case 1:
115
120
  _d.trys.push([1, 6, 7, 8]);
116
- _a = tslib_1.__values(this.options.entities), _b = _a.next();
121
+ _a = tslib_1.__values(this.entities), _b = _a.next();
117
122
  _d.label = 2;
118
123
  case 2:
119
124
  if (!!_b.done) return [3 /*break*/, 5];
@@ -171,12 +176,25 @@ var RemultServerImplementation = /** @class */ (function () {
171
176
  if (options.subscriptionServer)
172
177
  this.subscriptionServer = options.subscriptionServer;
173
178
  var entitiesMetaData = [];
179
+ var modules = (_a = options.modules) !== null && _a !== void 0 ? _a : [];
180
+ modules.push({
181
+ key: 'default',
182
+ priority: 0,
183
+ entities: (_b = options.entities) !== null && _b !== void 0 ? _b : [],
184
+ controllers: (_c = options.controllers) !== null && _c !== void 0 ? _c : [],
185
+ initApi: options.initApi,
186
+ initRequest: options.initRequest,
187
+ modules: [],
188
+ });
189
+ this.modulesSorted = (0, module_js_1.modulesFlatAndOrdered)(modules);
190
+ this.entities = this.modulesSorted.flatMap(function (m) { var _a; return (_a = m.entities) !== null && _a !== void 0 ? _a : []; });
191
+ this.controllers = this.modulesSorted.flatMap(function (m) { var _a; return (_a = m.controllers) !== null && _a !== void 0 ? _a : []; });
174
192
  this.dataProvider = dataProvider.then(function (dp) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
175
193
  var _this = this;
176
194
  return tslib_1.__generator(this, function (_a) {
177
195
  switch (_a.label) {
178
196
  case 0: return [4 /*yield*/, this.runWithRemult(function (remult) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
179
- var started_1, startConsoleLog, _a, _b, item, e_2_1;
197
+ var started_1, startConsoleLog, _a, _b, item, e_2_1, i, _initApi;
180
198
  var e_2, _c;
181
199
  return tslib_1.__generator(this, function (_d) {
182
200
  switch (_d.label) {
@@ -190,8 +208,8 @@ var RemultServerImplementation = /** @class */ (function () {
190
208
  started_1 = true;
191
209
  console.time('Schema ensured');
192
210
  };
193
- if (options.entities)
194
- entitiesMetaData.push.apply(entitiesMetaData, tslib_1.__spreadArray([], tslib_1.__read(options.entities.map(function (e) { return remult.repo(e).metadata; })), false));
211
+ if (this.entities)
212
+ entitiesMetaData.push.apply(entitiesMetaData, tslib_1.__spreadArray([], tslib_1.__read(this.entities.map(function (e) { return remult.repo(e).metadata; })), false));
195
213
  if (!dp.ensureSchema) return [3 /*break*/, 2];
196
214
  startConsoleLog();
197
215
  return [4 /*yield*/, dp.ensureSchema(entitiesMetaData)];
@@ -233,12 +251,20 @@ var RemultServerImplementation = /** @class */ (function () {
233
251
  console.timeEnd('Schema ensured');
234
252
  _d.label = 10;
235
253
  case 10:
236
- if (!options.initApi) return [3 /*break*/, 12];
237
- return [4 /*yield*/, options.initApi(remult)];
254
+ i = 0;
255
+ _d.label = 11;
238
256
  case 11:
257
+ if (!(i < this.modulesSorted.length)) return [3 /*break*/, 14];
258
+ _initApi = this.modulesSorted[i].initApi;
259
+ if (!_initApi) return [3 /*break*/, 13];
260
+ return [4 /*yield*/, _initApi(remult)];
261
+ case 12:
239
262
  _d.sent();
240
- _d.label = 12;
241
- case 12: return [2 /*return*/];
263
+ _d.label = 13;
264
+ case 13:
265
+ i++;
266
+ return [3 /*break*/, 11];
267
+ case 14: return [2 /*return*/];
242
268
  }
243
269
  });
244
270
  }); }, { skipDataProvider: true })];
@@ -284,7 +310,7 @@ var RemultServerImplementation = /** @class */ (function () {
284
310
  RemultServerImplementation.prototype.getEntities = function () {
285
311
  //TODO V2 - consider using entitiesMetaData - but it may require making it all awaitable
286
312
  var r = new context_js_1.Remult();
287
- return this.options.entities.map(function (x) { return r.repo(x).metadata; });
313
+ return this.entities.map(function (x) { return r.repo(x).metadata; });
288
314
  };
289
315
  RemultServerImplementation.prototype.getRouteImpl = function () {
290
316
  if (!this.routeImpl) {
@@ -299,14 +325,13 @@ var RemultServerImplementation = /** @class */ (function () {
299
325
  RemultServerImplementation.prototype.registerRouter = function (r) {
300
326
  var e_3, _a, e_4, _b;
301
327
  var _this = this;
302
- var _c;
303
328
  if (this.registeredRouter)
304
329
  throw 'Router already registered';
305
330
  this.registeredRouter = true;
306
331
  {
307
332
  try {
308
- for (var _d = tslib_1.__values(this.options.controllers), _e = _d.next(); !_e.done; _e = _d.next()) {
309
- var c = _e.value;
333
+ for (var _c = tslib_1.__values(this.controllers), _d = _c.next(); !_d.done; _d = _c.next()) {
334
+ var c = _d.value;
310
335
  var z = c[server_action_js_1.classBackendMethodsArray];
311
336
  if (z)
312
337
  try {
@@ -331,7 +356,7 @@ var RemultServerImplementation = /** @class */ (function () {
331
356
  catch (e_3_1) { e_3 = { error: e_3_1 }; }
332
357
  finally {
333
358
  try {
334
- if (_e && !_e.done && (_a = _d.return)) _a.call(_d);
359
+ if (_d && !_d.done && (_a = _c.return)) _a.call(_c);
335
360
  }
336
361
  finally { if (e_3) throw e_3.error; }
337
362
  }
@@ -365,8 +390,8 @@ var RemultServerImplementation = /** @class */ (function () {
365
390
  var admin = function () {
366
391
  return _this.process(function (remult, req, res, orig, origResponse) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
367
392
  var allowed, head, requireAuthToken, disableLiveQuery;
368
- var _a, _b, _c, _d, _e, _f, _g, _h;
369
- return tslib_1.__generator(this, function (_j) {
393
+ var _a, _b, _c, _d, _e, _f, _g;
394
+ return tslib_1.__generator(this, function (_h) {
370
395
  allowed = (0, isOfType_js_1.isOfType)(this.options.admin, 'allow')
371
396
  ? this.options.admin.allow
372
397
  : this.options.admin;
@@ -374,7 +399,7 @@ var RemultServerImplementation = /** @class */ (function () {
374
399
  if (((_a = orig === null || orig === void 0 ? void 0 : orig.params) === null || _a === void 0 ? void 0 : _a.id) === '__entities-metadata') {
375
400
  res.success((0, remult_admin_js_1.buildEntityInfo)({
376
401
  remult: remult,
377
- entities: (_b = this.options.entities) !== null && _b !== void 0 ? _b : [],
402
+ entities: this.entities,
378
403
  }));
379
404
  }
380
405
  else {
@@ -382,14 +407,14 @@ var RemultServerImplementation = /** @class */ (function () {
382
407
  requireAuthToken = false;
383
408
  disableLiveQuery = false;
384
409
  if ((0, isOfType_js_1.isOfType)(this.options.admin, 'allow')) {
385
- head = (_e = (_d = (_c = this.options.admin).customHtmlHead) === null || _d === void 0 ? void 0 : _d.call(_c, remult)) !== null && _e !== void 0 ? _e : head;
410
+ head = (_d = (_c = (_b = this.options.admin).customHtmlHead) === null || _c === void 0 ? void 0 : _c.call(_b, remult)) !== null && _d !== void 0 ? _d : head;
386
411
  requireAuthToken =
387
- (_f = this.options.admin.requireAuthToken) !== null && _f !== void 0 ? _f : requireAuthToken;
412
+ (_e = this.options.admin.requireAuthToken) !== null && _e !== void 0 ? _e : requireAuthToken;
388
413
  disableLiveQuery =
389
- (_g = this.options.admin.disableLiveQuery) !== null && _g !== void 0 ? _g : disableLiveQuery;
414
+ (_f = this.options.admin.disableLiveQuery) !== null && _f !== void 0 ? _f : disableLiveQuery;
390
415
  }
391
416
  origResponse.send((0, remult_admin_js_1.default)({
392
- rootPath: (_h = this.options.rootPath) !== null && _h !== void 0 ? _h : '/api',
417
+ rootPath: (_g = this.options.rootPath) !== null && _g !== void 0 ? _g : '/api',
393
418
  head: head,
394
419
  requireAuthToken: requireAuthToken,
395
420
  disableLiveQuery: disableLiveQuery,
@@ -465,7 +490,7 @@ var RemultServerImplementation = /** @class */ (function () {
465
490
  });
466
491
  }); }));
467
492
  }
468
- (_c = this.options.entities) === null || _c === void 0 ? void 0 : _c.forEach(function (e) {
493
+ this.entities.forEach(function (e) {
469
494
  _this.addEntity(e, (0, getEntityRef_js_1.getEntityKey)(e), r);
470
495
  });
471
496
  };
@@ -627,17 +652,17 @@ var RemultServerImplementation = /** @class */ (function () {
627
652
  return [4 /*yield*/, what(remult_static_js_1.remultStatic.asyncContext.getStore().remult, myReq, myRes, genReq, origRes, req)];
628
653
  case 2: return [2 /*return*/, _a.sent()];
629
654
  case 3: return [4 /*yield*/, this.runWithRemult(function (remult) { return tslib_1.__awaiter(_this, void 0, void 0, function () {
630
- var user;
655
+ var user, i, _initRequest;
631
656
  return tslib_1.__generator(this, function (_a) {
632
657
  switch (_a.label) {
633
658
  case 0:
634
- if (!req) return [3 /*break*/, 9];
659
+ if (!req) return [3 /*break*/, 11];
635
660
  ;
636
661
  remult.context.request = req;
637
662
  remult_static_js_1.remultStatic.asyncContext.setInInitRequest(true);
638
663
  _a.label = 1;
639
664
  case 1:
640
- _a.trys.push([1, , 8, 9]);
665
+ _a.trys.push([1, , 10, 11]);
641
666
  user = void 0;
642
667
  if (!this.options.getUser) return [3 /*break*/, 3];
643
668
  return [4 /*yield*/, this.options.getUser(req)];
@@ -654,8 +679,13 @@ var RemultServerImplementation = /** @class */ (function () {
654
679
  case 4:
655
680
  if (user)
656
681
  remult.user = user;
657
- if (!this.options.initRequest) return [3 /*break*/, 6];
658
- return [4 /*yield*/, this.options.initRequest(req, {
682
+ i = 0;
683
+ _a.label = 5;
684
+ case 5:
685
+ if (!(i < this.modulesSorted.length)) return [3 /*break*/, 8];
686
+ _initRequest = this.modulesSorted[i].initRequest;
687
+ if (!_initRequest) return [3 /*break*/, 7];
688
+ return [4 /*yield*/, _initRequest(req, {
659
689
  remult: remult,
660
690
  get liveQueryStorage() {
661
691
  return remult.liveQueryStorage;
@@ -664,17 +694,20 @@ var RemultServerImplementation = /** @class */ (function () {
664
694
  remult.liveQueryStorage = value;
665
695
  },
666
696
  })];
667
- case 5:
697
+ case 6:
668
698
  _a.sent();
669
- _a.label = 6;
670
- case 6: return [4 /*yield*/, what(remult, myReq, myRes, genReq, origRes, req)];
699
+ _a.label = 7;
671
700
  case 7:
701
+ i++;
702
+ return [3 /*break*/, 5];
703
+ case 8: return [4 /*yield*/, what(remult, myReq, myRes, genReq, origRes, req)];
704
+ case 9:
672
705
  _a.sent();
673
- return [3 /*break*/, 9];
674
- case 8:
706
+ return [3 /*break*/, 11];
707
+ case 10:
675
708
  remult_static_js_1.remultStatic.asyncContext.setInInitRequest(false);
676
709
  return [7 /*endfinally*/];
677
- case 9: return [2 /*return*/];
710
+ case 11: return [2 /*return*/];
678
711
  }
679
712
  });
680
713
  }); })];