@webda/core 2.0.0-beta.2 → 2.0.1

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 (279) hide show
  1. package/lib/application.d.ts +5 -21
  2. package/lib/application.js +71 -84
  3. package/lib/application.js.map +1 -1
  4. package/lib/application.spec.js +121 -140
  5. package/lib/application.spec.js.map +1 -1
  6. package/lib/core.d.ts +44 -45
  7. package/lib/core.js +239 -320
  8. package/lib/core.js.map +1 -1
  9. package/lib/core.spec.js +326 -391
  10. package/lib/core.spec.js.map +1 -1
  11. package/lib/index.d.ts +49 -45
  12. package/lib/index.js +54 -67
  13. package/lib/index.js.map +1 -1
  14. package/lib/models/aclmodel.d.ts +2 -2
  15. package/lib/models/aclmodel.js +63 -90
  16. package/lib/models/aclmodel.js.map +1 -1
  17. package/lib/models/aclmodel.spec.js +128 -151
  18. package/lib/models/aclmodel.spec.js.map +1 -1
  19. package/lib/models/coremodel.d.ts +39 -17
  20. package/lib/models/coremodel.js +160 -117
  21. package/lib/models/coremodel.js.map +1 -1
  22. package/lib/models/coremodel.spec.js +143 -107
  23. package/lib/models/coremodel.spec.js.map +1 -1
  24. package/lib/models/deployment.js +1 -2
  25. package/lib/models/ident.d.ts +3 -3
  26. package/lib/models/ident.js +4 -9
  27. package/lib/models/ident.js.map +1 -1
  28. package/lib/models/ident.spec.js +9 -11
  29. package/lib/models/ident.spec.js.map +1 -1
  30. package/lib/models/ownermodel.d.ts +2 -2
  31. package/lib/models/ownermodel.js +39 -62
  32. package/lib/models/ownermodel.js.map +1 -1
  33. package/lib/models/ownermodel.spec.js +126 -166
  34. package/lib/models/ownermodel.spec.js.map +1 -1
  35. package/lib/models/rolemodel.d.ts +2 -2
  36. package/lib/models/rolemodel.js +24 -40
  37. package/lib/models/rolemodel.js.map +1 -1
  38. package/lib/models/rolemodel.spec.js +44 -61
  39. package/lib/models/rolemodel.spec.js.map +1 -1
  40. package/lib/models/user.d.ts +9 -9
  41. package/lib/models/user.js +3 -8
  42. package/lib/models/user.js.map +1 -1
  43. package/lib/models/user.spec.js +14 -16
  44. package/lib/models/user.spec.js.map +1 -1
  45. package/lib/queues/filequeue.d.ts +2 -2
  46. package/lib/queues/filequeue.js +72 -93
  47. package/lib/queues/filequeue.js.map +1 -1
  48. package/lib/queues/filequeue.spec.js +53 -70
  49. package/lib/queues/filequeue.spec.js.map +1 -1
  50. package/lib/queues/memoryqueue.d.ts +2 -2
  51. package/lib/queues/memoryqueue.js +37 -61
  52. package/lib/queues/memoryqueue.js.map +1 -1
  53. package/lib/queues/memoryqueue.spec.js +142 -165
  54. package/lib/queues/memoryqueue.spec.js.map +1 -1
  55. package/lib/queues/pubsubservice.d.ts +2 -2
  56. package/lib/queues/pubsubservice.js +3 -7
  57. package/lib/queues/pubsubservice.js.map +1 -1
  58. package/lib/queues/queue.spec.d.ts +1 -1
  59. package/lib/queues/queue.spec.js +42 -56
  60. package/lib/queues/queue.spec.js.map +1 -1
  61. package/lib/queues/queueservice.d.ts +4 -4
  62. package/lib/queues/queueservice.js +52 -67
  63. package/lib/queues/queueservice.js.map +1 -1
  64. package/lib/router.d.ts +3 -3
  65. package/lib/router.js +46 -47
  66. package/lib/router.js.map +1 -1
  67. package/lib/router.spec.js +64 -61
  68. package/lib/router.spec.js.map +1 -1
  69. package/lib/services/asyncevents.d.ts +2 -2
  70. package/lib/services/asyncevents.js +44 -64
  71. package/lib/services/asyncevents.js.map +1 -1
  72. package/lib/services/asyncevents.spec.js +81 -98
  73. package/lib/services/asyncevents.spec.js.map +1 -1
  74. package/lib/services/authentication.d.ts +28 -19
  75. package/lib/services/authentication.js +542 -574
  76. package/lib/services/authentication.js.map +1 -1
  77. package/lib/services/authentication.spec.js +411 -447
  78. package/lib/services/authentication.spec.js.map +1 -1
  79. package/lib/services/binary.d.ts +9 -7
  80. package/lib/services/binary.js +213 -245
  81. package/lib/services/binary.js.map +1 -1
  82. package/lib/services/binary.spec.d.ts +3 -3
  83. package/lib/services/binary.spec.js +390 -443
  84. package/lib/services/binary.spec.js.map +1 -1
  85. package/lib/services/cloudbinary.d.ts +3 -3
  86. package/lib/services/cloudbinary.js +45 -70
  87. package/lib/services/cloudbinary.js.map +1 -1
  88. package/lib/services/cloudbinary.spec.d.ts +3 -3
  89. package/lib/services/cloudbinary.spec.js +133 -162
  90. package/lib/services/cloudbinary.spec.js.map +1 -1
  91. package/lib/services/configuration.d.ts +6 -3
  92. package/lib/services/configuration.js +78 -103
  93. package/lib/services/configuration.js.map +1 -1
  94. package/lib/services/configuration.spec.js +63 -83
  95. package/lib/services/configuration.spec.js.map +1 -1
  96. package/lib/services/cron.d.ts +3 -2
  97. package/lib/services/cron.js +9 -13
  98. package/lib/services/cron.js.map +1 -1
  99. package/lib/services/cron.spec.js +18 -21
  100. package/lib/services/cron.spec.js.map +1 -1
  101. package/lib/services/cryptoservice.d.ts +258 -0
  102. package/lib/services/cryptoservice.js +312 -0
  103. package/lib/services/cryptoservice.js.map +1 -0
  104. package/lib/services/cryptoservice.spec.d.ts +1 -0
  105. package/lib/services/cryptoservice.spec.js +137 -0
  106. package/lib/services/cryptoservice.spec.js.map +1 -0
  107. package/lib/services/debugmailer.d.ts +1 -1
  108. package/lib/services/debugmailer.js +13 -34
  109. package/lib/services/debugmailer.js.map +1 -1
  110. package/lib/services/debugmailer.spec.js +16 -29
  111. package/lib/services/debugmailer.spec.js.map +1 -1
  112. package/lib/services/echo.d.ts +2 -2
  113. package/lib/services/echo.js +15 -31
  114. package/lib/services/echo.js.map +1 -1
  115. package/lib/services/echo.spec.js +27 -40
  116. package/lib/services/echo.spec.js.map +1 -1
  117. package/lib/services/filebinary.d.ts +10 -5
  118. package/lib/services/filebinary.js +171 -205
  119. package/lib/services/filebinary.js.map +1 -1
  120. package/lib/services/filebinary.spec.d.ts +2 -1
  121. package/lib/services/filebinary.spec.js +106 -117
  122. package/lib/services/filebinary.spec.js.map +1 -1
  123. package/lib/services/fileconfiguration.d.ts +2 -2
  124. package/lib/services/fileconfiguration.js +25 -43
  125. package/lib/services/fileconfiguration.js.map +1 -1
  126. package/lib/services/fileconfiguration.spec.js +79 -109
  127. package/lib/services/fileconfiguration.spec.js.map +1 -1
  128. package/lib/services/invitationservice.d.ts +10 -10
  129. package/lib/services/invitationservice.js +275 -313
  130. package/lib/services/invitationservice.js.map +1 -1
  131. package/lib/services/invitationservice.spec.js +443 -449
  132. package/lib/services/invitationservice.spec.js.map +1 -1
  133. package/lib/services/kubernetesconfiguration.d.ts +2 -2
  134. package/lib/services/kubernetesconfiguration.js +41 -59
  135. package/lib/services/kubernetesconfiguration.js.map +1 -1
  136. package/lib/services/kubernetesconfiguration.spec.js +80 -98
  137. package/lib/services/kubernetesconfiguration.spec.js.map +1 -1
  138. package/lib/services/mailer.d.ts +4 -4
  139. package/lib/services/mailer.js +62 -86
  140. package/lib/services/mailer.js.map +1 -1
  141. package/lib/services/mailer.spec.js +86 -127
  142. package/lib/services/mailer.spec.js.map +1 -1
  143. package/lib/services/notificationservice.d.ts +4 -4
  144. package/lib/services/notificationservice.js +23 -42
  145. package/lib/services/notificationservice.js.map +1 -1
  146. package/lib/services/notificationservice.spec.js +47 -73
  147. package/lib/services/notificationservice.spec.js.map +1 -1
  148. package/lib/services/oauth.d.ts +32 -6
  149. package/lib/services/oauth.js +73 -78
  150. package/lib/services/oauth.js.map +1 -1
  151. package/lib/services/oauth.spec.js +128 -148
  152. package/lib/services/oauth.spec.js.map +1 -1
  153. package/lib/services/proxy.d.ts +74 -0
  154. package/lib/services/proxy.js +126 -0
  155. package/lib/services/proxy.js.map +1 -0
  156. package/lib/services/proxy.spec.d.ts +1 -0
  157. package/lib/services/proxy.spec.js +59 -0
  158. package/lib/services/proxy.spec.js.map +1 -0
  159. package/lib/services/resource.d.ts +2 -2
  160. package/lib/services/resource.js +12 -18
  161. package/lib/services/resource.js.map +1 -1
  162. package/lib/services/resource.spec.js +67 -99
  163. package/lib/services/resource.spec.js.map +1 -1
  164. package/lib/services/service.d.ts +29 -6
  165. package/lib/services/service.js +69 -39
  166. package/lib/services/service.js.map +1 -1
  167. package/lib/services/service.spec.js +62 -67
  168. package/lib/services/service.spec.js.map +1 -1
  169. package/lib/services/version.d.ts +1 -1
  170. package/lib/services/version.js +3 -8
  171. package/lib/services/version.js.map +1 -1
  172. package/lib/services/version.spec.js +11 -24
  173. package/lib/services/version.spec.js.map +1 -1
  174. package/lib/stores/aggregator.d.ts +3 -3
  175. package/lib/stores/aggregator.js +37 -57
  176. package/lib/stores/aggregator.js.map +1 -1
  177. package/lib/stores/file.d.ts +3 -3
  178. package/lib/stores/file.js +93 -131
  179. package/lib/stores/file.js.map +1 -1
  180. package/lib/stores/file.spec.d.ts +2 -2
  181. package/lib/stores/file.spec.js +262 -289
  182. package/lib/stores/file.spec.js.map +1 -1
  183. package/lib/stores/mapper.d.ts +4 -4
  184. package/lib/stores/mapper.js +111 -137
  185. package/lib/stores/mapper.js.map +1 -1
  186. package/lib/stores/mapper.spec.js +133 -150
  187. package/lib/stores/mapper.spec.js.map +1 -1
  188. package/lib/stores/memory.d.ts +67 -6
  189. package/lib/stores/memory.js +155 -117
  190. package/lib/stores/memory.js.map +1 -1
  191. package/lib/stores/memory.spec.d.ts +3 -2
  192. package/lib/stores/memory.spec.js +127 -105
  193. package/lib/stores/memory.spec.js.map +1 -1
  194. package/lib/stores/store.d.ts +40 -16
  195. package/lib/stores/store.js +847 -830
  196. package/lib/stores/store.js.map +1 -1
  197. package/lib/stores/store.spec.d.ts +6 -4
  198. package/lib/stores/store.spec.js +628 -647
  199. package/lib/stores/store.spec.js.map +1 -1
  200. package/lib/stores/webdaql/WebdaQLLexer.d.ts +4 -4
  201. package/lib/stores/webdaql/WebdaQLLexer.js +9 -13
  202. package/lib/stores/webdaql/WebdaQLLexer.js.map +1 -1
  203. package/lib/stores/webdaql/WebdaQLParserLexer.d.ts +4 -4
  204. package/lib/stores/webdaql/WebdaQLParserLexer.js +9 -13
  205. package/lib/stores/webdaql/WebdaQLParserLexer.js.map +1 -1
  206. package/lib/stores/webdaql/WebdaQLParserListener.d.ts +2 -2
  207. package/lib/stores/webdaql/WebdaQLParserListener.js +1 -2
  208. package/lib/stores/webdaql/WebdaQLParserListener.js.map +1 -1
  209. package/lib/stores/webdaql/WebdaQLParserParser.d.ts +10 -10
  210. package/lib/stores/webdaql/WebdaQLParserParser.js +62 -91
  211. package/lib/stores/webdaql/WebdaQLParserParser.js.map +1 -1
  212. package/lib/stores/webdaql/WebdaQLParserVisitor.d.ts +2 -2
  213. package/lib/stores/webdaql/WebdaQLParserVisitor.js +1 -2
  214. package/lib/stores/webdaql/WebdaQLParserVisitor.js.map +1 -1
  215. package/lib/stores/webdaql/query.d.ts +4 -5
  216. package/lib/stores/webdaql/query.js +16 -19
  217. package/lib/stores/webdaql/query.js.map +1 -1
  218. package/lib/stores/webdaql/query.spec.js +30 -32
  219. package/lib/stores/webdaql/query.spec.js.map +1 -1
  220. package/lib/test.d.ts +3 -3
  221. package/lib/test.js +74 -94
  222. package/lib/test.js.map +1 -1
  223. package/lib/unpackedapplication.d.ts +1 -1
  224. package/lib/unpackedapplication.js +44 -38
  225. package/lib/unpackedapplication.js.map +1 -1
  226. package/lib/utils/abstractdeployer.js +1 -5
  227. package/lib/utils/abstractdeployer.js.map +1 -1
  228. package/lib/utils/abstractdeployer.spec.js +6 -8
  229. package/lib/utils/abstractdeployer.spec.js.map +1 -1
  230. package/lib/utils/context.d.ts +61 -29
  231. package/lib/utils/context.js +133 -127
  232. package/lib/utils/context.js.map +1 -1
  233. package/lib/utils/context.spec.js +144 -153
  234. package/lib/utils/context.spec.js.map +1 -1
  235. package/lib/utils/cookie.d.ts +66 -45
  236. package/lib/utils/cookie.js +69 -158
  237. package/lib/utils/cookie.js.map +1 -1
  238. package/lib/utils/cookie.spec.js +220 -238
  239. package/lib/utils/cookie.spec.js.map +1 -1
  240. package/lib/utils/esm.d.ts +4 -0
  241. package/lib/utils/esm.js +10 -0
  242. package/lib/utils/esm.js.map +1 -0
  243. package/lib/utils/httpcontext.d.ts +3 -0
  244. package/lib/utils/httpcontext.js +48 -65
  245. package/lib/utils/httpcontext.js.map +1 -1
  246. package/lib/utils/httpcontext.spec.js +37 -56
  247. package/lib/utils/httpcontext.spec.js.map +1 -1
  248. package/lib/utils/logger.d.ts +2 -2
  249. package/lib/utils/logger.js +15 -28
  250. package/lib/utils/logger.js.map +1 -1
  251. package/lib/utils/logger.spec.js +9 -11
  252. package/lib/utils/logger.spec.js.map +1 -1
  253. package/lib/utils/serializers.js +17 -20
  254. package/lib/utils/serializers.js.map +1 -1
  255. package/lib/utils/serializers.spec.js +43 -44
  256. package/lib/utils/serializers.spec.js.map +1 -1
  257. package/lib/utils/session.d.ts +120 -0
  258. package/lib/utils/session.js +155 -0
  259. package/lib/utils/session.js.map +1 -0
  260. package/lib/utils/session.spec.d.ts +1 -0
  261. package/lib/utils/session.spec.js +66 -0
  262. package/lib/utils/session.spec.js.map +1 -0
  263. package/lib/utils/waiter.d.ts +1 -1
  264. package/lib/utils/waiter.js +32 -52
  265. package/lib/utils/waiter.js.map +1 -1
  266. package/lib/utils/waiter.spec.js +75 -92
  267. package/lib/utils/waiter.spec.js.map +1 -1
  268. package/package.json +22 -14
  269. package/test/config-invitation.json +1 -3
  270. package/test/config.json +3 -3
  271. package/test/config.old.json +1 -2
  272. package/test/moddas/annotatedservice.js +5 -5
  273. package/test/moddas/debugmailer.js +2 -3
  274. package/test/moddas/fakeservice.js +2 -3
  275. package/test/moddas/voidstore.js +6 -4
  276. package/test/models/ident.js +2 -6
  277. package/test/models/task.js +3 -7
  278. package/test/package.json +2 -1
  279. package/webda.module.json +895 -189
