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.
Files changed (203) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/dist/cjs/cache/adapters/in-memory/index.cjs +155 -155
  3. package/dist/cjs/cache/adapters/in-memory/index.cjs.map +1 -1
  4. package/dist/cjs/cache/adapters/in-memory/index.min.cjs +3 -3
  5. package/dist/cjs/cache/adapters/in-memory/index.min.cjs.map +1 -1
  6. package/dist/cjs/dbs/adapters/mongodb/index.cjs.map +1 -1
  7. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs +2 -2
  8. package/dist/cjs/dbs/adapters/mongodb/index.min.cjs.map +1 -1
  9. package/dist/cjs/dbs/index.cjs +181 -179
  10. package/dist/cjs/dbs/index.cjs.map +1 -1
  11. package/dist/cjs/dbs/index.min.cjs +3 -3
  12. package/dist/cjs/dbs/index.min.cjs.map +1 -1
  13. package/dist/cjs/errors/index.cjs +11 -0
  14. package/dist/cjs/errors/index.cjs.map +1 -1
  15. package/dist/cjs/errors/index.min.cjs +1 -1
  16. package/dist/cjs/errors/index.min.cjs.map +1 -1
  17. package/dist/cjs/events/adapters/kafka/index.cjs.map +1 -1
  18. package/dist/cjs/events/adapters/kafka/index.min.cjs +2 -2
  19. package/dist/cjs/events/adapters/kafka/index.min.cjs.map +1 -1
  20. package/dist/cjs/events/adapters/rabbitmq/index.cjs +179 -179
  21. package/dist/cjs/events/adapters/rabbitmq/index.cjs.map +1 -1
  22. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs +3 -3
  23. package/dist/cjs/events/adapters/rabbitmq/index.min.cjs.map +1 -1
  24. package/dist/cjs/orm/adapters/mongodb/index.cjs +144 -144
  25. package/dist/cjs/orm/adapters/mongodb/index.cjs.map +1 -1
  26. package/dist/cjs/orm/adapters/mongodb/index.min.cjs +1 -1
  27. package/dist/cjs/orm/adapters/mongodb/index.min.cjs.map +1 -1
  28. package/dist/cjs/orm/adapters/postgresql/index.cjs +152 -215
  29. package/dist/cjs/orm/adapters/postgresql/index.cjs.map +1 -1
  30. package/dist/cjs/orm/adapters/postgresql/index.min.cjs +11 -11
  31. package/dist/cjs/orm/adapters/postgresql/index.min.cjs.map +1 -1
  32. package/dist/cjs/server/adapters/express/index.cjs +292 -225
  33. package/dist/cjs/server/adapters/express/index.cjs.map +1 -1
  34. package/dist/cjs/server/adapters/express/index.min.cjs +7 -7
  35. package/dist/cjs/server/adapters/express/index.min.cjs.map +1 -1
  36. package/dist/cjs/server/adapters/fastify/index.cjs +277 -210
  37. package/dist/cjs/server/adapters/fastify/index.cjs.map +1 -1
  38. package/dist/cjs/server/adapters/fastify/index.min.cjs +7 -7
  39. package/dist/cjs/server/adapters/fastify/index.min.cjs.map +1 -1
  40. package/dist/cjs/server/index.cjs +82 -15
  41. package/dist/cjs/server/index.cjs.map +1 -1
  42. package/dist/cjs/server/index.min.cjs +7 -7
  43. package/dist/cjs/server/index.min.cjs.map +1 -1
  44. package/dist/cjs/utilities/index.cjs +0 -5
  45. package/dist/cjs/utilities/index.cjs.map +1 -1
  46. package/dist/cjs/utilities/index.min.cjs +2 -2
  47. package/dist/cjs/utilities/index.min.cjs.map +1 -1
  48. package/dist/cjs/validations/index.cjs +1 -0
  49. package/dist/cjs/validations/index.cjs.map +1 -1
  50. package/dist/cjs/validations/index.min.cjs +1 -1
  51. package/dist/cjs/validations/index.min.cjs.map +1 -1
  52. package/dist/esm/cache/adapters/in-memory/index.min.mjs +1 -1
  53. package/dist/esm/cache/adapters/in-memory/index.min.mjs.map +1 -1
  54. package/dist/esm/cache/adapters/in-memory/index.mjs +6 -3
  55. package/dist/esm/cache/adapters/in-memory/index.mjs.map +1 -1
  56. package/dist/esm/cache/adapters/redis/index.min.mjs +1 -1
  57. package/dist/esm/cache/adapters/redis/index.mjs +5 -3
  58. package/dist/esm/cache/index.min.mjs +1 -1
  59. package/dist/esm/cache/index.mjs +2 -2
  60. package/dist/esm/{chunk-2GGMLKRP.min.mjs → chunk-4GZ43EQ2.min.mjs} +2 -2
  61. package/dist/esm/{chunk-IRYCN6PI.min.mjs → chunk-5FEVQT6K.min.mjs} +2 -2
  62. package/dist/esm/{chunk-LKS5ZE45.mjs → chunk-74GY55PM.mjs} +2 -2
  63. package/dist/esm/{chunk-A4P7P6BU.mjs → chunk-7N4WUZ7P.mjs} +167 -347
  64. package/dist/esm/chunk-7N4WUZ7P.mjs.map +1 -0
  65. package/dist/esm/chunk-A332TTED.mjs +135 -0
  66. package/dist/esm/chunk-A332TTED.mjs.map +1 -0
  67. package/dist/esm/{chunk-7CP7ZE2O.mjs → chunk-BONYW6LU.mjs} +9 -5
  68. package/dist/esm/{chunk-7CP7ZE2O.mjs.map → chunk-BONYW6LU.mjs.map} +1 -1
  69. package/dist/esm/{chunk-HXFNN6RI.mjs → chunk-C3G4W4ZV.mjs} +3 -3
  70. package/dist/esm/chunk-CU2HU5UE.min.mjs +2 -0
  71. package/dist/esm/chunk-CU2HU5UE.min.mjs.map +1 -0
  72. package/dist/esm/{chunk-676VIABN.min.mjs → chunk-LJZOS62I.min.mjs} +2 -2
  73. package/dist/esm/{chunk-7SQ5JQYR.min.mjs → chunk-MCX2O5IT.min.mjs} +2 -2
  74. package/dist/esm/{chunk-BWUFPMVG.mjs → chunk-MNKDFIVK.mjs} +2 -2
  75. package/dist/esm/chunk-N3OD4QL2.min.mjs +32 -0
  76. package/dist/esm/chunk-N3OD4QL2.min.mjs.map +1 -0
  77. package/dist/esm/chunk-NEF3UYFA.mjs +144 -0
  78. package/dist/esm/chunk-NEF3UYFA.mjs.map +1 -0
  79. package/dist/esm/{chunk-TSVHZZE4.mjs → chunk-RFJ5URMP.mjs} +5 -5
  80. package/dist/esm/chunk-RX4XPABH.min.mjs +2 -0
  81. package/dist/esm/{chunk-MQXTTWPS.min.mjs.map → chunk-RX4XPABH.min.mjs.map} +1 -1
  82. package/dist/esm/chunk-SPOVKWV3.min.mjs +2 -0
  83. package/dist/esm/chunk-SPOVKWV3.min.mjs.map +1 -0
  84. package/dist/esm/{chunk-3TP7NINX.mjs → chunk-XESM7IWM.mjs} +2 -2
  85. package/dist/esm/{chunk-5PZACGPI.mjs → chunk-XJKBHQWO.mjs} +7 -5
  86. package/dist/esm/{chunk-5PZACGPI.mjs.map → chunk-XJKBHQWO.mjs.map} +1 -1
  87. package/dist/esm/chunk-YC6V4HLT.min.mjs +2 -0
  88. package/dist/esm/{chunk-7NF7PV6S.min.mjs.map → chunk-YC6V4HLT.min.mjs.map} +1 -1
  89. package/dist/esm/{chunk-P4PRHHIY.min.mjs → chunk-YWQTFKNY.min.mjs} +2 -2
  90. package/dist/esm/dbs/adapters/mongodb/index.min.mjs +1 -1
  91. package/dist/esm/dbs/adapters/mongodb/index.min.mjs.map +1 -1
  92. package/dist/esm/dbs/adapters/mongodb/index.mjs +8 -5
  93. package/dist/esm/dbs/adapters/mongodb/index.mjs.map +1 -1
  94. package/dist/esm/dbs/index.min.mjs +1 -1
  95. package/dist/esm/dbs/index.mjs +5 -3
  96. package/dist/esm/errors/index.min.mjs +1 -1
  97. package/dist/esm/errors/index.mjs +3 -1
  98. package/dist/esm/events/adapters/kafka/index.min.mjs +1 -1
  99. package/dist/esm/events/adapters/kafka/index.mjs +4 -2
  100. package/dist/esm/events/adapters/rabbitmq/index.min.mjs +1 -1
  101. package/dist/esm/events/adapters/rabbitmq/index.min.mjs.map +1 -1
  102. package/dist/esm/events/adapters/rabbitmq/index.mjs +7 -3
  103. package/dist/esm/events/adapters/rabbitmq/index.mjs.map +1 -1
  104. package/dist/esm/index.min.mjs +1 -1
  105. package/dist/esm/index.mjs +1 -1
  106. package/dist/esm/instance/index.min.mjs +1 -1
  107. package/dist/esm/instance/index.mjs +1 -1
  108. package/dist/esm/introspection-TO27QT2X.min.mjs +2 -0
  109. package/dist/esm/{introspection-YJF3QAUK.mjs → introspection-ZUQYVEFC.mjs} +3 -3
  110. package/dist/esm/jobs/adapters/redis/index.min.mjs +1 -1
  111. package/dist/esm/jobs/adapters/redis/index.min.mjs.map +1 -1
  112. package/dist/esm/jobs/adapters/redis/index.mjs +10 -6
  113. package/dist/esm/jobs/adapters/redis/index.mjs.map +1 -1
  114. package/dist/esm/orm/adapters/in-memory/index.min.mjs +1 -1
  115. package/dist/esm/orm/adapters/in-memory/index.mjs +4 -3
  116. package/dist/esm/orm/adapters/json/index.min.mjs +1 -1
  117. package/dist/esm/orm/adapters/json/index.min.mjs.map +1 -1
  118. package/dist/esm/orm/adapters/json/index.mjs +6 -5
  119. package/dist/esm/orm/adapters/json/index.mjs.map +1 -1
  120. package/dist/esm/orm/adapters/mongodb/index.min.mjs +1 -1
  121. package/dist/esm/orm/adapters/mongodb/index.min.mjs.map +1 -1
  122. package/dist/esm/orm/adapters/mongodb/index.mjs +6 -4
  123. package/dist/esm/orm/adapters/mongodb/index.mjs.map +1 -1
  124. package/dist/esm/orm/adapters/postgresql/index.min.mjs +2 -2
  125. package/dist/esm/orm/adapters/postgresql/index.min.mjs.map +1 -1
  126. package/dist/esm/orm/adapters/postgresql/index.mjs +8 -5
  127. package/dist/esm/orm/adapters/postgresql/index.mjs.map +1 -1
  128. package/dist/esm/orm/index.min.mjs +1 -1
  129. package/dist/esm/orm/index.mjs +3 -3
  130. package/dist/esm/server/adapters/express/index.min.mjs +1 -1
  131. package/dist/esm/server/adapters/express/index.min.mjs.map +1 -1
  132. package/dist/esm/server/adapters/express/index.mjs +7 -3
  133. package/dist/esm/server/adapters/express/index.mjs.map +1 -1
  134. package/dist/esm/server/adapters/fastify/index.min.mjs +1 -1
  135. package/dist/esm/server/adapters/fastify/index.min.mjs.map +1 -1
  136. package/dist/esm/server/adapters/fastify/index.mjs +7 -3
  137. package/dist/esm/server/adapters/fastify/index.mjs.map +1 -1
  138. package/dist/esm/server/index.min.mjs +1 -1
  139. package/dist/esm/server/index.mjs +1 -1
  140. package/dist/esm/utilities/index.min.mjs +1 -1
  141. package/dist/esm/utilities/index.mjs +5 -4
  142. package/dist/esm/validations/index.min.mjs +1 -1
  143. package/dist/esm/validations/index.mjs +1 -1
  144. package/dist/types/{base-BDTBLZ9a.d.ts → base-BnwwLupM.d.ts} +3 -3
  145. package/dist/types/cache/adapters/in-memory/index.js +6 -3
  146. package/dist/types/cache/adapters/redis/index.js +5 -3
  147. package/dist/types/cache/index.js +2 -2
  148. package/dist/types/chunk-7MXHWHRV.js +134 -0
  149. package/dist/types/{chunk-LPB5LS7A.js → chunk-BKXNLF6X.js} +1 -1
  150. package/dist/types/{chunk-J3TGB5YQ.js → chunk-DZFKDZDZ.js} +8 -4
  151. package/dist/types/{chunk-YLJNBL6J.js → chunk-GQRSK2KP.js} +6 -4
  152. package/dist/types/chunk-PPD4WDG6.js +143 -0
  153. package/dist/types/{chunk-55CTVK7R.js → chunk-SZAA5GF6.js} +1 -1
  154. package/dist/types/{chunk-4DH3POYM.js → chunk-UGLZIYAR.js} +4 -4
  155. package/dist/types/{chunk-5Z26ZURE.js → chunk-UR7O43FC.js} +1 -1
  156. package/dist/types/{chunk-IZDJDGOV.js → chunk-X5ZDIXCZ.js} +2 -2
  157. package/dist/types/{chunk-TT5EORDK.js → chunk-YGIIUOQM.js} +166 -346
  158. package/dist/types/dbs/adapters/mongodb/index.js +8 -5
  159. package/dist/types/dbs/index.js +5 -3
  160. package/dist/types/errors/index.d.ts +8 -3
  161. package/dist/types/errors/index.js +3 -1
  162. package/dist/types/events/adapters/kafka/index.js +4 -2
  163. package/dist/types/events/adapters/rabbitmq/index.js +7 -3
  164. package/dist/types/index.js +1 -1
  165. package/dist/types/instance/index.js +1 -1
  166. package/dist/types/{introspection-EHGM4RMO.js → introspection-ZQMYTW6H.js} +2 -2
  167. package/dist/types/jobs/adapters/redis/index.js +10 -6
  168. package/dist/types/orm/adapters/in-memory/index.js +4 -3
  169. package/dist/types/orm/adapters/json/index.js +6 -5
  170. package/dist/types/orm/adapters/mongodb/index.js +6 -4
  171. package/dist/types/orm/adapters/postgresql/index.js +8 -5
  172. package/dist/types/orm/index.js +3 -3
  173. package/dist/types/{requestError-DdaL8hc3.d.ts → requestError-BmOhSuFb.d.ts} +1 -0
  174. package/dist/types/server/adapters/express/index.d.ts +2 -2
  175. package/dist/types/server/adapters/express/index.js +7 -3
  176. package/dist/types/server/adapters/fastify/index.d.ts +3 -3
  177. package/dist/types/server/adapters/fastify/index.js +7 -3
  178. package/dist/types/server/index.d.ts +4 -4
  179. package/dist/types/server/index.js +1 -1
  180. package/dist/types/utilities/index.d.ts +1 -2
  181. package/dist/types/utilities/index.js +5 -4
  182. package/dist/types/{validationError-oigtHqBi.d.ts → validationError-C2tVK4s7.d.ts} +1 -1
  183. package/dist/types/validations/index.d.ts +4 -4
  184. package/dist/types/validations/index.js +1 -1
  185. package/package.json +1 -1
  186. package/dist/esm/chunk-7NF7PV6S.min.mjs +0 -2
  187. package/dist/esm/chunk-A4P7P6BU.mjs.map +0 -1
  188. package/dist/esm/chunk-IN5YKIJ7.min.mjs +0 -32
  189. package/dist/esm/chunk-IN5YKIJ7.min.mjs.map +0 -1
  190. package/dist/esm/chunk-MQXTTWPS.min.mjs +0 -2
  191. package/dist/esm/introspection-THKMXV5V.min.mjs +0 -2
  192. /package/dist/esm/{chunk-2GGMLKRP.min.mjs.map → chunk-4GZ43EQ2.min.mjs.map} +0 -0
  193. /package/dist/esm/{chunk-IRYCN6PI.min.mjs.map → chunk-5FEVQT6K.min.mjs.map} +0 -0
  194. /package/dist/esm/{chunk-LKS5ZE45.mjs.map → chunk-74GY55PM.mjs.map} +0 -0
  195. /package/dist/esm/{chunk-HXFNN6RI.mjs.map → chunk-C3G4W4ZV.mjs.map} +0 -0
  196. /package/dist/esm/{chunk-676VIABN.min.mjs.map → chunk-LJZOS62I.min.mjs.map} +0 -0
  197. /package/dist/esm/{chunk-7SQ5JQYR.min.mjs.map → chunk-MCX2O5IT.min.mjs.map} +0 -0
  198. /package/dist/esm/{chunk-BWUFPMVG.mjs.map → chunk-MNKDFIVK.mjs.map} +0 -0
  199. /package/dist/esm/{chunk-TSVHZZE4.mjs.map → chunk-RFJ5URMP.mjs.map} +0 -0
  200. /package/dist/esm/{chunk-3TP7NINX.mjs.map → chunk-XESM7IWM.mjs.map} +0 -0
  201. /package/dist/esm/{chunk-P4PRHHIY.min.mjs.map → chunk-YWQTFKNY.min.mjs.map} +0 -0
  202. /package/dist/esm/{introspection-THKMXV5V.min.mjs.map → introspection-TO27QT2X.min.mjs.map} +0 -0
  203. /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 import_valleyed9 = require("valleyed");
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 import_valleyed6 = require("valleyed");
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
- this.query = parseJSONObject(query);
622
- this.body = Object.assign(parseJSONObject(body), files);
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 = () => import_valleyed6.v.object({
799
- port: import_valleyed6.v.number(),
800
- cors: import_valleyed6.v.optional(
801
- import_valleyed6.v.object({
802
- origin: import_valleyed6.v.optional(import_valleyed6.v.or([import_valleyed6.v.array(import_valleyed6.v.string()), import_valleyed6.v.is(true)])),
803
- methods: import_valleyed6.v.optional(import_valleyed6.v.array(import_valleyed6.v.in(Object.values(Methods)))),
804
- credentials: import_valleyed6.v.optional(import_valleyed6.v.boolean())
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: import_valleyed6.v.optional(import_valleyed6.v.instanceOf(EventBus)),
808
- publicPath: import_valleyed6.v.optional(import_valleyed6.v.string()),
809
- healthPath: import_valleyed6.v.optional(import_valleyed6.v.string()),
810
- openapi: import_valleyed6.v.defaults(
811
- import_valleyed6.v.object({
812
- docsVersion: import_valleyed6.v.defaults(import_valleyed6.v.string(), "1.0.0"),
813
- docsBaseUrl: import_valleyed6.v.defaults(import_valleyed6.v.array(import_valleyed6.v.string()), ["/"]),
814
- docsPath: import_valleyed6.v.defaults(import_valleyed6.v.string(), "/__docs")
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: import_valleyed6.v.defaults(
819
- import_valleyed6.v.object({
820
- log: import_valleyed6.v.defaults(import_valleyed6.v.boolean(), true),
821
- rateLimit: import_valleyed6.v.defaults(
822
- import_valleyed6.v.object({
823
- enabled: import_valleyed6.v.defaults(import_valleyed6.v.boolean(), false),
824
- periodInMs: import_valleyed6.v.defaults(import_valleyed6.v.number(), 60 * 60 * 1e3),
825
- limit: import_valleyed6.v.defaults(import_valleyed6.v.number(), 5e3)
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: import_valleyed6.v.defaults(
830
- import_valleyed6.v.object({
831
- enabled: import_valleyed6.v.defaults(import_valleyed6.v.boolean(), false),
832
- periodInMs: import_valleyed6.v.defaults(import_valleyed6.v.number(), 10 * 60 * 1e3),
833
- delayAfter: import_valleyed6.v.defaults(import_valleyed6.v.number(), 2e3),
834
- delayInMs: import_valleyed6.v.defaults(import_valleyed6.v.number(), 500)
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: import_valleyed6.v.defaults(import_valleyed6.v.array(import_valleyed6.v.instanceOf(BaseRequestAuthMethod)), [])
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: import_valleyed6.v.meta(import_valleyed6.v.array(import_valleyed6.v.object({ message: import_valleyed6.v.string(), field: import_valleyed6.v.optional(import_valleyed6.v.string()) })), {
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] ?? import_valleyed6.v.any();
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] = import_valleyed6.v.schema(pipe);
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] = import_valleyed6.v.any().pipe((input) => {
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 import_valleyed6.PipeError.root(`schema not defined for status code: ${status}`, input);
1030
- const r = import_valleyed6.v.validate(p, input);
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: import_valleyed6.v.schema(record.pipe)
953
+ schema: import_valleyed5.v.schema(record.pipe)
1038
954
  }));
1039
955
  }
1040
956
  });
1041
- const requestPipe = import_valleyed6.v.object(requestPipeDefs);
1042
- import_valleyed6.v.compile(requestPipe, { allErrors: true });
1043
- const responsePipe = import_valleyed6.v.object(responsePipeDefs);
1044
- import_valleyed6.v.compile(responsePipe, { allErrors: true });
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
- () => import_valleyed6.v.validate(requestPipe, {
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
- () => import_valleyed6.v.validate(responsePipe, {
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 import_valleyed8 = require("valleyed");
1725
- var instanceSettingsPipe = () => import_valleyed8.v.object({
1726
- app: import_valleyed8.v.object({
1727
- name: import_valleyed8.v.string()
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: import_valleyed8.v.defaults(
1730
- import_valleyed8.v.object({
1731
- level: import_valleyed8.v.defaults(import_valleyed8.v.in(["fatal", "error", "warn", "info", "debug", "trace", "silent"]), "info")
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: import_valleyed8.v.defaults(
1736
- import_valleyed8.v.object({
1737
- hashSaltRounds: import_valleyed8.v.defaults(import_valleyed8.v.number(), 10),
1738
- paginationDefaultLimit: import_valleyed8.v.defaults(import_valleyed8.v.number(), 100),
1739
- maxFileUploadSizeInMb: import_valleyed8.v.defaults(import_valleyed8.v.number(), 500)
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 = import_valleyed9.v.validate(envsPipe, process.env);
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 = import_valleyed9.v.validate(instanceSettingsPipe(), settings);
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;