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
@@ -69,7 +69,7 @@ var import_cors = require("@fastify/cors");
69
69
  var import_cors2 = require("cors");
70
70
  var import_socket = require("socket.io");
71
71
  var import_supertest = __toESM(require("supertest"), 1);
72
- var import_valleyed8 = require("valleyed");
72
+ var import_valleyed7 = require("valleyed");
73
73
 
74
74
  // src/events/adapters/base.ts
75
75
  var EventBus = class {
@@ -708,6 +708,7 @@ var StatusCodes = {
708
708
  NotAuthorized: 403,
709
709
  NotFound: 404,
710
710
  ValidationError: 422,
711
+ PreconditionRequired: 428,
711
712
  TooManyRequests: 429,
712
713
  TokenExpired: 461
713
714
  };
@@ -961,170 +962,6 @@ var openapi = (config) => {
961
962
  };
962
963
  };
963
964
 
964
- // src/utilities/configurable.ts
965
- var import_valleyed7 = require("valleyed");
966
- function configurable(pipeFn, base) {
967
- const pipe = pipeFn();
968
- import_valleyed7.v.compile(pipe);
969
- class Configurable extends base {
970
- constructor(config, ...baseArgs) {
971
- super(...baseArgs);
972
- this.config = config;
973
- }
974
- static create(input, ...args) {
975
- const r = import_valleyed7.v.validate(pipe, input);
976
- if (!r.valid) throw r.error;
977
- return new this(r.value, ...args);
978
- }
979
- }
980
- return Configurable;
981
- }
982
- if (void 0) {
983
- const { describe, test, expect, expectTypeOf } = void 0;
984
- const { v: v8 } = null;
985
- const testPipe = () => v8.object({
986
- host: v8.string(),
987
- port: v8.number()
988
- });
989
- class TestBase {
990
- baseValue;
991
- constructor() {
992
- this.baseValue = "base";
993
- }
994
- }
995
- class TestBaseWithArgs {
996
- label;
997
- constructor(label) {
998
- this.label = label;
999
- }
1000
- }
1001
- describe("configurable", () => {
1002
- test("validation runs in static create before constructor body executes", () => {
1003
- let constructorRan = false;
1004
- const Wrapped = configurable(testPipe, TestBase);
1005
- class MyClass extends Wrapped {
1006
- constructor(config) {
1007
- super(config);
1008
- constructorRan = true;
1009
- }
1010
- }
1011
- expect(() => MyClass.create({ host: 123, port: "bad" })).toThrow();
1012
- expect(constructorRan).toBe(false);
1013
- MyClass.create({ host: "localhost", port: 3e3 });
1014
- expect(constructorRan).toBe(true);
1015
- });
1016
- test("constructor receives validated value", () => {
1017
- const Wrapped = configurable(testPipe, TestBase);
1018
- let receivedConfig;
1019
- class MyClass extends Wrapped {
1020
- constructor(config) {
1021
- super(config);
1022
- receivedConfig = this.config;
1023
- }
1024
- }
1025
- MyClass.create({ host: "localhost", port: 3e3 });
1026
- expect(receivedConfig).toEqual({ host: "localhost", port: 3e3 });
1027
- });
1028
- test("external new is a compile error", () => {
1029
- const Wrapped = configurable(testPipe, TestBase);
1030
- class MyClass extends Wrapped {
1031
- constructor(config) {
1032
- super(config);
1033
- }
1034
- }
1035
- void (() => new MyClass({ host: "localhost", port: 3e3 }));
1036
- });
1037
- test("static Config resolves to PipeOutput<P> at the type level", () => {
1038
- const Wrapped = configurable(testPipe, TestBase);
1039
- class MyClass extends Wrapped {
1040
- constructor(config) {
1041
- super(config);
1042
- }
1043
- }
1044
- expectTypeOf().toEqualTypeOf();
1045
- expect(MyClass.create).toBeTypeOf("function");
1046
- });
1047
- test("ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures", () => {
1048
- const Wrapped = configurable(testPipe, TestBase);
1049
- class MyClass extends Wrapped {
1050
- extra;
1051
- constructor(config, extra) {
1052
- super(config);
1053
- this.extra = extra;
1054
- }
1055
- }
1056
- const instance = MyClass.create({ host: "localhost", port: 3e3 }, 42);
1057
- expect(instance.extra).toBe(42);
1058
- expectTypeOf(instance).toHaveProperty("extra");
1059
- expectTypeOf(instance.extra).toEqualTypeOf();
1060
- void (() => MyClass.create({ host: "localhost", port: 3e3 }, "not-a-number"));
1061
- });
1062
- test("base-args forwarding works for non-zero-arg bases", () => {
1063
- const Wrapped = configurable(testPipe, TestBaseWithArgs);
1064
- class MyClass extends Wrapped {
1065
- constructor(config, label) {
1066
- super(config, label);
1067
- }
1068
- }
1069
- const instance = MyClass.create({ host: "localhost", port: 3e3 }, "test-label");
1070
- expect(instance.label).toBe("test-label");
1071
- });
1072
- test("config is accessible as protected readonly on instances", () => {
1073
- const Wrapped = configurable(testPipe, TestBase);
1074
- class MyClass extends Wrapped {
1075
- constructor(config) {
1076
- super(config);
1077
- }
1078
- getHost() {
1079
- return this.config.host;
1080
- }
1081
- }
1082
- const instance = MyClass.create({ host: "localhost", port: 3e3 });
1083
- expect(instance.getHost()).toBe("localhost");
1084
- });
1085
- test("accepts an abstract base class", () => {
1086
- class AbstractBase {
1087
- }
1088
- const Wrapped = configurable(testPipe, AbstractBase);
1089
- class Concrete extends Wrapped {
1090
- constructor(config) {
1091
- super(config);
1092
- }
1093
- greet() {
1094
- return `hello from ${this.config.host}`;
1095
- }
1096
- }
1097
- const instance = Concrete.create({ host: "localhost", port: 3e3 });
1098
- expect(instance.greet()).toBe("hello from localhost");
1099
- expectTypeOf(instance).toHaveProperty("config");
1100
- });
1101
- });
1102
- }
1103
-
1104
- // src/utilities/json.ts
1105
- var parseJSONValue = (data) => {
1106
- try {
1107
- if (data?.constructor?.name !== "String") return data;
1108
- return JSON.parse(data);
1109
- } catch {
1110
- return data;
1111
- }
1112
- };
1113
- function parseJSONObject(data) {
1114
- return Object.fromEntries(Object.entries(data).map(([key, value]) => [key, parseJSONValue(value)]));
1115
- }
1116
-
1117
- // src/utilities/media.ts
1118
- var import_music_metadata = require("music-metadata");
1119
- var getMediaDuration = async (buffer) => {
1120
- try {
1121
- const meta = await (0, import_music_metadata.parseBuffer)(buffer);
1122
- return meta.format.duration ?? 0;
1123
- } catch {
1124
- return 0;
1125
- }
1126
- };
1127
-
1128
965
  // src/server/requests.ts
