equipped 5.3.1 → 5.3.3
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/CHANGELOG.md +9 -0
- package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
- package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
- package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
- package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/dbs/index.cjs +181 -179
- package/dist/cjs/dbs/index.cjs.map +1 -1
- package/dist/cjs/dbs/index.min.cjs +3 -3
- package/dist/cjs/dbs/index.min.cjs.map +1 -1
- package/dist/cjs/errors/index.cjs +11 -0
- package/dist/cjs/errors/index.cjs.map +1 -1
- package/dist/cjs/errors/index.min.cjs +1 -1
- package/dist/cjs/errors/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
- package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
- package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
- package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
- package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
- package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.cjs +152 -215
- package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
- package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.cjs +292 -225
- package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.cjs +277 -210
- package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
- package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
- package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
- package/dist/cjs/server/index.cjs +82 -15
- package/dist/cjs/server/index.cjs.map +1 -1
- package/dist/cjs/server/index.min.cjs +7 -7
- package/dist/cjs/server/index.min.cjs.map +1 -1
- package/dist/cjs/utilities/index.cjs +0 -5
- package/dist/cjs/utilities/index.cjs.map +1 -1
- package/dist/cjs/utilities/index.min.cjs +2 -2
- package/dist/cjs/utilities/index.min.cjs.map +1 -1
- package/dist/cjs/validations/index.cjs +1 -0
- package/dist/cjs/validations/index.cjs.map +1 -1
- package/dist/cjs/validations/index.min.cjs +1 -1
- package/dist/cjs/validations/index.min.cjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
- package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
- package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
- package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/cache/adapters/redis/index.mjs +5 -3
- package/dist/esm/cache/index.min.mjs +1 -1
- package/dist/esm/cache/index.mjs +2 -2
- package/dist/esm/{chunk-2GGMLKRP.min.mjs → chunk-4GZ43EQ2.min.mjs} +2 -2
- package/dist/esm/{chunk-IRYCN6PI.min.mjs → chunk-5FEVQT6K.min.mjs} +2 -2
- package/dist/esm/{chunk-LKS5ZE45.mjs → chunk-74GY55PM.mjs} +2 -2
- package/dist/esm/{chunk-A4P7P6BU.mjs → chunk-7N4WUZ7P.mjs} +167 -347
- package/dist/esm/chunk-7N4WUZ7P.mjs.map +1 -0
- package/dist/esm/chunk-A332TTED.mjs +135 -0
- package/dist/esm/chunk-A332TTED.mjs.map +1 -0
- package/dist/esm/{chunk-7CP7ZE2O.mjs → chunk-BONYW6LU.mjs} +9 -5
- package/dist/esm/{chunk-7CP7ZE2O.mjs.map → chunk-BONYW6LU.mjs.map} +1 -1
- package/dist/esm/{chunk-HXFNN6RI.mjs → chunk-C3G4W4ZV.mjs} +3 -3
- package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
- package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
- package/dist/esm/{chunk-676VIABN.min.mjs → chunk-LJZOS62I.min.mjs} +2 -2
- package/dist/esm/{chunk-7SQ5JQYR.min.mjs → chunk-MCX2O5IT.min.mjs} +2 -2
- package/dist/esm/{chunk-BWUFPMVG.mjs → chunk-MNKDFIVK.mjs} +2 -2
- package/dist/esm/chunk-N3OD4QL2.min.mjs +32 -0
- package/dist/esm/chunk-N3OD4QL2.min.mjs.map +1 -0
- package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
- package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
- package/dist/esm/{chunk-TSVHZZE4.mjs → chunk-RFJ5URMP.mjs} +5 -5
- package/dist/esm/chunk-RX4XPABH.min.mjs +2 -0
- package/dist/esm/{chunk-MQXTTWPS.min.mjs.map → chunk-RX4XPABH.min.mjs.map} +1 -1
- package/dist/esm/chunk-SPOVKWV3.min.mjs +2 -0
- package/dist/esm/chunk-SPOVKWV3.min.mjs.map +1 -0
- package/dist/esm/{chunk-3TP7NINX.mjs → chunk-XESM7IWM.mjs} +2 -2
- package/dist/esm/{chunk-5PZACGPI.mjs → chunk-XJKBHQWO.mjs} +7 -5
- package/dist/esm/{chunk-5PZACGPI.mjs.map → chunk-XJKBHQWO.mjs.map} +1 -1
- package/dist/esm/chunk-YC6V4HLT.min.mjs +2 -0
- package/dist/esm/{chunk-7NF7PV6S.min.mjs.map → chunk-YC6V4HLT.min.mjs.map} +1 -1
- package/dist/esm/{chunk-P4PRHHIY.min.mjs → chunk-YWQTFKNY.min.mjs} +2 -2
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
- package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/dbs/index.min.mjs +1 -1
- package/dist/esm/dbs/index.mjs +5 -3
- package/dist/esm/errors/index.min.mjs +1 -1
- package/dist/esm/errors/index.mjs +3 -1
- package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
- package/dist/esm/events/adapters/kafka/index.mjs +4 -2
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
- package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
- package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
- package/dist/esm/index.min.mjs +1 -1
- package/dist/esm/index.mjs +1 -1
- package/dist/esm/instance/index.min.mjs +1 -1
- package/dist/esm/instance/index.mjs +1 -1
- package/dist/esm/introspection-TO27QT2X.min.mjs +2 -0
- package/dist/esm/{introspection-YJF3QAUK.mjs → introspection-ZUQYVEFC.mjs} +3 -3
- package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
- package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
- package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
- package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
- package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/json/index.mjs +6 -5
- package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
- package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
- package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
- package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
- package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
- package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
- package/dist/esm/orm/index.min.mjs +1 -1
- package/dist/esm/orm/index.mjs +3 -3
- package/dist/esm/server/adapters/express/index.min.mjs +1 -1
- package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/express/index.mjs +7 -3
- package/dist/esm/server/adapters/express/index.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
- package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
- package/dist/esm/server/adapters/fastify/index.mjs +7 -3
- package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
- package/dist/esm/server/index.min.mjs +1 -1
- package/dist/esm/server/index.mjs +1 -1
- package/dist/esm/utilities/index.min.mjs +1 -1
- package/dist/esm/utilities/index.mjs +5 -4
- package/dist/esm/validations/index.min.mjs +1 -1
- package/dist/esm/validations/index.mjs +1 -1
- package/dist/types/{base-BDTBLZ9a.d.ts → base-BnwwLupM.d.ts} +3 -3
- package/dist/types/cache/adapters/in-memory/index.js +6 -3
- package/dist/types/cache/adapters/redis/index.js +5 -3
- package/dist/types/cache/index.js +2 -2
- package/dist/types/chunk-7MXHWHRV.js +134 -0
- package/dist/types/{chunk-LPB5LS7A.js → chunk-BKXNLF6X.js} +1 -1
- package/dist/types/{chunk-J3TGB5YQ.js → chunk-DZFKDZDZ.js} +8 -4
- package/dist/types/{chunk-YLJNBL6J.js → chunk-GQRSK2KP.js} +6 -4
- package/dist/types/chunk-PPD4WDG6.js +143 -0
- package/dist/types/{chunk-55CTVK7R.js → chunk-SZAA5GF6.js} +1 -1
- package/dist/types/{chunk-4DH3POYM.js → chunk-UGLZIYAR.js} +4 -4
- package/dist/types/{chunk-5Z26ZURE.js → chunk-UR7O43FC.js} +1 -1
- package/dist/types/{chunk-IZDJDGOV.js → chunk-X5ZDIXCZ.js} +2 -2
- package/dist/types/{chunk-TT5EORDK.js → chunk-YGIIUOQM.js} +166 -346
- package/dist/types/dbs/adapters/mongodb/index.js +8 -5
- package/dist/types/dbs/index.js +5 -3
- package/dist/types/errors/index.d.ts +8 -3
- package/dist/types/errors/index.js +3 -1
- package/dist/types/events/adapters/kafka/index.js +4 -2
- package/dist/types/events/adapters/rabbitmq/index.js +7 -3
- package/dist/types/index.js +1 -1
- package/dist/types/instance/index.js +1 -1
- package/dist/types/{introspection-EHGM4RMO.js → introspection-ZQMYTW6H.js} +2 -2
- package/dist/types/jobs/adapters/redis/index.js +10 -6
- package/dist/types/orm/adapters/in-memory/index.js +4 -3
- package/dist/types/orm/adapters/json/index.js +6 -5
- package/dist/types/orm/adapters/mongodb/index.js +6 -4
- package/dist/types/orm/adapters/postgresql/index.js +8 -5
- package/dist/types/orm/index.js +3 -3
- package/dist/types/{requestError-DdaL8hc3.d.ts → requestError-BmOhSuFb.d.ts} +1 -0
- package/dist/types/server/adapters/express/index.d.ts +2 -2
- package/dist/types/server/adapters/express/index.js +7 -3
- package/dist/types/server/adapters/fastify/index.d.ts +3 -3
- package/dist/types/server/adapters/fastify/index.js +7 -3
- package/dist/types/server/index.d.ts +4 -4
- package/dist/types/server/index.js +1 -1
- package/dist/types/utilities/index.d.ts +1 -2
- package/dist/types/utilities/index.js +5 -4
- package/dist/types/{validationError-oigtHqBi.d.ts → validationError-C2tVK4s7.d.ts} +1 -1
- package/dist/types/validations/index.d.ts +4 -4
- package/dist/types/validations/index.js +1 -1
- package/package.json +1 -1
- package/dist/esm/chunk-7NF7PV6S.min.mjs +0 -2
- package/dist/esm/chunk-A4P7P6BU.mjs.map +0 -1
- package/dist/esm/chunk-IN5YKIJ7.min.mjs +0 -32
- package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +0 -1
- package/dist/esm/chunk-MQXTTWPS.min.mjs +0 -2
- package/dist/esm/introspection-THKMXV5V.min.mjs +0 -2
- /package/dist/esm/{chunk-2GGMLKRP.min.mjs.map → chunk-4GZ43EQ2.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-IRYCN6PI.min.mjs.map → chunk-5FEVQT6K.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-LKS5ZE45.mjs.map → chunk-74GY55PM.mjs.map} +0 -0
- /package/dist/esm/{chunk-HXFNN6RI.mjs.map → chunk-C3G4W4ZV.mjs.map} +0 -0
- /package/dist/esm/{chunk-676VIABN.min.mjs.map → chunk-LJZOS62I.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-7SQ5JQYR.min.mjs.map → chunk-MCX2O5IT.min.mjs.map} +0 -0
- /package/dist/esm/{chunk-BWUFPMVG.mjs.map → chunk-MNKDFIVK.mjs.map} +0 -0
- /package/dist/esm/{chunk-TSVHZZE4.mjs.map → chunk-RFJ5URMP.mjs.map} +0 -0
- /package/dist/esm/{chunk-3TP7NINX.mjs.map → chunk-XESM7IWM.mjs.map} +0 -0
- /package/dist/esm/{chunk-P4PRHHIY.min.mjs.map → chunk-YWQTFKNY.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-THKMXV5V.min.mjs.map → introspection-TO27QT2X.min.mjs.map} +0 -0
- /package/dist/esm/{introspection-YJF3QAUK.mjs.map → introspection-ZUQYVEFC.mjs.map} +0 -0
|
@@ -46,7 +46,7 @@ var import_pino_http = require("pino-http");
|
|
|
46
46
|
// src/instance/index.ts
|
|
47
47
|
var import_pino = __toESM(require("pino"), 1);
|
|
48
48
|
var import_ulid = require("ulid");
|
|
49
|
-
var
|
|
49
|
+
var import_valleyed8 = require("valleyed");
|
|
50
50
|
|
|
51
51
|
// src/errors/equippedError.ts
|
|
52
52
|
var EquippedError = class extends Error {
|
|
@@ -73,7 +73,7 @@ var import_cors = require("@fastify/cors");
|
|
|
73
73
|
var import_cors2 = require("cors");
|
|
74
74
|
var import_socket = require("socket.io");
|
|
75
75
|
var import_supertest = __toESM(require("supertest"), 1);
|
|
76
|
-
var
|
|
76
|
+
var import_valleyed5 = require("valleyed");
|
|
77
77
|
|
|
78
78
|
// src/events/adapters/base.ts
|
|
79
79
|
var EventBus = class {
|
|
@@ -173,6 +173,7 @@ var StatusCodes = {
|
|
|
173
173
|
NotAuthorized: 403,
|
|
174
174
|
NotFound: 404,
|
|
175
175
|
ValidationError: 422,
|
|
176
|
+
PreconditionRequired: 428,
|
|
176
177
|
TooManyRequests: 429,
|
|
177
178
|
TokenExpired: 461
|
|
178
179
|
};
|
|
@@ -426,170 +427,6 @@ var openapi = (config) => {
|
|
|
426
427
|
};
|
|
427
428
|
};
|
|
428
429
|
|
|
429
|
-
// src/utilities/configurable.ts
|
|
430
|
-
var import_valleyed5 = require("valleyed");
|
|
431
|
-
function configurable(pipeFn, base) {
|
|
432
|
-
const pipe = pipeFn();
|
|
433
|
-
import_valleyed5.v.compile(pipe);
|
|
434
|
-
class Configurable extends base {
|
|
435
|
-
constructor(config, ...baseArgs) {
|
|
436
|
-
super(...baseArgs);
|
|
437
|
-
this.config = config;
|
|
438
|
-
}
|
|
439
|
-
static create(input, ...args) {
|
|
440
|
-
const r = import_valleyed5.v.validate(pipe, input);
|
|
441
|
-
if (!r.valid) throw r.error;
|
|
442
|
-
return new this(r.value, ...args);
|
|
443
|
-
}
|
|
444
|
-
}
|
|
445
|
-
return Configurable;
|
|
446
|
-
}
|
|
447
|
-
if (void 0) {
|
|
448
|
-
const { describe, test, expect, expectTypeOf } = void 0;
|
|
449
|
-
const { v: v8 } = null;
|
|
450
|
-
const testPipe = () => v8.object({
|
|
451
|
-
host: v8.string(),
|
|
452
|
-
port: v8.number()
|
|
453
|
-
});
|
|
454
|
-
class TestBase {
|
|
455
|
-
baseValue;
|
|
456
|
-
constructor() {
|
|
457
|
-
this.baseValue = "base";
|
|
458
|
-
}
|
|
459
|
-
}
|
|
460
|
-
class TestBaseWithArgs {
|
|
461
|
-
label;
|
|
462
|
-
constructor(label) {
|
|
463
|
-
this.label = label;
|
|
464
|
-
}
|
|
465
|
-
}
|
|
466
|
-
describe("configurable", () => {
|
|
467
|
-
test("validation runs in static create before constructor body executes", () => {
|
|
468
|
-
let constructorRan = false;
|
|
469
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
470
|
-
class MyClass extends Wrapped {
|
|
471
|
-
constructor(config) {
|
|
472
|
-
super(config);
|
|
473
|
-
constructorRan = true;
|
|
474
|
-
}
|
|
475
|
-
}
|
|
476
|
-
expect(() => MyClass.create({ host: 123, port: "bad" })).toThrow();
|
|
477
|
-
expect(constructorRan).toBe(false);
|
|
478
|
-
MyClass.create({ host: "localhost", port: 3e3 });
|
|
479
|
-
expect(constructorRan).toBe(true);
|
|
480
|
-
});
|
|
481
|
-
test("constructor receives validated value", () => {
|
|
482
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
483
|
-
let receivedConfig;
|
|
484
|
-
class MyClass extends Wrapped {
|
|
485
|
-
constructor(config) {
|
|
486
|
-
super(config);
|
|
487
|
-
receivedConfig = this.config;
|
|
488
|
-
}
|
|
489
|
-
}
|
|
490
|
-
MyClass.create({ host: "localhost", port: 3e3 });
|
|
491
|
-
expect(receivedConfig).toEqual({ host: "localhost", port: 3e3 });
|
|
492
|
-
});
|
|
493
|
-
test("external new is a compile error", () => {
|
|
494
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
495
|
-
class MyClass extends Wrapped {
|
|
496
|
-
constructor(config) {
|
|
497
|
-
super(config);
|
|
498
|
-
}
|
|
499
|
-
}
|
|
500
|
-
void (() => new MyClass({ host: "localhost", port: 3e3 }));
|
|
501
|
-
});
|
|
502
|
-
test("static Config resolves to PipeOutput<P> at the type level", () => {
|
|
503
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
504
|
-
class MyClass extends Wrapped {
|
|
505
|
-
constructor(config) {
|
|
506
|
-
super(config);
|
|
507
|
-
}
|
|
508
|
-
}
|
|
509
|
-
expectTypeOf().toEqualTypeOf();
|
|
510
|
-
expect(MyClass.create).toBeTypeOf("function");
|
|
511
|
-
});
|
|
512
|
-
test("ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures", () => {
|
|
513
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
514
|
-
class MyClass extends Wrapped {
|
|
515
|
-
extra;
|
|
516
|
-
constructor(config, extra) {
|
|
517
|
-
super(config);
|
|
518
|
-
this.extra = extra;
|
|
519
|
-
}
|
|
520
|
-
}
|
|
521
|
-
const instance = MyClass.create({ host: "localhost", port: 3e3 }, 42);
|
|
522
|
-
expect(instance.extra).toBe(42);
|
|
523
|
-
expectTypeOf(instance).toHaveProperty("extra");
|
|
524
|
-
expectTypeOf(instance.extra).toEqualTypeOf();
|
|
525
|
-
void (() => MyClass.create({ host: "localhost", port: 3e3 }, "not-a-number"));
|
|
526
|
-
});
|
|
527
|
-
test("base-args forwarding works for non-zero-arg bases", () => {
|
|
528
|
-
const Wrapped = configurable(testPipe, TestBaseWithArgs);
|
|
529
|
-
class MyClass extends Wrapped {
|
|
530
|
-
constructor(config, label) {
|
|
531
|
-
super(config, label);
|
|
532
|
-
}
|
|
533
|
-
}
|
|
534
|
-
const instance = MyClass.create({ host: "localhost", port: 3e3 }, "test-label");
|
|
535
|
-
expect(instance.label).toBe("test-label");
|
|
536
|
-
});
|
|
537
|
-
test("config is accessible as protected readonly on instances", () => {
|
|
538
|
-
const Wrapped = configurable(testPipe, TestBase);
|
|
539
|
-
class MyClass extends Wrapped {
|
|
540
|
-
constructor(config) {
|
|
541
|
-
super(config);
|
|
542
|
-
}
|
|
543
|
-
getHost() {
|
|
544
|
-
return this.config.host;
|
|
545
|
-
}
|
|
546
|
-
}
|
|
547
|
-
const instance = MyClass.create({ host: "localhost", port: 3e3 });
|
|
548
|
-
expect(instance.getHost()).toBe("localhost");
|
|
549
|
-
});
|
|
550
|
-
test("accepts an abstract base class", () => {
|
|
551
|
-
class AbstractBase {
|
|
552
|
-
}
|
|
553
|
-
const Wrapped = configurable(testPipe, AbstractBase);
|
|
554
|
-
class Concrete extends Wrapped {
|
|
555
|
-
constructor(config) {
|
|
556
|
-
super(config);
|
|
557
|
-
}
|
|
558
|
-
greet() {
|
|
559
|
-
return `hello from ${this.config.host}`;
|
|
560
|
-
}
|
|
561
|
-
}
|
|
562
|
-
const instance = Concrete.create({ host: "localhost", port: 3e3 });
|
|
563
|
-
expect(instance.greet()).toBe("hello from localhost");
|
|
564
|
-
expectTypeOf(instance).toHaveProperty("config");
|
|
565
|
-
});
|
|
566
|
-
});
|
|
567
|
-
}
|
|
568
|
-
|
|
569
|
-
// src/utilities/json.ts
|
|
570
|
-
var parseJSONValue = (data) => {
|
|
571
|
-
try {
|
|
572
|
-
if (data?.constructor?.name !== "String") return data;
|
|
573
|
-
return JSON.parse(data);
|
|
574
|
-
} catch {
|
|
575
|
-
return data;
|
|
576
|
-
}
|
|
577
|
-
};
|
|
578
|
-
function parseJSONObject(data) {
|
|
579
|
-
return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, parseJSONValue(value)]));
|
|
580
|
-
}
|
|
581
|
-
|
|
582
|
-
// src/utilities/media.ts
|
|
583
|
-
var import_music_metadata = require("music-metadata");
|
|
584
|
-
var getMediaDuration = async (buffer) => {
|
|
585
|
-
try {
|
|
586
|
-
const meta = await (0, import_music_metadata.parseBuffer)(buffer);
|
|
587
|
-
return meta.format.duration ?? 0;
|
|
588
|
-
} catch {
|
|
589
|
-
return 0;
|
|
590
|
-
}
|
|
591
|
-
};
|
|
592
|
-
|
|
593
430
|
// src/server/requests.ts
|
|
594
431
|
var Request = class {
|
|
595
432
|
ip;
|
|
@@ -618,8 +455,10 @@ var Request = class {
|
|
|
618
455
|
this.params = params;
|
|
619
456
|
this.cookies = cookies;
|
|
620
457
|
this.headers = headers;
|
|
621
|
-
|
|
622
|
-
|
|
458
|
+
const hasFiles = Object.keys(files).length > 0;
|
|
459
|
+
const bodyFields = body && typeof body === "object" && !Array.isArray(body) ? body : {};
|
|
460
|
+
this.query = query;
|
|
461
|
+
this.body = hasFiles ? Object.assign({}, bodyFields, files) : body;
|
|
623
462
|
}
|
|
624
463
|
pipe(stream, opts = {}) {
|
|
625
464
|
return new Response({ ...opts, piped: true, body: stream });
|
|
@@ -665,6 +504,83 @@ var Response = class {
|
|
|
665
504
|
});
|
|
666
505
|
}
|
|
667
506
|
};
|
|
507
|
+
if (void 0) {
|
|
508
|
+
const { describe, expect, test } = void 0;
|
|
509
|
+
describe("Request", () => {
|
|
510
|
+
test("preserves adapter-provided query and body values without JSON normalization", () => {
|
|
511
|
+
const query = {
|
|
512
|
+
count: "10",
|
|
513
|
+
active: "true",
|
|
514
|
+
filter: '{"name":"test"}',
|
|
515
|
+
quoted: '"value"'
|
|
516
|
+
};
|
|
517
|
+
const body = {
|
|
518
|
+
count: "10",
|
|
519
|
+
active: "false",
|
|
520
|
+
payload: '{"nested":true}',
|
|
521
|
+
quoted: '"value"'
|
|
522
|
+
};
|
|
523
|
+
const request = new Request({
|
|
524
|
+
ip: void 0,
|
|
525
|
+
body,
|
|
526
|
+
cookies: {},
|
|
527
|
+
params: {},
|
|
528
|
+
query,
|
|
529
|
+
method: "post",
|
|
530
|
+
path: "/items",
|
|
531
|
+
headers: {},
|
|
532
|
+
files: {}
|
|
533
|
+
});
|
|
534
|
+
expect(request.query).toEqual(query);
|
|
535
|
+
expect(request.body).toEqual(body);
|
|
536
|
+
});
|
|
537
|
+
test("continues merging uploaded files into body fields without parsing string fields", () => {
|
|
538
|
+
const file = {
|
|
539
|
+
name: "avatar.png",
|
|
540
|
+
type: "image/png",
|
|
541
|
+
size: 4,
|
|
542
|
+
isTruncated: false,
|
|
543
|
+
data: Buffer.from("file"),
|
|
544
|
+
duration: 0
|
|
545
|
+
};
|
|
546
|
+
const body = { metadata: '{"alt":"avatar"}' };
|
|
547
|
+
const request = new Request({
|
|
548
|
+
ip: void 0,
|
|
549
|
+
body,
|
|
550
|
+
cookies: {},
|
|
551
|
+
params: {},
|
|
552
|
+
query: {},
|
|
553
|
+
method: "post",
|
|
554
|
+
path: "/upload",
|
|
555
|
+
headers: {},
|
|
556
|
+
files: { avatar: [file] }
|
|
557
|
+
});
|
|
558
|
+
expect(request.body).toEqual({ metadata: '{"alt":"avatar"}', avatar: [file] });
|
|
559
|
+
});
|
|
560
|
+
test("does not spread non-object body values when uploaded files are present", () => {
|
|
561
|
+
const file = {
|
|
562
|
+
name: "avatar.png",
|
|
563
|
+
type: "image/png",
|
|
564
|
+
size: 4,
|
|
565
|
+
isTruncated: false,
|
|
566
|
+
data: Buffer.from("file"),
|
|
567
|
+
duration: 0
|
|
568
|
+
};
|
|
569
|
+
const request = new Request({
|
|
570
|
+
ip: void 0,
|
|
571
|
+
body: "raw text body",
|
|
572
|
+
cookies: {},
|
|
573
|
+
params: {},
|
|
574
|
+
query: {},
|
|
575
|
+
method: "post",
|
|
576
|
+
path: "/upload",
|
|
577
|
+
headers: {},
|
|
578
|
+
files: { avatar: [file] }
|
|
579
|
+
});
|
|
580
|
+
expect(request.body).toEqual({ avatar: [file] });
|
|
581
|
+
});
|
|
582
|
+
});
|
|
583
|
+
}
|
|
668
584
|
|
|
669
585
|
// src/server/requests-auth-methods/base.ts
|
|
670
586
|
var import_node_http2 = require("http2");
|
|
@@ -795,50 +711,50 @@ var SocketEmitter = class {
|
|
|
795
711
|
};
|
|
796
712
|
|
|
797
713
|
// src/server/adapters/base.ts
|
|
798
|
-
var serverConfigPipe = () =>
|
|
799
|
-
port:
|
|
800
|
-
cors:
|
|
801
|
-
|
|
802
|
-
origin:
|
|
803
|
-
methods:
|
|
804
|
-
credentials:
|
|
714
|
+
var serverConfigPipe = () => import_valleyed5.v.object({
|
|
715
|
+
port: import_valleyed5.v.number(),
|
|
716
|
+
cors: import_valleyed5.v.optional(
|
|
717
|
+
import_valleyed5.v.object({
|
|
718
|
+
origin: import_valleyed5.v.optional(import_valleyed5.v.or([import_valleyed5.v.array(import_valleyed5.v.string()), import_valleyed5.v.is(true)])),
|
|
719
|
+
methods: import_valleyed5.v.optional(import_valleyed5.v.array(import_valleyed5.v.in(Object.values(Methods)))),
|
|
720
|
+
credentials: import_valleyed5.v.optional(import_valleyed5.v.boolean())
|
|
805
721
|
})
|
|
806
722
|
),
|
|
807
|
-
eventBus:
|
|
808
|
-
publicPath:
|
|
809
|
-
healthPath:
|
|
810
|
-
openapi:
|
|
811
|
-
|
|
812
|
-
docsVersion:
|
|
813
|
-
docsBaseUrl:
|
|
814
|
-
docsPath:
|
|
723
|
+
eventBus: import_valleyed5.v.optional(import_valleyed5.v.instanceOf(EventBus)),
|
|
724
|
+
publicPath: import_valleyed5.v.optional(import_valleyed5.v.string()),
|
|
725
|
+
healthPath: import_valleyed5.v.optional(import_valleyed5.v.string()),
|
|
726
|
+
openapi: import_valleyed5.v.defaults(
|
|
727
|
+
import_valleyed5.v.object({
|
|
728
|
+
docsVersion: import_valleyed5.v.defaults(import_valleyed5.v.string(), "1.0.0"),
|
|
729
|
+
docsBaseUrl: import_valleyed5.v.defaults(import_valleyed5.v.array(import_valleyed5.v.string()), ["/"]),
|
|
730
|
+
docsPath: import_valleyed5.v.defaults(import_valleyed5.v.string(), "/__docs")
|
|
815
731
|
}),
|
|
816
732
|
{}
|
|
817
733
|
),
|
|
818
|
-
requests:
|
|
819
|
-
|
|
820
|
-
log:
|
|
821
|
-
rateLimit:
|
|
822
|
-
|
|
823
|
-
enabled:
|
|
824
|
-
periodInMs:
|
|
825
|
-
limit:
|
|
734
|
+
requests: import_valleyed5.v.defaults(
|
|
735
|
+
import_valleyed5.v.object({
|
|
736
|
+
log: import_valleyed5.v.defaults(import_valleyed5.v.boolean(), true),
|
|
737
|
+
rateLimit: import_valleyed5.v.defaults(
|
|
738
|
+
import_valleyed5.v.object({
|
|
739
|
+
enabled: import_valleyed5.v.defaults(import_valleyed5.v.boolean(), false),
|
|
740
|
+
periodInMs: import_valleyed5.v.defaults(import_valleyed5.v.number(), 60 * 60 * 1e3),
|
|
741
|
+
limit: import_valleyed5.v.defaults(import_valleyed5.v.number(), 5e3)
|
|
826
742
|
}),
|
|
827
743
|
{}
|
|
828
744
|
),
|
|
829
|
-
slowdown:
|
|
830
|
-
|
|
831
|
-
enabled:
|
|
832
|
-
periodInMs:
|
|
833
|
-
delayAfter:
|
|
834
|
-
delayInMs:
|
|
745
|
+
slowdown: import_valleyed5.v.defaults(
|
|
746
|
+
import_valleyed5.v.object({
|
|
747
|
+
enabled: import_valleyed5.v.defaults(import_valleyed5.v.boolean(), false),
|
|
748
|
+
periodInMs: import_valleyed5.v.defaults(import_valleyed5.v.number(), 10 * 60 * 1e3),
|
|
749
|
+
delayAfter: import_valleyed5.v.defaults(import_valleyed5.v.number(), 2e3),
|
|
750
|
+
delayInMs: import_valleyed5.v.defaults(import_valleyed5.v.number(), 500)
|
|
835
751
|
}),
|
|
836
752
|
{}
|
|
837
753
|
)
|
|
838
754
|
}),
|
|
839
755
|
{}
|
|
840
756
|
),
|
|
841
|
-
socketsAuthMethods:
|
|
757
|
+
socketsAuthMethods: import_valleyed5.v.defaults(import_valleyed5.v.array(import_valleyed5.v.instanceOf(BaseRequestAuthMethod)), [])
|
|
842
758
|
});
|
|
843
759
|
var rawResponseHandledSymbol = /* @__PURE__ */ Symbol("rawResponseHandled");
|
|
844
760
|
var rawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true });
|
|
@@ -859,7 +775,7 @@ function writeRawHandlerError(response, error) {
|
|
|
859
775
|
var errorsSchemas = Object.entries(StatusCodes).filter(([, value]) => value > 399).map(([key, value]) => ({
|
|
860
776
|
status: value,
|
|
861
777
|
contentType: "application/json",
|
|
862
|
-
pipe:
|
|
778
|
+
pipe: import_valleyed5.v.meta(import_valleyed5.v.array(import_valleyed5.v.object({ message: import_valleyed5.v.string(), field: import_valleyed5.v.optional(import_valleyed5.v.string()) })), {
|
|
863
779
|
$refId: `Errors.${key}Response`,
|
|
864
780
|
description: `${key} Response`
|
|
865
781
|
})
|
|
@@ -1016,37 +932,37 @@ var Server = class {
|
|
|
1016
932
|
{ key: "responseCookies", type: "response" }
|
|
1017
933
|
];
|
|
1018
934
|
defs.forEach((def) => {
|
|
1019
|
-
const pipe = schema[def.key] ??
|
|
935
|
+
const pipe = schema[def.key] ?? import_valleyed5.v.any();
|
|
1020
936
|
if (def.skip) return;
|
|
1021
937
|
if (def.type === "request") {
|
|
1022
938
|
requestPipeDefs[def.key] = pipe;
|
|
1023
|
-
jsonSchema.request[def.key] =
|
|
939
|
+
jsonSchema.request[def.key] = import_valleyed5.v.schema(pipe);
|
|
1024
940
|
}
|
|
1025
941
|
if (def.type === "response") {
|
|
1026
942
|
const pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe });
|
|
1027
|
-
responsePipeDefs[def.key] =
|
|
943
|
+
responsePipeDefs[def.key] = import_valleyed5.v.any().pipe((input) => {
|
|
1028
944
|
const p = pipeRecords.find((rec) => rec.status === status)?.pipe;
|
|
1029
|
-
if (!p) throw
|
|
1030
|
-
const r =
|
|
945
|
+
if (!p) throw import_valleyed5.PipeError.root(`schema not defined for status code: ${status}`, input);
|
|
946
|
+
const r = import_valleyed5.v.validate(p, input);
|
|
1031
947
|
if (!r.valid) throw r.error;
|
|
1032
948
|
return r.value;
|
|
1033
949
|
});
|
|
1034
950
|
jsonSchema.response[def.key] = pipeRecords.map((record) => ({
|
|
1035
951
|
status: record.status,
|
|
1036
952
|
contentType: record.contentType,
|
|
1037
|
-
schema:
|
|
953
|
+
schema: import_valleyed5.v.schema(record.pipe)
|
|
1038
954
|
}));
|
|
1039
955
|
}
|
|
1040
956
|
});
|
|
1041
|
-
const requestPipe =
|
|
1042
|
-
|
|
1043
|
-
const responsePipe =
|
|
1044
|
-
|
|
957
|
+
const requestPipe = import_valleyed5.v.object(requestPipeDefs);
|
|
958
|
+
import_valleyed5.v.compile(requestPipe, { allErrors: true });
|
|
959
|
+
const responsePipe = import_valleyed5.v.object(responsePipeDefs);
|
|
960
|
+
import_valleyed5.v.compile(responsePipe, { allErrors: true });
|
|
1045
961
|
const validateRequest = async (request) => {
|
|
1046
962
|
if (!Object.keys(requestPipeDefs)) return request;
|
|
1047
963
|
const validity = requestLocalStorage.run(
|
|
1048
964
|
request,
|
|
1049
|
-
() =>
|
|
965
|
+
() => import_valleyed5.v.validate(requestPipe, {
|
|
1050
966
|
params: request.params,
|
|
1051
967
|
headers: request.headers,
|
|
1052
968
|
query: request.query,
|
|
@@ -1068,7 +984,7 @@ var Server = class {
|
|
|
1068
984
|
contentType = response.contentType;
|
|
1069
985
|
const validity = responseLocalStorage.run(
|
|
1070
986
|
response,
|
|
1071
|
-
() =>
|
|
987
|
+
() => import_valleyed5.v.validate(responsePipe, {
|
|
1072
988
|
responseHeaders: response.headers,
|
|
1073
989
|
responseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value])),
|
|
1074
990
|
response: response.body
|
|
@@ -1721,22 +1637,22 @@ if (void 0) {
|
|
|
1721
1637
|
}
|
|
1722
1638
|
|
|
1723
1639
|
// src/instance/settings.ts
|
|
1724
|
-
var
|
|
1725
|
-
var instanceSettingsPipe = () =>
|
|
1726
|
-
app:
|
|
1727
|
-
name:
|
|
1640
|
+
var import_valleyed7 = require("valleyed");
|
|
1641
|
+
var instanceSettingsPipe = () => import_valleyed7.v.object({
|
|
1642
|
+
app: import_valleyed7.v.object({
|
|
1643
|
+
name: import_valleyed7.v.string()
|
|
1728
1644
|
}),
|
|
1729
|
-
log:
|
|
1730
|
-
|
|
1731
|
-
level:
|
|
1645
|
+
log: import_valleyed7.v.defaults(
|
|
1646
|
+
import_valleyed7.v.object({
|
|
1647
|
+
level: import_valleyed7.v.defaults(import_valleyed7.v.in(["fatal", "error", "warn", "info", "debug", "trace", "silent"]), "info")
|
|
1732
1648
|
}),
|
|
1733
1649
|
{}
|
|
1734
1650
|
),
|
|
1735
|
-
utils:
|
|
1736
|
-
|
|
1737
|
-
hashSaltRounds:
|
|
1738
|
-
paginationDefaultLimit:
|
|
1739
|
-
maxFileUploadSizeInMb:
|
|
1651
|
+
utils: import_valleyed7.v.defaults(
|
|
1652
|
+
import_valleyed7.v.object({
|
|
1653
|
+
hashSaltRounds: import_valleyed7.v.defaults(import_valleyed7.v.number(), 10),
|
|
1654
|
+
paginationDefaultLimit: import_valleyed7.v.defaults(import_valleyed7.v.number(), 100),
|
|
1655
|
+
maxFileUploadSizeInMb: import_valleyed7.v.defaults(import_valleyed7.v.number(), 500)
|
|
1740
1656
|
}),
|
|
1741
1657
|
{}
|
|
1742
1658
|
)
|
|
@@ -1786,7 +1702,7 @@ var Instance = class _Instance {
|
|
|
1786
1702
|
}
|
|
1787
1703
|
}
|
|
1788
1704
|
static envs(envsPipe) {
|
|
1789
|
-
const envValidity =
|
|
1705
|
+
const envValidity = import_valleyed8.v.validate(envsPipe, process.env);
|
|
1790
1706
|
if (!envValidity.valid) {
|
|
1791
1707
|
_Instance.crash(
|
|
1792
1708
|
new EquippedError(`Environment variables are not valid
|
|
@@ -1799,7 +1715,7 @@ ${envValidity.error.toString()}`, {
|
|
|
1799
1715
|
}
|
|
1800
1716
|
static create(settings) {
|
|
1801
1717
|
if (_Instance.#instance) return _Instance.crash(new EquippedError("Instance has been initialized already", {}));
|
|
1802
|
-
const settingsValidity =
|
|
1718
|
+
const settingsValidity = import_valleyed8.v.validate(instanceSettingsPipe(), settings);
|
|
1803
1719
|
if (!settingsValidity.valid) {
|
|
1804
1720
|
_Instance.crash(
|
|
1805
1721
|
new EquippedError(`Settings are not valid
|
|
@@ -1853,6 +1769,157 @@ ${settingsValidity.error.toString()}`, {
|
|
|
1853
1769
|
}
|
|
1854
1770
|
};
|
|
1855
1771
|
|
|
1772
|
+
// src/utilities/configurable.ts
|
|
1773
|
+
var import_valleyed9 = require("valleyed");
|
|
1774
|
+
function configurable(pipeFn, base) {
|
|
1775
|
+
const pipe = pipeFn();
|
|
1776
|
+
import_valleyed9.v.compile(pipe);
|
|
1777
|
+
class Configurable extends base {
|
|
1778
|
+
constructor(config, ...baseArgs) {
|
|
1779
|
+
super(...baseArgs);
|
|
1780
|
+
this.config = config;
|
|
1781
|
+
}
|
|
1782
|
+
static create(input, ...args) {
|
|
1783
|
+
const r = import_valleyed9.v.validate(pipe, input);
|
|
1784
|
+
if (!r.valid) throw r.error;
|
|
1785
|
+
return new this(r.value, ...args);
|
|
1786
|
+
}
|
|
1787
|
+
}
|
|
1788
|
+
return Configurable;
|
|
1789
|
+
}
|
|
1790
|
+
if (void 0) {
|
|
1791
|
+
const { describe, test, expect, expectTypeOf } = void 0;
|
|
1792
|
+
const { v: v8 } = null;
|
|
1793
|
+
const testPipe = () => v8.object({
|
|
1794
|
+
host: v8.string(),
|
|
1795
|
+
port: v8.number()
|
|
1796
|
+
});
|
|
1797
|
+
class TestBase {
|
|
1798
|
+
baseValue;
|
|
1799
|
+
constructor() {
|
|
1800
|
+
this.baseValue = "base";
|
|
1801
|
+
}
|
|
1802
|
+
}
|
|
1803
|
+
class TestBaseWithArgs {
|
|
1804
|
+
label;
|
|
1805
|
+
constructor(label) {
|
|
1806
|
+
this.label = label;
|
|
1807
|
+
}
|
|
1808
|
+
}
|
|
1809
|
+
describe("configurable", () => {
|
|
1810
|
+
test("validation runs in static create before constructor body executes", () => {
|
|
1811
|
+
let constructorRan = false;
|
|
1812
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1813
|
+
class MyClass extends Wrapped {
|
|
1814
|
+
constructor(config) {
|
|
1815
|
+
super(config);
|
|
1816
|
+
constructorRan = true;
|
|
1817
|
+
}
|
|
1818
|
+
}
|
|
1819
|
+
expect(() => MyClass.create({ host: 123, port: "bad" })).toThrow();
|
|
1820
|
+
expect(constructorRan).toBe(false);
|
|
1821
|
+
MyClass.create({ host: "localhost", port: 3e3 });
|
|
1822
|
+
expect(constructorRan).toBe(true);
|
|
1823
|
+
});
|
|
1824
|
+
test("constructor receives validated value", () => {
|
|
1825
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1826
|
+
let receivedConfig;
|
|
1827
|
+
class MyClass extends Wrapped {
|
|
1828
|
+
constructor(config) {
|
|
1829
|
+
super(config);
|
|
1830
|
+
receivedConfig = this.config;
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
MyClass.create({ host: "localhost", port: 3e3 });
|
|
1834
|
+
expect(receivedConfig).toEqual({ host: "localhost", port: 3e3 });
|
|
1835
|
+
});
|
|
1836
|
+
test("external new is a compile error", () => {
|
|
1837
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1838
|
+
class MyClass extends Wrapped {
|
|
1839
|
+
constructor(config) {
|
|
1840
|
+
super(config);
|
|
1841
|
+
}
|
|
1842
|
+
}
|
|
1843
|
+
void (() => new MyClass({ host: "localhost", port: 3e3 }));
|
|
1844
|
+
});
|
|
1845
|
+
test("static Config resolves to PipeOutput<P> at the type level", () => {
|
|
1846
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1847
|
+
class MyClass extends Wrapped {
|
|
1848
|
+
constructor(config) {
|
|
1849
|
+
super(config);
|
|
1850
|
+
}
|
|
1851
|
+
}
|
|
1852
|
+
expectTypeOf().toEqualTypeOf();
|
|
1853
|
+
expect(MyClass.create).toBeTypeOf("function");
|
|
1854
|
+
});
|
|
1855
|
+
test("ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures", () => {
|
|
1856
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1857
|
+
class MyClass extends Wrapped {
|
|
1858
|
+
extra;
|
|
1859
|
+
constructor(config, extra) {
|
|
1860
|
+
super(config);
|
|
1861
|
+
this.extra = extra;
|
|
1862
|
+
}
|
|
1863
|
+
}
|
|
1864
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 }, 42);
|
|
1865
|
+
expect(instance.extra).toBe(42);
|
|
1866
|
+
expectTypeOf(instance).toHaveProperty("extra");
|
|
1867
|
+
expectTypeOf(instance.extra).toEqualTypeOf();
|
|
1868
|
+
void (() => MyClass.create({ host: "localhost", port: 3e3 }, "not-a-number"));
|
|
1869
|
+
});
|
|
1870
|
+
test("base-args forwarding works for non-zero-arg bases", () => {
|
|
1871
|
+
const Wrapped = configurable(testPipe, TestBaseWithArgs);
|
|
1872
|
+
class MyClass extends Wrapped {
|
|
1873
|
+
constructor(config, label) {
|
|
1874
|
+
super(config, label);
|
|
1875
|
+
}
|
|
1876
|
+
}
|
|
1877
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 }, "test-label");
|
|
1878
|
+
expect(instance.label).toBe("test-label");
|
|
1879
|
+
});
|
|
1880
|
+
test("config is accessible as protected readonly on instances", () => {
|
|
1881
|
+
const Wrapped = configurable(testPipe, TestBase);
|
|
1882
|
+
class MyClass extends Wrapped {
|
|
1883
|
+
constructor(config) {
|
|
1884
|
+
super(config);
|
|
1885
|
+
}
|
|
1886
|
+
getHost() {
|
|
1887
|
+
return this.config.host;
|
|
1888
|
+
}
|
|
1889
|
+
}
|
|
1890
|
+
const instance = MyClass.create({ host: "localhost", port: 3e3 });
|
|
1891
|
+
expect(instance.getHost()).toBe("localhost");
|
|
1892
|
+
});
|
|
1893
|
+
test("accepts an abstract base class", () => {
|
|
1894
|
+
class AbstractBase {
|
|
1895
|
+
}
|
|
1896
|
+
const Wrapped = configurable(testPipe, AbstractBase);
|
|
1897
|
+
class Concrete extends Wrapped {
|
|
1898
|
+
constructor(config) {
|
|
1899
|
+
super(config);
|
|
1900
|
+
}
|
|
1901
|
+
greet() {
|
|
1902
|
+
return `hello from ${this.config.host}`;
|
|
1903
|
+
}
|
|
1904
|
+
}
|
|
1905
|
+
const instance = Concrete.create({ host: "localhost", port: 3e3 });
|
|
1906
|
+
expect(instance.greet()).toBe("hello from localhost");
|
|
1907
|
+
expectTypeOf(instance).toHaveProperty("config");
|
|
1908
|
+
});
|
|
1909
|
+
});
|
|
1910
|
+
}
|
|
1911
|
+
|
|
1912
|
+
// src/utilities/media.ts
|
|
1913
|
+
var import_music_metadata = require("music-metadata");
|
|
1914
|
+
var getMediaDuration = async (buffer) => {
|
|
1915
|
+
try {
|
|
1916
|
+
const meta = await (0, import_music_metadata.parseBuffer)(buffer);
|
|
1917
|
+
return meta.format.duration ?? 0;
|
|
1918
|
+
} catch {
|
|
1919
|
+
return 0;
|
|
1920
|
+
}
|
|
1921
|
+
};
|
|
1922
|
+
|
|
1856
1923
|
// src/server/adapters/express/index.ts
|
|
1857
1924
|
var ExpressServer = class extends configurable(serverConfigPipe, Server) {
|
|
1858
1925
|
#app;
|