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
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/configurable.ts"],"sourcesContent":["import { v, type ConditionalObjectKeys, type Pipe, type PipeInput, type PipeOutput } from 'valleyed'\n\ntype CtorParams<T> = ConstructorParameters<T & (abstract new (...args: any[]) => any)>\ntype BaseCtorParams<T> = T extends abstract new (...args: infer A) => any ? A : never\n\nexport function configurable<P extends Pipe<any, any>, Base extends abstract new (...args: any[]) => any>(pipeFn: () => P, base: Base) {\n\tconst pipe = pipeFn()\n\tv.compile(pipe)\n\n\tabstract class Configurable extends (base as unknown as new (...args: any[]) => any) {\n\t\tdeclare static readonly Config: PipeOutput<P>\n\n\t\tprotected constructor (protected readonly config: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) {\n\t\t\t// eslint-disable-next-line constructor-super\n\t\t\tsuper(...baseArgs)\n\t\t}\n\n\t\tstatic create<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype'] {\n\t\t\tconst r = v.validate(pipe, input)\n\t\t\tif (!r.valid) throw r.error\n\t\t\treturn new (this as any)(r.value, ...args) as This['prototype']\n\t\t}\n\t}\n\n\treturn Configurable as unknown as (abstract new (validated: PipeOutput<P>, ...baseArgs: BaseCtorParams<Base>) => InstanceType<Base> & { readonly config: PipeOutput<P> }) & {\n\t\treadonly Config: PipeOutput<P>\n\t\tcreate<This extends Function & { prototype: any }>(\n\t\t\tthis: This,\n\t\t\tinput: ConditionalObjectKeys<PipeInput<P>>,\n\t\t\t...args: CtorParams<This> extends [PipeOutput<P>, ...infer R] ? R : never\n\t\t): This['prototype']\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf } = import.meta.vitest\n\tconst { v } = await import('valleyed')\n\n\tconst testPipe = () =>\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.number(),\n\t\t})\n\n\ttype TestConfig = PipeOutput<ReturnType<typeof testPipe>>\n\n\tclass TestBase {\n\t\tbaseValue: string\n\t\tconstructor() {\n\t\t\tthis.baseValue = 'base'\n\t\t}\n\t}\n\n\tclass TestBaseWithArgs {\n\t\tlabel: string\n\t\tconstructor(label: string) {\n\t\t\tthis.label = label\n\t\t}\n\t}\n\n\tdescribe('configurable', () => {\n\t\ttest('validation runs in static create before constructor body executes', () => {\n\t\t\tlet constructorRan = false\n\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tconstructorRan = true\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpect(() => MyClass.create({ host: 123, port: 'bad' } as any)).toThrow()\n\t\t\texpect(constructorRan).toBe(false)\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(constructorRan).toBe(true)\n\t\t})\n\n\t\ttest('constructor receives validated value', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tlet receivedConfig: unknown\n\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\treceivedConfig = this.config\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tMyClass.create({ host: 'localhost', port: 3000 })\n\n\t\t\texpect(receivedConfig).toEqual({ host: 'localhost', port: 3000 })\n\t\t})\n\n\t\ttest('external new is a compile error', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new MyClass({ host: 'localhost', port: 3000 }))\n\t\t})\n\n\t\ttest('static Config resolves to PipeOutput<P> at the type level', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\texpectTypeOf<typeof MyClass.Config>().toEqualTypeOf<TestConfig>()\n\t\t\texpect(MyClass.create).toBeTypeOf('function')\n\t\t})\n\n\t\ttest('ConstructorParameters<This>-based extras inference works for non-zero-arg leaf signatures', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\textra: number\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, extra: number) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t\tthis.extra = extra\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 42)\n\n\t\t\texpect(instance.extra).toBe(42)\n\t\t\texpectTypeOf(instance).toHaveProperty('extra')\n\t\t\texpectTypeOf(instance.extra).toEqualTypeOf<number>()\n\n\t\t\t// @ts-expect-error — wrong extra type\n\t\t\tvoid (() => MyClass.create({ host: 'localhost', port: 3000 }, 'not-a-number'))\n\t\t})\n\n\t\ttest('base-args forwarding works for non-zero-arg bases', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBaseWithArgs)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config, label: string) {\n\t\t\t\t\tsuper(config, label)\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 }, 'test-label')\n\n\t\t\texpect(instance.label).toBe('test-label')\n\t\t})\n\n\t\ttest('config is accessible as protected readonly on instances', () => {\n\t\t\tconst Wrapped = configurable(testPipe, TestBase)\n\t\t\tclass MyClass extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof MyClass.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\n\t\t\t\tgetHost() {\n\t\t\t\t\treturn this.config.host\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = MyClass.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.getHost()).toBe('localhost')\n\t\t})\n\n\t\ttest('accepts an abstract base class', () => {\n\t\t\tabstract class AbstractBase {\n\t\t\t\tabstract greet(): string\n\t\t\t}\n\n\t\t\tconst Wrapped = configurable(testPipe, AbstractBase)\n\t\t\tclass Concrete extends Wrapped {\n\t\t\t\tprotected constructor(config: typeof Concrete.Config) {\n\t\t\t\t\tsuper(config)\n\t\t\t\t}\n\t\t\t\tgreet() {\n\t\t\t\t\treturn `hello from ${this.config.host}`\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst instance = Concrete.create({ host: 'localhost', port: 3000 })\n\t\t\texpect(instance.greet()).toBe('hello from localhost')\n\t\t\texpectTypeOf(instance).toHaveProperty('config')\n\t\t})\n\t})\n}\n"],"mappings":";AAAA,SAAS,SAAiF;AAKnF,SAAS,aAA0F,QAAiB,MAAY;AACtI,QAAM,OAAO,OAAO;AACpB,IAAE,QAAQ,IAAI;AAAA,EAEd,MAAe,qBAAsB,KAAgD;AAAA,IAG1E,YAAgC,WAA0B,UAAgC;AAEnG,YAAM,GAAG,QAAQ;AAFwB;AAAA,IAG1C;AAAA,IAEA,OAAO,OAEN,UACG,MACiB;AACpB,YAAM,IAAI,EAAE,SAAS,MAAM,KAAK;AAChC,UAAI,CAAC,EAAE,MAAO,OAAM,EAAE;AACtB,aAAO,IAAK,KAAa,EAAE,OAAO,GAAG,IAAI;AAAA,IAC1C;AAAA,EACD;AAEA,SAAO;AAQR;AAEA,IAAI,QAAoB;AACvB,QAAM,EAAE,UAAU,MAAM,QAAQ,aAAa,IAAI;AACjD,QAAM,EAAE,GAAAA,GAAE,IAAI,MAAa;AAE3B,QAAM,WAAW,MAChBA,GAAE,OAAO;AAAA,IACR,MAAMA,GAAE,OAAO;AAAA,IACf,MAAMA,GAAE,OAAO;AAAA,EAChB,CAAC;AAAA,EAIF,MAAM,SAAS;AAAA,IACd;AAAA,IACA,cAAc;AACb,WAAK,YAAY;AAAA,IAClB;AAAA,EACD;AAAA,EAEA,MAAM,iBAAiB;AAAA,IACtB;AAAA,IACA,YAAY,OAAe;AAC1B,WAAK,QAAQ;AAAA,IACd;AAAA,EACD;AAEA,WAAS,gBAAgB,MAAM;AAC9B,SAAK,qEAAqE,MAAM;AAC/E,UAAI,iBAAiB;AAErB,YAAM,UAAU,aAAa,UAAU,QAAQ;AAAA,MAC/C,MAAM,gBAAgB,QAAQ;AAAA,QACnB,YAAY,QAA+B;AACpD,gBAAM,MAAM;AACZ,2BAAiB;AAAA,QAClB;AAAA,MACD;AAEA,aAAO,MAAM,QAAQ,OAAO,EAAE,MAAM,KAAK,MAAM,MAAM,CAAQ,CAAC,EAAE,QAAQ;AACxE,aAAO,cAAc,EAAE,KAAK,KAAK;AAEjC,cAAQ,OAAO,EAAE,MAAM,aAAa,MAAM,IAAK,CAAC;AAChD,aAAO,cAAc,EAAE,KAAK,IAAI;AAAA,IACjC,CAAC;AAED,SAAK,wCAAwC,MAAM;AAClD,YAAM,UAAU,aAAa,UAAU,QAAQ;AAC/C,UAAI;AAAA,MAEJ,MAAM,gBAAgB,QAAQ;AAAA,QACnB,YAAY,QAA+B;AACpD,gBAAM,MAAM;AACZ,2BAAiB,KAAK;AAAA,QACvB;AAAA,MACD;AAEA,cAAQ,OAAO,EAAE,MAAM,aAAa,MAAM,IAAK,CAAC;AAEhD,aAAO,cAAc,EAAE,QAAQ,EAAE,MAAM,aAAa,MAAM,IAAK,CAAC;AAAA,IACjE,CAAC;AAED,SAAK,mCAAmC,MAAM;AAC7C,YAAM,UAAU,aAAa,UAAU,QAAQ;AAAA,MAC/C,MAAM,gBAAgB,QAAQ;AAAA,QACnB,YAAY,QAA+B;AACpD,gBAAM,MAAM;AAAA,QACb;AAAA,MACD;AAGA,YAAM,MAAM,IAAI,QAAQ,EAAE,MAAM,aAAa,MAAM,IAAK,CAAC;AAAA,IAC1D,CAAC;AAED,SAAK,6DAA6D,MAAM;AACvE,YAAM,UAAU,aAAa,UAAU,QAAQ;AAAA,MAC/C,MAAM,gBAAgB,QAAQ;AAAA,QACnB,YAAY,QAA+B;AACpD,gBAAM,MAAM;AAAA,QACb;AAAA,MACD;AAEA,mBAAoC,EAAE,cAA0B;AAChE,aAAO,QAAQ,MAAM,EAAE,WAAW,UAAU;AAAA,IAC7C,CAAC;AAED,SAAK,6FAA6F,MAAM;AACvG,YAAM,UAAU,aAAa,UAAU,QAAQ;AAAA,MAC/C,MAAM,gBAAgB,QAAQ;AAAA,QAC7B;AAAA,QACU,YAAY,QAA+B,OAAe;AACnE,gBAAM,MAAM;AACZ,eAAK,QAAQ;AAAA,QACd;AAAA,MACD;AAEA,YAAM,WAAW,QAAQ,OAAO,EAAE,MAAM,aAAa,MAAM,IAAK,GAAG,EAAE;AAErE,aAAO,SAAS,KAAK,EAAE,KAAK,EAAE;AAC9B,mBAAa,QAAQ,EAAE,eAAe,OAAO;AAC7C,mBAAa,SAAS,KAAK,EAAE,cAAsB;AAGnD,YAAM,MAAM,QAAQ,OAAO,EAAE,MAAM,aAAa,MAAM,IAAK,GAAG,cAAc;AAAA,IAC7E,CAAC;AAED,SAAK,qDAAqD,MAAM;AAC/D,YAAM,UAAU,aAAa,UAAU,gBAAgB;AAAA,MACvD,MAAM,gBAAgB,QAAQ;AAAA,QACnB,YAAY,QAA+B,OAAe;AACnE,gBAAM,QAAQ,KAAK;AAAA,QACpB;AAAA,MACD;AAEA,YAAM,WAAW,QAAQ,OAAO,EAAE,MAAM,aAAa,MAAM,IAAK,GAAG,YAAY;AAE/E,aAAO,SAAS,KAAK,EAAE,KAAK,YAAY;AAAA,IACzC,CAAC;AAED,SAAK,2DAA2D,MAAM;AACrE,YAAM,UAAU,aAAa,UAAU,QAAQ;AAAA,MAC/C,MAAM,gBAAgB,QAAQ;AAAA,QACnB,YAAY,QAA+B;AACpD,gBAAM,MAAM;AAAA,QACb;AAAA,QAEA,UAAU;AACT,iBAAO,KAAK,OAAO;AAAA,QACpB;AAAA,MACD;AAEA,YAAM,WAAW,QAAQ,OAAO,EAAE,MAAM,aAAa,MAAM,IAAK,CAAC;AACjE,aAAO,SAAS,QAAQ,CAAC,EAAE,KAAK,WAAW;AAAA,IAC5C,CAAC;AAED,SAAK,kCAAkC,MAAM;AAAA,MAC5C,MAAe,aAAa;AAAA,MAE5B;AAEA,YAAM,UAAU,aAAa,UAAU,YAAY;AAAA,MACnD,MAAM,iBAAiB,QAAQ;AAAA,QACpB,YAAY,QAAgC;AACrD,gBAAM,MAAM;AAAA,QACb;AAAA,QACA,QAAQ;AACP,iBAAO,cAAc,KAAK,OAAO,IAAI;AAAA,QACtC;AAAA,MACD;AAEA,YAAM,WAAW,SAAS,OAAO,EAAE,MAAM,aAAa,MAAM,IAAK,CAAC;AAClE,aAAO,SAAS,MAAM,CAAC,EAAE,KAAK,sBAAsB;AACpD,mBAAa,QAAQ,EAAE,eAAe,QAAQ;AAAA,IAC/C,CAAC;AAAA,EACF,CAAC;AACF;","names":["v"]}
@@ -1,3 +1,6 @@
1
+ import {
2
+ configurable
3
+ } from "./chunk-NEF3UYFA.mjs";
1
4
  import {
2
5
  Filter,
3
6
  FilterGroup,
@@ -11,10 +14,7 @@ import {
11
14
  PushOp,
12
15
  SetOp,
13
16
  UnsetOp
14
- } from "./chunk-3TP7NINX.mjs";
15
- import {
16
- configurable
17
- } from "./chunk-A4P7P6BU.mjs";
17
+ } from "./chunk-XESM7IWM.mjs";
18
18
 
19
19
  // src/orm/adapters/in-memory/index.ts
20
20
  import { AsyncLocalStorage } from "async_hooks";
@@ -792,4 +792,4 @@ if (void 0) {
792
792
  export {
793
793
  InMemoryAdapter
794
794
  };
795
- //# sourceMappingURL=chunk-TSVHZZE4.mjs.map
795
+ //# sourceMappingURL=chunk-RFJ5URMP.mjs.map
@@ -0,0 +1,2 @@
1
+ import{c as d,e as g}from "./chunk-SPOVKWV3.min.mjs";import{a as l}from "./chunk-CU2HU5UE.min.mjs";import{C as e,a as u}from "./chunk-N3OD4QL2.min.mjs";import{a as f}from "./chunk-DSUJ5FUL.min.mjs";import{KafkaJS as h}from"@confluentinc/kafka-javascript";import{v as t}from"valleyed";var y=()=>t.meta(t.object({brokers:t.array(t.string()),ssl:t.optional(t.boolean()),sasl:t.optional(t.object({mechanism:t.is("plain"),username:t.string(),password:t.string()})),clientId:t.optional(t.string())}),{title:"Kafka Config",$refId:"KafkaConfig"}),k=class p extends l(y,f){#t;#a=null;constructor(a){super(a),this.#t=new h.Kafka({kafkaJS:{...a,logLevel:h.logLevel.NOTHING}})}async#e(){return this.#a||(this.#a=(async()=>{let a=this.#t.admin();return await a.connect(),a})()),this.#a}async#s(a){await(await this.#e()).createTopics({topics:[{topic:a}],timeout:5e3})}async#n(a){await(await this.#e()).deleteGroups([a]).catch(()=>{})}stream(a,s={}){let n=s.skipScope?a:e.get().getScopedName(a);return{publish:async o=>{let i=this.#t.producer();return await i.connect(),await i.send({topic:n,messages:[{value:JSON.stringify(o)}]}),!0},subscribe:o=>{let i=async()=>{await this.#s(n);let c=s.fanout?e.get().getScopedName(`${e.get().id}-fanout-${g.string(10)}`):n,r=this.#t.consumer({kafkaJS:{groupId:c}});await r.connect(),await r.subscribe({topic:n}),await r.run({eachMessage:async({message:m})=>{await e.resolveBeforeCrash(async()=>{m.value&&await o(d(m.value.toString()))}).catch(w=>e.crash(new u("Error processing kafka event",{topic:n,groupId:c,options:s},w)))}}),s.fanout&&e.on("close",async()=>{await r.disconnect(),await this.#n(c)},{class:p})};e.on("start",i,{class:p})}}}};export{y as a,k as b};
2
+ //# sourceMappingURL=chunk-RX4XPABH.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/events/adapters/kafka/index.ts"],"sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { Events } from '../../../types'\nimport { Random, configurable, parseJSONValue } from '../../../utilities'\nimport { EventBus, type Stream, type StreamOptions } from '../base'\n\nexport const kafkaConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\tbrokers: v.array(v.string()),\n\t\t\tssl: v.optional(v.boolean()),\n\t\t\tsasl: v.optional(\n\t\t\t\tv.object({\n\t\t\t\t\tmechanism: v.is('plain' as const),\n\t\t\t\t\tusername: v.string(),\n\t\t\t\t\tpassword: v.string(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tclientId: v.optional(v.string()),\n\t\t}),\n\t\t{ title: 'Kafka Config', $refId: 'KafkaConfig' },\n\t)\n\nexport class KafkaEventBus extends configurable(kafkaConfigPipe, EventBus) {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | null = null\n\n\tprotected constructor(config: typeof KafkaEventBus.Config) {\n\t\tsuper(config)\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\n\t\t})\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin)\n\t\t\tthis.#admin = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n\n\tstream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}): Stream<Event['data']> {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data) => {\n\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tsubscribe: (onMessage) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on('close', async () => {\n\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t}, { class: KafkaEventBus })\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, { class: KafkaEventBus })\n\t\t\t},\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["KafkaJS","v","kafkaConfigPipe","v","KafkaEventBus","_KafkaEventBus","configurable","EventBus","#client","#admin","config","KafkaJS","#getAdmin","admin","#createTopic","topic","#deleteGroup","groupId","topicName","options","Instance","data","producer","onMessage","subscribe","random_exports","consumer","message","parseJSONValue","error","EquippedError"]}
1
+ {"version":3,"sources":["../../src/events/adapters/kafka/index.ts"],"sourcesContent":["import { KafkaJS } from '@confluentinc/kafka-javascript'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { Events } from '../../../types'\nimport { Random, configurable, parseJSONValue } from '../../../utilities'\nimport { EventBus, type Stream, type StreamOptions } from '../base'\n\nexport const kafkaConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\tbrokers: v.array(v.string()),\n\t\t\tssl: v.optional(v.boolean()),\n\t\t\tsasl: v.optional(\n\t\t\t\tv.object({\n\t\t\t\t\tmechanism: v.is('plain' as const),\n\t\t\t\t\tusername: v.string(),\n\t\t\t\t\tpassword: v.string(),\n\t\t\t\t}),\n\t\t\t),\n\t\t\tclientId: v.optional(v.string()),\n\t\t}),\n\t\t{ title: 'Kafka Config', $refId: 'KafkaConfig' },\n\t)\n\nexport class KafkaEventBus extends configurable(kafkaConfigPipe, EventBus) {\n\t#client: KafkaJS.Kafka\n\t#admin: Promise<KafkaJS.Admin> | null = null\n\n\tprotected constructor(config: typeof KafkaEventBus.Config) {\n\t\tsuper(config)\n\t\tthis.#client = new KafkaJS.Kafka({\n\t\t\tkafkaJS: { ...config, logLevel: KafkaJS.logLevel.NOTHING },\n\t\t})\n\t}\n\n\tasync #getAdmin() {\n\t\tif (!this.#admin)\n\t\t\tthis.#admin = (async () => {\n\t\t\t\tconst admin = this.#client.admin()\n\t\t\t\tawait admin.connect()\n\t\t\t\treturn admin\n\t\t\t})()\n\t\treturn this.#admin\n\t}\n\n\tasync #createTopic(topic: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.createTopics({ topics: [{ topic }], timeout: 5000 })\n\t}\n\n\tasync #deleteGroup(groupId: string) {\n\t\tconst admin = await this.#getAdmin()\n\t\tawait admin.deleteGroups([groupId]).catch(() => {})\n\t}\n\n\tstream<Event extends Events[keyof Events]>(topicName: Event['topic'], options: Partial<StreamOptions> = {}): Stream<Event['data']> {\n\t\tconst topic = options.skipScope ? topicName : Instance.get().getScopedName(topicName)\n\t\treturn {\n\t\t\tpublish: async (data) => {\n\t\t\t\tconst producer = this.#client.producer()\n\t\t\t\tawait producer.connect()\n\t\t\t\tawait producer.send({\n\t\t\t\t\ttopic,\n\t\t\t\t\tmessages: [{ value: JSON.stringify(data) }],\n\t\t\t\t})\n\t\t\t\treturn true\n\t\t\t},\n\t\t\tsubscribe: (onMessage) => {\n\t\t\t\tconst subscribe = async () => {\n\t\t\t\t\tawait this.#createTopic(topic)\n\t\t\t\t\tconst groupId = options.fanout\n\t\t\t\t\t\t? Instance.get().getScopedName(`${Instance.get().id}-fanout-${Random.string(10)}`)\n\t\t\t\t\t\t: topic\n\t\t\t\t\tconst consumer = this.#client.consumer({ kafkaJS: { groupId } })\n\n\t\t\t\t\tawait consumer.connect()\n\t\t\t\t\tawait consumer.subscribe({ topic })\n\n\t\t\t\t\tawait consumer.run({\n\t\t\t\t\t\teachMessage: async ({ message }) => {\n\t\t\t\t\t\t\tawait Instance.resolveBeforeCrash(async () => {\n\t\t\t\t\t\t\t\tif (!message.value) return\n\t\t\t\t\t\t\t\tawait onMessage(parseJSONValue(message.value.toString()))\n\t\t\t\t\t\t\t}).catch((error) =>\n\t\t\t\t\t\t\t\tInstance.crash(new EquippedError('Error processing kafka event', { topic, groupId, options }, error)),\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t},\n\t\t\t\t\t})\n\n\t\t\t\t\tif (options.fanout)\n\t\t\t\t\t\tInstance.on('close', async () => {\n\t\t\t\t\t\t\tawait consumer.disconnect()\n\t\t\t\t\t\t\tawait this.#deleteGroup(groupId)\n\t\t\t\t\t\t}, { class: KafkaEventBus })\n\t\t\t\t}\n\t\t\t\tInstance.on('start', subscribe, { class: KafkaEventBus })\n\t\t\t},\n\t\t}\n\t}\n}\n"],"mappings":"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","names":["KafkaJS","v","kafkaConfigPipe","v","KafkaEventBus","_KafkaEventBus","configurable","EventBus","#client","#admin","config","KafkaJS","#getAdmin","admin","#createTopic","topic","#deleteGroup","groupId","topicName","options","Instance","data","producer","onMessage","subscribe","random_exports","consumer","message","parseJSONValue","error","EquippedError"]}
@@ -0,0 +1,2 @@
1
+ import{C as u,a as n}from "./chunk-N3OD4QL2.min.mjs";import{a as m}from "./chunk-AQY7QVYI.min.mjs";var f={};m(f,{signinWithApple:()=>b,signinWithFacebook:()=>_,signinWithGoogle:()=>x});import g from"axios";import p from"jsonwebtoken";import d from"jwks-rsa";var x=async t=>{let r=`https://oauth2.googleapis.com/tokeninfo?id_token=${t}`,{data:e}=await g.get(r).catch(i=>{throw new n("Failed to sign in with google",{idToken:t},i)});return e.first_name=e.given_name,e.last_name=e.family_name,e},b=async t=>{try{let r="https://appleid.apple.com",e=p.decode(t,{complete:!0});if(!e?.header)throw new n("Missing JWT header",{idToken:t,json:e});let{kid:i,alg:a}=e.header,c=await d({jwksUri:`${r}/auth/keys`,cache:!0}).getSigningKey(i).then(y=>y.getPublicKey()).catch(()=>null);if(!c)throw new n("no publicKey",{idToken:t,publicKey:c,json:e});let o=p.verify(t,c,{algorithms:[a]});if(!o)throw new n("no data",{idToken:t,data:o});if(o.iss!==r)throw new n("iss doesnt match",{idToken:t,data:o});if(o.exp*1e3<Date.now())throw new n("expired idToken",{idToken:t,data:o});return o}catch(r){throw new n("Failed to sign in with apple",{idToken:t},r)}},_=async(t,r=[])=>{r=[...new Set([...r,"name","picture","email"])];let{data:e}=await g.request({method:"get",url:"https://graph.facebook.com/v15.0/me",params:{fields:r.join(","),access_token:t}}).catch(a=>{throw new n("Failed to sign in with facebook",{accessToken:t,fields:r},a)});if(!r.every(a=>a in e))throw new n("Incomplete scope for access token",{accessToken:t,fields:r,data:e});return e.email_verified="true",e};var h={};m(h,{compare:()=>S,hash:()=>v});import*as s from"bcryptjs";var v=async t=>(t=t.trim(),t?await s.hash(t,u.get().settings.utils.hashSaltRounds):""),S=async(t,r)=>(t=t.trim(),!t&&t===r?!0:await s.compare(t,r));var J=t=>{try{return t?.constructor?.name!=="String"?t:JSON.parse(t)}catch{return t}};import{parseBuffer as E}from"music-metadata";var k=async t=>{try{return(await E(t)).format.duration??0}catch{return 0}};var w={};m(w,{number:()=>j,string:()=>R});import l from"crypto";function R(t=20){return l.randomBytes(t).toString("hex").slice(0,t)}function j(t=0,r=2**48-1){return l.randomInt(t,r)}var A=t=>new Promise(r=>setTimeout(r,t)),B=async(t,r,e)=>{if(r<=0)throw new n("out of tries",{tries:r,waitTimeInMs:e});let i=await t();return i.done===!0?i.value:(await A(e),await B(t,r-1,e))};export{f as a,h as b,J as c,k as d,w as e,A as f,B as g};
2
+ //# sourceMappingURL=chunk-SPOVKWV3.min.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utilities/authProviders.ts","../../src/utilities/hash.ts","../../src/utilities/json.ts","../../src/utilities/media.ts","../../src/utilities/random.ts","../../src/utilities/retry.ts"],"sourcesContent":["import axios from 'axios'\nimport jwt from 'jsonwebtoken'\nimport jwksClient from 'jwks-rsa'\n\nimport { EquippedError } from '../errors'\n\nexport const signinWithGoogle = async (idToken: string) => {\n\tconst authUrl = `https://oauth2.googleapis.com/tokeninfo?id_token=${idToken}`\n\tconst { data } = await axios.get(authUrl).catch((err) => {\n\t\tthrow new EquippedError('Failed to sign in with google', { idToken }, err)\n\t})\n\tdata.first_name = data.given_name\n\tdata.last_name = data.family_name\n\treturn data as {\n\t\temail: string\n\t\temail_verified: 'true' | 'false'\n\t\tfirst_name: string\n\t\tlast_name: string\n\t\tpicture: string\n\t\tsub: string\n\t} & Record<string, any>\n}\n\nexport const signinWithApple = async (idToken: string) => {\n\ttry {\n\t\tconst APPLE_BASE = 'https://appleid.apple.com'\n\t\tconst json = jwt.decode(idToken, { complete: true })\n\t\tif (!json?.header) throw new EquippedError('Missing JWT header', { idToken, json })\n\t\tconst { kid, alg } = json.header\n\t\tconst publicKey = await jwksClient({ jwksUri: `${APPLE_BASE}/auth/keys`, cache: true })\n\t\t\t.getSigningKey(kid)\n\t\t\t.then((key) => key.getPublicKey())\n\t\t\t.catch(() => null)\n\t\tif (!publicKey) throw new EquippedError('no publicKey', { idToken, publicKey, json })\n\t\tconst data = jwt.verify(idToken, publicKey, { algorithms: [alg as any] }) as Record<string, any>\n\t\tif (!data) throw new EquippedError('no data', { idToken, data })\n\t\tif (data.iss !== APPLE_BASE) throw new EquippedError('iss doesnt match', { idToken, data })\n\t\tif (data.exp * 1000 < Date.now()) throw new EquippedError('expired idToken', { idToken, data })\n\t\t// TODO: Find out how to get profile data from api\n\t\treturn data as {\n\t\t\temail?: string\n\t\t\tsub: string\n\t\t\temail_verified?: 'true' | 'false'\n\t\t\tis_private_email?: 'true' | 'false'\n\t\t} & Record<string, any>\n\t} catch (err) {\n\t\tthrow new EquippedError('Failed to sign in with apple', { idToken }, err)\n\t}\n}\n\nexport const signinWithFacebook = async (accessToken: string, fields = [] as string[]) => {\n\tfields = [...new Set([...fields, 'name', 'picture', 'email'])]\n\tconst { data } = await axios\n\t\t.request({\n\t\t\tmethod: 'get',\n\t\t\turl: 'https://graph.facebook.com/v15.0/me',\n\t\t\tparams: {\n\t\t\t\tfields: fields.join(','),\n\t\t\t\taccess_token: accessToken,\n\t\t\t},\n\t\t})\n\t\t.catch((err) => {\n\t\t\tthrow new EquippedError('Failed to sign in with facebook', { accessToken, fields }, err)\n\t\t})\n\tconst isValidData = fields.every((key) => key in data)\n\tif (!isValidData) throw new EquippedError('Incomplete scope for access token', { accessToken, fields, data })\n\tdata.email_verified = 'true'\n\treturn data as {\n\t\tid: string\n\t\temail: string\n\t\temail_verified: 'true' | 'false'\n\t\tname: string\n\t\tpicture: {\n\t\t\tdata: { height: number; is_silhouette: boolean; url: string; width: number }\n\t\t}\n\t} & Record<string, any>\n}\n","import * as bcrypt from 'bcryptjs'\n\nimport { Instance } from '../instance'\n\nexport const hash = async (password: string) => {\n\tpassword = password.trim()\n\tif (!password) return ''\n\treturn await bcrypt.hash(password, Instance.get().settings.utils.hashSaltRounds)\n}\n\nexport const compare = async (plainPassword: string, hashed: string) => {\n\tplainPassword = plainPassword.trim()\n\tif (!plainPassword && plainPassword === hashed) return true\n\treturn await bcrypt.compare(plainPassword, hashed)\n}\n","export const parseJSONValue = (data: any) => {\n\ttry {\n\t\tif (data?.constructor?.name !== 'String') return data\n\t\treturn JSON.parse(data)\n\t} catch {\n\t\treturn data\n\t}\n}\n","import { parseBuffer } from 'music-metadata'\n\nexport const getMediaDuration = async (buffer: Buffer) => {\n\ttry {\n\t\tconst meta = await parseBuffer(buffer)\n\t\treturn meta.format.duration ?? 0\n\t} catch {\n\t\treturn 0\n\t}\n}\n","import crypto from 'crypto'\n\nexport function string(length = 20) {\n\treturn crypto.randomBytes(length).toString('hex').slice(0, length)\n}\n\nexport function number(min = 0, max = 2 ** 48 - 1) {\n\treturn crypto.randomInt(min, max)\n}\n","import { EquippedError } from '../errors'\n\nexport const sleep = (ms: number): Promise<void> => new Promise((resolve) => setTimeout(resolve, ms))\n\nexport const retry = async <T>(cb: () => Promise<{ done: true; value: T } | { done: false }>, tries: number, waitTimeInMs: number) => {\n\tif (tries <= 0) throw new EquippedError('out of tries', { tries, waitTimeInMs })\n\tconst result = await cb()\n\tif (result.done === true) return result.value\n\tawait sleep(waitTimeInMs)\n\treturn await retry(cb, tries - 1, waitTimeInMs)\n}\n"],"mappings":"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","names":["authProviders_exports","__export","signinWithApple","signinWithFacebook","signinWithGoogle","axios","jwt","jwksClient","signinWithGoogle","idToken","authUrl","data","axios","err","EquippedError","signinWithApple","APPLE_BASE","json","jwt","kid","alg","publicKey","jwksClient","key","signinWithFacebook","accessToken","fields","hash_exports","__export","compare","hash","bcrypt","hash","password","Instance","compare","plainPassword","hashed","parseJSONValue","data","parseBuffer","getMediaDuration","buffer","random_exports","__export","number","string","crypto","length","min","max","sleep","ms","resolve","retry","cb","tries","waitTimeInMs","EquippedError","result"]}
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  EquippedError,
3
3
  Instance
4
- } from "./chunk-A4P7P6BU.mjs";
4
+ } from "./chunk-7N4WUZ7P.mjs";
5
5
 
6
6
  // src/orm/errors/validation.ts
7
7
  var OrmValidationError = class extends EquippedError {
@@ -1277,4 +1277,4 @@ export {
1277
1277
  opTouchedFields,
1278
1278
  flattenOps
1279
1279
  };
1280
- //# sourceMappingURL=chunk-3TP7NINX.mjs.map
1280
+ //# sourceMappingURL=chunk-XESM7IWM.mjs.map
@@ -1,11 +1,13 @@
1
1
  import {
2
2
  Cache
3
- } from "./chunk-LKS5ZE45.mjs";
3
+ } from "./chunk-74GY55PM.mjs";
4
4
  import {
5
- EquippedError,
6
- Instance,
7
5
  configurable
8
- } from "./chunk-A4P7P6BU.mjs";
6
+ } from "./chunk-NEF3UYFA.mjs";
7
+ import {
8
+ EquippedError,
9
+ Instance
10
+ } from "./chunk-7N4WUZ7P.mjs";
9
11
 
10
12
  // src/cache/adapters/redis/index.ts
11
13
  import { Cluster, Redis } from "ioredis";
@@ -110,4 +112,4 @@ export {
110
112
  redisConfigPipe,
111
113
  RedisCache
112
114
  };
113
- //# sourceMappingURL=chunk-5PZACGPI.mjs.map
115
+ //# sourceMappingURL=chunk-XJKBHQWO.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cache/adapters/redis/index.ts"],"sourcesContent":["import { Cluster, Redis, type RedisOptions } from 'ioredis'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable } from '../../../utilities'\nimport { Cache } from '../base'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport class RedisCache extends configurable(redisConfigPipe, Cache) {\n\t#client: Cluster | Redis\n\n\tprotected constructor(config: typeof RedisCache.Config, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper(config)\n\t\tconst node = {\n\t\t\t...(config.host ? { host: config.host } : {}),\n\t\t\t...(config.port ? { port: config.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(config.password ? { password: config.password } : {}),\n\t\t\t...(config.username ? { username: config.username } : {}),\n\t\t\t...(config.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.#client = config.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.#client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.#client.connect(), { class: RedisCache })\n\t\tInstance.on('close', async () => this.#client.quit(), { class: RedisCache })\n\t}\n\n\tget connectionOptions() {\n\t\treturn this.#client.options\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.#client.del(this.getScopedKey(key))\n\t}\n\tasync get(key: string) {\n\t\treturn await this.#client.get(this.getScopedKey(key))\n\t}\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.#client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.#client.set(this.getScopedKey(key), data)\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf, vi, beforeEach, afterEach } = import.meta.vitest\n\ttype PipeOutput<T> = import('valleyed').PipeOutput<T>\n\n\tlet hookCalls: Array<{ event: string; options?: any }>\n\n\tbeforeEach(() => {\n\t\thookCalls = []\n\t\tvi.spyOn(Instance, 'on').mockImplementation((event, _cb, options) => {\n\t\t\thookCalls.push({ event, options })\n\t\t})\n\t\tvi.spyOn(Instance, 'get').mockReturnValue({ getScopedName: (_name: string, _sep: string) => `test:${_name}` } as any)\n\t})\n\n\tafterEach(() => {\n\t\tvi.restoreAllMocks()\n\t})\n\n\tdescribe('RedisCache', () => {\n\t\ttest('create() produces a working instance', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost' })\n\t\t\texpect(cache).toBeInstanceOf(RedisCache)\n\t\t})\n\n\t\ttest('new RedisCache() is a compile error', () => {\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new RedisCache({ host: 'localhost' }))\n\t\t})\n\n\t\ttest('Instance.on calls use { class: RedisCache }', () => {\n\t\t\tRedisCache.create({ host: 'localhost' })\n\t\t\tconst startHook = hookCalls.find((h) => h.event === 'start')\n\t\t\tconst closeHook = hookCalls.find((h) => h.event === 'close')\n\t\t\texpect(startHook?.options).toEqual({ class: RedisCache })\n\t\t\texpect(closeHook?.options).toEqual({ class: RedisCache })\n\t\t})\n\n\t\ttest('skips start hook when extraConfig is provided', () => {\n\t\t\tRedisCache.create({ host: 'localhost' }, { maxRetriesPerRequest: null })\n\t\t\tconst startHooks = hookCalls.filter((h) => h.event === 'start')\n\t\t\tconst closeHooks = hookCalls.filter((h) => h.event === 'close')\n\t\t\texpect(startHooks).toHaveLength(0)\n\t\t\texpect(closeHooks).toHaveLength(1)\n\t\t})\n\n\t\ttest('Config type matches pipe output', () => {\n\t\t\ttype Expected = PipeOutput<ReturnType<typeof redisConfigPipe>>\n\t\t\texpectTypeOf<typeof RedisCache.Config>().toEqualTypeOf<Expected>()\n\t\t})\n\n\t\ttest('connectionOptions is accessible', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost', port: 6379 })\n\t\t\texpect(cache.connectionOptions).toBeDefined()\n\t\t})\n\t})\n}\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../src/cache/adapters/redis/index.ts"],"sourcesContent":["import { Cluster, Redis, type RedisOptions } from 'ioredis'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable } from '../../../utilities'\nimport { Cache } from '../base'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport class RedisCache extends configurable(redisConfigPipe, Cache) {\n\t#client: Cluster | Redis\n\n\tprotected constructor(config: typeof RedisCache.Config, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper(config)\n\t\tconst node = {\n\t\t\t...(config.host ? { host: config.host } : {}),\n\t\t\t...(config.port ? { port: config.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(config.password ? { password: config.password } : {}),\n\t\t\t...(config.username ? { username: config.username } : {}),\n\t\t\t...(config.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.#client = config.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.#client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.#client.connect(), { class: RedisCache })\n\t\tInstance.on('close', async () => this.#client.quit(), { class: RedisCache })\n\t}\n\n\tget connectionOptions() {\n\t\treturn this.#client.options\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.#client.del(this.getScopedKey(key))\n\t}\n\tasync get(key: string) {\n\t\treturn await this.#client.get(this.getScopedKey(key))\n\t}\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.#client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.#client.set(this.getScopedKey(key), data)\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf, vi, beforeEach, afterEach } = import.meta.vitest\n\ttype PipeOutput<T> = import('valleyed').PipeOutput<T>\n\n\tlet hookCalls: Array<{ event: string; options?: any }>\n\n\tbeforeEach(() => {\n\t\thookCalls = []\n\t\tvi.spyOn(Instance, 'on').mockImplementation((event, _cb, options) => {\n\t\t\thookCalls.push({ event, options })\n\t\t})\n\t\tvi.spyOn(Instance, 'get').mockReturnValue({ getScopedName: (_name: string, _sep: string) => `test:${_name}` } as any)\n\t})\n\n\tafterEach(() => {\n\t\tvi.restoreAllMocks()\n\t})\n\n\tdescribe('RedisCache', () => {\n\t\ttest('create() produces a working instance', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost' })\n\t\t\texpect(cache).toBeInstanceOf(RedisCache)\n\t\t})\n\n\t\ttest('new RedisCache() is a compile error', () => {\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new RedisCache({ host: 'localhost' }))\n\t\t})\n\n\t\ttest('Instance.on calls use { class: RedisCache }', () => {\n\t\t\tRedisCache.create({ host: 'localhost' })\n\t\t\tconst startHook = hookCalls.find((h) => h.event === 'start')\n\t\t\tconst closeHook = hookCalls.find((h) => h.event === 'close')\n\t\t\texpect(startHook?.options).toEqual({ class: RedisCache })\n\t\t\texpect(closeHook?.options).toEqual({ class: RedisCache })\n\t\t})\n\n\t\ttest('skips start hook when extraConfig is provided', () => {\n\t\t\tRedisCache.create({ host: 'localhost' }, { maxRetriesPerRequest: null })\n\t\t\tconst startHooks = hookCalls.filter((h) => h.event === 'start')\n\t\t\tconst closeHooks = hookCalls.filter((h) => h.event === 'close')\n\t\t\texpect(startHooks).toHaveLength(0)\n\t\t\texpect(closeHooks).toHaveLength(1)\n\t\t})\n\n\t\ttest('Config type matches pipe output', () => {\n\t\t\ttype Expected = PipeOutput<ReturnType<typeof redisConfigPipe>>\n\t\t\texpectTypeOf<typeof RedisCache.Config>().toEqualTypeOf<Expected>()\n\t\t})\n\n\t\ttest('connectionOptions is accessible', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost', port: 6379 })\n\t\t\texpect(cache.connectionOptions).toBeDefined()\n\t\t})\n\t})\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,2 @@
1
+ import{a as r}from "./chunk-5FEVQT6K.min.mjs";import{a as p}from "./chunk-CU2HU5UE.min.mjs";import{C as n,a as c}from "./chunk-N3OD4QL2.min.mjs";import{Cluster as d,Redis as u}from"ioredis";import{v as t}from"valleyed";var m=()=>t.meta(t.object({host:t.string(),port:t.optional(t.number()),password:t.optional(t.string()),username:t.optional(t.string()),tls:t.optional(t.boolean()),cluster:t.optional(t.boolean())}),{title:"Redis Config",$refId:"RedisConfig"}),l=class a extends p(m,r){#e;constructor(e,s){super(e);let o={...e.host?{host:e.host}:{},...e.port?{port:e.port}:{}},i={...s,...e.password?{password:e.password}:{},...e.username?{username:e.username}:{},...e.tls?{tls:{}}:{},lazyConnect:!0};this.#e=e.cluster?new d([o],{...s,redisOptions:i,lazyConnect:!0}):new u({...i,...o}),this.#e.on("error",async h=>{n.crash(new c("Redis failed with error",{},h))}),s||n.on("start",async()=>this.#e.connect(),{class:a}),n.on("close",async()=>this.#e.quit(),{class:a})}get connectionOptions(){return this.#e.options}async delete(e){await this.#e.del(this.getScopedKey(e))}async get(e){return await this.#e.get(this.getScopedKey(e))}async set(e,s,o){o?await this.#e.setex(this.getScopedKey(e),o,s):this.#e.set(this.getScopedKey(e),s)}};export{m as a,l as b};
2
+ //# sourceMappingURL=chunk-YC6V4HLT.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/cache/adapters/redis/index.ts"],"sourcesContent":["import { Cluster, Redis, type RedisOptions } from 'ioredis'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable } from '../../../utilities'\nimport { Cache } from '../base'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport class RedisCache extends configurable(redisConfigPipe, Cache) {\n\t#client: Cluster | Redis\n\n\tprotected constructor(config: typeof RedisCache.Config, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper(config)\n\t\tconst node = {\n\t\t\t...(config.host ? { host: config.host } : {}),\n\t\t\t...(config.port ? { port: config.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(config.password ? { password: config.password } : {}),\n\t\t\t...(config.username ? { username: config.username } : {}),\n\t\t\t...(config.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.#client = config.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.#client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.#client.connect(), { class: RedisCache })\n\t\tInstance.on('close', async () => this.#client.quit(), { class: RedisCache })\n\t}\n\n\tget connectionOptions() {\n\t\treturn this.#client.options\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.#client.del(this.getScopedKey(key))\n\t}\n\tasync get(key: string) {\n\t\treturn await this.#client.get(this.getScopedKey(key))\n\t}\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.#client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.#client.set(this.getScopedKey(key), data)\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf, vi, beforeEach, afterEach } = import.meta.vitest\n\ttype PipeOutput<T> = import('valleyed').PipeOutput<T>\n\n\tlet hookCalls: Array<{ event: string; options?: any }>\n\n\tbeforeEach(() => {\n\t\thookCalls = []\n\t\tvi.spyOn(Instance, 'on').mockImplementation((event, _cb, options) => {\n\t\t\thookCalls.push({ event, options })\n\t\t})\n\t\tvi.spyOn(Instance, 'get').mockReturnValue({ getScopedName: (_name: string, _sep: string) => `test:${_name}` } as any)\n\t})\n\n\tafterEach(() => {\n\t\tvi.restoreAllMocks()\n\t})\n\n\tdescribe('RedisCache', () => {\n\t\ttest('create() produces a working instance', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost' })\n\t\t\texpect(cache).toBeInstanceOf(RedisCache)\n\t\t})\n\n\t\ttest('new RedisCache() is a compile error', () => {\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new RedisCache({ host: 'localhost' }))\n\t\t})\n\n\t\ttest('Instance.on calls use { class: RedisCache }', () => {\n\t\t\tRedisCache.create({ host: 'localhost' })\n\t\t\tconst startHook = hookCalls.find((h) => h.event === 'start')\n\t\t\tconst closeHook = hookCalls.find((h) => h.event === 'close')\n\t\t\texpect(startHook?.options).toEqual({ class: RedisCache })\n\t\t\texpect(closeHook?.options).toEqual({ class: RedisCache })\n\t\t})\n\n\t\ttest('skips start hook when extraConfig is provided', () => {\n\t\t\tRedisCache.create({ host: 'localhost' }, { maxRetriesPerRequest: null })\n\t\t\tconst startHooks = hookCalls.filter((h) => h.event === 'start')\n\t\t\tconst closeHooks = hookCalls.filter((h) => h.event === 'close')\n\t\t\texpect(startHooks).toHaveLength(0)\n\t\t\texpect(closeHooks).toHaveLength(1)\n\t\t})\n\n\t\ttest('Config type matches pipe output', () => {\n\t\t\ttype Expected = PipeOutput<ReturnType<typeof redisConfigPipe>>\n\t\t\texpectTypeOf<typeof RedisCache.Config>().toEqualTypeOf<Expected>()\n\t\t})\n\n\t\ttest('connectionOptions is accessible', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost', port: 6379 })\n\t\t\texpect(cache.connectionOptions).toBeDefined()\n\t\t})\n\t})\n}\n"],"mappings":"wGAAA,OAAS,WAAAA,EAAS,SAAAC,MAAgC,UAClD,OAAS,KAAAC,MAAS,WAOX,IAAMC,EAAkB,IAC9BC,EAAE,KACDA,EAAE,OAAO,CACR,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC3B,SAAUA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC/B,SAAUA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC/B,IAAKA,EAAE,SAASA,EAAE,QAAQ,CAAC,EAC3B,QAASA,EAAE,SAASA,EAAE,QAAQ,CAAC,CAChC,CAAC,EACD,CAAE,MAAO,eAAgB,OAAQ,aAAc,CAChD,EAEYC,EAAN,MAAMC,UAAmBC,EAAaJ,EAAiBK,CAAK,CAAE,CACpEC,GAEU,YAAYC,EAAkCC,EAAqC,CAC5F,MAAMD,CAAM,EACZ,IAAME,EAAO,CACZ,GAAIF,EAAO,KAAO,CAAE,KAAMA,EAAO,IAAK,EAAI,CAAC,EAC3C,GAAIA,EAAO,KAAO,CAAE,KAAMA,EAAO,IAAK,EAAI,CAAC,CAC5C,EACMG,EAAS,CACd,GAAGF,EACH,GAAID,EAAO,SAAW,CAAE,SAAUA,EAAO,QAAS,EAAI,CAAC,EACvD,GAAIA,EAAO,SAAW,CAAE,SAAUA,EAAO,QAAS,EAAI,CAAC,EACvD,GAAIA,EAAO,IAAM,CAAE,IAAK,CAAC,CAAE,EAAI,CAAC,EAChC,YAAa,EACd,EACA,KAAKD,GAAUC,EAAO,QACnB,IAAII,EAAQ,CAACF,CAAI,EAAG,CACpB,GAAGD,EACH,aAAcE,EACd,YAAa,EACd,CAAC,EACA,IAAIE,EAAM,CAAE,GAAGF,EAAQ,GAAGD,CAAK,CAAC,EACnC,KAAKH,GAAQ,GAAG,QAAS,MAAOO,GAAU,CACzCC,EAAS,MAAM,IAAIC,EAAc,0BAA2B,CAAC,EAAGF,CAAK,CAAC,CACvE,CAAC,EACIL,GAAaM,EAAS,GAAG,QAAS,SAAY,KAAKR,GAAQ,QAAQ,EAAG,CAAE,MAAOH,CAAW,CAAC,EAChGW,EAAS,GAAG,QAAS,SAAY,KAAKR,GAAQ,KAAK,EAAG,CAAE,MAAOH,CAAW,CAAC,CAC5E,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAKG,GAAQ,OACrB,CAEA,MAAM,OAAOU,EAAa,CACzB,MAAM,KAAKV,GAAQ,IAAI,KAAK,aAAaU,CAAG,CAAC,CAC9C,CACA,MAAM,IAAIA,EAAa,CACtB,OAAO,MAAM,KAAKV,GAAQ,IAAI,KAAK,aAAaU,CAAG,CAAC,CACrD,CACA,MAAM,IAAIA,EAAaC,EAAcC,EAAoB,CACpDA,EAAW,MAAM,KAAKZ,GAAQ,MAAM,KAAK,aAAaU,CAAG,EAAGE,EAAWD,CAAI,EAC1E,KAAKX,GAAQ,IAAI,KAAK,aAAaU,CAAG,EAAGC,CAAI,CACnD,CACD","names":["Cluster","Redis","v","redisConfigPipe","v","RedisCache","_RedisCache","configurable","Cache","#client","config","extraConfig","node","common","Cluster","Redis","error","Instance","EquippedError","key","data","ttlInSecs"]}
1
+ {"version":3,"sources":["../../src/cache/adapters/redis/index.ts"],"sourcesContent":["import { Cluster, Redis, type RedisOptions } from 'ioredis'\nimport { v } from 'valleyed'\n\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { configurable } from '../../../utilities'\nimport { Cache } from '../base'\n\nexport const redisConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\thost: v.string(),\n\t\t\tport: v.optional(v.number()),\n\t\t\tpassword: v.optional(v.string()),\n\t\t\tusername: v.optional(v.string()),\n\t\t\ttls: v.optional(v.boolean()),\n\t\t\tcluster: v.optional(v.boolean()),\n\t\t}),\n\t\t{ title: 'Redis Config', $refId: 'RedisConfig' },\n\t)\n\nexport class RedisCache extends configurable(redisConfigPipe, Cache) {\n\t#client: Cluster | Redis\n\n\tprotected constructor(config: typeof RedisCache.Config, extraConfig?: Partial<RedisOptions>) {\n\t\tsuper(config)\n\t\tconst node = {\n\t\t\t...(config.host ? { host: config.host } : {}),\n\t\t\t...(config.port ? { port: config.port } : {}),\n\t\t}\n\t\tconst common = {\n\t\t\t...extraConfig,\n\t\t\t...(config.password ? { password: config.password } : {}),\n\t\t\t...(config.username ? { username: config.username } : {}),\n\t\t\t...(config.tls ? { tls: {} } : {}),\n\t\t\tlazyConnect: true,\n\t\t}\n\t\tthis.#client = config.cluster\n\t\t\t? new Cluster([node], {\n\t\t\t\t\t...extraConfig,\n\t\t\t\t\tredisOptions: common,\n\t\t\t\t\tlazyConnect: true,\n\t\t\t\t})\n\t\t\t: new Redis({ ...common, ...node })\n\t\tthis.#client.on('error', async (error) => {\n\t\t\tInstance.crash(new EquippedError(`Redis failed with error`, {}, error))\n\t\t})\n\t\tif (!extraConfig) Instance.on('start', async () => this.#client.connect(), { class: RedisCache })\n\t\tInstance.on('close', async () => this.#client.quit(), { class: RedisCache })\n\t}\n\n\tget connectionOptions() {\n\t\treturn this.#client.options\n\t}\n\n\tasync delete(key: string) {\n\t\tawait this.#client.del(this.getScopedKey(key))\n\t}\n\tasync get(key: string) {\n\t\treturn await this.#client.get(this.getScopedKey(key))\n\t}\n\tasync set(key: string, data: string, ttlInSecs?: number) {\n\t\tif (ttlInSecs) await this.#client.setex(this.getScopedKey(key), ttlInSecs, data)\n\t\telse this.#client.set(this.getScopedKey(key), data)\n\t}\n}\n\nif (import.meta.vitest) {\n\tconst { describe, test, expect, expectTypeOf, vi, beforeEach, afterEach } = import.meta.vitest\n\ttype PipeOutput<T> = import('valleyed').PipeOutput<T>\n\n\tlet hookCalls: Array<{ event: string; options?: any }>\n\n\tbeforeEach(() => {\n\t\thookCalls = []\n\t\tvi.spyOn(Instance, 'on').mockImplementation((event, _cb, options) => {\n\t\t\thookCalls.push({ event, options })\n\t\t})\n\t\tvi.spyOn(Instance, 'get').mockReturnValue({ getScopedName: (_name: string, _sep: string) => `test:${_name}` } as any)\n\t})\n\n\tafterEach(() => {\n\t\tvi.restoreAllMocks()\n\t})\n\n\tdescribe('RedisCache', () => {\n\t\ttest('create() produces a working instance', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost' })\n\t\t\texpect(cache).toBeInstanceOf(RedisCache)\n\t\t})\n\n\t\ttest('new RedisCache() is a compile error', () => {\n\t\t\t// @ts-expect-error — external `new` on a class with protected constructor is a compile error\n\t\t\tvoid (() => new RedisCache({ host: 'localhost' }))\n\t\t})\n\n\t\ttest('Instance.on calls use { class: RedisCache }', () => {\n\t\t\tRedisCache.create({ host: 'localhost' })\n\t\t\tconst startHook = hookCalls.find((h) => h.event === 'start')\n\t\t\tconst closeHook = hookCalls.find((h) => h.event === 'close')\n\t\t\texpect(startHook?.options).toEqual({ class: RedisCache })\n\t\t\texpect(closeHook?.options).toEqual({ class: RedisCache })\n\t\t})\n\n\t\ttest('skips start hook when extraConfig is provided', () => {\n\t\t\tRedisCache.create({ host: 'localhost' }, { maxRetriesPerRequest: null })\n\t\t\tconst startHooks = hookCalls.filter((h) => h.event === 'start')\n\t\t\tconst closeHooks = hookCalls.filter((h) => h.event === 'close')\n\t\t\texpect(startHooks).toHaveLength(0)\n\t\t\texpect(closeHooks).toHaveLength(1)\n\t\t})\n\n\t\ttest('Config type matches pipe output', () => {\n\t\t\ttype Expected = PipeOutput<ReturnType<typeof redisConfigPipe>>\n\t\t\texpectTypeOf<typeof RedisCache.Config>().toEqualTypeOf<Expected>()\n\t\t})\n\n\t\ttest('connectionOptions is accessible', () => {\n\t\t\tconst cache = RedisCache.create({ host: 'localhost', port: 6379 })\n\t\t\texpect(cache.connectionOptions).toBeDefined()\n\t\t})\n\t})\n}\n"],"mappings":"8IAAA,OAAS,WAAAA,EAAS,SAAAC,MAAgC,UAClD,OAAS,KAAAC,MAAS,WAOX,IAAMC,EAAkB,IAC9BC,EAAE,KACDA,EAAE,OAAO,CACR,KAAMA,EAAE,OAAO,EACf,KAAMA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC3B,SAAUA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC/B,SAAUA,EAAE,SAASA,EAAE,OAAO,CAAC,EAC/B,IAAKA,EAAE,SAASA,EAAE,QAAQ,CAAC,EAC3B,QAASA,EAAE,SAASA,EAAE,QAAQ,CAAC,CAChC,CAAC,EACD,CAAE,MAAO,eAAgB,OAAQ,aAAc,CAChD,EAEYC,EAAN,MAAMC,UAAmBC,EAAaJ,EAAiBK,CAAK,CAAE,CACpEC,GAEU,YAAYC,EAAkCC,EAAqC,CAC5F,MAAMD,CAAM,EACZ,IAAME,EAAO,CACZ,GAAIF,EAAO,KAAO,CAAE,KAAMA,EAAO,IAAK,EAAI,CAAC,EAC3C,GAAIA,EAAO,KAAO,CAAE,KAAMA,EAAO,IAAK,EAAI,CAAC,CAC5C,EACMG,EAAS,CACd,GAAGF,EACH,GAAID,EAAO,SAAW,CAAE,SAAUA,EAAO,QAAS,EAAI,CAAC,EACvD,GAAIA,EAAO,SAAW,CAAE,SAAUA,EAAO,QAAS,EAAI,CAAC,EACvD,GAAIA,EAAO,IAAM,CAAE,IAAK,CAAC,CAAE,EAAI,CAAC,EAChC,YAAa,EACd,EACA,KAAKD,GAAUC,EAAO,QACnB,IAAII,EAAQ,CAACF,CAAI,EAAG,CACpB,GAAGD,EACH,aAAcE,EACd,YAAa,EACd,CAAC,EACA,IAAIE,EAAM,CAAE,GAAGF,EAAQ,GAAGD,CAAK,CAAC,EACnC,KAAKH,GAAQ,GAAG,QAAS,MAAOO,GAAU,CACzCC,EAAS,MAAM,IAAIC,EAAc,0BAA2B,CAAC,EAAGF,CAAK,CAAC,CACvE,CAAC,EACIL,GAAaM,EAAS,GAAG,QAAS,SAAY,KAAKR,GAAQ,QAAQ,EAAG,CAAE,MAAOH,CAAW,CAAC,EAChGW,EAAS,GAAG,QAAS,SAAY,KAAKR,GAAQ,KAAK,EAAG,CAAE,MAAOH,CAAW,CAAC,CAC5E,CAEA,IAAI,mBAAoB,CACvB,OAAO,KAAKG,GAAQ,OACrB,CAEA,MAAM,OAAOU,EAAa,CACzB,MAAM,KAAKV,GAAQ,IAAI,KAAK,aAAaU,CAAG,CAAC,CAC9C,CACA,MAAM,IAAIA,EAAa,CACtB,OAAO,MAAM,KAAKV,GAAQ,IAAI,KAAK,aAAaU,CAAG,CAAC,CACrD,CACA,MAAM,IAAIA,EAAaC,EAAcC,EAAoB,CACpDA,EAAW,MAAM,KAAKZ,GAAQ,MAAM,KAAK,aAAaU,CAAG,EAAGE,EAAWD,CAAI,EAC1E,KAAKX,GAAQ,IAAI,KAAK,aAAaU,CAAG,EAAGC,CAAI,CACnD,CACD","names":["Cluster","Redis","v","redisConfigPipe","v","RedisCache","_RedisCache","configurable","Cache","#client","config","extraConfig","node","common","Cluster","Redis","error","Instance","EquippedError","key","data","ttlInSecs"]}
@@ -1,2 +1,2 @@
1
- import{f as S,g as F,j as O,k as q,l as C,m as I,n as R,o as P,p as B,q as D,r as T,s as K}from "./chunk-7SQ5JQYR.min.mjs";import{m as k}from "./chunk-IN5YKIJ7.min.mjs";import{AsyncLocalStorage as _}from"async_hooks";import{v as M,differ as h}from"valleyed";var j=()=>M.object({});function d(a){return structuredClone(a)}var w=(a,e)=>{a.clear();for(let[t,n]of e.entries())a.set(t,n)};function b(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function A(a,e){return Array.isArray(a)?(Array.isArray(e)?e:[e]).every(n=>a.some(s=>h.equal(s,n))):b(a)&&b(e)?Object.entries(e).every(([t,n])=>A(a[t],n)):h.equal(a,e)}function f(a,e){if(a===e)return 0;if(a==null)return-1;if(e==null)return 1;if(typeof a=="number"&&typeof e=="number"||typeof a=="string"&&typeof e=="string")return a<e?-1:1;if(typeof a=="boolean"&&typeof e=="boolean")return a===!1?-1:1;let t=JSON.stringify(a),n=JSON.stringify(e);return t===n?0:t<n?-1:1}function L(a,e){return`${e.prefix??""}${e.table}`}function z(a,e){let t=a[e.field],n=e.value;switch(e.op){case"eq":return h.equal(t,n);case"ne":return!h.equal(t,n);case"gt":return f(t,n)>0;case"gte":return f(t,n)>=0;case"lt":return f(t,n)<0;case"lte":return f(t,n)<=0;case"in":return Array.isArray(n)?n.some(s=>h.equal(t,s)):!1;case"notIn":return Array.isArray(n)?!n.some(s=>h.equal(t,s)):!0;case"like":return String(t??"").toLowerCase().includes(String(n??"").toLowerCase());case"exists":return t!=null;case"notExists":return t==null;case"contains":return A(t,n);case"notContains":return!A(t,n);default:return!1}}function x(a,e){if(e instanceof S)return z(a,e);if(e instanceof F){if(e.op==="and")return e.children.every(t=>x(a,t));if(e.op==="or")return e.children.some(t=>x(a,t))}return!0}function y(a,e){for(let t of e.children)if(!x(a,t))return!1;return!0}function E(a,e){let t=a;if(e?.orderBy?.length&&(t=[...t].sort((n,s)=>{for(let i of e.orderBy??[]){let c=f(n[i.field],s[i.field]);if(c!==0)return i.direction==="asc"?c:-c}return 0})),e?.offset!=null&&(t=t.slice(Math.max(0,e.offset))),e?.limit!=null&&(t=t.slice(0,e.limit)),e?.select?.length){let n=new Set(e.select);t=t.map(s=>{let i={};for(let c of n)i[c]=s[c];return i})}return t}function N(a,e,t){if(t instanceof C){let n=Number(a[e]??0);a[e]=n+t.value;return}if(t instanceof I){let n=Number(a[e]??0);a[e]=n*t.value;return}if(t instanceof R){let n=a[e];a[e]=n==null||f(t.value,n)<0?t.value:n;return}if(t instanceof P){let n=a[e];a[e]=n==null||f(t.value,n)>0?t.value:n;return}if(t instanceof B){a[e]=null;return}if(t instanceof D){let n=Array.isArray(a[e])?[...a[e]]:[];n.push(d(t.value)),a[e]=n;return}if(t instanceof T){let n=Array.isArray(a[e])?a[e]:[];a[e]=n.filter(s=>!h.equal(s,t.value));return}if(t instanceof K){let n=b(a[e])?d(a[e]):{};if(b(t.value))for(let[s,i]of Object.entries(t.value))n[s]=d(i);a[e]=n;return}a[e]=d(t)}function $(a,e){let t=d(a);for(let[n,s]of Object.entries(e))N(t,n,s);return t}function v(a,e){let t=d(a);for(let n of e)if(n instanceof q)for(let[s,i]of Object.entries(n.values))t[s]=d(i);else N(t,n.field,n);return t}var U=new _,G=class extends k(j,O){schemaConfigPipe=M.object({table:M.string()});supportedFieldTypes=["string","number","boolean","null","object","array","date"];queryableOps=["eq","ne","gt","gte","lt","lte","in","notIn","like","exists","notExists","contains","notContains"];updateOps=["set","inc","mul","min","max","unset","push","pull","patch"];aggregateOps=["count","countDistinct","sum","avg","min","max"];stores=new Map;migrations=new Map;indexes=new Map;tables=new Map;foreignKeys=new Map;#t=Promise.resolve();constructor(e){super(e)}#n(e){return this.stores.has(e)||this.stores.set(e,new Map),this.stores.get(e)}#e(e,t){return this.#n(L(e,t))}#a(){let e=new Map;for(let[c,o]of this.stores.entries()){let r=new Map;for(let[l,u]of o.entries())r.set(l,d(u));e.set(c,r)}let t=new Map(this.migrations),n=new Map(this.indexes),s=new Map;for(let[c,o]of this.tables.entries())s.set(c,{pk:{...o.pk},fields:new Map(o.fields)});let i=new Map(this.foreignKeys);return{stores:e,migrations:t,indexes:n,tables:s,foreignKeys:i}}#r(e){w(this.stores,e.stores),w(this.migrations,e.migrations),w(this.indexes,e.indexes),w(this.tables,e.tables),w(this.foreignKeys,e.foreignKeys)}async findByPk(e,t,n){let i=this.#e(e,t).get(String(n));return i?d(i):null}async createMany(e,t,n){let s=e.pkField.name,i=this.#e(e,t);return n.map(c=>{let o=d(c);return i.set(String(o[s]),o),d(o)})}async deleteByPk(e,t,n){let s=this.#e(e,t),i=String(n),c=s.get(i);return c?(s.delete(i),d(c)):null}async updateByPk(e,t,n,s){let i=this.#e(e,t),c=String(n),o=i.get(c);if(!o)return null;let r=v(o,s);return i.set(c,r),d(r)}async findMany(e,t,n,s){let c=[...this.#e(e,t).values()].filter(o=>y(o,n)).map(o=>d(o));return E(c,s)}async count(e,t,n){return[...this.#e(e,t).values()].filter(i=>y(i,n)).length}async*iterateMany(e,t,n,s){let i=this.#e(e,t),c=E([...i.values()].filter(r=>y(r,n)).map(r=>d(r)),s),o=typeof s?.batchSize=="number"&&Number.isSafeInteger(s.batchSize)&&s.batchSize>0?s.batchSize:1;for(let r=0;r<c.length;r+=o)for(let l of c.slice(r,r+o))yield l}async updateMany(e,t,n,s){let i=this.#e(e,t),c=[...i.entries()].filter(([,r])=>y(r,n)).map(([r])=>r),o=[];for(let r of c){let l=i.get(r);if(!l)continue;let u=$(l,s);i.set(r,u),o.push(d(u))}return o}async deleteMany(e,t,n){let s=this.#e(e,t),i=e.pkField.name,c=[...s.values()].filter(o=>y(o,n)).map(o=>d(o));for(let o of c)s.delete(String(o[i]));return c}async upsertOne(e,t,n,s,i){let c=this.#e(e,t),o=e.pkField.name,l=[...c.values()].filter(g=>y(g,n))[0];if(l){let g=i.length>0?v(l,i):d(l);return c.set(String(g[o]),g),d(g)}let u=d(s),p=i.length>0?v(u,i):u;return c.set(String(p[o]),p),d(p)}async aggregate(e,t,n){let i=[...this.#e(e,t).values()];if(n.where){let r=n.where;i=i.filter(l=>y(l,r))}let c=new Map;if(n.groupBy.length>0)for(let r of i){let l=JSON.stringify(n.groupBy.map(u=>r[u]));c.has(l)||c.set(l,[]),c.get(l).push(r)}else c.set("__all__",i);let o=[];for(let[,r]of c){let l={};if(n.groupBy.length>0)for(let u of n.groupBy)l[u]=r[0][u];for(let u of n.aggregates)switch(u.fn){case"count":l[u.alias]=r.length;break;case"countDistinct":{let p=new Set(r.map(g=>JSON.stringify(g[u.field])));l[u.alias]=p.size;break}case"sum":l[u.alias]=r.reduce((p,g)=>p+Number(g[u.field]??0),0);break;case"avg":{let p=r.reduce((g,m)=>g+Number(m[u.field]??0),0);l[u.alias]=r.length>0?p/r.length:0;break}case"min":{let p=null;for(let g of r){let m=g[u.field];m!=null&&(p===null||f(m,p)<0)&&(p=m)}l[u.alias]=p;break}case"max":{let p=null;for(let g of r){let m=g[u.field];m!=null&&(p===null||f(m,p)>0)&&(p=m)}l[u.alias]=p;break}}o.push(l)}if(n.having){let r=n.having;return o.filter(l=>y(l,r))}return o}async loadMigrations(){return[...this.migrations.values()].map(e=>({id:e.id,appliedAt:e.appliedAt}))}async recordMigration(e,t){this.migrations.set(e,{id:e,appliedAt:t})}async applyCreateTable(e){let t=new Map;for(let n of e.fields)t.set(n.name,{...n});this.tables.set(e.name,{pk:{name:e.pk.name,type:e.pk.type},fields:t})}async applyDropTable(e){this.tables.delete(e.name)}async applyAddField(e){let t=this.tables.get(e.table);t&&t.fields.set(e.field.name,{...e.field})}async applyDropField(e){let t=this.tables.get(e.table);t&&t.fields.delete(e.name)}async applyModifyField(e){let t=this.tables.get(e.table);t&&(t.fields.delete(e.name),t.fields.set(e.to.name,{...e.to}))}async applyRenameTable(e){let t=this.tables.get(e.from);t&&(this.tables.delete(e.from),this.tables.set(e.to,t))}async applyRenameField(e){let t=this.tables.get(e.table);if(t){let n=t.fields.get(e.from);n&&(t.fields.delete(e.from),t.fields.set(e.to,{...n,name:e.to}))}}async applyAddIndex(e){let t=e.name??`${e.table}_${e.on.join("_")}_idx`;this.indexes.set(t,{table:e.table,on:e.on,unique:e.unique??!1})}async applyDropIndex(e){this.indexes.delete(e.name)}async applyAddForeignKey(e){let t=e.name??`${e.table}_${e.on}_fk`;this.foreignKeys.set(t,{table:e.table,on:e.on,references:{table:e.references.table,column:e.references.column},onDelete:e.onDelete,onUpdate:e.onUpdate})}async applyDropForeignKey(e){this.foreignKeys.delete(e.name)}async introspect(){let e=[];for(let[t,n]of this.tables.entries()){let s=[...n.fields.values()].map(o=>({name:o.name,type:o.type,nullable:o.nullable??!1,...o.default!==void 0?{default:o.default}:{},...o.unique?{unique:!0}:{}})),i=[...this.indexes.entries()].filter(([,o])=>o.table===t).map(([o,r])=>({name:o,on:r.on,unique:r.unique})),c=[...this.foreignKeys.entries()].filter(([,o])=>o.table===t).map(([o,r])=>({name:o,on:r.on,references:{table:r.references.table,column:r.references.column},...r.onDelete?{onDelete:r.onDelete}:{},...r.onUpdate?{onUpdate:r.onUpdate}:{}}));e.push({name:t,pk:{name:n.pk.name,type:n.pk.type},fields:s,indexes:i,foreignKeys:c})}return e}async acquireMigrationLock(e){let t,n=new Promise(i=>{t=i}),s=this.#t;this.#t=n,await s;try{return await e()}finally{t()}}async session(e){if(U.getStore())return e();let t=this.#a();try{return await U.run(!0,e)}catch(n){throw this.#r(t),n}}};export{G as a};
2
- //# sourceMappingURL=chunk-P4PRHHIY.min.mjs.map
1
+ import{a as k}from "./chunk-CU2HU5UE.min.mjs";import{f as S,g as F,j as O,k as q,l as C,m as I,n as R,o as P,p as B,q as D,r as T,s as K}from "./chunk-MCX2O5IT.min.mjs";import{AsyncLocalStorage as _}from"async_hooks";import{v as M,differ as h}from"valleyed";var j=()=>M.object({});function d(a){return structuredClone(a)}var w=(a,e)=>{a.clear();for(let[t,n]of e.entries())a.set(t,n)};function b(a){return typeof a=="object"&&a!==null&&!Array.isArray(a)}function A(a,e){return Array.isArray(a)?(Array.isArray(e)?e:[e]).every(n=>a.some(s=>h.equal(s,n))):b(a)&&b(e)?Object.entries(e).every(([t,n])=>A(a[t],n)):h.equal(a,e)}function f(a,e){if(a===e)return 0;if(a==null)return-1;if(e==null)return 1;if(typeof a=="number"&&typeof e=="number"||typeof a=="string"&&typeof e=="string")return a<e?-1:1;if(typeof a=="boolean"&&typeof e=="boolean")return a===!1?-1:1;let t=JSON.stringify(a),n=JSON.stringify(e);return t===n?0:t<n?-1:1}function L(a,e){return`${e.prefix??""}${e.table}`}function z(a,e){let t=a[e.field],n=e.value;switch(e.op){case"eq":return h.equal(t,n);case"ne":return!h.equal(t,n);case"gt":return f(t,n)>0;case"gte":return f(t,n)>=0;case"lt":return f(t,n)<0;case"lte":return f(t,n)<=0;case"in":return Array.isArray(n)?n.some(s=>h.equal(t,s)):!1;case"notIn":return Array.isArray(n)?!n.some(s=>h.equal(t,s)):!0;case"like":return String(t??"").toLowerCase().includes(String(n??"").toLowerCase());case"exists":return t!=null;case"notExists":return t==null;case"contains":return A(t,n);case"notContains":return!A(t,n);default:return!1}}function x(a,e){if(e instanceof S)return z(a,e);if(e instanceof F){if(e.op==="and")return e.children.every(t=>x(a,t));if(e.op==="or")return e.children.some(t=>x(a,t))}return!0}function y(a,e){for(let t of e.children)if(!x(a,t))return!1;return!0}function E(a,e){let t=a;if(e?.orderBy?.length&&(t=[...t].sort((n,s)=>{for(let i of e.orderBy??[]){let c=f(n[i.field],s[i.field]);if(c!==0)return i.direction==="asc"?c:-c}return 0})),e?.offset!=null&&(t=t.slice(Math.max(0,e.offset))),e?.limit!=null&&(t=t.slice(0,e.limit)),e?.select?.length){let n=new Set(e.select);t=t.map(s=>{let i={};for(let c of n)i[c]=s[c];return i})}return t}function N(a,e,t){if(t instanceof C){let n=Number(a[e]??0);a[e]=n+t.value;return}if(t instanceof I){let n=Number(a[e]??0);a[e]=n*t.value;return}if(t instanceof R){let n=a[e];a[e]=n==null||f(t.value,n)<0?t.value:n;return}if(t instanceof P){let n=a[e];a[e]=n==null||f(t.value,n)>0?t.value:n;return}if(t instanceof B){a[e]=null;return}if(t instanceof D){let n=Array.isArray(a[e])?[...a[e]]:[];n.push(d(t.value)),a[e]=n;return}if(t instanceof T){let n=Array.isArray(a[e])?a[e]:[];a[e]=n.filter(s=>!h.equal(s,t.value));return}if(t instanceof K){let n=b(a[e])?d(a[e]):{};if(b(t.value))for(let[s,i]of Object.entries(t.value))n[s]=d(i);a[e]=n;return}a[e]=d(t)}function $(a,e){let t=d(a);for(let[n,s]of Object.entries(e))N(t,n,s);return t}function v(a,e){let t=d(a);for(let n of e)if(n instanceof q)for(let[s,i]of Object.entries(n.values))t[s]=d(i);else N(t,n.field,n);return t}var U=new _,G=class extends k(j,O){schemaConfigPipe=M.object({table:M.string()});supportedFieldTypes=["string","number","boolean","null","object","array","date"];queryableOps=["eq","ne","gt","gte","lt","lte","in","notIn","like","exists","notExists","contains","notContains"];updateOps=["set","inc","mul","min","max","unset","push","pull","patch"];aggregateOps=["count","countDistinct","sum","avg","min","max"];stores=new Map;migrations=new Map;indexes=new Map;tables=new Map;foreignKeys=new Map;#t=Promise.resolve();constructor(e){super(e)}#n(e){return this.stores.has(e)||this.stores.set(e,new Map),this.stores.get(e)}#e(e,t){return this.#n(L(e,t))}#a(){let e=new Map;for(let[c,o]of this.stores.entries()){let r=new Map;for(let[l,u]of o.entries())r.set(l,d(u));e.set(c,r)}let t=new Map(this.migrations),n=new Map(this.indexes),s=new Map;for(let[c,o]of this.tables.entries())s.set(c,{pk:{...o.pk},fields:new Map(o.fields)});let i=new Map(this.foreignKeys);return{stores:e,migrations:t,indexes:n,tables:s,foreignKeys:i}}#r(e){w(this.stores,e.stores),w(this.migrations,e.migrations),w(this.indexes,e.indexes),w(this.tables,e.tables),w(this.foreignKeys,e.foreignKeys)}async findByPk(e,t,n){let i=this.#e(e,t).get(String(n));return i?d(i):null}async createMany(e,t,n){let s=e.pkField.name,i=this.#e(e,t);return n.map(c=>{let o=d(c);return i.set(String(o[s]),o),d(o)})}async deleteByPk(e,t,n){let s=this.#e(e,t),i=String(n),c=s.get(i);return c?(s.delete(i),d(c)):null}async updateByPk(e,t,n,s){let i=this.#e(e,t),c=String(n),o=i.get(c);if(!o)return null;let r=v(o,s);return i.set(c,r),d(r)}async findMany(e,t,n,s){let c=[...this.#e(e,t).values()].filter(o=>y(o,n)).map(o=>d(o));return E(c,s)}async count(e,t,n){return[...this.#e(e,t).values()].filter(i=>y(i,n)).length}async*iterateMany(e,t,n,s){let i=this.#e(e,t),c=E([...i.values()].filter(r=>y(r,n)).map(r=>d(r)),s),o=typeof s?.batchSize=="number"&&Number.isSafeInteger(s.batchSize)&&s.batchSize>0?s.batchSize:1;for(let r=0;r<c.length;r+=o)for(let l of c.slice(r,r+o))yield l}async updateMany(e,t,n,s){let i=this.#e(e,t),c=[...i.entries()].filter(([,r])=>y(r,n)).map(([r])=>r),o=[];for(let r of c){let l=i.get(r);if(!l)continue;let u=$(l,s);i.set(r,u),o.push(d(u))}return o}async deleteMany(e,t,n){let s=this.#e(e,t),i=e.pkField.name,c=[...s.values()].filter(o=>y(o,n)).map(o=>d(o));for(let o of c)s.delete(String(o[i]));return c}async upsertOne(e,t,n,s,i){let c=this.#e(e,t),o=e.pkField.name,l=[...c.values()].filter(g=>y(g,n))[0];if(l){let g=i.length>0?v(l,i):d(l);return c.set(String(g[o]),g),d(g)}let u=d(s),p=i.length>0?v(u,i):u;return c.set(String(p[o]),p),d(p)}async aggregate(e,t,n){let i=[...this.#e(e,t).values()];if(n.where){let r=n.where;i=i.filter(l=>y(l,r))}let c=new Map;if(n.groupBy.length>0)for(let r of i){let l=JSON.stringify(n.groupBy.map(u=>r[u]));c.has(l)||c.set(l,[]),c.get(l).push(r)}else c.set("__all__",i);let o=[];for(let[,r]of c){let l={};if(n.groupBy.length>0)for(let u of n.groupBy)l[u]=r[0][u];for(let u of n.aggregates)switch(u.fn){case"count":l[u.alias]=r.length;break;case"countDistinct":{let p=new Set(r.map(g=>JSON.stringify(g[u.field])));l[u.alias]=p.size;break}case"sum":l[u.alias]=r.reduce((p,g)=>p+Number(g[u.field]??0),0);break;case"avg":{let p=r.reduce((g,m)=>g+Number(m[u.field]??0),0);l[u.alias]=r.length>0?p/r.length:0;break}case"min":{let p=null;for(let g of r){let m=g[u.field];m!=null&&(p===null||f(m,p)<0)&&(p=m)}l[u.alias]=p;break}case"max":{let p=null;for(let g of r){let m=g[u.field];m!=null&&(p===null||f(m,p)>0)&&(p=m)}l[u.alias]=p;break}}o.push(l)}if(n.having){let r=n.having;return o.filter(l=>y(l,r))}return o}async loadMigrations(){return[...this.migrations.values()].map(e=>({id:e.id,appliedAt:e.appliedAt}))}async recordMigration(e,t){this.migrations.set(e,{id:e,appliedAt:t})}async applyCreateTable(e){let t=new Map;for(let n of e.fields)t.set(n.name,{...n});this.tables.set(e.name,{pk:{name:e.pk.name,type:e.pk.type},fields:t})}async applyDropTable(e){this.tables.delete(e.name)}async applyAddField(e){let t=this.tables.get(e.table);t&&t.fields.set(e.field.name,{...e.field})}async applyDropField(e){let t=this.tables.get(e.table);t&&t.fields.delete(e.name)}async applyModifyField(e){let t=this.tables.get(e.table);t&&(t.fields.delete(e.name),t.fields.set(e.to.name,{...e.to}))}async applyRenameTable(e){let t=this.tables.get(e.from);t&&(this.tables.delete(e.from),this.tables.set(e.to,t))}async applyRenameField(e){let t=this.tables.get(e.table);if(t){let n=t.fields.get(e.from);n&&(t.fields.delete(e.from),t.fields.set(e.to,{...n,name:e.to}))}}async applyAddIndex(e){let t=e.name??`${e.table}_${e.on.join("_")}_idx`;this.indexes.set(t,{table:e.table,on:e.on,unique:e.unique??!1})}async applyDropIndex(e){this.indexes.delete(e.name)}async applyAddForeignKey(e){let t=e.name??`${e.table}_${e.on}_fk`;this.foreignKeys.set(t,{table:e.table,on:e.on,references:{table:e.references.table,column:e.references.column},onDelete:e.onDelete,onUpdate:e.onUpdate})}async applyDropForeignKey(e){this.foreignKeys.delete(e.name)}async introspect(){let e=[];for(let[t,n]of this.tables.entries()){let s=[...n.fields.values()].map(o=>({name:o.name,type:o.type,nullable:o.nullable??!1,...o.default!==void 0?{default:o.default}:{},...o.unique?{unique:!0}:{}})),i=[...this.indexes.entries()].filter(([,o])=>o.table===t).map(([o,r])=>({name:o,on:r.on,unique:r.unique})),c=[...this.foreignKeys.entries()].filter(([,o])=>o.table===t).map(([o,r])=>({name:o,on:r.on,references:{table:r.references.table,column:r.references.column},...r.onDelete?{onDelete:r.onDelete}:{},...r.onUpdate?{onUpdate:r.onUpdate}:{}}));e.push({name:t,pk:{name:n.pk.name,type:n.pk.type},fields:s,indexes:i,foreignKeys:c})}return e}async acquireMigrationLock(e){let t,n=new Promise(i=>{t=i}),s=this.#t;this.#t=n,await s;try{return await e()}finally{t()}}async session(e){if(U.getStore())return e();let t=this.#a();try{return await U.run(!0,e)}catch(n){throw this.#r(t),n}}};export{G as a};
2
+ //# sourceMappingURL=chunk-YWQTFKNY.min.mjs.map
@@ -1,2 +1,2 @@
1
- import{a as T,b as P,c as $}from "../../../chunk-2GGMLKRP.min.mjs";import"../../../chunk-MQXTTWPS.min.mjs";import{K as w,a as C,t as O}from "../../../chunk-IN5YKIJ7.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import"mongodb";import{differ as v}from"valleyed";import B from"axios";import{v as R}from"valleyed";var S="db-changes",E=class{constructor(a,i,n){this.config=a;this.callbacks=i;this.mapper=n;this.config=R.assert(P(),a)}async configureConnector(a,i){let n=B.create({baseURL:this.config.debeziumUrl});return await n.put(`/connectors/${a}/config`,{"topic.prefix":S,"topic.creation.enable":"false","topic.creation.default.replication.factor":"-1","topic.creation.default.partitions":"-1","key.converter":"org.apache.kafka.connect.json.JsonConverter","key.converter.schemas.enable":"false","value.converter":"org.apache.kafka.connect.json.JsonConverter","value.converter.schemas.enable":"false",...i}).then(async()=>(await n.get(`/connectors/${a}/topics`)).data[a]?.topics?.includes?.(a)??!1).catch(l=>{throw new C("Failed to configure watcher",{key:a},l)})}};var k=class extends E{#e=!1;constructor(a,i,n,l,f){super(i,l,f);let d=r=>r._id?{...r,_id:r._id.$oid??r._id}:void 0,m=n.dbName,c=n.collectionName,e=`${m}.${c}`,t=`${S}.${e}`,o="5f5f65717569707065645f5f",s={_id:o};i.eventBus.stream(t,{skipScope:!0}).subscribe(async r=>{let p=r.op,u=JSON.parse(r.before??"null"),y=JSON.parse(r.after??"null");u&&(u=d(u)),y&&(y=d(y)),!(u?._id===o||y?._id===o)&&(p==="c"&&this.callbacks.created&&y?await this.callbacks.created({before:null,after:this.mapper(y)}):p==="u"&&this.callbacks.updated&&u&&y?await this.callbacks.updated({before:this.mapper(u),after:this.mapper(y),changes:v.from(v.diff(u,y))}):p==="d"&&this.callbacks.deleted&&u&&await this.callbacks.deleted({before:this.mapper(u),after:null}))}),w.on("start",async()=>{this.#e||(this.#e=!0,await O(async()=>await this.configureConnector(t,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":a.uri,"collection.include.list":e,"snapshot.mode":"when_needed","capture.scope":"collection","capture.target":e,"heartbeat.interval.ms":"60000","errors.max.retries":"3"})?{done:!0,value:!0}:(await n.findOneAndUpdate(s,{$set:{colName:c}},{upsert:!0}),await n.findOneAndDelete(s),w.get().log.warn(`Waiting for db changes for ${e} to start...`),{done:!1}),6,3e4).catch(r=>w.crash(new C("Failed to start db changes",{dbColName:e},r))))})}};import{AsyncLocalStorage as F}from"async_hooks";import{MongoClient as q,ObjectId as I}from"mongodb";import{v as N}from"valleyed";import{v as x}from"valleyed";var _=()=>x.meta(x.object({uri:x.string()}),{title:"Mongodb Config",$refId:"MongodbConfig"});import"mongodb";var Q=async(h,a)=>{let i=[],n=A(a.where,a.whereType);n&&i.push(n);let l=A(a.auth,a.authType);if(l&&i.push(l),a.search&&a.search.fields.length>0){let D=a.search.fields.map(j=>({[j]:{$regex:new RegExp(a.search.value,"i")}}));i.push({$or:D})}let f={};i.length>0&&(f.$and=i);let d=a.sort.map(D=>[D.field,D.desc?"desc":"asc"]),m=a.all??!1,c=a.limit,e=a.page,t=await h.countDocuments(f),o=a.select?.length?Object.fromEntries(a.select.map(D=>[D,1])):void 0,s=h.find(f,{projection:o});d.length&&(s=s.sort(Object.fromEntries(d))),!m&&c&&(s=s.limit(c),e&&(s=s.skip((e-1)*c)));let r=await s.toArray(),p=1,u=Math.ceil(t/c)||1,y=e>=u?null:e+1,b=e<=p?null:e-1;return{pages:{start:p,last:u,next:y,previous:b,current:e},docs:{limit:c,total:t,count:r.length},results:r}};function U(h){return Object.values($).includes(h.condition)}var A=(h,a="and")=>{let i=(Array.isArray(h)?h:[]).map(n=>{if(U(n))return A(n.value,n.condition);let{field:l}=n,f=l==="id"?"_id":l??"",d=n.value===void 0?"":n.value;return{field:f,value:d,condition:n.condition,isWhere:!0}}).filter(n=>!!n).map(n=>n.isWhere?{[`${n.field}`]:{[`$${n.condition}`]:n.value}}:n);return i.length>0?{[`$${a}`]:i}:null};var M="_id",g=new F(void 0),W=class extends T{constructor(i,n){super(n);this.mongoConfig=i;this.mongoConfig=N.assert(_(),i),this.client=new q(i.uri,{ignoreUndefined:!0}),w.on("start",async()=>{await this.client.connect();let l=this.#e.reduce((d,m)=>(d[m.db]||(d[m.db]=[]),d[m.db].push(m.col),d),{}),f={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(l).map(async([d,m])=>{let c=this.client.db(d),e=await c.listCollections().toArray();return m.map(async t=>{let o=e.find(s=>s.name===t);o?o.options?.changeStreamPreAndPostImages?.enabled!==f.changeStreamPreAndPostImages.enabled&&await c.command({collMod:t,...f}):await c.createCollection(t,f)})}))}),w.on("close",async()=>this.client.close())}client;#e=[];async session(i){if(g.getStore())return i();let n=await this.client.startSession();return n.withTransaction(async()=>g.run(n,i))}id(){return new I}use(i){let n=this.getScopedDb(i.db);return this.#e.push({db:n,col:i.col}),this.#t(i,this.client.db(n).collection(i.col))}#t(i,n){function l(e,t){let s=(Array.isArray(e)?e:[e]).map(r=>i.mapper(r,t));return Array.isArray(e)?s:s[0]}function f(e,t,o,s){let r={[M]:t,...i.options?.skipAudit?{}:{createdAt:o.getTime(),...s?{}:{updatedAt:o.getTime()}}};return{...e,...r}}function d(e,t,o=!1){return{...e,$set:{...e.$set,...o||Object.keys(e).length>0&&!i.options?.skipAudit?{updatedAt:t.getTime()}:{}}}}let m=this,c={config:i,extras:{collection:n},query:async e=>{let t=await Q(n,e);return{...t,results:l(t.results,e.select)}},findMany:async(e,t={})=>{let{select:o,...s}=t,r=o?.length?Object.fromEntries(o.map(b=>[b,1])):void 0,u=(Array.isArray(s.sort)?s.sort:s.sort?[s.sort]:[]).map(b=>[b.field,b.desc?"desc":"asc"]),y=await n.find(e,{session:g.getStore(),limit:s.limit,sort:u,projection:r}).toArray();return l(y,o)},findOne:async(e,t={})=>(await c.findMany(e,{...t,limit:1})).at(0)??null,findById:async(e,t={})=>await c.findOne({[M]:e},t),insertMany:async(e,t={})=>{let o=t.getTime?.()??new Date,s=e.map((p,u)=>f(p,t.makeId?.(u)??new I().toString(),o));return await n.insertMany(s,{session:g.getStore()}),(await Promise.all(s.map(async p=>await c.findById(p[M])))).filter(p=>!!p)},insertOne:async(e,t={})=>(await c.insertMany([e],t))[0],updateMany:async(e,t,o={})=>{let s=o.getTime?.()??new Date,r=g.getStore(),u=(await n.find(e,{session:r,projection:{[M]:1}}).toArray()).map(b=>b[M]),y={[M]:{$in:u}};return await n.updateMany(y,d(t,s),{session:r}),c.findMany(y)},updateOne:async(e,t,o={})=>{let s=o.getTime?.()??new Date,r=await n.findOneAndUpdate(e,d(t,s),{returnDocument:"after",session:g.getStore()});return r?l(r,void 0):null},updateById:async(e,t,o={})=>await c.updateOne({[M]:e},t,o),upsertOne:async(e,t,o={})=>{let s=o.getTime?.()??new Date,r=await n.findOneAndUpdate(e,{...d("update"in t?t.update:{},s,!0),$setOnInsert:f(t.insert,o.makeId?.()??new I().toString(),s,!0)},{returnDocument:"after",session:g.getStore(),upsert:!0});return l(r,void 0)},deleteMany:async(e,t={})=>{let o=await c.findMany(e,t);return await n.deleteMany(e,{session:g.getStore()}),o},deleteOne:async e=>{let t=await n.findOneAndDelete(e,{session:g.getStore()});return t?l(t,void 0):null},deleteById:async e=>await c.deleteOne({[M]:e}),bulkWrite:async(e,t={})=>{if(!e.length)return;let o=n.initializeUnorderedBulkOp({session:g.getStore()}),s=t.getTime?.()??new Date;e.forEach((r,p)=>{switch(r.op){case"insert":o.insert(f(r.value,r.makeId?.(p)??new I().toString(),s));break;case"delete":o.find(r.filter).delete();break;case"update":o.find(r.filter).update(d(r.value,s));break;case"upsert":o.find(r.filter).upsert().update({...d("update"in r?r.update:{},s,!0),$setOnInsert:f(r.insert,r.makeId?.(p)??new I().toString(),s,!0)});break;default:throw new C("Unknown bulkWrite operation",{operation:r})}}),await o.execute({session:g.getStore()})},watch(e){return m.config.changes||w.crash(new C("Db changes are not enabled in the configuration.",{config:i})),new k(m.mongoConfig,m.config.changes,n,e,t=>i.mapper(t))}};return c}};export{W as MongoDb,k as MongoDbChange,_ as mongoDbConfigPipe};
1
+ import{a as O,b as P,c as $}from "../../../chunk-4GZ43EQ2.min.mjs";import"../../../chunk-RX4XPABH.min.mjs";import{g as T}from "../../../chunk-SPOVKWV3.min.mjs";import"../../../chunk-CU2HU5UE.min.mjs";import{C as w,a as C}from "../../../chunk-N3OD4QL2.min.mjs";import"../../../chunk-DSUJ5FUL.min.mjs";import"../../../chunk-AQY7QVYI.min.mjs";import"mongodb";import{differ as v}from"valleyed";import B from"axios";import{v as R}from"valleyed";var S="db-changes",E=class{constructor(a,i,n){this.config=a;this.callbacks=i;this.mapper=n;this.config=R.assert(P(),a)}async configureConnector(a,i){let n=B.create({baseURL:this.config.debeziumUrl});return await n.put(`/connectors/${a}/config`,{"topic.prefix":S,"topic.creation.enable":"false","topic.creation.default.replication.factor":"-1","topic.creation.default.partitions":"-1","key.converter":"org.apache.kafka.connect.json.JsonConverter","key.converter.schemas.enable":"false","value.converter":"org.apache.kafka.connect.json.JsonConverter","value.converter.schemas.enable":"false",...i}).then(async()=>(await n.get(`/connectors/${a}/topics`)).data[a]?.topics?.includes?.(a)??!1).catch(l=>{throw new C("Failed to configure watcher",{key:a},l)})}};var k=class extends E{#e=!1;constructor(a,i,n,l,f){super(i,l,f);let d=r=>r._id?{...r,_id:r._id.$oid??r._id}:void 0,m=n.dbName,c=n.collectionName,e=`${m}.${c}`,t=`${S}.${e}`,o="5f5f65717569707065645f5f",s={_id:o};i.eventBus.stream(t,{skipScope:!0}).subscribe(async r=>{let p=r.op,u=JSON.parse(r.before??"null"),y=JSON.parse(r.after??"null");u&&(u=d(u)),y&&(y=d(y)),!(u?._id===o||y?._id===o)&&(p==="c"&&this.callbacks.created&&y?await this.callbacks.created({before:null,after:this.mapper(y)}):p==="u"&&this.callbacks.updated&&u&&y?await this.callbacks.updated({before:this.mapper(u),after:this.mapper(y),changes:v.from(v.diff(u,y))}):p==="d"&&this.callbacks.deleted&&u&&await this.callbacks.deleted({before:this.mapper(u),after:null}))}),w.on("start",async()=>{this.#e||(this.#e=!0,await T(async()=>await this.configureConnector(t,{"connector.class":"io.debezium.connector.mongodb.MongoDbConnector","capture.mode":"change_streams_update_full_with_pre_image","mongodb.connection.string":a.uri,"collection.include.list":e,"snapshot.mode":"when_needed","capture.scope":"collection","capture.target":e,"heartbeat.interval.ms":"60000","errors.max.retries":"3"})?{done:!0,value:!0}:(await n.findOneAndUpdate(s,{$set:{colName:c}},{upsert:!0}),await n.findOneAndDelete(s),w.get().log.warn(`Waiting for db changes for ${e} to start...`),{done:!1}),6,3e4).catch(r=>w.crash(new C("Failed to start db changes",{dbColName:e},r))))})}};import{AsyncLocalStorage as F}from"async_hooks";import{MongoClient as q,ObjectId as I}from"mongodb";import{v as N}from"valleyed";import{v as x}from"valleyed";var _=()=>x.meta(x.object({uri:x.string()}),{title:"Mongodb Config",$refId:"MongodbConfig"});import"mongodb";var Q=async(h,a)=>{let i=[],n=A(a.where,a.whereType);n&&i.push(n);let l=A(a.auth,a.authType);if(l&&i.push(l),a.search&&a.search.fields.length>0){let D=a.search.fields.map(j=>({[j]:{$regex:new RegExp(a.search.value,"i")}}));i.push({$or:D})}let f={};i.length>0&&(f.$and=i);let d=a.sort.map(D=>[D.field,D.desc?"desc":"asc"]),m=a.all??!1,c=a.limit,e=a.page,t=await h.countDocuments(f),o=a.select?.length?Object.fromEntries(a.select.map(D=>[D,1])):void 0,s=h.find(f,{projection:o});d.length&&(s=s.sort(Object.fromEntries(d))),!m&&c&&(s=s.limit(c),e&&(s=s.skip((e-1)*c)));let r=await s.toArray(),p=1,u=Math.ceil(t/c)||1,y=e>=u?null:e+1,b=e<=p?null:e-1;return{pages:{start:p,last:u,next:y,previous:b,current:e},docs:{limit:c,total:t,count:r.length},results:r}};function U(h){return Object.values($).includes(h.condition)}var A=(h,a="and")=>{let i=(Array.isArray(h)?h:[]).map(n=>{if(U(n))return A(n.value,n.condition);let{field:l}=n,f=l==="id"?"_id":l??"",d=n.value===void 0?"":n.value;return{field:f,value:d,condition:n.condition,isWhere:!0}}).filter(n=>!!n).map(n=>n.isWhere?{[`${n.field}`]:{[`$${n.condition}`]:n.value}}:n);return i.length>0?{[`$${a}`]:i}:null};var M="_id",g=new F(void 0),W=class extends O{constructor(i,n){super(n);this.mongoConfig=i;this.mongoConfig=N.assert(_(),i),this.client=new q(i.uri,{ignoreUndefined:!0}),w.on("start",async()=>{await this.client.connect();let l=this.#e.reduce((d,m)=>(d[m.db]||(d[m.db]=[]),d[m.db].push(m.col),d),{}),f={changeStreamPreAndPostImages:{enabled:!0}};await Promise.all(Object.entries(l).map(async([d,m])=>{let c=this.client.db(d),e=await c.listCollections().toArray();return m.map(async t=>{let o=e.find(s=>s.name===t);o?o.options?.changeStreamPreAndPostImages?.enabled!==f.changeStreamPreAndPostImages.enabled&&await c.command({collMod:t,...f}):await c.createCollection(t,f)})}))}),w.on("close",async()=>this.client.close())}client;#e=[];async session(i){if(g.getStore())return i();let n=await this.client.startSession();return n.withTransaction(async()=>g.run(n,i))}id(){return new I}use(i){let n=this.getScopedDb(i.db);return this.#e.push({db:n,col:i.col}),this.#t(i,this.client.db(n).collection(i.col))}#t(i,n){function l(e,t){let s=(Array.isArray(e)?e:[e]).map(r=>i.mapper(r,t));return Array.isArray(e)?s:s[0]}function f(e,t,o,s){let r={[M]:t,...i.options?.skipAudit?{}:{createdAt:o.getTime(),...s?{}:{updatedAt:o.getTime()}}};return{...e,...r}}function d(e,t,o=!1){return{...e,$set:{...e.$set,...o||Object.keys(e).length>0&&!i.options?.skipAudit?{updatedAt:t.getTime()}:{}}}}let m=this,c={config:i,extras:{collection:n},query:async e=>{let t=await Q(n,e);return{...t,results:l(t.results,e.select)}},findMany:async(e,t={})=>{let{select:o,...s}=t,r=o?.length?Object.fromEntries(o.map(b=>[b,1])):void 0,u=(Array.isArray(s.sort)?s.sort:s.sort?[s.sort]:[]).map(b=>[b.field,b.desc?"desc":"asc"]),y=await n.find(e,{session:g.getStore(),limit:s.limit,sort:u,projection:r}).toArray();return l(y,o)},findOne:async(e,t={})=>(await c.findMany(e,{...t,limit:1})).at(0)??null,findById:async(e,t={})=>await c.findOne({[M]:e},t),insertMany:async(e,t={})=>{let o=t.getTime?.()??new Date,s=e.map((p,u)=>f(p,t.makeId?.(u)??new I().toString(),o));return await n.insertMany(s,{session:g.getStore()}),(await Promise.all(s.map(async p=>await c.findById(p[M])))).filter(p=>!!p)},insertOne:async(e,t={})=>(await c.insertMany([e],t))[0],updateMany:async(e,t,o={})=>{let s=o.getTime?.()??new Date,r=g.getStore(),u=(await n.find(e,{session:r,projection:{[M]:1}}).toArray()).map(b=>b[M]),y={[M]:{$in:u}};return await n.updateMany(y,d(t,s),{session:r}),c.findMany(y)},updateOne:async(e,t,o={})=>{let s=o.getTime?.()??new Date,r=await n.findOneAndUpdate(e,d(t,s),{returnDocument:"after",session:g.getStore()});return r?l(r,void 0):null},updateById:async(e,t,o={})=>await c.updateOne({[M]:e},t,o),upsertOne:async(e,t,o={})=>{let s=o.getTime?.()??new Date,r=await n.findOneAndUpdate(e,{...d("update"in t?t.update:{},s,!0),$setOnInsert:f(t.insert,o.makeId?.()??new I().toString(),s,!0)},{returnDocument:"after",session:g.getStore(),upsert:!0});return l(r,void 0)},deleteMany:async(e,t={})=>{let o=await c.findMany(e,t);return await n.deleteMany(e,{session:g.getStore()}),o},deleteOne:async e=>{let t=await n.findOneAndDelete(e,{session:g.getStore()});return t?l(t,void 0):null},deleteById:async e=>await c.deleteOne({[M]:e}),bulkWrite:async(e,t={})=>{if(!e.length)return;let o=n.initializeUnorderedBulkOp({session:g.getStore()}),s=t.getTime?.()??new Date;e.forEach((r,p)=>{switch(r.op){case"insert":o.insert(f(r.value,r.makeId?.(p)??new I().toString(),s));break;case"delete":o.find(r.filter).delete();break;case"update":o.find(r.filter).update(d(r.value,s));break;case"upsert":o.find(r.filter).upsert().update({...d("update"in r?r.update:{},s,!0),$setOnInsert:f(r.insert,r.makeId?.(p)??new I().toString(),s,!0)});break;default:throw new C("Unknown bulkWrite operation",{operation:r})}}),await o.execute({session:g.getStore()})},watch(e){return m.config.changes||w.crash(new C("Db changes are not enabled in the configuration.",{config:i})),new k(m.mongoConfig,m.config.changes,n,e,t=>i.mapper(t))}};return c}};export{W as MongoDb,k as MongoDbChange,_ as mongoDbConfigPipe};
2
2
  //# sourceMappingURL=index.min.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/dbs/adapters/mongodb/changes.ts","../../../../../src/dbs/adapters/base/changes.ts","../../../../../src/dbs/adapters/mongodb/db.ts","../../../../../src/dbs/adapters/mongodb/pipes.ts","../../../../../src/dbs/adapters/mongodb/query.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport type { MongoDbConfig } from './pipes'\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { retry } from '../../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.stream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on('start', async () => {\n\t\t\tif (this.#started) return\n\t\t\tthis.#started = true\n\n\t\t\tawait retry(\n\t\t\t\tasync () => {\n\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t})\n\n\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\treturn { done: false }\n\t\t\t\t},\n\t\t\t\t6,\n\t\t\t\t30_000,\n\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t})\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n","import axios from 'axios'\nimport { v } from 'valleyed'\n\nimport * as core from './core'\nimport { dbChangeConfigPipe, type DbChangeConfig } from './types'\nimport { EquippedError } from '../../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {\n\t\tthis.config = v.assert(dbChangeConfigPipe(), config)\n\t}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\tMongoClient,\n\tObjectId,\n\ttype CollectionInfo,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\nimport { v } from 'valleyed'\n\nimport { MongoDbChange } from './changes'\nimport { mongoDbConfigPipe, type MongoDbConfig } from './pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { QueryParamsBase } from '../../pipes'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.mongoConfig = v.assert(mongoDbConfigPipe(), mongoConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on('start', async () => {\n\t\t\tawait this.client.connect()\n\n\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\treturn acc\n\t\t\t}, {})\n\n\t\t\tconst options = {\n\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t}\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\t\t})\n\t\tInstance.on('close', async () => this.client.close())\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tfunction transform(doc: WI, select?: core.Select<Entity>): Entity\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI[], select?: core.Select<Entity>): Entity[]\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI | WI[], select?: core.Select<Entity>) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model, select))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params as QueryParamsBase)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: transform(results.results as any, params.select as core.Select<Entity>),\n\t\t\t\t} as any\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst { select, ...rest } = options\n\t\t\t\tconst projection = select?.length ? Object.fromEntries(select.map((k) => [k, 1])) : undefined\n\t\t\t\tconst sortArray = Array.isArray(rest.sort) ? rest.sort : rest.sort ? [rest.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: rest.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t\tprojection,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs, select as core.Select<Entity>) as any\n\t\t\t},\n\n\t\t\tfindOne: async (filter: core.Filter<Model>, options = {}) => {\n\t\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 } as any)\n\t\t\t\treturn (result.at(0) ?? null) as any\n\t\t\t},\n\n\t\t\tfindById: async (id, options = {}) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options as any)\n\t\t\t\treturn result as any\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc, undefined) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc, undefined)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc, undefined) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tif (!operations.length) return\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, (m) =>\n\t\t\t\t\tconfig.mapper(m),\n\t\t\t\t)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n","import { type PipeInput, v } from 'valleyed'\n\nexport const mongoDbConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\turi: v.string(),\n\t\t}),\n\t\t{ title: 'Mongodb Config', $refId: 'MongodbConfig' },\n\t)\n\nexport type MongoDbConfig = PipeInput<ReturnType<typeof mongoDbConfigPipe>>\n","import { Collection } from 'mongodb'\n\nimport { QueryKeys, type QueryParamsBase, type QueryResults, type QueryWhereBlock, type QueryWhereClause } from '../../pipes'\nimport * as core from '../base/core'\n\nexport const parseMongodbQueryParams = async <Model extends core.Model<{ _id: string }>>(\n\tcollection: Collection<Model>,\n\tparams: QueryParamsBase,\n): Promise<QueryResults<Model>> => {\n\t// Handle where/search clauses\n\tconst query = <ReturnType<typeof buildWhereQuery>[]>[]\n\tconst where = buildWhereQuery(params.where, params.whereType)\n\tif (where) query.push(where)\n\tconst auth = buildWhereQuery(params.auth, params.authType)\n\tif (auth) query.push(auth)\n\tif (params.search && params.search.fields.length > 0) {\n\t\tconst search = params.search.fields.map((field) => ({\n\t\t\t[field]: {\n\t\t\t\t$regex: new RegExp(params.search!.value, 'i'),\n\t\t\t},\n\t\t}))\n\t\tquery.push({ $or: search })\n\t}\n\tconst totalClause = {}\n\tif (query.length > 0) totalClause['$and'] = query\n\n\t// Handle sort clauses\n\tconst sort = params.sort.map((p) => [p.field, p.desc ? 'desc' : 'asc'])\n\n\t// Handle limit/offest clause\n\tconst all = params.all ?? false\n\tconst limit = params.limit\n\tconst page = params.page\n\n\tconst total = await collection.countDocuments(totalClause)\n\n\tconst projection = params.select?.length ? Object.fromEntries(params.select.map((k) => [k, 1])) : undefined\n\tlet builtQuery = collection.find(totalClause, { projection })\n\tif (sort.length) builtQuery = builtQuery.sort(Object.fromEntries(sort))\n\tif (!all && limit) {\n\t\tbuiltQuery = builtQuery.limit(limit)\n\t\tif (page) builtQuery = builtQuery.skip((page - 1) * limit)\n\t}\n\n\tconst results = await builtQuery.toArray()\n\tconst start = 1\n\tconst last = Math.ceil(total / limit) || 1\n\tconst next = page >= last ? null : page + 1\n\tconst previous = page <= start ? null : page - 1\n\n\treturn {\n\t\tpages: { start, last, next, previous, current: page },\n\t\tdocs: { limit, total, count: results.length },\n\t\tresults: results as any[],\n\t} satisfies QueryResults<Model>\n}\n\nfunction isWhereBlock(param: QueryWhereClause): param is QueryWhereBlock {\n\treturn Object.values(QueryKeys).includes(param.condition as QueryKeys)\n}\n\nconst buildWhereQuery = (params: QueryWhereClause[], key: QueryKeys = QueryKeys.and): Record<string, Record<string, any>> | null => {\n\tconst where = (Array.isArray(params) ? params : [])\n\t\t.map((param) => {\n\t\t\tif (isWhereBlock(param)) return buildWhereQuery(param.value, param.condition)\n\t\t\tconst { field } = param\n\t\t\tconst checkedField = field === 'id' ? '_id' : (field ?? '')\n\t\t\tconst checkedValue = param.value === undefined ? '' : param.value\n\t\t\treturn {\n\t\t\t\tfield: checkedField,\n\t\t\t\tvalue: checkedValue,\n\t\t\t\tcondition: param.condition,\n\t\t\t\tisWhere: true,\n\t\t\t}\n\t\t})\n\t\t.filter((c) => !!c)\n\t\t.map((c) => {\n\t\t\tif (c.isWhere) return { [`${c.field}`]: { [`$${c.condition}`]: c.value } }\n\t\t\telse return c\n\t\t})\n\n\treturn where.length > 0 ? { [`$${key}`]: where } : null\n}\n"],"mappings":"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","names":["differ","axios","v","TopicPrefix","DbChange","config","callbacks","mapper","v","dbChangeConfigPipe","key","data","instance","axios","err","EquippedError","MongoDbChange","DbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","dbName","colName","dbColName","topic","TopicPrefix","TestId","condition","op","before","after","differ","Instance","retry","err","EquippedError","AsyncLocalStorage","MongoClient","ObjectId","v","v","mongoDbConfigPipe","parseMongodbQueryParams","collection","params","query","where","buildWhereQuery","auth","search","field","totalClause","sort","p","all","limit","page","total","projection","k","builtQuery","results","start","last","next","previous","isWhereBlock","param","QueryKeys","key","checkedField","checkedValue","c","idKey","sessionStore","AsyncLocalStorage","MongoDb","Db","mongoConfig","dbConfig","v","mongoDbConfigPipe","MongoClient","Instance","grouped","#cols","acc","cur","options","dbName","colNames","db","collections","colName","existing","collection","callback","session","ObjectId","config","#getTable","transform","doc","select","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","dbThis","table","params","results","parseMongodbQueryParams","filter","rest","projection","k","sort","p","docs","values","payload","i","data","ids","filterUpd","operations","bulk","operation","EquippedError","callbacks","MongoDbChange","m"]}
1
+ {"version":3,"sources":["../../../../../src/dbs/adapters/mongodb/changes.ts","../../../../../src/dbs/adapters/base/changes.ts","../../../../../src/dbs/adapters/mongodb/db.ts","../../../../../src/dbs/adapters/mongodb/pipes.ts","../../../../../src/dbs/adapters/mongodb/query.ts"],"sourcesContent":["import { Collection, type Filter } from 'mongodb'\nimport { differ } from 'valleyed'\n\nimport type { MongoDbConfig } from './pipes'\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport { retry } from '../../../utilities'\nimport { DbChange, TopicPrefix } from '../base/changes'\nimport * as core from '../base/core'\nimport type { DbChangeConfig } from '../base/types'\n\nexport class MongoDbChange<Model extends core.Model<{ _id: string }>, Entity extends core.Entity> extends DbChange<Model, Entity> {\n\t#started = false\n\n\tconstructor(\n\t\tconfig: MongoDbConfig,\n\t\tchange: DbChangeConfig,\n\t\tcollection: Collection<Model>,\n\t\tcallbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tmapper: (model: Model) => Entity,\n\t) {\n\t\tsuper(change, callbacks, mapper)\n\n\t\tconst hydrate = (data: any) =>\n\t\t\tdata._id\n\t\t\t\t? {\n\t\t\t\t\t\t...data,\n\t\t\t\t\t\t_id: data._id['$oid'] ?? data._id,\n\t\t\t\t\t}\n\t\t\t\t: undefined\n\n\t\tconst dbName = collection.dbName\n\t\tconst colName = collection.collectionName\n\t\tconst dbColName = `${dbName}.${colName}`\n\t\tconst topic = `${TopicPrefix}.${dbColName}`\n\n\t\tconst TestId = '5f5f65717569707065645f5f' // __equipped__\n\t\tconst condition = { _id: TestId } as Filter<Model>\n\n\t\tchange.eventBus.stream(topic as never, { skipScope: true }).subscribe(async (data: DbDocumentChange) => {\n\t\t\tconst op = data.op\n\n\t\t\tlet before = JSON.parse(data.before ?? 'null')\n\t\t\tlet after = JSON.parse(data.after ?? 'null')\n\n\t\t\tif (before) before = hydrate(before)\n\t\t\tif (after) after = hydrate(after)\n\t\t\tif (before?._id === TestId || after?._id === TestId) return\n\n\t\t\tif (op === 'c' && this.callbacks.created && after)\n\t\t\t\tawait this.callbacks.created({\n\t\t\t\t\tbefore: null,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t})\n\t\t\telse if (op === 'u' && this.callbacks.updated && before && after)\n\t\t\t\tawait this.callbacks.updated({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: this.mapper(after)!,\n\t\t\t\t\tchanges: differ.from(differ.diff(before, after)),\n\t\t\t\t})\n\t\t\telse if (op === 'd' && this.callbacks.deleted && before)\n\t\t\t\tawait this.callbacks.deleted({\n\t\t\t\t\tbefore: this.mapper(before)!,\n\t\t\t\t\tafter: null,\n\t\t\t\t})\n\t\t})\n\n\t\tInstance.on('start', async () => {\n\t\t\tif (this.#started) return\n\t\t\tthis.#started = true\n\n\t\t\tawait retry(\n\t\t\t\tasync () => {\n\t\t\t\t\tconst started = await this.configureConnector(topic, {\n\t\t\t\t\t\t'connector.class': 'io.debezium.connector.mongodb.MongoDbConnector',\n\t\t\t\t\t\t'capture.mode': 'change_streams_update_full_with_pre_image',\n\t\t\t\t\t\t'mongodb.connection.string': config.uri,\n\t\t\t\t\t\t'collection.include.list': dbColName,\n\t\t\t\t\t\t'snapshot.mode': 'when_needed',\n\t\t\t\t\t\t'capture.scope': 'collection',\n\t\t\t\t\t\t'capture.target': dbColName,\n\t\t\t\t\t\t'heartbeat.interval.ms': '60000',\n\t\t\t\t\t\t'errors.max.retries': '3',\n\t\t\t\t\t})\n\n\t\t\t\t\tif (started) return { done: true, value: true }\n\t\t\t\t\tawait collection.findOneAndUpdate(condition, { $set: { colName } as any }, { upsert: true })\n\t\t\t\t\tawait collection.findOneAndDelete(condition)\n\t\t\t\t\tInstance.get().log.warn(`Waiting for db changes for ${dbColName} to start...`)\n\t\t\t\t\treturn { done: false }\n\t\t\t\t},\n\t\t\t\t6,\n\t\t\t\t30_000,\n\t\t\t).catch((err) => Instance.crash(new EquippedError(`Failed to start db changes`, { dbColName }, err)))\n\t\t})\n\t}\n}\n\ntype DbDocumentChange = {\n\tbefore: string | null\n\tafter: string | null\n\top: 'c' | 'u' | 'd'\n}\n","import axios from 'axios'\nimport { v } from 'valleyed'\n\nimport * as core from './core'\nimport { dbChangeConfigPipe, type DbChangeConfig } from './types'\nimport { EquippedError } from '../../../errors'\n\nexport const TopicPrefix = 'db-changes'\n\nexport abstract class DbChange<Model extends core.Model<core.IdType>, Entity extends core.Entity> {\n\tconstructor(\n\t\tprotected config: DbChangeConfig,\n\t\tprotected callbacks: core.DbChangeCallbacks<Model, Entity>,\n\t\tprotected mapper: (model: Model) => Entity,\n\t) {\n\t\tthis.config = v.assert(dbChangeConfigPipe(), config)\n\t}\n\n\tprotected async configureConnector(key: string, data: Record<string, string>) {\n\t\tconst instance = axios.create({ baseURL: this.config.debeziumUrl })\n\t\treturn await instance\n\t\t\t.put(`/connectors/${key}/config`, {\n\t\t\t\t'topic.prefix': TopicPrefix,\n\t\t\t\t'topic.creation.enable': 'false',\n\t\t\t\t'topic.creation.default.replication.factor': `-1`,\n\t\t\t\t'topic.creation.default.partitions': '-1',\n\t\t\t\t'key.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'key.converter.schemas.enable': 'false',\n\t\t\t\t'value.converter': 'org.apache.kafka.connect.json.JsonConverter',\n\t\t\t\t'value.converter.schemas.enable': 'false',\n\t\t\t\t...data,\n\t\t\t})\n\t\t\t.then(async () => {\n\t\t\t\tconst topics = await instance.get(`/connectors/${key}/topics`)\n\t\t\t\treturn topics.data[key]?.topics?.includes?.(key) ?? false\n\t\t\t})\n\t\t\t.catch((err) => {\n\t\t\t\tthrow new EquippedError(`Failed to configure watcher`, { key }, err)\n\t\t\t})\n\t}\n}\n","import { AsyncLocalStorage } from 'node:async_hooks'\n\nimport {\n\tClientSession,\n\tCollection,\n\tMongoClient,\n\tObjectId,\n\ttype CollectionInfo,\n\ttype OptionalUnlessRequiredId,\n\ttype SortDirection,\n\ttype WithId,\n} from 'mongodb'\nimport { v } from 'valleyed'\n\nimport { MongoDbChange } from './changes'\nimport { mongoDbConfigPipe, type MongoDbConfig } from './pipes'\nimport { parseMongodbQueryParams } from './query'\nimport { EquippedError } from '../../../errors'\nimport { Instance } from '../../../instance'\nimport type { QueryParamsBase } from '../../pipes'\nimport * as core from '../base/core'\nimport { Db } from '../base/db'\nimport type { DbConfig } from '../base/types'\n\nconst idKey = '_id'\ntype IdType = { _id: string }\n\nconst sessionStore = new AsyncLocalStorage<ClientSession | undefined>(undefined)\n\nexport class MongoDb extends Db<{ _id: string }> {\n\tclient: MongoClient\n\t#cols: { db: string; col: string }[] = []\n\n\tconstructor(\n\t\tprivate mongoConfig: MongoDbConfig,\n\t\tdbConfig: DbConfig,\n\t) {\n\t\tsuper(dbConfig)\n\t\tthis.mongoConfig = v.assert(mongoDbConfigPipe(), mongoConfig)\n\t\tthis.client = new MongoClient(mongoConfig.uri, { ignoreUndefined: true })\n\t\tInstance.on('start', async () => {\n\t\t\tawait this.client.connect()\n\n\t\t\tconst grouped = this.#cols.reduce<Record<string, string[]>>((acc, cur) => {\n\t\t\t\tif (!acc[cur.db]) acc[cur.db] = []\n\t\t\t\tacc[cur.db].push(cur.col)\n\t\t\t\treturn acc\n\t\t\t}, {})\n\n\t\t\tconst options = {\n\t\t\t\tchangeStreamPreAndPostImages: { enabled: true },\n\t\t\t}\n\t\t\tawait Promise.all(\n\t\t\t\tObject.entries(grouped).map(async ([dbName, colNames]) => {\n\t\t\t\t\tconst db = this.client.db(dbName)\n\t\t\t\t\tconst collections = await db.listCollections<CollectionInfo>().toArray()\n\t\t\t\t\treturn colNames.map(async (colName) => {\n\t\t\t\t\t\tconst existing = collections.find((collection) => collection.name === colName)\n\t\t\t\t\t\tif (existing) {\n\t\t\t\t\t\t\tif (\n\t\t\t\t\t\t\t\texisting.options?.changeStreamPreAndPostImages?.enabled !== options.changeStreamPreAndPostImages.enabled\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t\tawait db.command({ collMod: colName, ...options })\n\t\t\t\t\t\t} else await db.createCollection(colName, options)\n\t\t\t\t\t})\n\t\t\t\t}),\n\t\t\t)\n\t\t})\n\t\tInstance.on('close', async () => this.client.close())\n\t}\n\n\tasync session<T>(callback: () => Promise<T>) {\n\t\tif (sessionStore.getStore()) return callback()\n\t\tconst session = await this.client.startSession()\n\t\treturn session.withTransaction(async () => sessionStore.run(session, callback))\n\t}\n\n\tid() {\n\t\treturn new ObjectId()\n\t}\n\n\tuse<Model extends core.Model<{ _id: string }>, Entity extends core.Entity>(config: core.Config<Model, Entity>) {\n\t\tconst db = this.getScopedDb(config.db)\n\t\tthis.#cols.push({ db, col: config.col })\n\t\treturn this.#getTable(config, this.client.db(db).collection<Model>(config.col))\n\t}\n\n\t#getTable<Model extends core.Model<IdType>, Entity extends core.Entity>(\n\t\tconfig: core.Config<Model, Entity>,\n\t\tcollection: Collection<Model>,\n\t) {\n\t\ttype WI = Model | WithId<Model>\n\t\tfunction transform(doc: WI, select?: core.Select<Entity>): Entity\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI[], select?: core.Select<Entity>): Entity[]\n\t\t// eslint-disable-next-line no-redeclare\n\t\tfunction transform(doc: WI | WI[], select?: core.Select<Entity>) {\n\t\t\tconst docs = Array.isArray(doc) ? doc : [doc]\n\t\t\tconst mapped = docs.map((d) => config.mapper(d as Model, select))\n\t\t\treturn Array.isArray(doc) ? mapped : mapped[0]\n\t\t}\n\n\t\tfunction prepInsertValue(value: core.CreateInput<Model>, id: string, now: Date, skipUpdate?: boolean) {\n\t\t\tconst base: core.Model<IdType> = {\n\t\t\t\t[idKey]: id,\n\t\t\t\t...(config.options?.skipAudit\n\t\t\t\t\t? {}\n\t\t\t\t\t: {\n\t\t\t\t\t\t\tcreatedAt: now.getTime(),\n\t\t\t\t\t\t\t...(skipUpdate ? {} : { updatedAt: now.getTime() }),\n\t\t\t\t\t\t}),\n\t\t\t}\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t...base,\n\t\t\t} as unknown as OptionalUnlessRequiredId<Model>\n\t\t}\n\n\t\tfunction prepUpdateValue(value: core.UpdateInput<Model>, now: Date, upsert = false) {\n\t\t\treturn {\n\t\t\t\t...value,\n\t\t\t\t$set: {\n\t\t\t\t\t...value.$set,\n\t\t\t\t\t...(upsert || (Object.keys(value).length > 0 && !config.options?.skipAudit) ? { updatedAt: now.getTime() } : {}),\n\t\t\t\t},\n\t\t\t}\n\t\t}\n\n\t\tconst dbThis = this\n\n\t\tconst table: core.Table<IdType, Model, Entity, { collection: Collection<Model> }> = {\n\t\t\tconfig,\n\t\t\textras: { collection },\n\n\t\t\tquery: async (params) => {\n\t\t\t\tconst results = await parseMongodbQueryParams(collection, params as QueryParamsBase)\n\t\t\t\treturn {\n\t\t\t\t\t...results,\n\t\t\t\t\tresults: transform(results.results as any, params.select as core.Select<Entity>),\n\t\t\t\t} as any\n\t\t\t},\n\n\t\t\tfindMany: async (filter, options = {}) => {\n\t\t\t\tconst { select, ...rest } = options\n\t\t\t\tconst projection = select?.length ? Object.fromEntries(select.map((k) => [k, 1])) : undefined\n\t\t\t\tconst sortArray = Array.isArray(rest.sort) ? rest.sort : rest.sort ? [rest.sort] : []\n\t\t\t\tconst sort = sortArray.map((p) => [p.field, p.desc ? 'desc' : 'asc'] as [string, SortDirection])\n\t\t\t\tconst docs = await collection\n\t\t\t\t\t.find(filter, {\n\t\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t\t\tlimit: rest.limit,\n\t\t\t\t\t\tsort,\n\t\t\t\t\t\tprojection,\n\t\t\t\t\t})\n\t\t\t\t\t.toArray()\n\t\t\t\treturn transform(docs, select as core.Select<Entity>) as any\n\t\t\t},\n\n\t\t\tfindOne: async (filter: core.Filter<Model>, options = {}) => {\n\t\t\t\tconst result = await table.findMany(filter, { ...options, limit: 1 } as any)\n\t\t\t\treturn (result.at(0) ?? null) as any\n\t\t\t},\n\n\t\t\tfindById: async (id, options = {}) => {\n\t\t\t\tconst result = await table.findOne({ [idKey]: id } as core.Filter<Model>, options as any)\n\t\t\t\treturn result as any\n\t\t\t},\n\n\t\t\tinsertMany: async (values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst payload = values.map((value, i) => prepInsertValue(value, options.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\tawait collection.insertMany(payload, { session: sessionStore.getStore() })\n\n\t\t\t\tconst insertedData = await Promise.all(payload.map(async (data) => await table.findById(data[idKey] as any)))\n\t\t\t\treturn insertedData.filter((value) => !!value)\n\t\t\t},\n\n\t\t\tinsertOne: async (values, options = {}) => {\n\t\t\t\tconst result = await table.insertMany([values], options)\n\t\t\t\treturn result[0]\n\t\t\t},\n\n\t\t\tupdateMany: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst session = sessionStore.getStore()\n\t\t\t\tconst data = await collection.find(filter, { session, projection: { [idKey]: 1 } }).toArray()\n\t\t\t\tconst ids = data.map((doc) => doc[idKey])\n\t\t\t\tconst filterUpd = { [idKey]: { $in: ids } } as core.Filter<Model>\n\t\t\t\tawait collection.updateMany(filterUpd, prepUpdateValue(values, now), { session })\n\t\t\t\treturn table.findMany(filterUpd)\n\t\t\t},\n\n\t\t\tupdateOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\tconst doc = await collection.findOneAndUpdate(filter, prepUpdateValue(values, now), {\n\t\t\t\t\treturnDocument: 'after',\n\t\t\t\t\tsession: sessionStore.getStore(),\n\t\t\t\t})\n\t\t\t\treturn doc ? transform(doc, undefined) : null\n\t\t\t},\n\n\t\t\tupdateById: async (id, values, options = {}) => {\n\t\t\t\tconst result = await table.updateOne({ [idKey]: id } as core.Filter<Model>, values, options)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tupsertOne: async (filter, values, options = {}) => {\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\n\t\t\t\tconst doc = await collection.findOneAndUpdate(\n\t\t\t\t\tfilter,\n\t\t\t\t\t{\n\t\t\t\t\t\t...prepUpdateValue('update' in values ? values.update : {}, now, true),\n\t\t\t\t\t\t// @ts-expect-error fighting ts\n\t\t\t\t\t\t$setOnInsert: prepInsertValue(values.insert, options.makeId?.() ?? new ObjectId().toString(), now, true),\n\t\t\t\t\t},\n\t\t\t\t\t{ returnDocument: 'after', session: sessionStore.getStore(), upsert: true },\n\t\t\t\t)\n\n\t\t\t\treturn transform(doc, undefined)\n\t\t\t},\n\n\t\t\tdeleteMany: async (filter, options = {}) => {\n\t\t\t\tconst docs = await table.findMany(filter, options)\n\t\t\t\tawait collection.deleteMany(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn docs\n\t\t\t},\n\n\t\t\tdeleteOne: async (filter) => {\n\t\t\t\tconst doc = await collection.findOneAndDelete(filter, { session: sessionStore.getStore() })\n\t\t\t\treturn doc ? transform(doc, undefined) : null\n\t\t\t},\n\n\t\t\tdeleteById: async (id) => {\n\t\t\t\tconst result = await table.deleteOne({ [idKey]: id } as core.Filter<Model>)\n\t\t\t\treturn result\n\t\t\t},\n\n\t\t\tbulkWrite: async (operations, options = {}) => {\n\t\t\t\tif (!operations.length) return\n\t\t\t\tconst bulk = collection.initializeUnorderedBulkOp({ session: sessionStore.getStore() })\n\t\t\t\tconst now = options.getTime?.() ?? new Date()\n\t\t\t\toperations.forEach((operation, i) => {\n\t\t\t\t\tswitch (operation.op) {\n\t\t\t\t\t\tcase 'insert':\n\t\t\t\t\t\t\tbulk.insert(prepInsertValue(operation.value, operation.makeId?.(i) ?? new ObjectId().toString(), now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'delete':\n\t\t\t\t\t\t\tbulk.find(operation.filter).delete()\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'update':\n\t\t\t\t\t\t\tbulk.find(operation.filter).update(prepUpdateValue(operation.value, now))\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tcase 'upsert':\n\t\t\t\t\t\t\tbulk.find(operation.filter)\n\t\t\t\t\t\t\t\t.upsert()\n\t\t\t\t\t\t\t\t.update({\n\t\t\t\t\t\t\t\t\t...prepUpdateValue('update' in operation ? operation.update : {}, now, true),\n\t\t\t\t\t\t\t\t\t$setOnInsert: prepInsertValue(\n\t\t\t\t\t\t\t\t\t\toperation.insert as any,\n\t\t\t\t\t\t\t\t\t\toperation.makeId?.(i) ?? new ObjectId().toString(),\n\t\t\t\t\t\t\t\t\t\tnow,\n\t\t\t\t\t\t\t\t\t\ttrue,\n\t\t\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tthrow new EquippedError(`Unknown bulkWrite operation`, { operation })\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\tawait bulk.execute({ session: sessionStore.getStore() })\n\t\t\t},\n\n\t\t\twatch(callbacks) {\n\t\t\t\tif (!dbThis.config.changes)\n\t\t\t\t\tInstance.crash(new EquippedError('Db changes are not enabled in the configuration.', { config }))\n\t\t\t\treturn new MongoDbChange<Model, Entity>(dbThis.mongoConfig, dbThis.config.changes, collection, callbacks, (m) =>\n\t\t\t\t\tconfig.mapper(m),\n\t\t\t\t)\n\t\t\t},\n\t\t}\n\n\t\treturn table\n\t}\n}\n","import { type PipeInput, v } from 'valleyed'\n\nexport const mongoDbConfigPipe = () =>\n\tv.meta(\n\t\tv.object({\n\t\t\turi: v.string(),\n\t\t}),\n\t\t{ title: 'Mongodb Config', $refId: 'MongodbConfig' },\n\t)\n\nexport type MongoDbConfig = PipeInput<ReturnType<typeof mongoDbConfigPipe>>\n","import { Collection } from 'mongodb'\n\nimport { QueryKeys, type QueryParamsBase, type QueryResults, type QueryWhereBlock, type QueryWhereClause } from '../../pipes'\nimport * as core from '../base/core'\n\nexport const parseMongodbQueryParams = async <Model extends core.Model<{ _id: string }>>(\n\tcollection: Collection<Model>,\n\tparams: QueryParamsBase,\n): Promise<QueryResults<Model>> => {\n\t// Handle where/search clauses\n\tconst query = <ReturnType<typeof buildWhereQuery>[]>[]\n\tconst where = buildWhereQuery(params.where, params.whereType)\n\tif (where) query.push(where)\n\tconst auth = buildWhereQuery(params.auth, params.authType)\n\tif (auth) query.push(auth)\n\tif (params.search && params.search.fields.length > 0) {\n\t\tconst search = params.search.fields.map((field) => ({\n\t\t\t[field]: {\n\t\t\t\t$regex: new RegExp(params.search!.value, 'i'),\n\t\t\t},\n\t\t}))\n\t\tquery.push({ $or: search })\n\t}\n\tconst totalClause = {}\n\tif (query.length > 0) totalClause['$and'] = query\n\n\t// Handle sort clauses\n\tconst sort = params.sort.map((p) => [p.field, p.desc ? 'desc' : 'asc'])\n\n\t// Handle limit/offest clause\n\tconst all = params.all ?? false\n\tconst limit = params.limit\n\tconst page = params.page\n\n\tconst total = await collection.countDocuments(totalClause)\n\n\tconst projection = params.select?.length ? Object.fromEntries(params.select.map((k) => [k, 1])) : undefined\n\tlet builtQuery = collection.find(totalClause, { projection })\n\tif (sort.length) builtQuery = builtQuery.sort(Object.fromEntries(sort))\n\tif (!all && limit) {\n\t\tbuiltQuery = builtQuery.limit(limit)\n\t\tif (page) builtQuery = builtQuery.skip((page - 1) * limit)\n\t}\n\n\tconst results = await builtQuery.toArray()\n\tconst start = 1\n\tconst last = Math.ceil(total / limit) || 1\n\tconst next = page >= last ? null : page + 1\n\tconst previous = page <= start ? null : page - 1\n\n\treturn {\n\t\tpages: { start, last, next, previous, current: page },\n\t\tdocs: { limit, total, count: results.length },\n\t\tresults: results as any[],\n\t} satisfies QueryResults<Model>\n}\n\nfunction isWhereBlock(param: QueryWhereClause): param is QueryWhereBlock {\n\treturn Object.values(QueryKeys).includes(param.condition as QueryKeys)\n}\n\nconst buildWhereQuery = (params: QueryWhereClause[], key: QueryKeys = QueryKeys.and): Record<string, Record<string, any>> | null => {\n\tconst where = (Array.isArray(params) ? params : [])\n\t\t.map((param) => {\n\t\t\tif (isWhereBlock(param)) return buildWhereQuery(param.value, param.condition)\n\t\t\tconst { field } = param\n\t\t\tconst checkedField = field === 'id' ? '_id' : (field ?? '')\n\t\t\tconst checkedValue = param.value === undefined ? '' : param.value\n\t\t\treturn {\n\t\t\t\tfield: checkedField,\n\t\t\t\tvalue: checkedValue,\n\t\t\t\tcondition: param.condition,\n\t\t\t\tisWhere: true,\n\t\t\t}\n\t\t})\n\t\t.filter((c) => !!c)\n\t\t.map((c) => {\n\t\t\tif (c.isWhere) return { [`${c.field}`]: { [`$${c.condition}`]: c.value } }\n\t\t\telse return c\n\t\t})\n\n\treturn where.length > 0 ? { [`$${key}`]: where } : null\n}\n"],"mappings":"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","names":["differ","axios","v","TopicPrefix","DbChange","config","callbacks","mapper","v","dbChangeConfigPipe","key","data","instance","axios","err","EquippedError","MongoDbChange","DbChange","#started","config","change","collection","callbacks","mapper","hydrate","data","dbName","colName","dbColName","topic","TopicPrefix","TestId","condition","op","before","after","differ","Instance","retry","err","EquippedError","AsyncLocalStorage","MongoClient","ObjectId","v","v","mongoDbConfigPipe","parseMongodbQueryParams","collection","params","query","where","buildWhereQuery","auth","search","field","totalClause","sort","p","all","limit","page","total","projection","k","builtQuery","results","start","last","next","previous","isWhereBlock","param","QueryKeys","key","checkedField","checkedValue","c","idKey","sessionStore","AsyncLocalStorage","MongoDb","Db","mongoConfig","dbConfig","v","mongoDbConfigPipe","MongoClient","Instance","grouped","#cols","acc","cur","options","dbName","colNames","db","collections","colName","existing","collection","callback","session","ObjectId","config","#getTable","transform","doc","select","mapped","d","prepInsertValue","value","id","now","skipUpdate","base","prepUpdateValue","upsert","dbThis","table","params","results","parseMongodbQueryParams","filter","rest","projection","k","sort","p","docs","values","payload","i","data","ids","filterUpd","operations","bulk","operation","EquippedError","callbacks","MongoDbChange","m"]}
@@ -2,13 +2,16 @@ import {
2
2
  Db,
3
3
  QueryKeys,
4
4
  dbChangeConfigPipe
5
- } from "../../../chunk-HXFNN6RI.mjs";
6
- import "../../../chunk-7CP7ZE2O.mjs";
5
+ } from "../../../chunk-C3G4W4ZV.mjs";
6
+ import "../../../chunk-BONYW6LU.mjs";
7
7
  import {
8
- EquippedError,
9
- Instance,
10
8
  retry
11
- } from "../../../chunk-A4P7P6BU.mjs";
9
+ } from "../../../chunk-A332TTED.mjs";
10
+ import "../../../chunk-NEF3UYFA.mjs";
11
+ import {
12
+ EquippedError,
13
+ Instance
14
+ } from "../../../chunk-7N4WUZ7P.mjs";
12
15
  import "../../../chunk-VCCS7CAI.mjs";
13
16
  import "../../../chunk-J5LGTIGS.mjs";
14
17