1129
966
  var Request = class {
1130
967
  ip;
@@ -1153,8 +990,10 @@ var Request = class {
1153
990
  this.params = params;
1154
991
  this.cookies = cookies;
1155
992
  this.headers = headers;
1156
- this.query = parseJSONObject(query);
1157
- this.body = Object.assign(parseJSONObject(body), files);
993
+ const hasFiles = Object.keys(files).length > 0;
994
+ const bodyFields = body && typeof body === "object" && !Array.isArray(body) ? body : {};
995
+ this.query = query;
996
+ this.body = hasFiles ? Object.assign({}, bodyFields, files) : body;
1158
997
  }
1159
998
  pipe(stream, opts = {}) {
1160
999
  return new Response({ ...opts, piped: true, body: stream });
@@ -1200,6 +1039,83 @@ var Response = class {
1200
1039
  });
1201
1040
  }
1202
1041
  };
1042
+ if (void 0) {
1043
+ const { describe, expect, test } = void 0;
1044
+ describe("Request", () => {
1045
+ test("preserves adapter-provided query and body values without JSON normalization", () => {
1046
+ const query = {
1047
+ count: "10",
1048
+ active: "true",
1049
+ filter: '{"name":"test"}',
1050
+ quoted: '"value"'
1051
+ };
1052
+ const body = {
1053
+ count: "10",
1054
+ active: "false",
1055
+ payload: '{"nested":true}',
1056
+ quoted: '"value"'
1057
+ };
1058
+ const request = new Request({
1059
+ ip: void 0,
1060
+ body,
1061
+ cookies: {},
1062
+ params: {},
1063
+ query,
1064
+ method: "post",
1065
+ path: "/items",
1066
+ headers: {},
1067
+ files: {}
1068
+ });
1069
+ expect(request.query).toEqual(query);
1070
+ expect(request.body).toEqual(body);
1071
+ });
1072
+ test("continues merging uploaded files into body fields without parsing string fields", () => {
1073
+ const file = {
1074
+ name: "avatar.png",
1075
+ type: "image/png",
1076
+ size: 4,
1077
+ isTruncated: false,
1078
+ data: Buffer.from("file"),
1079
+ duration: 0
1080
+ };
1081
+ const body = { metadata: '{"alt":"avatar"}' };
1082
+ const request = new Request({
1083
+ ip: void 0,
1084
+ body,
1085
+ cookies: {},
1086
+ params: {},
1087
+ query: {},
1088
+ method: "post",
1089
+ path: "/upload",
1090
+ headers: {},
1091
+ files: { avatar: [file] }
1092
+ });
1093
+ expect(request.body).toEqual({ metadata: '{"alt":"avatar"}', avatar: [file] });
1094
+ });
1095
+ test("does not spread non-object body values when uploaded files are present", () => {
1096
+ const file = {
1097
+ name: "avatar.png",
1098
+ type: "image/png",
1099
+ size: 4,
1100
+ isTruncated: false,
1101
+ data: Buffer.from("file"),
1102
+ duration: 0
1103
+ };
1104
+ const request = new Request({
1105
+ ip: void 0,
1106
+ body: "raw text body",
1107
+ cookies: {},
1108
+ params: {},
1109
+ query: {},
1110
+ method: "post",
1111
+ path: "/upload",
1112
+ headers: {},
1113
+ files: { avatar: [file] }
1114
+ });
1115
+ expect(request.body).toEqual({ avatar: [file] });
1116
+ });
1117
+ });
1118
+ }
1203
1119
 
