@tahminator/sapling 2.1.0-beta.0e8a97e8 → 2.1.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.
- package/dist/index.cjs +128 -176
- package/dist/index.d.cts +10 -33
- package/dist/index.d.mts +10 -33
- package/dist/index.mjs +129 -165
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -270,160 +270,10 @@ var ParserError = class ParserError extends ResponseStatusError {
|
|
|
270
270
|
}
|
|
271
271
|
};
|
|
272
272
|
//#endregion
|
|
273
|
-
//#region lib/weakmap.ts
|
|
274
|
-
/**
|
|
275
|
-
* WeakMap that is iterable.
|
|
276
|
-
*/
|
|
277
|
-
var IterableWeakMap = class IterableWeakMap {
|
|
278
|
-
#weakMap = /* @__PURE__ */ new WeakMap();
|
|
279
|
-
#refSet = /* @__PURE__ */ new Set();
|
|
280
|
-
#finalizationGroup = new FinalizationRegistry(IterableWeakMap.#cleanup);
|
|
281
|
-
static #cleanup(heldValue) {
|
|
282
|
-
heldValue.set.delete(heldValue.ref);
|
|
283
|
-
}
|
|
284
|
-
constructor(iterable) {
|
|
285
|
-
if (iterable) for (const [key, value] of iterable) this.set(key, value);
|
|
286
|
-
}
|
|
287
|
-
set(key, value) {
|
|
288
|
-
const ref = new WeakRef(key);
|
|
289
|
-
this.#weakMap.set(key, {
|
|
290
|
-
value,
|
|
291
|
-
ref
|
|
292
|
-
});
|
|
293
|
-
this.#refSet.add(ref);
|
|
294
|
-
this.#finalizationGroup.register(key, {
|
|
295
|
-
set: this.#refSet,
|
|
296
|
-
ref
|
|
297
|
-
}, ref);
|
|
298
|
-
return this;
|
|
299
|
-
}
|
|
300
|
-
get(key) {
|
|
301
|
-
return this.#weakMap.get(key)?.value;
|
|
302
|
-
}
|
|
303
|
-
delete(key) {
|
|
304
|
-
const entry = this.#weakMap.get(key);
|
|
305
|
-
if (!entry) return false;
|
|
306
|
-
this.#weakMap.delete(key);
|
|
307
|
-
this.#refSet.delete(entry.ref);
|
|
308
|
-
this.#finalizationGroup.unregister(entry.ref);
|
|
309
|
-
return true;
|
|
310
|
-
}
|
|
311
|
-
*[Symbol.iterator]() {
|
|
312
|
-
for (const ref of this.#refSet) {
|
|
313
|
-
const key = ref.deref();
|
|
314
|
-
if (!key) continue;
|
|
315
|
-
const entry = this.#weakMap.get(key);
|
|
316
|
-
if (entry) yield [key, entry.value];
|
|
317
|
-
}
|
|
318
|
-
}
|
|
319
|
-
entries() {
|
|
320
|
-
return this[Symbol.iterator]();
|
|
321
|
-
}
|
|
322
|
-
*keys() {
|
|
323
|
-
for (const [key] of this) yield key;
|
|
324
|
-
}
|
|
325
|
-
*values() {
|
|
326
|
-
for (const [, value] of this) yield value;
|
|
327
|
-
}
|
|
328
|
-
forEach(callback, thisArg) {
|
|
329
|
-
for (const [key, value] of this) callback.call(thisArg, value, key, this);
|
|
330
|
-
}
|
|
331
|
-
};
|
|
332
|
-
//#endregion
|
|
333
|
-
//#region src/annotation/injectable.ts
|
|
334
|
-
const _InjectableRegistry = /* @__PURE__ */ new WeakMap();
|
|
335
|
-
const _InjectableDeps = new IterableWeakMap();
|
|
336
|
-
/**
|
|
337
|
-
* Mark the class as an injectable to be handled by Sapling. The class can now be
|
|
338
|
-
* be injected into other classes, as well as allow the class to inject other `@Injectable` classes.
|
|
339
|
-
*
|
|
340
|
-
* @argument deps - An optional array to define any dependencies that this class may require.
|
|
341
|
-
*/
|
|
342
|
-
function Injectable(deps = []) {
|
|
343
|
-
return function(target) {
|
|
344
|
-
_InjectableRegistry.set(target, null);
|
|
345
|
-
_InjectableDeps.set(target, deps);
|
|
346
|
-
};
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Resolves and instantiates a class along with all of it's transitive dependencies.
|
|
350
|
-
*
|
|
351
|
-
* Uses topological sort (Kahn's algorithm) to ensure that the dependency graph is created
|
|
352
|
-
* in a correct order.
|
|
353
|
-
*
|
|
354
|
-
* When `resolve` is first called (usually during controller registration),
|
|
355
|
-
* it will compute the dependency graph of all `@Injectable` classes and instantiates
|
|
356
|
-
* them in the correct order.
|
|
357
|
-
*
|
|
358
|
-
* Subsequent calls to dependencies that have already been resolved are cached, so they will
|
|
359
|
-
* re-use the created singletons instead of re-instantiation.
|
|
360
|
-
*/
|
|
361
|
-
function _resolve(ctor) {
|
|
362
|
-
const inDegree = /* @__PURE__ */ new Map();
|
|
363
|
-
const graph = /* @__PURE__ */ new Map();
|
|
364
|
-
_InjectableDeps.forEach((deps, node) => {
|
|
365
|
-
inDegree.set(node, inDegree.get(node) || 0);
|
|
366
|
-
deps.forEach((dep) => {
|
|
367
|
-
if (dep === void 0) throw new Error(`There is an @Injectable (${node.name}) which has a dependency that cannot be found. This is likely caused by a circular dependency.`);
|
|
368
|
-
inDegree.set(dep, inDegree.get(dep) || 0);
|
|
369
|
-
inDegree.set(node, inDegree.get(node) + 1);
|
|
370
|
-
if (!graph.has(dep)) graph.set(dep, []);
|
|
371
|
-
graph.get(dep).push(node);
|
|
372
|
-
});
|
|
373
|
-
});
|
|
374
|
-
const queue = [];
|
|
375
|
-
inDegree.forEach((deg, node) => {
|
|
376
|
-
if (deg === 0) queue.push(node);
|
|
377
|
-
});
|
|
378
|
-
while (queue.length) {
|
|
379
|
-
const current = queue.shift();
|
|
380
|
-
if (!_InjectableRegistry.get(current)) {
|
|
381
|
-
const instance = new current(...(_InjectableDeps.get(current) || []).map((dep) => _InjectableRegistry.get(dep)));
|
|
382
|
-
_InjectableRegistry.set(current, instance);
|
|
383
|
-
}
|
|
384
|
-
(graph.get(current) || []).forEach((neighbor) => {
|
|
385
|
-
inDegree.set(neighbor, (inDegree.get(neighbor) ?? 0) - 1);
|
|
386
|
-
if (inDegree.get(neighbor) === 0) queue.push(neighbor);
|
|
387
|
-
});
|
|
388
|
-
}
|
|
389
|
-
if (!_InjectableRegistry.get(ctor)) throw new Error("Circular dependency detected or injectable not registered");
|
|
390
|
-
return _InjectableRegistry.get(ctor);
|
|
391
|
-
}
|
|
392
|
-
//#endregion
|
|
393
|
-
//#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
|
|
394
|
-
function __decorate(decorators, target, key, desc) {
|
|
395
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
396
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
397
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
398
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
399
|
-
}
|
|
400
|
-
//#endregion
|
|
401
|
-
//#region src/middleware/health/registrar.ts
|
|
402
|
-
let HealthRegistrar = class HealthRegistrar {
|
|
403
|
-
_checks;
|
|
404
|
-
_sealed;
|
|
405
|
-
constructor() {
|
|
406
|
-
this._checks = [];
|
|
407
|
-
this._sealed = false;
|
|
408
|
-
}
|
|
409
|
-
add(healthCheck) {
|
|
410
|
-
this._checks.push(healthCheck);
|
|
411
|
-
}
|
|
412
|
-
seal() {
|
|
413
|
-
this._sealed = true;
|
|
414
|
-
}
|
|
415
|
-
async check() {
|
|
416
|
-
if (!this._sealed) return false;
|
|
417
|
-
return (await Promise.all(this._checks.map((c) => c()))).every((c) => c === true);
|
|
418
|
-
}
|
|
419
|
-
};
|
|
420
|
-
HealthRegistrar = __decorate([Injectable()], HealthRegistrar);
|
|
421
|
-
//#endregion
|
|
422
273
|
//#region src/helper/sapling.ts
|
|
423
274
|
const _settings = {
|
|
424
275
|
serialize: JSON.stringify,
|
|
425
276
|
deserialize: JSON.parse,
|
|
426
|
-
health: { path: "/up" },
|
|
427
277
|
doc: {
|
|
428
278
|
openApiPath: "/openapi.json",
|
|
429
279
|
swaggerPath: "/swagger.html",
|
|
@@ -499,7 +349,6 @@ var Sapling = class Sapling {
|
|
|
499
349
|
static registerApp(app) {
|
|
500
350
|
app.use(express.default.text({ type: "application/json" }));
|
|
501
351
|
app.use(Sapling.json());
|
|
502
|
-
_InjectableRegistry.get(HealthRegistrar)?.seal();
|
|
503
352
|
}
|
|
504
353
|
/**
|
|
505
354
|
* Serialize a value into a JSON string.
|
|
@@ -925,6 +774,126 @@ const methodResolve = {
|
|
|
925
774
|
USE: "use"
|
|
926
775
|
};
|
|
927
776
|
//#endregion
|
|
777
|
+
//#region lib/weakmap.ts
|
|
778
|
+
/**
|
|
779
|
+
* WeakMap that is iterable.
|
|
780
|
+
*/
|
|
781
|
+
var IterableWeakMap = class IterableWeakMap {
|
|
782
|
+
#weakMap = /* @__PURE__ */ new WeakMap();
|
|
783
|
+
#refSet = /* @__PURE__ */ new Set();
|
|
784
|
+
#finalizationGroup = new FinalizationRegistry(IterableWeakMap.#cleanup);
|
|
785
|
+
static #cleanup(heldValue) {
|
|
786
|
+
heldValue.set.delete(heldValue.ref);
|
|
787
|
+
}
|
|
788
|
+
constructor(iterable) {
|
|
789
|
+
if (iterable) for (const [key, value] of iterable) this.set(key, value);
|
|
790
|
+
}
|
|
791
|
+
set(key, value) {
|
|
792
|
+
const ref = new WeakRef(key);
|
|
793
|
+
this.#weakMap.set(key, {
|
|
794
|
+
value,
|
|
795
|
+
ref
|
|
796
|
+
});
|
|
797
|
+
this.#refSet.add(ref);
|
|
798
|
+
this.#finalizationGroup.register(key, {
|
|
799
|
+
set: this.#refSet,
|
|
800
|
+
ref
|
|
801
|
+
}, ref);
|
|
802
|
+
return this;
|
|
803
|
+
}
|
|
804
|
+
get(key) {
|
|
805
|
+
return this.#weakMap.get(key)?.value;
|
|
806
|
+
}
|
|
807
|
+
delete(key) {
|
|
808
|
+
const entry = this.#weakMap.get(key);
|
|
809
|
+
if (!entry) return false;
|
|
810
|
+
this.#weakMap.delete(key);
|
|
811
|
+
this.#refSet.delete(entry.ref);
|
|
812
|
+
this.#finalizationGroup.unregister(entry.ref);
|
|
813
|
+
return true;
|
|
814
|
+
}
|
|
815
|
+
*[Symbol.iterator]() {
|
|
816
|
+
for (const ref of this.#refSet) {
|
|
817
|
+
const key = ref.deref();
|
|
818
|
+
if (!key) continue;
|
|
819
|
+
const entry = this.#weakMap.get(key);
|
|
820
|
+
if (entry) yield [key, entry.value];
|
|
821
|
+
}
|
|
822
|
+
}
|
|
823
|
+
entries() {
|
|
824
|
+
return this[Symbol.iterator]();
|
|
825
|
+
}
|
|
826
|
+
*keys() {
|
|
827
|
+
for (const [key] of this) yield key;
|
|
828
|
+
}
|
|
829
|
+
*values() {
|
|
830
|
+
for (const [, value] of this) yield value;
|
|
831
|
+
}
|
|
832
|
+
forEach(callback, thisArg) {
|
|
833
|
+
for (const [key, value] of this) callback.call(thisArg, value, key, this);
|
|
834
|
+
}
|
|
835
|
+
};
|
|
836
|
+
//#endregion
|
|
837
|
+
//#region src/annotation/injectable.ts
|
|
838
|
+
const _InjectableRegistry = /* @__PURE__ */ new WeakMap();
|
|
839
|
+
const _InjectableDeps = new IterableWeakMap();
|
|
840
|
+
/**
|
|
841
|
+
* Mark the class as an injectable to be handled by Sapling. The class can now be
|
|
842
|
+
* be injected into other classes, as well as allow the class to inject other `@Injectable` classes.
|
|
843
|
+
*
|
|
844
|
+
* @argument deps - An optional array to define any dependencies that this class may require.
|
|
845
|
+
*/
|
|
846
|
+
function Injectable(deps = []) {
|
|
847
|
+
return function(target) {
|
|
848
|
+
_InjectableRegistry.set(target, null);
|
|
849
|
+
_InjectableDeps.set(target, deps);
|
|
850
|
+
};
|
|
851
|
+
}
|
|
852
|
+
/**
|
|
853
|
+
* Resolves and instantiates a class along with all of it's transitive dependencies.
|
|
854
|
+
*
|
|
855
|
+
* Uses topological sort (Kahn's algorithm) to ensure that the dependency graph is created
|
|
856
|
+
* in a correct order.
|
|
857
|
+
*
|
|
858
|
+
* When `resolve` is first called (usually during controller registration),
|
|
859
|
+
* it will compute the dependency graph of all `@Injectable` classes and instantiates
|
|
860
|
+
* them in the correct order.
|
|
861
|
+
*
|
|
862
|
+
* Subsequent calls to dependencies that have already been resolved are cached, so they will
|
|
863
|
+
* re-use the created singletons instead of re-instantiation.
|
|
864
|
+
*/
|
|
865
|
+
function _resolve(ctor) {
|
|
866
|
+
const inDegree = /* @__PURE__ */ new Map();
|
|
867
|
+
const graph = /* @__PURE__ */ new Map();
|
|
868
|
+
_InjectableDeps.forEach((deps, node) => {
|
|
869
|
+
inDegree.set(node, inDegree.get(node) || 0);
|
|
870
|
+
deps.forEach((dep) => {
|
|
871
|
+
if (dep === void 0) throw new Error(`There is an @Injectable (${node.name}) which has a dependency that cannot be found. This is likely caused by a circular dependency.`);
|
|
872
|
+
inDegree.set(dep, inDegree.get(dep) || 0);
|
|
873
|
+
inDegree.set(node, inDegree.get(node) + 1);
|
|
874
|
+
if (!graph.has(dep)) graph.set(dep, []);
|
|
875
|
+
graph.get(dep).push(node);
|
|
876
|
+
});
|
|
877
|
+
});
|
|
878
|
+
const queue = [];
|
|
879
|
+
inDegree.forEach((deg, node) => {
|
|
880
|
+
if (deg === 0) queue.push(node);
|
|
881
|
+
});
|
|
882
|
+
while (queue.length) {
|
|
883
|
+
const current = queue.shift();
|
|
884
|
+
if (!_InjectableRegistry.get(current)) {
|
|
885
|
+
const instance = new current(...(_InjectableDeps.get(current) || []).map((dep) => _InjectableRegistry.get(dep)));
|
|
886
|
+
_InjectableRegistry.set(current, instance);
|
|
887
|
+
}
|
|
888
|
+
(graph.get(current) || []).forEach((neighbor) => {
|
|
889
|
+
inDegree.set(neighbor, (inDegree.get(neighbor) ?? 0) - 1);
|
|
890
|
+
if (inDegree.get(neighbor) === 0) queue.push(neighbor);
|
|
891
|
+
});
|
|
892
|
+
}
|
|
893
|
+
if (!_InjectableRegistry.get(ctor)) throw new Error("Circular dependency detected or injectable not registered");
|
|
894
|
+
return _InjectableRegistry.get(ctor);
|
|
895
|
+
}
|
|
896
|
+
//#endregion
|
|
928
897
|
//#region src/annotation/controller.ts
|
|
929
898
|
const _ControllerRegistry = /* @__PURE__ */ new WeakMap();
|
|
930
899
|
/**
|
|
@@ -1043,6 +1012,14 @@ function MiddlewareClass(...args) {
|
|
|
1043
1012
|
return Controller(...args);
|
|
1044
1013
|
}
|
|
1045
1014
|
//#endregion
|
|
1015
|
+
//#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
|
|
1016
|
+
function __decorate(decorators, target, key, desc) {
|
|
1017
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
1018
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
1019
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
1020
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
1021
|
+
}
|
|
1022
|
+
//#endregion
|
|
1046
1023
|
//#region src/middleware/default/error/base.ts
|
|
1047
1024
|
let DefaultBaseErrorMiddleware = class DefaultBaseErrorMiddleware {
|
|
1048
1025
|
handle(err, _request, _response, _next) {
|
|
@@ -1158,19 +1135,6 @@ const DefaultSwaggerMiddleware = {
|
|
|
1158
1135
|
Setup
|
|
1159
1136
|
};
|
|
1160
1137
|
//#endregion
|
|
1161
|
-
//#region src/middleware/default/health/index.ts
|
|
1162
|
-
let DefaultHealthMiddleware = class DefaultHealthMiddleware {
|
|
1163
|
-
constructor(healthRegistrar) {
|
|
1164
|
-
this.healthRegistrar = healthRegistrar;
|
|
1165
|
-
}
|
|
1166
|
-
async serve(_request, _response, _next) {
|
|
1167
|
-
const up = await this.healthRegistrar.check();
|
|
1168
|
-
return ResponseEntity.ok().body({ up });
|
|
1169
|
-
}
|
|
1170
|
-
};
|
|
1171
|
-
__decorate([GET(_settings.health.path)], DefaultHealthMiddleware.prototype, "serve", null);
|
|
1172
|
-
DefaultHealthMiddleware = __decorate([MiddlewareClass({ deps: [HealthRegistrar] })], DefaultHealthMiddleware);
|
|
1173
|
-
//#endregion
|
|
1174
1138
|
exports.Controller = Controller;
|
|
1175
1139
|
exports.ControllerSchema = ControllerSchema;
|
|
1176
1140
|
exports.DELETE = DELETE;
|
|
@@ -1180,12 +1144,6 @@ Object.defineProperty(exports, "DefaultBaseErrorMiddleware", {
|
|
|
1180
1144
|
return DefaultBaseErrorMiddleware;
|
|
1181
1145
|
}
|
|
1182
1146
|
});
|
|
1183
|
-
Object.defineProperty(exports, "DefaultHealthMiddleware", {
|
|
1184
|
-
enumerable: true,
|
|
1185
|
-
get: function() {
|
|
1186
|
-
return DefaultHealthMiddleware;
|
|
1187
|
-
}
|
|
1188
|
-
});
|
|
1189
1147
|
Object.defineProperty(exports, "DefaultOpenApiMiddleware", {
|
|
1190
1148
|
enumerable: true,
|
|
1191
1149
|
get: function() {
|
|
@@ -1207,12 +1165,6 @@ Object.defineProperty(exports, "DefaultResponseStatusErrorMiddleware", {
|
|
|
1207
1165
|
exports.DefaultSwaggerMiddleware = DefaultSwaggerMiddleware;
|
|
1208
1166
|
exports.GET = GET;
|
|
1209
1167
|
exports.HEAD = HEAD;
|
|
1210
|
-
Object.defineProperty(exports, "HealthRegistrar", {
|
|
1211
|
-
enumerable: true,
|
|
1212
|
-
get: function() {
|
|
1213
|
-
return HealthRegistrar;
|
|
1214
|
-
}
|
|
1215
|
-
});
|
|
1216
1168
|
exports.Html404ErrorPage = Html404ErrorPage;
|
|
1217
1169
|
exports.HttpStatus = HttpStatus;
|
|
1218
1170
|
exports.Injectable = Injectable;
|
package/dist/index.d.cts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e, { ErrorRequestHandler, NextFunction, Request
|
|
1
|
+
import e, { ErrorRequestHandler, NextFunction, Request, RequestHandler, Response as Response$1, Router } from "express";
|
|
2
2
|
|
|
3
3
|
//#region src/html/404.d.ts
|
|
4
4
|
/**
|
|
@@ -26,7 +26,7 @@ type RouteDefinition = {
|
|
|
26
26
|
};
|
|
27
27
|
type Class<T> = new (...args: any[]) => T;
|
|
28
28
|
type HttpHeaders = Record<string, string>;
|
|
29
|
-
type ExpressMiddlewareFn = ($1: Request
|
|
29
|
+
type ExpressMiddlewareFn = ($1: Request, $2: Response$1, $3: NextFunction) => void;
|
|
30
30
|
//#endregion
|
|
31
31
|
//#region src/annotation/controller.d.ts
|
|
32
32
|
declare const _ControllerRegistry: WeakMap<Function, Router | ErrorRequestHandler>;
|
|
@@ -794,9 +794,6 @@ declare function _clearOpenApiRegistry(): void;
|
|
|
794
794
|
type Settings = {
|
|
795
795
|
serialize: (value: any) => string;
|
|
796
796
|
deserialize: (value: string) => any;
|
|
797
|
-
health: {
|
|
798
|
-
path: string;
|
|
799
|
-
};
|
|
800
797
|
doc: {
|
|
801
798
|
openApiPath: string;
|
|
802
799
|
swaggerPath: string;
|
|
@@ -925,7 +922,7 @@ declare class Sapling {
|
|
|
925
922
|
* }
|
|
926
923
|
* ```
|
|
927
924
|
*/
|
|
928
|
-
static chainHandlers(this: void, handlers: RequestHandler[], request: Request
|
|
925
|
+
static chainHandlers(this: void, handlers: RequestHandler[], request: Request, response: Response$1, next: NextFunction, index?: number): void;
|
|
929
926
|
}
|
|
930
927
|
//#endregion
|
|
931
928
|
//#region src/annotation/validator.d.ts
|
|
@@ -981,7 +978,7 @@ declare function _getControllerSchema(ctor: Function): ControllerSchemaDefinitio
|
|
|
981
978
|
* If the default is not suitable, you may also easily write your own.
|
|
982
979
|
*/
|
|
983
980
|
declare class DefaultBaseErrorMiddleware {
|
|
984
|
-
handle(err: unknown, _request: Request
|
|
981
|
+
handle(err: unknown, _request: Request, _response: Response$1, _next: NextFunction): ResponseEntity<{
|
|
985
982
|
message: string;
|
|
986
983
|
}>;
|
|
987
984
|
}
|
|
@@ -992,7 +989,7 @@ declare class DefaultBaseErrorMiddleware {
|
|
|
992
989
|
* If the default is not suitable, you may also easily write your own.
|
|
993
990
|
*/
|
|
994
991
|
declare class DefaultParserErrorMiddleware {
|
|
995
|
-
handle(err: unknown, _request: Request
|
|
992
|
+
handle(err: unknown, _request: Request, _response: Response$1, next: NextFunction): ResponseEntity<{
|
|
996
993
|
message: string;
|
|
997
994
|
}> | undefined;
|
|
998
995
|
}
|
|
@@ -1003,7 +1000,7 @@ declare class DefaultParserErrorMiddleware {
|
|
|
1003
1000
|
* If the default is not suitable, you may also easily write your own.
|
|
1004
1001
|
*/
|
|
1005
1002
|
declare class DefaultResponseStatusErrorMiddleware {
|
|
1006
|
-
handle(err: unknown, _request: Request
|
|
1003
|
+
handle(err: unknown, _request: Request, _response: Response$1, next: NextFunction): ResponseEntity<{
|
|
1007
1004
|
message: string;
|
|
1008
1005
|
}> | undefined;
|
|
1009
1006
|
}
|
|
@@ -1026,7 +1023,7 @@ declare class DefaultResponseStatusErrorMiddleware {
|
|
|
1026
1023
|
* ```
|
|
1027
1024
|
*/
|
|
1028
1025
|
declare class DefaultOpenApiMiddleware {
|
|
1029
|
-
handle(_request: Request
|
|
1026
|
+
handle(_request: Request, _response: Response$1, _next: NextFunction): ResponseEntity<OpenAPIV3.Document<{}>>;
|
|
1030
1027
|
}
|
|
1031
1028
|
//#endregion
|
|
1032
1029
|
//#region src/middleware/default/swagger/index.d.ts
|
|
@@ -1048,7 +1045,7 @@ declare class DefaultOpenApiMiddleware {
|
|
|
1048
1045
|
*/
|
|
1049
1046
|
declare class Serve {
|
|
1050
1047
|
private readonly handlers;
|
|
1051
|
-
handle(request: Request
|
|
1048
|
+
handle(request: Request, response: Response$1, next: NextFunction): void;
|
|
1052
1049
|
}
|
|
1053
1050
|
/**
|
|
1054
1051
|
* Enable the serving of the Swagger endpoint used to serve the OpenAPI spec generated by Sapling.
|
|
@@ -1069,7 +1066,7 @@ declare class Serve {
|
|
|
1069
1066
|
declare class Setup {
|
|
1070
1067
|
private readonly handler;
|
|
1071
1068
|
constructor();
|
|
1072
|
-
handle(request: Request
|
|
1069
|
+
handle(request: Request, response: Response$1, next: NextFunction): unknown;
|
|
1073
1070
|
}
|
|
1074
1071
|
/**
|
|
1075
1072
|
* Enable the serving of the Swagger endpoint used to serve the OpenAPI spec generated by Sapling.
|
|
@@ -1092,24 +1089,4 @@ declare const DefaultSwaggerMiddleware: {
|
|
|
1092
1089
|
Setup: typeof Setup;
|
|
1093
1090
|
};
|
|
1094
1091
|
//#endregion
|
|
1095
|
-
|
|
1096
|
-
type HealthCheck = () => boolean | Promise<boolean>;
|
|
1097
|
-
declare class HealthRegistrar {
|
|
1098
|
-
private _checks;
|
|
1099
|
-
private _sealed;
|
|
1100
|
-
constructor();
|
|
1101
|
-
add(healthCheck: HealthCheck): void;
|
|
1102
|
-
seal(): void;
|
|
1103
|
-
check(): Promise<boolean>;
|
|
1104
|
-
}
|
|
1105
|
-
//#endregion
|
|
1106
|
-
//#region src/middleware/default/health/index.d.ts
|
|
1107
|
-
declare class DefaultHealthMiddleware {
|
|
1108
|
-
private readonly healthRegistrar;
|
|
1109
|
-
constructor(healthRegistrar: HealthRegistrar);
|
|
1110
|
-
serve(_request: Request, _response: Response, _next: NextFunction): Promise<ResponseEntity<{
|
|
1111
|
-
up: boolean;
|
|
1112
|
-
}>>;
|
|
1113
|
-
}
|
|
1114
|
-
//#endregion
|
|
1115
|
-
export { Class, Controller, ControllerSchema, ControllerSchemaDefinition, DELETE, DefaultBaseErrorMiddleware, DefaultHealthMiddleware, DefaultOpenApiMiddleware, DefaultParserErrorMiddleware, DefaultResponseStatusErrorMiddleware, DefaultSwaggerMiddleware, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, HealthCheck, HealthRegistrar, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, OpenAPIMetadata, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseBody, ResponseEntity, ResponseEntityBuilder, ResponseSchema, ResponseStatusError, RouteDefinition, RouteSchema, RouteSchemaDefinition, Sapling, ValidatorSchema, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _clearOpenApiRegistry, _getControllerSchema, _getOrCreateSchemaDefinition, _getRouteSchema, _getRoutes, _getValidatorSchema, _parseOrThrow, _registerController, _resolve, _saveValidatorSchema, _setControllerSchema, _setRouteSchema, _settings, generateOpenApiSpec, methodResolve, openApiGenerator };
|
|
1092
|
+
export { Class, Controller, ControllerSchema, ControllerSchemaDefinition, DELETE, DefaultBaseErrorMiddleware, DefaultOpenApiMiddleware, DefaultParserErrorMiddleware, DefaultResponseStatusErrorMiddleware, DefaultSwaggerMiddleware, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, OpenAPIMetadata, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseBody, ResponseEntity, ResponseEntityBuilder, ResponseSchema, ResponseStatusError, RouteDefinition, RouteSchema, RouteSchemaDefinition, Sapling, ValidatorSchema, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _clearOpenApiRegistry, _getControllerSchema, _getOrCreateSchemaDefinition, _getRouteSchema, _getRoutes, _getValidatorSchema, _parseOrThrow, _registerController, _resolve, _saveValidatorSchema, _setControllerSchema, _setRouteSchema, _settings, generateOpenApiSpec, methodResolve, openApiGenerator };
|
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import e, { ErrorRequestHandler, NextFunction, Request
|
|
1
|
+
import e, { ErrorRequestHandler, NextFunction, Request, RequestHandler, Response as Response$1, Router } from "express";
|
|
2
2
|
|
|
3
3
|
//#region src/html/404.d.ts
|
|
4
4
|
/**
|
|
@@ -26,7 +26,7 @@ type RouteDefinition = {
|
|
|
26
26
|
};
|
|
27
27
|
type Class<T> = new (...args: any[]) => T;
|
|
28
28
|
type HttpHeaders = Record<string, string>;
|
|
29
|
-
type ExpressMiddlewareFn = ($1: Request
|
|
29
|
+
type ExpressMiddlewareFn = ($1: Request, $2: Response$1, $3: NextFunction) => void;
|
|
30
30
|
//#endregion
|
|
31
31
|
//#region src/annotation/controller.d.ts
|
|
32
32
|
declare const _ControllerRegistry: WeakMap<Function, Router | ErrorRequestHandler>;
|
|
@@ -794,9 +794,6 @@ declare function _clearOpenApiRegistry(): void;
|
|
|
794
794
|
type Settings = {
|
|
795
795
|
serialize: (value: any) => string;
|
|
796
796
|
deserialize: (value: string) => any;
|
|
797
|
-
health: {
|
|
798
|
-
path: string;
|
|
799
|
-
};
|
|
800
797
|
doc: {
|
|
801
798
|
openApiPath: string;
|
|
802
799
|
swaggerPath: string;
|
|
@@ -925,7 +922,7 @@ declare class Sapling {
|
|
|
925
922
|
* }
|
|
926
923
|
* ```
|
|
927
924
|
*/
|
|
928
|
-
static chainHandlers(this: void, handlers: RequestHandler[], request: Request
|
|
925
|
+
static chainHandlers(this: void, handlers: RequestHandler[], request: Request, response: Response$1, next: NextFunction, index?: number): void;
|
|
929
926
|
}
|
|
930
927
|
//#endregion
|
|
931
928
|
//#region src/annotation/validator.d.ts
|
|
@@ -981,7 +978,7 @@ declare function _getControllerSchema(ctor: Function): ControllerSchemaDefinitio
|
|
|
981
978
|
* If the default is not suitable, you may also easily write your own.
|
|
982
979
|
*/
|
|
983
980
|
declare class DefaultBaseErrorMiddleware {
|
|
984
|
-
handle(err: unknown, _request: Request
|
|
981
|
+
handle(err: unknown, _request: Request, _response: Response$1, _next: NextFunction): ResponseEntity<{
|
|
985
982
|
message: string;
|
|
986
983
|
}>;
|
|
987
984
|
}
|
|
@@ -992,7 +989,7 @@ declare class DefaultBaseErrorMiddleware {
|
|
|
992
989
|
* If the default is not suitable, you may also easily write your own.
|
|
993
990
|
*/
|
|
994
991
|
declare class DefaultParserErrorMiddleware {
|
|
995
|
-
handle(err: unknown, _request: Request
|
|
992
|
+
handle(err: unknown, _request: Request, _response: Response$1, next: NextFunction): ResponseEntity<{
|
|
996
993
|
message: string;
|
|
997
994
|
}> | undefined;
|
|
998
995
|
}
|
|
@@ -1003,7 +1000,7 @@ declare class DefaultParserErrorMiddleware {
|
|
|
1003
1000
|
* If the default is not suitable, you may also easily write your own.
|
|
1004
1001
|
*/
|
|
1005
1002
|
declare class DefaultResponseStatusErrorMiddleware {
|
|
1006
|
-
handle(err: unknown, _request: Request
|
|
1003
|
+
handle(err: unknown, _request: Request, _response: Response$1, next: NextFunction): ResponseEntity<{
|
|
1007
1004
|
message: string;
|
|
1008
1005
|
}> | undefined;
|
|
1009
1006
|
}
|
|
@@ -1026,7 +1023,7 @@ declare class DefaultResponseStatusErrorMiddleware {
|
|
|
1026
1023
|
* ```
|
|
1027
1024
|
*/
|
|
1028
1025
|
declare class DefaultOpenApiMiddleware {
|
|
1029
|
-
handle(_request: Request
|
|
1026
|
+
handle(_request: Request, _response: Response$1, _next: NextFunction): ResponseEntity<OpenAPIV3.Document<{}>>;
|
|
1030
1027
|
}
|
|
1031
1028
|
//#endregion
|
|
1032
1029
|
//#region src/middleware/default/swagger/index.d.ts
|
|
@@ -1048,7 +1045,7 @@ declare class DefaultOpenApiMiddleware {
|
|
|
1048
1045
|
*/
|
|
1049
1046
|
declare class Serve {
|
|
1050
1047
|
private readonly handlers;
|
|
1051
|
-
handle(request: Request
|
|
1048
|
+
handle(request: Request, response: Response$1, next: NextFunction): void;
|
|
1052
1049
|
}
|
|
1053
1050
|
/**
|
|
1054
1051
|
* Enable the serving of the Swagger endpoint used to serve the OpenAPI spec generated by Sapling.
|
|
@@ -1069,7 +1066,7 @@ declare class Serve {
|
|
|
1069
1066
|
declare class Setup {
|
|
1070
1067
|
private readonly handler;
|
|
1071
1068
|
constructor();
|
|
1072
|
-
handle(request: Request
|
|
1069
|
+
handle(request: Request, response: Response$1, next: NextFunction): unknown;
|
|
1073
1070
|
}
|
|
1074
1071
|
/**
|
|
1075
1072
|
* Enable the serving of the Swagger endpoint used to serve the OpenAPI spec generated by Sapling.
|
|
@@ -1092,24 +1089,4 @@ declare const DefaultSwaggerMiddleware: {
|
|
|
1092
1089
|
Setup: typeof Setup;
|
|
1093
1090
|
};
|
|
1094
1091
|
//#endregion
|
|
1095
|
-
|
|
1096
|
-
type HealthCheck = () => boolean | Promise<boolean>;
|
|
1097
|
-
declare class HealthRegistrar {
|
|
1098
|
-
private _checks;
|
|
1099
|
-
private _sealed;
|
|
1100
|
-
constructor();
|
|
1101
|
-
add(healthCheck: HealthCheck): void;
|
|
1102
|
-
seal(): void;
|
|
1103
|
-
check(): Promise<boolean>;
|
|
1104
|
-
}
|
|
1105
|
-
//#endregion
|
|
1106
|
-
//#region src/middleware/default/health/index.d.ts
|
|
1107
|
-
declare class DefaultHealthMiddleware {
|
|
1108
|
-
private readonly healthRegistrar;
|
|
1109
|
-
constructor(healthRegistrar: HealthRegistrar);
|
|
1110
|
-
serve(_request: Request, _response: Response, _next: NextFunction): Promise<ResponseEntity<{
|
|
1111
|
-
up: boolean;
|
|
1112
|
-
}>>;
|
|
1113
|
-
}
|
|
1114
|
-
//#endregion
|
|
1115
|
-
export { Class, Controller, ControllerSchema, ControllerSchemaDefinition, DELETE, DefaultBaseErrorMiddleware, DefaultHealthMiddleware, DefaultOpenApiMiddleware, DefaultParserErrorMiddleware, DefaultResponseStatusErrorMiddleware, DefaultSwaggerMiddleware, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, HealthCheck, HealthRegistrar, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, OpenAPIMetadata, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseBody, ResponseEntity, ResponseEntityBuilder, ResponseSchema, ResponseStatusError, RouteDefinition, RouteSchema, RouteSchemaDefinition, Sapling, ValidatorSchema, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _clearOpenApiRegistry, _getControllerSchema, _getOrCreateSchemaDefinition, _getRouteSchema, _getRoutes, _getValidatorSchema, _parseOrThrow, _registerController, _resolve, _saveValidatorSchema, _setControllerSchema, _setRouteSchema, _settings, generateOpenApiSpec, methodResolve, openApiGenerator };
|
|
1092
|
+
export { Class, Controller, ControllerSchema, ControllerSchemaDefinition, DELETE, DefaultBaseErrorMiddleware, DefaultOpenApiMiddleware, DefaultParserErrorMiddleware, DefaultResponseStatusErrorMiddleware, DefaultSwaggerMiddleware, ExpressMiddlewareFn, ExpressRouterMethodKey, ExpressRouterMethods, GET, HEAD, Html404ErrorPage, HttpHeaders, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, OpenAPIMetadata, PATCH, POST, PUT, ParserError, ParserErrorLocation, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseBody, ResponseEntity, ResponseEntityBuilder, ResponseSchema, ResponseStatusError, RouteDefinition, RouteSchema, RouteSchemaDefinition, Sapling, ValidatorSchema, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _clearOpenApiRegistry, _getControllerSchema, _getOrCreateSchemaDefinition, _getRouteSchema, _getRoutes, _getValidatorSchema, _parseOrThrow, _registerController, _resolve, _saveValidatorSchema, _setControllerSchema, _setRouteSchema, _settings, generateOpenApiSpec, methodResolve, openApiGenerator };
|
package/dist/index.mjs
CHANGED
|
@@ -245,160 +245,10 @@ var ParserError = class ParserError extends ResponseStatusError {
|
|
|
245
245
|
}
|
|
246
246
|
};
|
|
247
247
|
//#endregion
|
|
248
|
-
//#region lib/weakmap.ts
|
|
249
|
-
/**
|
|
250
|
-
* WeakMap that is iterable.
|
|
251
|
-
*/
|
|
252
|
-
var IterableWeakMap = class IterableWeakMap {
|
|
253
|
-
#weakMap = /* @__PURE__ */ new WeakMap();
|
|
254
|
-
#refSet = /* @__PURE__ */ new Set();
|
|
255
|
-
#finalizationGroup = new FinalizationRegistry(IterableWeakMap.#cleanup);
|
|
256
|
-
static #cleanup(heldValue) {
|
|
257
|
-
heldValue.set.delete(heldValue.ref);
|
|
258
|
-
}
|
|
259
|
-
constructor(iterable) {
|
|
260
|
-
if (iterable) for (const [key, value] of iterable) this.set(key, value);
|
|
261
|
-
}
|
|
262
|
-
set(key, value) {
|
|
263
|
-
const ref = new WeakRef(key);
|
|
264
|
-
this.#weakMap.set(key, {
|
|
265
|
-
value,
|
|
266
|
-
ref
|
|
267
|
-
});
|
|
268
|
-
this.#refSet.add(ref);
|
|
269
|
-
this.#finalizationGroup.register(key, {
|
|
270
|
-
set: this.#refSet,
|
|
271
|
-
ref
|
|
272
|
-
}, ref);
|
|
273
|
-
return this;
|
|
274
|
-
}
|
|
275
|
-
get(key) {
|
|
276
|
-
return this.#weakMap.get(key)?.value;
|
|
277
|
-
}
|
|
278
|
-
delete(key) {
|
|
279
|
-
const entry = this.#weakMap.get(key);
|
|
280
|
-
if (!entry) return false;
|
|
281
|
-
this.#weakMap.delete(key);
|
|
282
|
-
this.#refSet.delete(entry.ref);
|
|
283
|
-
this.#finalizationGroup.unregister(entry.ref);
|
|
284
|
-
return true;
|
|
285
|
-
}
|
|
286
|
-
*[Symbol.iterator]() {
|
|
287
|
-
for (const ref of this.#refSet) {
|
|
288
|
-
const key = ref.deref();
|
|
289
|
-
if (!key) continue;
|
|
290
|
-
const entry = this.#weakMap.get(key);
|
|
291
|
-
if (entry) yield [key, entry.value];
|
|
292
|
-
}
|
|
293
|
-
}
|
|
294
|
-
entries() {
|
|
295
|
-
return this[Symbol.iterator]();
|
|
296
|
-
}
|
|
297
|
-
*keys() {
|
|
298
|
-
for (const [key] of this) yield key;
|
|
299
|
-
}
|
|
300
|
-
*values() {
|
|
301
|
-
for (const [, value] of this) yield value;
|
|
302
|
-
}
|
|
303
|
-
forEach(callback, thisArg) {
|
|
304
|
-
for (const [key, value] of this) callback.call(thisArg, value, key, this);
|
|
305
|
-
}
|
|
306
|
-
};
|
|
307
|
-
//#endregion
|
|
308
|
-
//#region src/annotation/injectable.ts
|
|
309
|
-
const _InjectableRegistry = /* @__PURE__ */ new WeakMap();
|
|
310
|
-
const _InjectableDeps = new IterableWeakMap();
|
|
311
|
-
/**
|
|
312
|
-
* Mark the class as an injectable to be handled by Sapling. The class can now be
|
|
313
|
-
* be injected into other classes, as well as allow the class to inject other `@Injectable` classes.
|
|
314
|
-
*
|
|
315
|
-
* @argument deps - An optional array to define any dependencies that this class may require.
|
|
316
|
-
*/
|
|
317
|
-
function Injectable(deps = []) {
|
|
318
|
-
return function(target) {
|
|
319
|
-
_InjectableRegistry.set(target, null);
|
|
320
|
-
_InjectableDeps.set(target, deps);
|
|
321
|
-
};
|
|
322
|
-
}
|
|
323
|
-
/**
|
|
324
|
-
* Resolves and instantiates a class along with all of it's transitive dependencies.
|
|
325
|
-
*
|
|
326
|
-
* Uses topological sort (Kahn's algorithm) to ensure that the dependency graph is created
|
|
327
|
-
* in a correct order.
|
|
328
|
-
*
|
|
329
|
-
* When `resolve` is first called (usually during controller registration),
|
|
330
|
-
* it will compute the dependency graph of all `@Injectable` classes and instantiates
|
|
331
|
-
* them in the correct order.
|
|
332
|
-
*
|
|
333
|
-
* Subsequent calls to dependencies that have already been resolved are cached, so they will
|
|
334
|
-
* re-use the created singletons instead of re-instantiation.
|
|
335
|
-
*/
|
|
336
|
-
function _resolve(ctor) {
|
|
337
|
-
const inDegree = /* @__PURE__ */ new Map();
|
|
338
|
-
const graph = /* @__PURE__ */ new Map();
|
|
339
|
-
_InjectableDeps.forEach((deps, node) => {
|
|
340
|
-
inDegree.set(node, inDegree.get(node) || 0);
|
|
341
|
-
deps.forEach((dep) => {
|
|
342
|
-
if (dep === void 0) throw new Error(`There is an @Injectable (${node.name}) which has a dependency that cannot be found. This is likely caused by a circular dependency.`);
|
|
343
|
-
inDegree.set(dep, inDegree.get(dep) || 0);
|
|
344
|
-
inDegree.set(node, inDegree.get(node) + 1);
|
|
345
|
-
if (!graph.has(dep)) graph.set(dep, []);
|
|
346
|
-
graph.get(dep).push(node);
|
|
347
|
-
});
|
|
348
|
-
});
|
|
349
|
-
const queue = [];
|
|
350
|
-
inDegree.forEach((deg, node) => {
|
|
351
|
-
if (deg === 0) queue.push(node);
|
|
352
|
-
});
|
|
353
|
-
while (queue.length) {
|
|
354
|
-
const current = queue.shift();
|
|
355
|
-
if (!_InjectableRegistry.get(current)) {
|
|
356
|
-
const instance = new current(...(_InjectableDeps.get(current) || []).map((dep) => _InjectableRegistry.get(dep)));
|
|
357
|
-
_InjectableRegistry.set(current, instance);
|
|
358
|
-
}
|
|
359
|
-
(graph.get(current) || []).forEach((neighbor) => {
|
|
360
|
-
inDegree.set(neighbor, (inDegree.get(neighbor) ?? 0) - 1);
|
|
361
|
-
if (inDegree.get(neighbor) === 0) queue.push(neighbor);
|
|
362
|
-
});
|
|
363
|
-
}
|
|
364
|
-
if (!_InjectableRegistry.get(ctor)) throw new Error("Circular dependency detected or injectable not registered");
|
|
365
|
-
return _InjectableRegistry.get(ctor);
|
|
366
|
-
}
|
|
367
|
-
//#endregion
|
|
368
|
-
//#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
|
|
369
|
-
function __decorate(decorators, target, key, desc) {
|
|
370
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
371
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
372
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
373
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
374
|
-
}
|
|
375
|
-
//#endregion
|
|
376
|
-
//#region src/middleware/health/registrar.ts
|
|
377
|
-
let HealthRegistrar = class HealthRegistrar {
|
|
378
|
-
_checks;
|
|
379
|
-
_sealed;
|
|
380
|
-
constructor() {
|
|
381
|
-
this._checks = [];
|
|
382
|
-
this._sealed = false;
|
|
383
|
-
}
|
|
384
|
-
add(healthCheck) {
|
|
385
|
-
this._checks.push(healthCheck);
|
|
386
|
-
}
|
|
387
|
-
seal() {
|
|
388
|
-
this._sealed = true;
|
|
389
|
-
}
|
|
390
|
-
async check() {
|
|
391
|
-
if (!this._sealed) return false;
|
|
392
|
-
return (await Promise.all(this._checks.map((c) => c()))).every((c) => c === true);
|
|
393
|
-
}
|
|
394
|
-
};
|
|
395
|
-
HealthRegistrar = __decorate([Injectable()], HealthRegistrar);
|
|
396
|
-
//#endregion
|
|
397
248
|
//#region src/helper/sapling.ts
|
|
398
249
|
const _settings = {
|
|
399
250
|
serialize: JSON.stringify,
|
|
400
251
|
deserialize: JSON.parse,
|
|
401
|
-
health: { path: "/up" },
|
|
402
252
|
doc: {
|
|
403
253
|
openApiPath: "/openapi.json",
|
|
404
254
|
swaggerPath: "/swagger.html",
|
|
@@ -474,7 +324,6 @@ var Sapling = class Sapling {
|
|
|
474
324
|
static registerApp(app) {
|
|
475
325
|
app.use(e.text({ type: "application/json" }));
|
|
476
326
|
app.use(Sapling.json());
|
|
477
|
-
_InjectableRegistry.get(HealthRegistrar)?.seal();
|
|
478
327
|
}
|
|
479
328
|
/**
|
|
480
329
|
* Serialize a value into a JSON string.
|
|
@@ -900,6 +749,126 @@ const methodResolve = {
|
|
|
900
749
|
USE: "use"
|
|
901
750
|
};
|
|
902
751
|
//#endregion
|
|
752
|
+
//#region lib/weakmap.ts
|
|
753
|
+
/**
|
|
754
|
+
* WeakMap that is iterable.
|
|
755
|
+
*/
|
|
756
|
+
var IterableWeakMap = class IterableWeakMap {
|
|
757
|
+
#weakMap = /* @__PURE__ */ new WeakMap();
|
|
758
|
+
#refSet = /* @__PURE__ */ new Set();
|
|
759
|
+
#finalizationGroup = new FinalizationRegistry(IterableWeakMap.#cleanup);
|
|
760
|
+
static #cleanup(heldValue) {
|
|
761
|
+
heldValue.set.delete(heldValue.ref);
|
|
762
|
+
}
|
|
763
|
+
constructor(iterable) {
|
|
764
|
+
if (iterable) for (const [key, value] of iterable) this.set(key, value);
|
|
765
|
+
}
|
|
766
|
+
set(key, value) {
|
|
767
|
+
const ref = new WeakRef(key);
|
|
768
|
+
this.#weakMap.set(key, {
|
|
769
|
+
value,
|
|
770
|
+
ref
|
|
771
|
+
});
|
|
772
|
+
this.#refSet.add(ref);
|
|
773
|
+
this.#finalizationGroup.register(key, {
|
|
774
|
+
set: this.#refSet,
|
|
775
|
+
ref
|
|
776
|
+
}, ref);
|
|
777
|
+
return this;
|
|
778
|
+
}
|
|
779
|
+
get(key) {
|
|
780
|
+
return this.#weakMap.get(key)?.value;
|
|
781
|
+
}
|
|
782
|
+
delete(key) {
|
|
783
|
+
const entry = this.#weakMap.get(key);
|
|
784
|
+
if (!entry) return false;
|
|
785
|
+
this.#weakMap.delete(key);
|
|
786
|
+
this.#refSet.delete(entry.ref);
|
|
787
|
+
this.#finalizationGroup.unregister(entry.ref);
|
|
788
|
+
return true;
|
|
789
|
+
}
|
|
790
|
+
*[Symbol.iterator]() {
|
|
791
|
+
for (const ref of this.#refSet) {
|
|
792
|
+
const key = ref.deref();
|
|
793
|
+
if (!key) continue;
|
|
794
|
+
const entry = this.#weakMap.get(key);
|
|
795
|
+
if (entry) yield [key, entry.value];
|
|
796
|
+
}
|
|
797
|
+
}
|
|
798
|
+
entries() {
|
|
799
|
+
return this[Symbol.iterator]();
|
|
800
|
+
}
|
|
801
|
+
*keys() {
|
|
802
|
+
for (const [key] of this) yield key;
|
|
803
|
+
}
|
|
804
|
+
*values() {
|
|
805
|
+
for (const [, value] of this) yield value;
|
|
806
|
+
}
|
|
807
|
+
forEach(callback, thisArg) {
|
|
808
|
+
for (const [key, value] of this) callback.call(thisArg, value, key, this);
|
|
809
|
+
}
|
|
810
|
+
};
|
|
811
|
+
//#endregion
|
|
812
|
+
//#region src/annotation/injectable.ts
|
|
813
|
+
const _InjectableRegistry = /* @__PURE__ */ new WeakMap();
|
|
814
|
+
const _InjectableDeps = new IterableWeakMap();
|
|
815
|
+
/**
|
|
816
|
+
* Mark the class as an injectable to be handled by Sapling. The class can now be
|
|
817
|
+
* be injected into other classes, as well as allow the class to inject other `@Injectable` classes.
|
|
818
|
+
*
|
|
819
|
+
* @argument deps - An optional array to define any dependencies that this class may require.
|
|
820
|
+
*/
|
|
821
|
+
function Injectable(deps = []) {
|
|
822
|
+
return function(target) {
|
|
823
|
+
_InjectableRegistry.set(target, null);
|
|
824
|
+
_InjectableDeps.set(target, deps);
|
|
825
|
+
};
|
|
826
|
+
}
|
|
827
|
+
/**
|
|
828
|
+
* Resolves and instantiates a class along with all of it's transitive dependencies.
|
|
829
|
+
*
|
|
830
|
+
* Uses topological sort (Kahn's algorithm) to ensure that the dependency graph is created
|
|
831
|
+
* in a correct order.
|
|
832
|
+
*
|
|
833
|
+
* When `resolve` is first called (usually during controller registration),
|
|
834
|
+
* it will compute the dependency graph of all `@Injectable` classes and instantiates
|
|
835
|
+
* them in the correct order.
|
|
836
|
+
*
|
|
837
|
+
* Subsequent calls to dependencies that have already been resolved are cached, so they will
|
|
838
|
+
* re-use the created singletons instead of re-instantiation.
|
|
839
|
+
*/
|
|
840
|
+
function _resolve(ctor) {
|
|
841
|
+
const inDegree = /* @__PURE__ */ new Map();
|
|
842
|
+
const graph = /* @__PURE__ */ new Map();
|
|
843
|
+
_InjectableDeps.forEach((deps, node) => {
|
|
844
|
+
inDegree.set(node, inDegree.get(node) || 0);
|
|
845
|
+
deps.forEach((dep) => {
|
|
846
|
+
if (dep === void 0) throw new Error(`There is an @Injectable (${node.name}) which has a dependency that cannot be found. This is likely caused by a circular dependency.`);
|
|
847
|
+
inDegree.set(dep, inDegree.get(dep) || 0);
|
|
848
|
+
inDegree.set(node, inDegree.get(node) + 1);
|
|
849
|
+
if (!graph.has(dep)) graph.set(dep, []);
|
|
850
|
+
graph.get(dep).push(node);
|
|
851
|
+
});
|
|
852
|
+
});
|
|
853
|
+
const queue = [];
|
|
854
|
+
inDegree.forEach((deg, node) => {
|
|
855
|
+
if (deg === 0) queue.push(node);
|
|
856
|
+
});
|
|
857
|
+
while (queue.length) {
|
|
858
|
+
const current = queue.shift();
|
|
859
|
+
if (!_InjectableRegistry.get(current)) {
|
|
860
|
+
const instance = new current(...(_InjectableDeps.get(current) || []).map((dep) => _InjectableRegistry.get(dep)));
|
|
861
|
+
_InjectableRegistry.set(current, instance);
|
|
862
|
+
}
|
|
863
|
+
(graph.get(current) || []).forEach((neighbor) => {
|
|
864
|
+
inDegree.set(neighbor, (inDegree.get(neighbor) ?? 0) - 1);
|
|
865
|
+
if (inDegree.get(neighbor) === 0) queue.push(neighbor);
|
|
866
|
+
});
|
|
867
|
+
}
|
|
868
|
+
if (!_InjectableRegistry.get(ctor)) throw new Error("Circular dependency detected or injectable not registered");
|
|
869
|
+
return _InjectableRegistry.get(ctor);
|
|
870
|
+
}
|
|
871
|
+
//#endregion
|
|
903
872
|
//#region src/annotation/controller.ts
|
|
904
873
|
const _ControllerRegistry = /* @__PURE__ */ new WeakMap();
|
|
905
874
|
/**
|
|
@@ -1018,6 +987,14 @@ function MiddlewareClass(...args) {
|
|
|
1018
987
|
return Controller(...args);
|
|
1019
988
|
}
|
|
1020
989
|
//#endregion
|
|
990
|
+
//#region \0@oxc-project+runtime@0.127.0/helpers/decorate.js
|
|
991
|
+
function __decorate(decorators, target, key, desc) {
|
|
992
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
993
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
994
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
995
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
996
|
+
}
|
|
997
|
+
//#endregion
|
|
1021
998
|
//#region src/middleware/default/error/base.ts
|
|
1022
999
|
let DefaultBaseErrorMiddleware = class DefaultBaseErrorMiddleware {
|
|
1023
1000
|
handle(err, _request, _response, _next) {
|
|
@@ -1133,17 +1110,4 @@ const DefaultSwaggerMiddleware = {
|
|
|
1133
1110
|
Setup
|
|
1134
1111
|
};
|
|
1135
1112
|
//#endregion
|
|
1136
|
-
|
|
1137
|
-
let DefaultHealthMiddleware = class DefaultHealthMiddleware {
|
|
1138
|
-
constructor(healthRegistrar) {
|
|
1139
|
-
this.healthRegistrar = healthRegistrar;
|
|
1140
|
-
}
|
|
1141
|
-
async serve(_request, _response, _next) {
|
|
1142
|
-
const up = await this.healthRegistrar.check();
|
|
1143
|
-
return ResponseEntity.ok().body({ up });
|
|
1144
|
-
}
|
|
1145
|
-
};
|
|
1146
|
-
__decorate([GET(_settings.health.path)], DefaultHealthMiddleware.prototype, "serve", null);
|
|
1147
|
-
DefaultHealthMiddleware = __decorate([MiddlewareClass({ deps: [HealthRegistrar] })], DefaultHealthMiddleware);
|
|
1148
|
-
//#endregion
|
|
1149
|
-
export { Controller, ControllerSchema, DELETE, DefaultBaseErrorMiddleware, DefaultHealthMiddleware, DefaultOpenApiMiddleware, DefaultParserErrorMiddleware, DefaultResponseStatusErrorMiddleware, DefaultSwaggerMiddleware, GET, HEAD, HealthRegistrar, Html404ErrorPage, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseBody, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, RouteSchema, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _clearOpenApiRegistry, _getControllerSchema, _getOrCreateSchemaDefinition, _getRouteSchema, _getRoutes, _getValidatorSchema, _parseOrThrow, _registerController, _resolve, _saveValidatorSchema, _setControllerSchema, _setRouteSchema, _settings, generateOpenApiSpec, methodResolve, openApiGenerator };
|
|
1113
|
+
export { Controller, ControllerSchema, DELETE, DefaultBaseErrorMiddleware, DefaultOpenApiMiddleware, DefaultParserErrorMiddleware, DefaultResponseStatusErrorMiddleware, DefaultSwaggerMiddleware, GET, HEAD, Html404ErrorPage, HttpStatus, Injectable, Middleware, MiddlewareClass, OPTIONS, PATCH, POST, PUT, ParserError, RedirectView, RequestBody, RequestParam, RequestQuery, ResponseBody, ResponseEntity, ResponseEntityBuilder, ResponseStatusError, RouteSchema, Sapling, _ControllerRegistry, _InjectableDeps, _InjectableRegistry, _Route, _clearOpenApiRegistry, _getControllerSchema, _getOrCreateSchemaDefinition, _getRouteSchema, _getRoutes, _getValidatorSchema, _parseOrThrow, _registerController, _resolve, _saveValidatorSchema, _setControllerSchema, _setRouteSchema, _settings, generateOpenApiSpec, methodResolve, openApiGenerator };
|