package/lib/core.js CHANGED
@@ -1,31 +1,34 @@
1
- "use strict";
2
- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
- return new (P || (P = Promise))(function (resolve, reject) {
5
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
- step((generator = generator.apply(thisArg, _arguments || [])).next());
9
- });
10
- };
11
- Object.defineProperty(exports, "__esModule", { value: true });
12
- exports.Core = exports.Route = exports.Bean = exports.WebsiteOriginFilter = exports.OriginFilter = exports.WebdaError = void 0;
13
- const ajv_1 = require("ajv");
14
- const ajv_formats_1 = require("ajv-formats");
15
- const validation_error_1 = require("ajv/dist/runtime/validation_error");
16
- const crypto = require("crypto");
17
- const deepmerge_ts_1 = require("deepmerge-ts");
18
- const events = require("events");
19
- const jsonpath = require("jsonpath");
20
- const uuid_1 = require("uuid");
21
- const vm = require("vm");
22
- const index_1 = require("./index");
23
- const coremodel_1 = require("./models/coremodel");
24
- const router_1 = require("./router");
1
+ import Ajv from "ajv";
2
+ import addFormats from "ajv-formats";
3
+ import { deepmerge } from "deepmerge-ts";
4
+ import * as events from "events";
5
+ import jsonpath from "jsonpath";
6
+ import pkg from "node-machine-id";
7
+ import { v4 as uuidv4 } from "uuid";
8
+ import { Context, Logger, Store } from "./index.js";
9
+ import { CoreModel } from "./models/coremodel.js";
10
+ import { Router } from "./router.js";
11
+ const { machineIdSync } = pkg;
12
+ /**
13
+ * Copy from https://github.com/ajv-validator/ajv/blob/master/lib/runtime/validation_error.ts
14
+ * It is not exported by ajv
15
+ */
16
+ export class ValidationError extends Error {
17
+ constructor(errors) {
18
+ super("validation failed");
19
+ this.errors = errors;
20
+ this.ajv = this.validation = true;
21
+ }
22
+ }
23
+ /**
24
+ *
25
+ */
26
+ export class RegistryEntry extends CoreModel {
27
+ }
25
28
  /**
26
29
  * Error with a code
27
30
  */