1204
1120
  // src/server/requests-auth-methods/base.ts
1205
1121
  var import_node_http2 = require("http2");
@@ -1330,50 +1246,50 @@ var SocketEmitter = class {
1330
1246
  };
1331
1247
 
1332
1248
  // src/server/adapters/base.ts
1333
- var serverConfigPipe = () => import_valleyed8.v.object({
1334
- port: import_valleyed8.v.number(),
1335
- cors: import_valleyed8.v.optional(
1336
- import_valleyed8.v.object({
1337
- origin: import_valleyed8.v.optional(import_valleyed8.v.or([import_valleyed8.v.array(import_valleyed8.v.string()), import_valleyed8.v.is(true)])),
1338
- methods: import_valleyed8.v.optional(import_valleyed8.v.array(import_valleyed8.v.in(Object.values(Methods)))),
1339
- credentials: import_valleyed8.v.optional(import_valleyed8.v.boolean())
1249
+ var serverConfigPipe = () => import_valleyed7.v.object({
1250
+ port: import_valleyed7.v.number(),
1251
+ cors: import_valleyed7.v.optional(
1252
+ import_valleyed7.v.object({
1253
+ origin: import_valleyed7.v.optional(import_valleyed7.v.or([import_valleyed7.v.array(import_valleyed7.v.string()), import_valleyed7.v.is(true)])),
1254
+ methods: import_valleyed7.v.optional(import_valleyed7.v.array(import_valleyed7.v.in(Object.values(Methods)))),
1255
+ credentials: import_valleyed7.v.optional(import_valleyed7.v.boolean())
1340
1256
  })
1341
1257
  ),
1342
- eventBus: import_valleyed8.v.optional(import_valleyed8.v.instanceOf(EventBus)),
1343
- publicPath: import_valleyed8.v.optional(import_valleyed8.v.string()),
1344
- healthPath: import_valleyed8.v.optional(import_valleyed8.v.string()),
1345
- openapi: import_valleyed8.v.defaults(
1346
- import_valleyed8.v.object({
1347
- docsVersion: import_valleyed8.v.defaults(import_valleyed8.v.string(), "1.0.0"),
1348
- docsBaseUrl: import_valleyed8.v.defaults(import_valleyed8.v.array(import_valleyed8.v.string()), ["/"]),
1349
- docsPath: import_valleyed8.v.defaults(import_valleyed8.v.string(), "/__docs")
1258
+ eventBus: import_valleyed7.v.optional(import_valleyed7.v.instanceOf(EventBus)),
1259
+ publicPath: import_valleyed7.v.optional(import_valleyed7.v.string()),
1260
+ healthPath: import_valleyed7.v.optional(import_valleyed7.v.string()),
1261
+ openapi: import_valleyed7.v.defaults(
1262
+ import_valleyed7.v.object({
1263
+ docsVersion: import_valleyed7.v.defaults(import_valleyed7.v.string(), "1.0.0"),
1264
+ docsBaseUrl: import_valleyed7.v.defaults(import_valleyed7.v.array(import_valleyed7.v.string()), ["/"]),
1265
+ docsPath: import_valleyed7.v.defaults(import_valleyed7.v.string(), "/__docs")
1350
1266
  }),
1351
1267
  {}
1352
1268
  ),
1353
- requests: import_valleyed8.v.defaults(
1354
- import_valleyed8.v.object({
1355
- log: import_valleyed8.v.defaults(import_valleyed8.v.boolean(), true),
1356
- rateLimit: import_valleyed8.v.defaults(
1357
- import_valleyed8.v.object({
1358
- enabled: import_valleyed8.v.defaults(import_valleyed8.v.boolean(), false),
1359
- periodInMs: import_valleyed8.v.defaults(import_valleyed8.v.number(), 60 * 60 * 1e3),
1360
- limit: import_valleyed8.v.defaults(import_valleyed8.v.number(), 5e3)
1269
+ requests: import_valleyed7.v.defaults(
1270
+ import_valleyed7.v.object({
1271
+ log: import_valleyed7.v.defaults(import_valleyed7.v.boolean(), true),
1272
+ rateLimit: import_valleyed7.v.defaults(
1273
+ import_valleyed7.v.object({
1274
+ enabled: import_valleyed7.v.defaults(import_valleyed7.v.boolean(), false),
1275
+ periodInMs: import_valleyed7.v.defaults(import_valleyed7.v.number(), 60 * 60 * 1e3),
1276
+ limit: import_valleyed7.v.defaults(import_valleyed7.v.number(), 5e3)
1361
1277
  }),
1362
1278
  {}
1363
1279
  ),
1364
- slowdown: import_valleyed8.v.defaults(
1365
- import_valleyed8.v.object({
1366
- enabled: import_valleyed8.v.defaults(import_valleyed8.v.boolean(), false),
1367
- periodInMs: import_valleyed8.v.defaults(import_valleyed8.v.number(), 10 * 60 * 1e3),
1368
- delayAfter: import_valleyed8.v.defaults(import_valleyed8.v.number(), 2e3),
1369
- delayInMs: import_valleyed8.v.defaults(import_valleyed8.v.number(), 500)
1280
+ slowdown: import_valleyed7.v.defaults(
1281
+ import_valleyed7.v.object({
1282
+ enabled: import_valleyed7.v.defaults(import_valleyed7.v.boolean(), false),
1283
+ periodInMs: import_valleyed7.v.defaults(import_valleyed7.v.number(), 10 * 60 * 1e3),
1284
+ delayAfter: import_valleyed7.v.defaults(import_valleyed7.v.number(), 2e3),
1285
+ delayInMs: import_valleyed7.v.defaults(import_valleyed7.v.number(), 500)
1370
1286
  }),
1371
1287
  {}
1372
1288
  )
1373
1289
  }),
1374
1290
  {}
1375
1291
  ),
1376
- socketsAuthMethods: import_valleyed8.v.defaults(import_valleyed8.v.array(import_valleyed8.v.instanceOf(BaseRequestAuthMethod)), [])
1292
+ socketsAuthMethods: import_valleyed7.v.defaults(import_valleyed7.v.array(import_valleyed7.v.instanceOf(BaseRequestAuthMethod)), [])
1377
1293
  });
1378
1294
  var rawResponseHandledSymbol = /* @__PURE__ */ Symbol("rawResponseHandled");
1379
1295
  var rawResponseHandled = Object.freeze({ [rawResponseHandledSymbol]: true });
@@ -1394,7 +1310,7 @@ function writeRawHandlerError(response, error) {
1394
1310
  var errorsSchemas = Object.entries(StatusCodes).filter(([, value]) => value > 399).map(([key, value]) => ({
1395
1311
  status: value,
1396
1312
  contentType: "application/json",
1397
- pipe: import_valleyed8.v.meta(import_valleyed8.v.array(import_valleyed8.v.object({ message: import_valleyed8.v.string(), field: import_valleyed8.v.optional(import_valleyed8.v.string()) })), {
1313
+ pipe: import_valleyed7.v.meta(import_valleyed7.v.array(import_valleyed7.v.object({ message: import_valleyed7.v.string(), field: import_valleyed7.v.optional(import_valleyed7.v.string()) })), {
1398
1314
  $refId: `Errors.${key}Response`,
1399
1315
  description: `${key} Response`
1400
1316
  })
@@ -1551,37 +1467,37 @@ var Server = class {
1551
1467
  { key: "responseCookies", type: "response" }
1552
1468
  ];
1553
1469
  defs.forEach((def) => {
1554
- const pipe = schema[def.key] ?? import_valleyed8.v.any();
1470
+ const pipe = schema[def.key] ?? import_valleyed7.v.any();
1555
1471
  if (def.skip) return;
1556
1472
  if (def.type === "request") {
1557
1473
  requestPipeDefs[def.key] = pipe;
1558
- jsonSchema.request[def.key] = import_valleyed8.v.schema(pipe);
1474
+ jsonSchema.request[def.key] = import_valleyed7.v.schema(pipe);
1559
1475
  }
1560
1476
  if (def.type === "response") {
1561
1477
  const pipeRecords = errorsSchemas.concat({ status: defaultStatusCode, contentType, pipe });
1562
- responsePipeDefs[def.key] = import_valleyed8.v.any().pipe((input) => {
1478
+ responsePipeDefs[def.key] = import_valleyed7.v.any().pipe((input) => {
1563
1479
  const p = pipeRecords.find((rec) => rec.status === status)?.pipe;
1564
- if (!p) throw import_valleyed8.PipeError.root(`schema not defined for status code: ${status}`, input);
1565
- const r = import_valleyed8.v.validate(p, input);
1480
+ if (!p) throw import_valleyed7.PipeError.root(`schema not defined for status code: ${status}`, input);
1481
+ const r = import_valleyed7.v.validate(p, input);
1566
1482
  if (!r.valid) throw r.error;
1567
1483
  return r.value;
1568
1484
  });
1569
1485
  jsonSchema.response[def.key] = pipeRecords.map((record) => ({
1570
1486
  status: record.status,
1571
1487
  contentType: record.contentType,
1572
- schema: import_valleyed8.v.schema(record.pipe)
1488
+ schema: import_valleyed7.v.schema(record.pipe)
1573
1489
  }));
1574
1490
  }
1575
1491
  });
1576
- const requestPipe = import_valleyed8.v.object(requestPipeDefs);
1577
- import_valleyed8.v.compile(requestPipe, { allErrors: true });
1578
- const responsePipe = import_valleyed8.v.object(responsePipeDefs);
1579
- import_valleyed8.v.compile(responsePipe, { allErrors: true });
1492
+ const requestPipe = import_valleyed7.v.object(requestPipeDefs);
1493
+ import_valleyed7.v.compile(requestPipe, { allErrors: true });
1494
+ const responsePipe = import_valleyed7.v.object(responsePipeDefs);
1495
+ import_valleyed7.v.compile(responsePipe, { allErrors: true });
1580
1496
  const validateRequest = async (request) => {
1581
1497
  if (!Object.keys(requestPipeDefs)) return request;
1582
1498
  const validity = requestLocalStorage.run(
1583
1499
  request,
1584
- () => import_valleyed8.v.validate(requestPipe, {
1500
+ () => import_valleyed7.v.validate(requestPipe, {
1585
1501
  params: request.params,
1586
1502
  headers: request.headers,
1587
1503
  query: request.query,
@@ -1603,7 +1519,7 @@ var Server = class {
1603
1519
  contentType = response.contentType;
1604
1520
  const validity = responseLocalStorage.run(
1605
1521
  response,
1606
- () => import_valleyed8.v.validate(responsePipe, {
1522
+ () => import_valleyed7.v.validate(responsePipe, {
1607
1523
  responseHeaders: response.headers,
1608
1524
  responseCookies: Object.fromEntries(Object.entries(response.cookies).map(([key, val]) => [key, val.value])),
1609
1525
  response: response.body
@@ -1854,6 +1770,157 @@ var ValidationError = class extends RequestError {
1854
1770
  }
1855
1771
  };
1856
1772
 
1773
+ // src/utilities/configurable.ts
1774
+ var import_valleyed9 = require("valleyed");
1775
+ function configurable(pipeFn, base) {
1776
+ const pipe = pipeFn();
1777
+ import_valleyed9.v.compile(pipe);
1778
+ class Configurable extends base {
1779
+ constructor(config, ...baseArgs) {
1780
+ super(...baseArgs);
1781
+ this.config = config;
1782
+ }
1783
+ static create(input, ...args) {
1784
+ const r = import_valleyed9.v.validate(pipe, input);
1785
+ if (!r.valid) throw r.error;
1786
+ return new this(r.value, ...args);
1787
+ }
1788
+ }
1789
+ return Configurable;
1790
+ }
1791
+ if (void 0) {
1792
+ const { describe, test, expect, expectTypeOf } = void 0;
1793
+ const { v: v8 } = null;
1794
+ const testPipe = () => v8.object({
1795
+ host: v8.string(),
1796
+ port: v8.number()
1797
+ });
1798
+ class TestBase {
1799
+ baseValue;
1800
+ constructor() {
1801
+ this.baseValue = "base";
1802
+ }
1803
+ }
1804
+ class TestBaseWithArgs {
1805
+ label;
1806
+ constructor(label) {
1807
+ this.label = label;
1808
+ }
1809
+ }
1810
+ describe("configurable", () => {
1811
+ test("validation runs in static create before constructor body executes", () => {
1812
+ let constructorRan = false;
1813
+ const Wrapped = configurable(testPipe, TestBase);
1814
+ class MyClass extends Wrapped {
1815
+ constructor(config) {
1816
+ super(config);
1817
+ constructorRan = true;
1818
+ }
1819
+ }
1820
+ expect(() => MyClass.create({ host: 123, port: "bad" })).toThrow();
1821
+ expect(constructorRan).toBe(false);
1822
+ MyClass.create({ host: "localhost", port: 3e3 });
1823
+ expect(constructorRan).toBe(true);
1824
+ });
1825
+ test("constructor receives validated value", () => {
1826
+ const Wrapped = configurable(testPipe, TestBase);
1827
+ let receivedConfig;
1828
+ class MyClass extends Wrapped {
1829
+ constructor(config) {
1830
+ super(config);
1831
+ receivedConfig = this.config;
1832
+ }
1833
+ }
1834
+ MyClass.create({ host: "localhost", port: 3e3 });
1835
+ expect(receivedConfig).toEqual({ host: "localhost", port: 3e3 });
1836
+ });
1837
+ test("external new is a compile error", () => {
1838
+ const Wrapped = configurable(testPipe, TestBase);
1839
+ class MyClass extends Wrapped {
1840
+ constructor(config) {
1841
+ super(config);
1842
+ }
1843
+ }
1844
+ void (() => new MyClass({ host: "localhost", port: 3e3 }));
1845
+ });
1846
+ test("static Config resolves to PipeOutput<P> at the type level", () => {
1847
+ const Wrapped = configurable(testPipe, TestBase);
1848
+ class MyClass extends Wrapped {
1849
+ constructor(config) {
1850
+ super(config);
1851
+ }
1852
+ }
1853
+ expectTypeOf().toEqualTypeOf();
1854
+ expect(MyClass.create).toBeTypeOf("function");
1855
+ });
1856
+ test("ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures", () => {
1857
+ const Wrapped = configurable(testPipe, TestBase);
1858
+ class MyClass extends Wrapped {
1859
+ extra;
1860
+ constructor(config, extra) {
1861
+ super(config);
1862
+ this.extra = extra;
1863
+ }
1864
+ }
1865
+ const instance = MyClass.create({ host: "localhost", port: 3e3 }, 42);
1866
+ expect(instance.extra).toBe(42);
1867
+ expectTypeOf(instance).toHaveProperty("extra");
1868
+ expectTypeOf(instance.extra).toEqualTypeOf();
1869
+ void (() => MyClass.create({ host: "localhost", port: 3e3 }, "not-a-number"));
1870
+ });
1871
+ test("base-args forwarding works for non-zero-arg bases", () => {
1872
+ const Wrapped = configurable(testPipe, TestBaseWithArgs);
1873
+ class MyClass extends Wrapped {
1874
+ constructor(config, label) {
1875
+ super(config, label);
1876
+ }
1877
+ }
1878
+ const instance = MyClass.create({ host: "localhost", port: 3e3 }, "test-label");
1879
+ expect(instance.label).toBe("test-label");
1880
+ });
1881
+ test("config is accessible as protected readonly on instances", () => {
1882
+ const Wrapped = configurable(testPipe, TestBase);
1883
+ class MyClass extends Wrapped {
1884
+ constructor(config) {
1885
+ super(config);
1886
+ }
1887
+ getHost() {
1888
+ return this.config.host;
1889
+ }
1890
+ }
1891
+ const instance = MyClass.create({ host: "localhost", port: 3e3 });
1892
+ expect(instance.getHost()).toBe("localhost");
1893
+ });
1894
+ test("accepts an abstract base class", () => {
1895
+ class AbstractBase {
1896
+ }
1897
+ const Wrapped = configurable(testPipe, AbstractBase);
1898
+ class Concrete extends Wrapped {
1899
+ constructor(config) {
1900
+ super(config);
1901
+ }
1902
+ greet() {
1903
+ return `hello from ${this.config.host}`;
1904
+ }
1905
+ }
1906
+ const instance = Concrete.create({ host: "localhost", port: 3e3 });
1907
+ expect(instance.greet()).toBe("hello from localhost");
1908
+ expectTypeOf(instance).toHaveProperty("config");
1909
+ });
1910
+ });
1911
+ }
1912
+
1913
+ // src/utilities/media.ts
1914
+ var import_music_metadata = require("music-metadata");
1915
+ var getMediaDuration = async (buffer) => {
1916
+ try {
1917
+ const meta = await (0, import_music_metadata.parseBuffer)(buffer);
1918
+ return meta.format.duration ?? 0;
1919
+ } catch {
1920
+ return 0;
1921
+ }
1922
+ };
1923
+
1857
1924
  // src/server/adapters/fastify/index.ts
1858
1925
  var FastifyServer = class extends configurable(serverConfigPipe, Server) {
1859
1926
  #app;