28
- class WebdaError extends Error {
31
+ export class WebdaError extends Error {
29
32
  /**
30
33
  *
31
34
  * @param code
@@ -42,13 +45,12 @@ class WebdaError extends Error {
42
45
  return this.code;
43
46
  }
44
47
  }
45
- exports.WebdaError = WebdaError;
46
48
  /**
47
49
  * Filter request based on their origin
48
50
  *
49
51
  * @category CoreFeatures
50
52
  */
51
- class OriginFilter {
53
+ export class OriginFilter {
52
54
  constructor(origins) {
53
55
  this.regexs = origins.map(origin => {
54
56
  if (!origin.endsWith("$")) {
@@ -65,26 +67,23 @@ class OriginFilter {
65
67
  * @param context
66
68
  * @returns
67
69
  */
68
- checkRequest(context) {
69
- return __awaiter(this, void 0, void 0, function* () {
70
- let httpContext = context.getHttpContext();
71
- for (let regexp of this.regexs) {
72
- if (httpContext.hostname.match(regexp)) {
73
- return true;
74
- }
75
- if (httpContext.origin.match(regexp)) {
76
- return true;
77
- }
70
+ async checkRequest(context) {
71
+ let httpContext = context.getHttpContext();
72
+ for (let regexp of this.regexs) {
73
+ if (httpContext.hostname.match(regexp)) {
74
+ return true;
78
75
  }
79
- return false;
80
- });
76
+ if (httpContext.origin.match(regexp)) {
77
+ return true;
78
+ }
79
+ }
80
+ return false;
81
81
  }
82
82
  }
83
- exports.OriginFilter = OriginFilter;
84
83
  /**
85
84
  * Authorize requests based on the website
86
85
  */
87
- class WebsiteOriginFilter {
86
+ export class WebsiteOriginFilter {
88
87
  constructor(website) {
89
88
  this.websites = [];
90
89
  if (!Array.isArray(website)) {
@@ -99,58 +98,35 @@ class WebsiteOriginFilter {
99
98
  this.websites = [...website];
100
99
  }
101
100
  }
102
- checkRequest(context) {
103
- return __awaiter(this, void 0, void 0, function* () {
104
- let httpContext = context.getHttpContext();
105
- if (this.websites.indexOf(httpContext.origin) >= 0 ||
106
- this.websites.indexOf(httpContext.host) >= 0 ||
107
- this.websites.indexOf("*") >= 0) {
108
- return true;
109
- }
110
- return false;
111
- });
101
+ async checkRequest(context) {
102
+ let httpContext = context.getHttpContext();
103
+ if (this.websites.indexOf(httpContext.origin) >= 0 ||
104
+ this.websites.indexOf(httpContext.host) >= 0 ||
105
+ this.websites.indexOf("*") >= 0) {
106
+ return true;
107
+ }
108
+ return false;
112
109
  }
113
110
  }
114
- exports.WebsiteOriginFilter = WebsiteOriginFilter;
115
111
  const beans = {};
116
112
  // @Bean to declare as a Singleton service
117
- function Bean(constructor) {
113
+ export function Bean(constructor) {
118
114
  let name = constructor.name.toLowerCase();
119
115
  beans[name] = beans[name] || { constructor };
120
- beans[name] = Object.assign(Object.assign({}, beans[name]), { bean: true });
121
- }
122
- exports.Bean = Bean;
123
- // @Route to declare route on Bean
124
- function Route(route, methods = ["GET"], allowPath = false, openapi = {}) {
125
- return function (target, executor) {
126
- let targetName = target.constructor.name.toLowerCase();
127
- beans[targetName] = beans[targetName] || {
128
- constructor: target.constructor
129
- };
130
- beans[targetName].routes = beans[targetName].routes || {};
131
- beans[targetName].routes[route] = beans[targetName].routes[route] || [];
132
- beans[targetName].routes[route].push({
133
- methods: Array.isArray(methods) ? methods : [methods],
134
- executor,
135
- allowPath,
136
- openapi
137
- });
138
- };
116
+ beans[name] = { ...beans[name], bean: true };
139
117
  }
140
- exports.Route = Route;
141
118
  /**
142
119
  * This is the main class of the framework, it handles the routing, the services initialization and resolution
143
120
  *
144
121
  * @class Core
145
122
  * @category CoreFeatures
146
123
  */
147
- class Core extends events.EventEmitter {
124
+ export class Core extends events.EventEmitter {
148
125
  /**
149
126
  * @params {Object} config - The configuration Object, if undefined will load the configuration file
150
127
  */
151
128
  constructor(application) {
152
129
  var _a, _b, _c;
153
- var _d, _e, _f;
154
130
  /** @ignore */
155
131
  super();
156
132
  /**
@@ -161,7 +137,7 @@ class Core extends events.EventEmitter {
161
137
  /**
162
138
  * Router that will route http request in
163
139
  */
164
- this.router = new router_1.Router(this);
140
+ this.router = new Router(this);
165
141
  /**
166
142
  * If Core is already initiated
167
143
  */
@@ -185,21 +161,21 @@ class Core extends events.EventEmitter {
185
161
  */
186
162
  this._requestCORSFilters = [];
187
163
  this.workerOutput = application.getWorkerOutput();
188
- this.logger = new index_1.Logger(this.workerOutput, "@webda/core/lib/core.js");
164
+ this.logger = new Logger(this.workerOutput, "@webda/core/lib/core.js");
189
165
  this.application = application;
190
166
  this._initTime = new Date().getTime();
191
167
  // Schema validations
192
- this._ajv = new ajv_1.default();
193
- (0, ajv_formats_1.default)(this._ajv);
168
+ this._ajv = new Ajv();
169
+ addFormats(this._ajv);
194
170
  this._ajvSchemas = {};
195
171
  // Load the configuration and migrate
196
172
  this.configuration = this.application.getCurrentConfiguration();
197
173
  // Set the global context
198
- index_1.Context.setGlobalContext(new (this.getModel(this.parameter("contextModel") || "Webda/Context"))(this));
174
+ Context.setGlobalContext(new (this.getModel(this.parameter("contextModel") || "Webda/Context"))(this));
199
175
  // Init default values for configuration
200
- (_a = (_d = this.configuration).parameters) !== null && _a !== void 0 ? _a : (_d.parameters = {});
201
- (_b = (_e = this.configuration.parameters).apiUrl) !== null && _b !== void 0 ? _b : (_e.apiUrl = "http://localhost:18080");
202
- (_c = (_f = this.configuration).services) !== null && _c !== void 0 ? _c : (_f.services = {});
176
+ (_a = this.configuration).parameters ?? (_a.parameters = {});
177
+ (_b = this.configuration.parameters).apiUrl ?? (_b.apiUrl = "http://localhost:18080");
178
+ (_c = this.configuration).services ?? (_c.services = {});
203
179
  // Add CSRF origins filtering
204
180
  if (this.configuration.parameters.csrfOrigins) {
205
181
  this.registerCORSFilter(new OriginFilter(this.configuration.parameters.csrfOrigins));
@@ -215,8 +191,7 @@ class Core extends events.EventEmitter {
215
191
  * It is a random generated string
216
192
  */
217
193
  getInstanceId() {
218
- var _a;
219
- (_a = this.instanceId) !== null && _a !== void 0 ? _a : (this.instanceId = this.getUuid());
194
+ this.instanceId ?? (this.instanceId = this.getUuid());
220
195
  return this.instanceId;
221
196
  }
222
197
  /**
@@ -240,21 +215,6 @@ class Core extends events.EventEmitter {
240
215
  getAppPath(subpath = "") {
241
216
  return this.application.getAppPath(subpath);
242
217
  }
243
- /**
244
- * Reinit the @Route
245
- */
246
- reinitResolvedRoutes() {
247
- for (let i in beans) {
248
- if (beans[i].routes) {
249
- for (let j in beans[i].routes) {
250
- beans[i].routes[j].forEach(r => {
251
- r.resolved = false;
252
- this.router.removeRoute(j, r.info);
253
- });
254
- }
255
- }
256
- }
257
- }
258
218
  /**
259
219
  * Retrieve all detected modules definition
260
220
  */
@@ -277,86 +237,83 @@ class Core extends events.EventEmitter {
277
237
  * Init one service
278
238
  * @param service
279
239
  */
280
- initService(service) {
281
- return __awaiter(this, void 0, void 0, function* () {
282
- try {
283
- // TODO Define parralel initialization
284
- this.log("TRACE", "Initializing service", service);
285
- this.initBeanRoutes(this.services[service]);
286
- this.services[service]._initTime = Date.now();
287
- yield this.services[service].init();
288
- }
289
- catch (err) {
290
- this.services[service]._initException = err;
291
- this.failedServices[service] = { _initException: err };
292
- this.log("ERROR", "Init service " + service + " failed: " + err.message);
293
- this.log("TRACE", err.stack);
294
- }
295
- });
240
+ async initService(service) {
241
+ try {
242
+ // TODO Define parralel initialization
243
+ this.log("TRACE", "Initializing service", service);
244
+ this.services[service]._initTime = Date.now();
245
+ await this.services[service].init();
246
+ }
247
+ catch (err) {
248
+ this.services[service]._initException = err;
249
+ this.failedServices[service] = { _initException: err };
250
+ this.log("ERROR", "Init service " + service + " failed: " + err.message);
251
+ this.log("TRACE", err.stack);
252
+ }
296
253
  }
297
254
  /**
298
255
  * Get an object from the application based on its full uuid
299
256
  * @param fullUuid
300
257
  * @param partials
301
258
  */
302
- getModelObject(fullUuid, partials) {
303
- return __awaiter(this, void 0, void 0, function* () {
304
- return coremodel_1.CoreModel.fromFullUuid(this, fullUuid, partials);
305
- });
259
+ async getModelObject(fullUuid, partials) {
260
+ return CoreModel.fromFullUuid(this, fullUuid, partials);
306
261
  }
307
262
  /**
308
263
  * Init Webda
309
264
  *
310
265
  * It will resolve Services init method and autolink
311
266
  */
312
- init() {
267
+ async init() {
313
268
  var _a, _b;
314
- var _c, _d;
315
- return __awaiter(this, void 0, void 0, function* () {
316
- if (this._init) {
317
- return this._init;
318
- }
319
- if (this.configuration.parameters.configurationService) {
320
- try {
321
- this.log("INFO", "Create and init ConfigurationService", this.configuration.parameters.configurationService);
322
- // Create the configuration service
323
- this.createService(this.configuration.services, this.configuration.parameters.configurationService);
324
- let cfg = yield this.getService(this.configuration.parameters.configurationService).initConfiguration();
325
- if (cfg.webda) {
326
- (_a = (_c = cfg.webda).parameters) !== null && _a !== void 0 ? _a : (_c.parameters = {});
327
- (_b = (_d = cfg.webda).services) !== null && _b !== void 0 ? _b : (_d.services = {});
328
- this.configuration.parameters = Object.assign(Object.assign({}, this.configuration.parameters), cfg.webda.parameters);
329
- for (let i in this.configuration.services) {
330
- this.configuration.services[i] = Object.assign(Object.assign({}, (0, deepmerge_ts_1.deepmerge)(this.configuration.services[i], cfg.webda.services[i] || {})), { type: this.configuration.services[i].type });
331
- }
269
+ if (this._init) {
270
+ return this._init;
271
+ }
272
+ if (this.configuration.parameters.configurationService) {
273
+ try {
274
+ this.log("INFO", "Create and init ConfigurationService", this.configuration.parameters.configurationService);
275
+ // Create the configuration service
276
+ this.createService(this.configuration.services, this.configuration.parameters.configurationService);
277
+ let cfg = await this.getService(this.configuration.parameters.configurationService).initConfiguration();
278
+ if (cfg.webda) {
279
+ (_a = cfg.webda).parameters ?? (_a.parameters = {});
280
+ (_b = cfg.webda).services ?? (_b.services = {});
281
+ this.configuration.parameters = { ...this.configuration.parameters, ...cfg.webda.parameters };
282
+ for (let i in this.configuration.services) {
283
+ this.configuration.services[i] = {
284
+ ...deepmerge(this.configuration.services[i], cfg.webda.services[i] || {}),
285
+ type: this.configuration.services[i].type
286
+ };
332
287
  }
333
- yield this.getService(this.configuration.parameters.configurationService).init();
334
- }
335
- catch (err) {
336
- this.log("ERROR", "Cannot use ConfigurationService", this.configuration.parameters.configurationService, err);
337
- this.services = {};
338
288
  }
289
+ await this.getService(this.configuration.parameters.configurationService).init();
339
290
  }
340
- this.initStatics();
341
- this.reinitResolvedRoutes();
342
- this.log("TRACE", "Create Webda init promise");
343
- this._init = new Promise((resolve) => __awaiter(this, void 0, void 0, function* () {
344
- // Init services
345
- let service;
346
- let inits = [];
347
- for (service in this.services) {
348
- if (this.services[service].init !== undefined &&
349
- !this.services[service]._createException &&
350
- !this.services[service]._initTime) {
351
- inits.push(this.initService(service));
352
- }
291
+ catch (err) {
292
+ this.log("ERROR", "Cannot use ConfigurationService", this.configuration.parameters.configurationService, err);
293
+ this.services = {};
294
+ }
295
+ }
296
+ // Init the other services
297
+ this.initStatics();
298
+ this.log("TRACE", "Create Webda init promise");
299
+ this._init = new Promise(async (resolve) => {
300
+ await this.initService("registry");
301
+ await this.initService("cryptoservice");
302
+ // Init services
303
+ let service;
304
+ let inits = [];
305
+ for (service in this.services) {
306
+ if (this.services[service].init !== undefined &&
307
+ !this.services[service]._createException &&
308
+ !this.services[service]._initTime) {
309
+ inits.push(this.initService(service));
353
310
  }
354
- yield Promise.all(inits);
355
- yield this.emitSync("Webda.Init.Services", this.services);
356
- resolve();
357
- }));
358
- return this._init;
311
+ }
312
+ await Promise.all(inits);
313
+ await this.emitSync("Webda.Init.Services", this.services);
314
+ resolve();
359
315
  });
316
+ return this._init;
360
317
  }
361
318
  /**
362
319
  * Register a request filtering
@@ -376,23 +333,6 @@ class Core extends events.EventEmitter {
376
333
  registerCORSFilter(filter) {
377
334
  this._requestCORSFilters.push(filter);
378
335
  }
379
- /**
380
- *
381
- * @param {Object} executor The executor to expose as executor
382
- * @param {String} code to execute
383
- */
384
- sandbox(code, context) {
385
- context !== null && context !== void 0 ? context : (context = {
386
- require: () => {
387
- throw Error("not allowed");
388
- }
389
- });
390
- context.module = {
391
- exports: {}
392
- };
393
- vm.runInNewContext(code, context);
394
- return context.module.exports();
395
- }
396
336
  /**
397
337
  * Validate the object with schema
398
338
  *
@@ -415,7 +355,7 @@ class Core extends events.EventEmitter {
415
355
  if (this._ajv.validate(name, object)) {
416
356
  return true;
417
357
  }
418
- throw new validation_error_1.default(this._ajv.errors);
358
+ throw new ValidationError(this._ajv.errors);
419
359
  }
420
360
  /**
421
361
  * Return webda current version
@@ -452,7 +392,7 @@ class Core extends events.EventEmitter {
452
392
  }
453
393
  }
454
394
  }
455
- return new index_1.Logger(this.workerOutput, className);
395
+ return new Logger(this.workerOutput, className);
456
396
  }
457
397
  /**
458
398
  * Add a route dynamicaly
@@ -516,7 +456,7 @@ class Core extends events.EventEmitter {
516
456
  * @returns {{}}
517
457
  */
518
458
  getStores() {
519
- return this.getServicesOfType(index_1.Store);
459
+ return this.getServicesOfType(Store);
520
460
  }
521
461
  /**
522
462
  * Return a map of defined models
@@ -533,49 +473,17 @@ class Core extends events.EventEmitter {
533
473
  getModel(name) {
534
474
  return this.application.getModel(name);
535
475
  }
536
- /**
537
- * This should return a "turning" secret with cache and a service to modify it every x mins
538
- * WARNING The security is lower without this "turning" secret, you can still set the global.secret parameter
539
- *
540
- * Dont rely on this method, it will probably disapear to avoid secret leak
541
- *
542
- * @deprecated
543
- * @returns {String} Current secret
544
- */
545
- getSecret() {
546
- // For now a static config file but should have a rolling service secret
547
- return this.configuration.parameters.sessionSecret;
548
- }
549
- /**
550
- * Retrieve a HMAC for a string
551
- * @param data
552
- * @returns
553
- */
554
- getHmac(data) {
555
- return __awaiter(this, void 0, void 0, function* () {
556
- return crypto.createHmac("sha256", this.getSecret()).update(data).digest("hex");
557
- });
558
- }
559
- /**
560
- * Return a salt to use when doing digest
561
- *
562
- * @returns {String} Current salt
563
- */
564
- getSalt() {
565
- // For now a static config file but should have a rolling service secret
566
- return this.configuration.parameters.salt;
567
- }
568
476
  /**
569
477
  * Add to context information and executor based on the http context
570
478
  */
571
479
  updateContextWithRoute(ctx) {
572
480
  let http = ctx.getHttpContext();
573
481
  // Check mapping
574
- var route = this.router.getRouteFromUrl(ctx, http.getMethod(), http.getRelativeUri());
482
+ let route = this.router.getRouteFromUrl(ctx, http.getMethod(), http.getRelativeUri());
575
483
  if (route === undefined) {
576
484
  return false;
577
485
  }
578
- ctx.setRoute(Object.assign(Object.assign({}, this.configuration), route));
486
+ ctx.setRoute({ ...this.configuration, ...route });
579
487
  ctx.setExecutor(this.getService(route.executor));
580
488
  return true;
581
489
  }
@@ -611,41 +519,37 @@ class Core extends events.EventEmitter {
611
519
  * Reinit one service
612
520
  * @param service
613
521
  */
614
- reinitService(service) {
615
- return __awaiter(this, void 0, void 0, function* () {
616
- try {
617
- this.log("TRACE", "Re-Initializing service", service);
618
- let serviceBean = this.services[service];
619
- yield serviceBean.reinit(this.getServiceParams(serviceBean.getName()));
620
- }
621
- catch (err) {
622
- this.log("ERROR", "Re-Init service " + service + " failed", err);
623
- this.log("TRACE", err.stack);
624
- }
625
- });
522
+ async reinitService(service) {
523
+ try {
524
+ this.log("TRACE", "Re-Initializing service", service);
525
+ let serviceBean = this.services[service];
526
+ await serviceBean.reinit(this.getServiceParams(serviceBean.getName()));
527
+ }
528
+ catch (err) {
529
+ this.log("ERROR", "Re-Init service " + service + " failed", err);
530
+ this.log("TRACE", err.stack);
531
+ }
626
532
  }
627
533
  /**
628
534
  * Reinit all services with updated parameters
629
535
  * @param updates
630
536
  * @returns
631
537
  */
632
- reinit(updates) {
633
- return __awaiter(this, void 0, void 0, function* () {
634
- let configuration = JSON.parse(JSON.stringify(this.configuration.services));
635
- for (let service in updates) {
636
- jsonpath.value(configuration, service, updates[service]);
637
- }
638
- if (JSON.stringify(Object.keys(configuration)) !== JSON.stringify(Object.keys(this.configuration.services))) {
639
- this.log("ERROR", "Configuration update cannot modify services");
640
- throw new WebdaError("REINIT_SERVICE_INJECTION", "Configuration is not designed to add dynamically services");
641
- }
642
- this.configuration.services = configuration;
643
- let inits = [];
644
- for (let service in this.services) {
645
- inits.push(this.reinitService(service));
646
- }
647
- yield Promise.all(inits);
648
- });
538
+ async reinit(updates) {
539
+ let configuration = JSON.parse(JSON.stringify(this.configuration.services));
540
+ for (let service in updates) {
541
+ jsonpath.value(configuration, service, updates[service]);
542
+ }
543
+ if (JSON.stringify(Object.keys(configuration)) !== JSON.stringify(Object.keys(this.configuration.services))) {
544
+ this.log("ERROR", "Configuration update cannot modify services");
545
+ throw new WebdaError("REINIT_SERVICE_INJECTION", "Configuration is not designed to add dynamically services");
546
+ }
547
+ this.configuration.services = configuration;
548
+ let inits = [];
549
+ for (let service in this.services) {
550
+ inits.push(this.reinitService(service));
551
+ }
552
+ await Promise.all(inits);
649
553
  }
650
554
  /**
651
555
  * Get a full resolved service parameter
@@ -655,21 +559,20 @@ class Core extends events.EventEmitter {
655
559
  * @returns
656
560
  */
657
561
  getServiceParams(service, configuration = { parameters: {}, services: {} }) {
658
- var _a, _b, _c;
659
- var _d;
660
- (_a = configuration.parameters) !== null && _a !== void 0 ? _a : (configuration.parameters = {});
661
- (_b = configuration.services) !== null && _b !== void 0 ? _b : (configuration.services = {});
662
- (_c = (_d = configuration.services)[service]) !== null && _c !== void 0 ? _c : (_d[service] = {});
663
- const params = (0, deepmerge_ts_1.deepmerge)(this.configuration.parameters || {}, configuration.parameters || {}, this.configuration.services[service] || {}, configuration.services[service] || {});
562
+ var _a;
563
+ configuration.parameters ?? (configuration.parameters = {});
564
+ configuration.services ?? (configuration.services = {});
565
+ (_a = configuration.services)[service] ?? (_a[service] = {});
566
+ const params = deepmerge(this.configuration.parameters || {}, configuration.parameters || {}, this.configuration.services[service] || {}, configuration.services[service] || {});
664
567
  delete params.require;
665
568
  return params;
666
569
  }
667
570
  createService(services, service) {
668
- var type = services[service].type;
571
+ let type = services[service].type;
669
572
  if (type === undefined) {
670
573
  type = service;
671
574
  }
672
- var serviceConstructor = undefined;
575
+ let serviceConstructor = undefined;
673
576
  try {
674
577
  serviceConstructor = this.application.getModda(type);
675
578
  }
@@ -696,9 +599,6 @@ class Core extends events.EventEmitter {
696
599
  const services = this.configuration.services;
697
600
  this.log("DEBUG", beans);
698
601
  for (let i in beans) {
699
- if (!beans[i].bean) {
700
- this.log("DEBUG", "Implicit @Bean due to a @Route", beans[i].constructor.name);
701
- }
702
602
  let name = beans[i].constructor.name;
703
603
  if (!services[name]) {
704
604
  services[name] = {};
@@ -730,6 +630,20 @@ class Core extends events.EventEmitter {
730
630
  }
731
631
  return methods;
732
632
  }
633
+ /**
634
+ * A registry is a predefined store
635
+ * @returns
636
+ */
637
+ getRegistry() {
638
+ return this.registry;
639
+ }
640
+ /**
641
+ * Return the crypto service
642
+ * @returns
643
+ */
644
+ getCrypto() {
645
+ return this.cryptoService;
646
+ }
733
647
  /**
734
648
  * Auto connect services with setters
735
649
  */
@@ -766,38 +680,42 @@ class Core extends events.EventEmitter {
766
680
  * Init services and Beans along with Routes
767
681
  */
768
682
  initStatics() {
683
+ var _a, _b, _c;
684
+ // Init the registry
685
+ const autoRegistry = this.configuration.services["Registry"] === undefined;
686
+ (_a = this.configuration.services)["Registry"] ?? (_a["Registry"] = {
687
+ type: "webda/memorystore",
688
+ persistence: {
689
+ path: ".registry",
690
+ key: machineIdSync()
691
+ }
692
+ });
693
+ this.createService(this.configuration.services, "Registry");
694
+ this.registry = this.getService("Registry").resolve();
695
+ // Init the key service
696
+ (_b = this.configuration.services)["CryptoService"] ?? (_b["CryptoService"] = {
697
+ type: "webda/cryptoservice",
698
+ autoRotate: autoRegistry ? 30 : undefined,
699
+ autoCreate: true
700
+ });
701
+ this.createService(this.configuration.services, "CryptoService");
702
+ this.cryptoService = this.getService("CryptoService").resolve();
703
+ // Session Manager
704
+ (_c = this.configuration.services)["SessionManager"] ?? (_c["SessionManager"] = {
705
+ type: "webda/cookiesessionmanager"
706
+ });
769
707
  if (this.configuration.services !== undefined) {
770
- this.createServices(Object.keys(this.services));
708
+ let excludes = ["registry", "cryptoservice"];
709
+ if (this.configuration.parameters.configurationService) {
710
+ excludes.push(this.configuration.parameters.configurationService.toLowerCase());
711
+ }
712
+ // Do not recreate the configuration services
713
+ this.createServices(excludes);
771
714
  }
772
715
  this.router.remapRoutes();
773
716
  this._initiated = true;
774
717
  this.emit("Webda.Init", this.configuration);
775
718
  }
776
- /**
777
- * Init Routes declare by @Route annotation
778
- */
779
- initBeanRoutes(serviceBean) {
780
- let service = serviceBean.getName().toLowerCase();
781
- if (beans[service] !== undefined && beans[service].routes) {
782
- for (let j in beans[service].routes) {
783
- this.log("TRACE", "Adding route", j, "for bean", service);
784
- beans[service].routes[j].forEach(route => {
785
- if (route.resolved) {
786
- return;
787
- }
788
- route.info = {
789
- methods: route.methods,
790
- _method: this.services[service][route.executor],
791
- allowPath: route.allowPath || false,
792
- openapi: route.openapi,
793
- executor: beans[service].constructor.name // Name of the service
794
- };
795
- this.addRoute(j, route.info);
796
- route.resolved = true;
797
- });
798
- }
799
- }
800
- }
801
719
  /**
802
720
  * Create a new context for a request
803
721
  *
@@ -806,15 +724,13 @@ class Core extends events.EventEmitter {
806
724
  * @param stream - The request output stream if any
807
725
  * @return A new context object to pass along
808
726
  */
809
- newContext(httpContext, stream = undefined, noInit = false) {
810
- return __awaiter(this, void 0, void 0, function* () {
811
- let res = (new (this.getModel(this.parameter("contextModel") || "Webda/Context"))(this, httpContext, stream));
812
- if (!noInit) {
813
- yield res.init();
814
- }
815
- yield this.emitSync("Webda.NewContext", res);
816
- return res;
817
- });
727
+ async newContext(httpContext, stream = undefined, noInit = false) {
728
+ let res = (new (this.getModel(this.parameter("contextModel") || "Webda/Context"))(this, httpContext, stream));
729
+ if (!noInit) {
730
+ await res.init();
731
+ }
732
+ await this.emitSync("Webda.NewContext", res);
733
+ return res;
818
734
  }
819
735
  /**
820
736
  * Convert an object to JSON using the Webda json filter
@@ -834,10 +750,10 @@ class Core extends events.EventEmitter {
834
750
  */
835
751
  getUuid(format = "uuid") {
836
752
  if (format === "uuid") {
837
- return (0, uuid_1.v4)().toString();
753
+ return uuidv4().toString();
838
754
  }
839
755
  let buffer = Buffer.alloc(16);
840
- (0, uuid_1.v4)(undefined, buffer);
756
+ uuidv4(undefined, buffer);
841
757
  if (format === "base64") {
842
758
  // Remove useless = we won't transfer back to original value or could just add ==
843
759
  // https://datatracker.ietf.org/doc/html/rfc4648#page-7
@@ -855,9 +771,9 @@ class Core extends events.EventEmitter {
855
771
  * Emit the event with data and wait for Promise to finish if listener returned a Promise
856
772
  */
857
773
  emitSync(eventType, event, ...data) {
858
- var result;
859
- var promises = [];
860
- var listeners = this.listeners(eventType);
774
+ let result;
775
+ let promises = [];
776
+ let listeners = this.listeners(eventType);
861
777
  for (let listener of listeners) {
862
778
  result = listener(event, ...data);
863
779
  if (result instanceof Promise) {
@@ -896,28 +812,23 @@ class Core extends events.EventEmitter {
896
812
  *
897
813
  * @param context Context of the request
898
814
  */
899
- checkRequest(ctx) {
900
- return __awaiter(this, void 0, void 0, function* () {
901
- // Do not need to filter on OPTIONS as CORS is for that
902
- if (ctx.getHttpContext().getMethod() === "OPTIONS") {
903
- return true;
904
- }
905
- return (yield Promise.all(this._requestFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
906
- });
815
+ async checkRequest(ctx) {
816
+ // Do not need to filter on OPTIONS as CORS is for that
817
+ if (ctx.getHttpContext().getMethod() === "OPTIONS") {
818
+ return true;
819
+ }
820
+ return (await Promise.all(this._requestFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
907
821
  }
908
822
  /**
909
823
  * Verify if an origin is allowed to do request on the API
910
824
  *
911
825
  * @param context Context of the request
912
826
  */
913
- checkCORSRequest(ctx) {
914
- return __awaiter(this, void 0, void 0, function* () {
915
- return (yield Promise.all(this._requestCORSFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
916
- });
827
+ async checkCORSRequest(ctx) {
828
+ return (await Promise.all(this._requestCORSFilters.map(filter => filter.checkRequest(ctx)))).some(v => v);
917
829
  }
918
830
  exportOpenAPI(skipHidden = true) {
919
831
  var _a;
920
- var _b;
921
832
  let packageInfo = this.application.getPackageDescription();
922
833
  let contact;
923
834
  if (typeof packageInfo.author === "string") {
@@ -937,7 +848,7 @@ class Core extends events.EventEmitter {
937
848
  else if (packageInfo.license) {
938
849
  license = packageInfo.license;
939
850
  }
940
- let openapi = (0, deepmerge_ts_1.deepmerge)({
851
+ let openapi = deepmerge({
941
852
  openapi: "3.0.3",
942
853
  info: {
943
854
  description: packageInfo.description,
@@ -947,11 +858,11 @@ class Core extends events.EventEmitter {
947
858
  contact,
948
859
  license
949
860
  },
950
- schemes: ["https"],
951
- basePath: "/",
952
- definitions: {
953
- Object: {
954
- type: "object"
861
+ components: {
862
+ schemas: {
863
+ Object: {
864
+ type: "object"
865
+ }
955
866
  }
956
867
  },
957
868
  paths: {},
@@ -964,21 +875,30 @@ class Core extends events.EventEmitter {
964
875
  type: "object"
965
876
  };
966
877
  let modelDescription = this.getModel(i);
878
+ let modelName = model.name || i.split("/").pop();
967
879
  // Only export CoreModel info
968
- if (!this.application.extends(modelDescription, coremodel_1.CoreModel)) {
880
+ if (!this.application.extends(modelDescription, CoreModel)) {
969
881
  continue;
970
882
  }
971
883
  let schema = this.application.getSchema(i);
972
884
  if (schema) {
973
885
  for (let j in schema.definitions) {
974
886
  // @ts-ignore
975
- (_a = (_b = openapi.definitions)[j]) !== null && _a !== void 0 ? _a : (_b[j] = schema.definitions[j]);
887
+ (_a = openapi.components.schemas)[j] ?? (_a[j] = schema.definitions[j]);
976
888
  }
977
889
  delete schema.definitions;
978
890
  desc = schema;
979
891
  }
980
- // @ts-ignore
981
- openapi.definitions[model.name.split("/").pop()] = desc;
892
+ // Remove empty required as openapi does not like that
893
+ // Our compiler is not generating this anymore but it is additional protection
894
+ /* c8 ignore next 3 */
895
+ if (desc.required && desc.required.length === 0) {
896
+ delete desc.required;
897
+ }
898
+ // Remove $schema
899
+ delete desc.$schema;
900
+ // Rename all #/definitions/ by #/components/schemas/
901
+ openapi.components.schemas[modelName] = JSON.parse(JSON.stringify(desc).replace(/#\/definitions\//g, "#/components/schemas/"));
982
902
  }
983
903
  this.router.completeOpenAPI(openapi, skipHidden);
984
904
  openapi.tags.sort((a, b) => a.name.toLowerCase().localeCompare(b.name.toLowerCase()));
@@ -990,5 +910,4 @@ class Core extends events.EventEmitter {
990
910
  return openapi;
991
911
  }
992
912
  }
993
- exports.Core = Core;
994
913
  //# sourceMappingURL=core.js.map