@warlock.js/notifications 5.29.0 → 5.30.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (525) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/cjs/{channel_api-CBB_XoIl.cjs → channel_api-C5ZZDkgQ.cjs} +21 -21
  3. package/cjs/channel_api-C5ZZDkgQ.cjs.map +1 -0
  4. package/cjs/index.cjs +22 -22
  5. package/cjs/index.cjs.map +1 -1
  6. package/cjs/rabbitmq-driver-BFoWr21L.cjs +3 -0
  7. package/cjs/{src-B6UVThgW.cjs → src-eu2jxS21.cjs} +173 -135
  8. package/cjs/src-eu2jxS21.cjs.map +1 -0
  9. package/esm/channels/database-channel.d.mts +1 -1
  10. package/esm/channels/database-channel.d.mts.map +1 -1
  11. package/esm/channels/database-channel.mjs +1 -1
  12. package/esm/channels/database-channel.mjs.map +1 -1
  13. package/esm/channels/mail-channel.d.mts +1 -1
  14. package/esm/channels/mail-channel.d.mts.map +1 -1
  15. package/esm/channels/mail-channel.mjs +1 -1
  16. package/esm/channels/mail-channel.mjs.map +1 -1
  17. package/esm/config.d.mts +1 -1
  18. package/esm/config.d.mts.map +1 -1
  19. package/esm/config.mjs +1 -1
  20. package/esm/config.mjs.map +1 -1
  21. package/esm/contracts/channel.contract.d.mts +1 -1
  22. package/esm/contracts/channel.contract.d.mts.map +1 -1
  23. package/esm/contracts/notification.contract.d.mts +1 -1
  24. package/esm/contracts/notification.contract.d.mts.map +1 -1
  25. package/esm/contracts/preference-provider.contract.d.mts +1 -1
  26. package/esm/contracts/preference-provider.contract.d.mts.map +1 -1
  27. package/esm/contracts/queue-dispatcher.contract.d.mts +1 -1
  28. package/esm/contracts/queue-dispatcher.contract.d.mts.map +1 -1
  29. package/esm/contracts/rate-limiter.contract.d.mts +1 -1
  30. package/esm/contracts/rate-limiter.contract.d.mts.map +1 -1
  31. package/esm/dispatch/define-channel.d.mts +1 -1
  32. package/esm/dispatch/define-channel.d.mts.map +1 -1
  33. package/esm/dispatch/define-channel.mjs +1 -1
  34. package/esm/dispatch/define-channel.mjs.map +1 -1
  35. package/esm/dispatch/define-notification.d.mts +1 -1
  36. package/esm/dispatch/define-notification.d.mts.map +1 -1
  37. package/esm/dispatch/define-notification.mjs +1 -1
  38. package/esm/dispatch/define-notification.mjs.map +1 -1
  39. package/esm/dispatch/dispatch-id.mjs +1 -1
  40. package/esm/dispatch/dispatch-id.mjs.map +1 -1
  41. package/esm/dispatch/dispatcher.mjs +1 -1
  42. package/esm/dispatch/dispatcher.mjs.map +1 -1
  43. package/esm/dispatch/notifications-event-bus.d.mts +1 -1
  44. package/esm/dispatch/notifications-event-bus.d.mts.map +1 -1
  45. package/esm/dispatch/notifications-event-bus.mjs +1 -1
  46. package/esm/dispatch/notifications-event-bus.mjs.map +1 -1
  47. package/esm/dispatch/notify.d.mts +1 -1
  48. package/esm/dispatch/notify.d.mts.map +1 -1
  49. package/esm/dispatch/notify.mjs +1 -1
  50. package/esm/dispatch/notify.mjs.map +1 -1
  51. package/esm/errors.d.mts +1 -1
  52. package/esm/errors.d.mts.map +1 -1
  53. package/esm/errors.mjs +1 -1
  54. package/esm/errors.mjs.map +1 -1
  55. package/esm/in-app/base-notifications-repository.d.mts +1 -1
  56. package/esm/in-app/base-notifications-repository.d.mts.map +1 -1
  57. package/esm/in-app/base-notifications-repository.mjs +1 -1
  58. package/esm/in-app/base-notifications-repository.mjs.map +1 -1
  59. package/esm/in-app/column-map.d.mts +1 -1
  60. package/esm/in-app/column-map.d.mts.map +1 -1
  61. package/esm/in-app/column-map.mjs +1 -1
  62. package/esm/in-app/column-map.mjs.map +1 -1
  63. package/esm/in-app/database-notification.d.mts +1 -1
  64. package/esm/in-app/database-notification.d.mts.map +1 -1
  65. package/esm/in-app/database-notification.mjs +1 -1
  66. package/esm/in-app/database-notification.mjs.map +1 -1
  67. package/esm/in-app/in-app.d.mts +1 -1
  68. package/esm/in-app/in-app.d.mts.map +1 -1
  69. package/esm/in-app/in-app.mjs +1 -1
  70. package/esm/in-app/in-app.mjs.map +1 -1
  71. package/esm/migration/notification-columns.d.mts +1 -1
  72. package/esm/migration/notification-columns.d.mts.map +1 -1
  73. package/esm/migration/notification-columns.mjs +1 -1
  74. package/esm/migration/notification-columns.mjs.map +1 -1
  75. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs +1 -1
  76. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs.map +1 -1
  77. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs +1 -1
  78. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs.map +1 -1
  79. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs +1 -1
  80. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs.map +1 -1
  81. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs +1 -1
  82. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs.map +1 -1
  83. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs +1 -1
  84. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs.map +1 -1
  85. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs +1 -1
  86. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs.map +1 -1
  87. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs +1 -1
  88. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs.map +1 -1
  89. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs +1 -1
  90. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs.map +1 -1
  91. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs +1 -1
  92. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs.map +1 -1
  93. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs +1 -1
  94. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs.map +1 -1
  95. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs +1 -1
  96. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs.map +1 -1
  97. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs +1 -1
  98. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs.map +1 -1
  99. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs +1 -1
  100. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs.map +1 -1
  101. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs +1 -1
  102. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs.map +1 -1
  103. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toStudlyCase.mjs +1 -1
  104. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toStudlyCase.mjs.map +1 -1
  105. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/trim.mjs +1 -1
  106. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/trim.mjs.map +1 -1
  107. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ucfirst.mjs +1 -1
  108. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ucfirst.mjs.map +1 -1
  109. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/words.mjs +1 -1
  110. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/words.mjs.map +1 -1
  111. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/escapeRegex.mjs +1 -1
  112. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/escapeRegex.mjs.map +1 -1
  113. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/lazy.mjs +1 -1
  114. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/lazy.mjs.map +1 -1
  115. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/tap.mjs +1 -1
  116. package/esm/node_modules/.pnpm/@mongez_reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/utils/tap.mjs.map +1 -1
  117. package/esm/node_modules/.pnpm/@mongez_supportive-is@3.0.0/node_modules/@mongez/supportive-is/esm/index.mjs +1 -1
  118. package/esm/node_modules/.pnpm/@mongez_supportive-is@3.0.0/node_modules/@mongez/supportive-is/esm/index.mjs.map +1 -1
  119. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/channel_api.mjs +1 -1
  120. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/channel_api.mjs.map +1 -1
  121. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/api_args.mjs +1 -1
  122. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/api_args.mjs.map +1 -1
  123. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/bitset.mjs +1 -1
  124. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/bitset.mjs.map +1 -1
  125. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel.mjs +1 -1
  126. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel.mjs.map +1 -1
  127. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel_model.mjs +1 -1
  128. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/channel_model.mjs.map +1 -1
  129. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/codec.mjs +1 -1
  130. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/codec.mjs.map +1 -1
  131. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connect.mjs +1 -1
  132. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connect.mjs.map +1 -1
  133. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connection.mjs +1 -1
  134. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/connection.mjs.map +1 -1
  135. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/credentials.mjs +1 -1
  136. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/credentials.mjs.map +1 -1
  137. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/defs.mjs +1 -1
  138. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/defs.mjs.map +1 -1
  139. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/error.mjs +1 -1
  140. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/error.mjs.map +1 -1
  141. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/format.mjs +1 -1
  142. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/format.mjs.map +1 -1
  143. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/frame.mjs +1 -1
  144. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/frame.mjs.map +1 -1
  145. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/heartbeat.mjs +1 -1
  146. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/heartbeat.mjs.map +1 -1
  147. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/mux.mjs +1 -1
  148. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/lib/mux.mjs.map +1 -1
  149. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/package.mjs +1 -1
  150. package/esm/node_modules/.pnpm/amqplib@0.10.9/node_modules/amqplib/package.mjs.map +1 -1
  151. package/esm/node_modules/.pnpm/buffer-more-ints@1.0.0/node_modules/buffer-more-ints/buffer-more-ints.mjs +1 -1
  152. package/esm/node_modules/.pnpm/buffer-more-ints@1.0.0/node_modules/buffer-more-ints/buffer-more-ints.mjs.map +1 -1
  153. package/esm/node_modules/.pnpm/dayjs@1.11.23/node_modules/dayjs/dayjs.min.mjs +1 -1
  154. package/esm/node_modules/.pnpm/dayjs@1.11.23/node_modules/dayjs/dayjs.min.mjs.map +1 -1
  155. package/esm/node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.mjs +1 -1
  156. package/esm/node_modules/.pnpm/querystringify@2.2.0/node_modules/querystringify/index.mjs.map +1 -1
  157. package/esm/node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.mjs +1 -1
  158. package/esm/node_modules/.pnpm/requires-port@1.0.0/node_modules/requires-port/index.mjs.map +1 -1
  159. package/esm/node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.mjs +1 -1
  160. package/esm/node_modules/.pnpm/url-parse@1.5.10/node_modules/url-parse/index.mjs.map +1 -1
  161. package/esm/{herald → packages/herald}/src/communicators/broker-registry.mjs +1 -1
  162. package/esm/packages/herald/src/communicators/broker-registry.mjs.map +1 -0
  163. package/esm/{herald → packages/herald}/src/communicators/broker.mjs +1 -1
  164. package/esm/packages/herald/src/communicators/broker.mjs.map +1 -0
  165. package/esm/{herald → packages/herald}/src/decorators/consumable.mjs +1 -1
  166. package/esm/packages/herald/src/decorators/consumable.mjs.map +1 -0
  167. package/esm/{herald → packages/herald}/src/drivers/rabbitmq/rabbitmq-channel.mjs +1 -1
  168. package/esm/packages/herald/src/drivers/rabbitmq/rabbitmq-channel.mjs.map +1 -0
  169. package/esm/{herald → packages/herald}/src/drivers/rabbitmq/rabbitmq-driver.mjs +3 -3
  170. package/esm/packages/herald/src/drivers/rabbitmq/rabbitmq-driver.mjs.map +1 -0
  171. package/esm/{herald → packages/herald}/src/message-managers/event-consumer.mjs +1 -1
  172. package/esm/packages/herald/src/message-managers/event-consumer.mjs.map +1 -0
  173. package/esm/{herald → packages/herald}/src/message-managers/event-message.mjs +1 -1
  174. package/esm/packages/herald/src/message-managers/event-message.mjs.map +1 -0
  175. package/esm/{herald → packages/herald}/src/message-managers/prepare-consumer-subscription.mjs +1 -1
  176. package/esm/packages/herald/src/message-managers/prepare-consumer-subscription.mjs.map +1 -0
  177. package/esm/{herald → packages/herald}/src/use-case-broadcast.mjs +1 -1
  178. package/esm/packages/herald/src/use-case-broadcast.mjs.map +1 -0
  179. package/esm/{herald → packages/herald}/src/utils/connect-to-broker.mjs +1 -1
  180. package/esm/packages/herald/src/utils/connect-to-broker.mjs.map +1 -0
  181. package/esm/{seal → packages/seal}/src/config.mjs +1 -1
  182. package/esm/packages/seal/src/config.mjs.map +1 -0
  183. package/esm/{seal → packages/seal}/src/factory/validate.mjs +12 -4
  184. package/esm/packages/seal/src/factory/validate.mjs.map +1 -0
  185. package/esm/{seal → packages/seal}/src/factory/validators.mjs +1 -1
  186. package/esm/packages/seal/src/factory/validators.mjs.map +1 -0
  187. package/esm/{seal → packages/seal}/src/helpers/date-helpers.mjs +1 -1
  188. package/esm/packages/seal/src/helpers/date-helpers.mjs.map +1 -0
  189. package/esm/{seal → packages/seal}/src/helpers/get-field-value.mjs +3 -3
  190. package/esm/packages/seal/src/helpers/get-field-value.mjs.map +1 -0
  191. package/esm/packages/seal/src/helpers/is-empty-value.mjs +10 -0
  192. package/esm/packages/seal/src/helpers/is-empty-value.mjs.map +1 -0
  193. package/esm/{seal → packages/seal}/src/helpers/path-helpers.mjs +1 -1
  194. package/esm/packages/seal/src/helpers/path-helpers.mjs.map +1 -0
  195. package/esm/{seal → packages/seal}/src/helpers/validation-helpers.mjs +1 -1
  196. package/esm/packages/seal/src/helpers/validation-helpers.mjs.map +1 -0
  197. package/esm/{seal → packages/seal}/src/mutators/array-mutators.mjs +3 -3
  198. package/esm/packages/seal/src/mutators/array-mutators.mjs.map +1 -0
  199. package/esm/{seal → packages/seal}/src/mutators/boolean-mutators.mjs +1 -1
  200. package/esm/packages/seal/src/mutators/boolean-mutators.mjs.map +1 -0
  201. package/esm/{seal → packages/seal}/src/mutators/date-mutators.mjs +3 -3
  202. package/esm/packages/seal/src/mutators/date-mutators.mjs.map +1 -0
  203. package/esm/{seal → packages/seal}/src/mutators/number-mutators.mjs +4 -4
  204. package/esm/packages/seal/src/mutators/number-mutators.mjs.map +1 -0
  205. package/esm/{seal → packages/seal}/src/mutators/object-mutators.mjs +4 -4
  206. package/esm/packages/seal/src/mutators/object-mutators.mjs.map +1 -0
  207. package/esm/{seal → packages/seal}/src/mutators/scalar-mutators.mjs +1 -1
  208. package/esm/packages/seal/src/mutators/scalar-mutators.mjs.map +1 -0
  209. package/esm/{seal → packages/seal}/src/mutators/string-mutators.mjs +11 -11
  210. package/esm/packages/seal/src/mutators/string-mutators.mjs.map +1 -0
  211. package/esm/{seal → packages/seal}/src/object.mjs +1 -1
  212. package/esm/packages/seal/src/object.mjs.map +1 -0
  213. package/esm/{seal → packages/seal}/src/rules/array/array-rules.mjs +1 -1
  214. package/esm/packages/seal/src/rules/array/array-rules.mjs.map +1 -0
  215. package/esm/{seal → packages/seal}/src/rules/color/color-rules.mjs +1 -1
  216. package/esm/packages/seal/src/rules/color/color-rules.mjs.map +1 -0
  217. package/esm/{seal → packages/seal}/src/rules/common/enum.mjs +1 -1
  218. package/esm/packages/seal/src/rules/common/enum.mjs.map +1 -0
  219. package/esm/{seal → packages/seal}/src/rules/common/equals-field-rules.mjs +1 -1
  220. package/esm/packages/seal/src/rules/common/equals-field-rules.mjs.map +1 -0
  221. package/esm/{seal → packages/seal}/src/rules/common/instanceof.mjs +1 -1
  222. package/esm/packages/seal/src/rules/common/instanceof.mjs.map +1 -0
  223. package/esm/{seal → packages/seal}/src/rules/common/literal.mjs +1 -1
  224. package/esm/packages/seal/src/rules/common/literal.mjs.map +1 -0
  225. package/esm/{seal → packages/seal}/src/rules/common/type-rules.mjs +2 -2
  226. package/esm/packages/seal/src/rules/common/type-rules.mjs.map +1 -0
  227. package/esm/{seal → packages/seal}/src/rules/common/unknown-key.mjs +1 -1
  228. package/esm/packages/seal/src/rules/common/unknown-key.mjs.map +1 -0
  229. package/esm/{seal → packages/seal}/src/rules/conditional/forbidden-if-rules.mjs +1 -1
  230. package/esm/packages/seal/src/rules/conditional/forbidden-if-rules.mjs.map +1 -0
  231. package/esm/{seal → packages/seal}/src/rules/conditional/present-if-rules.mjs +1 -1
  232. package/esm/packages/seal/src/rules/conditional/present-if-rules.mjs.map +1 -0
  233. package/esm/{seal → packages/seal}/src/rules/conditional/present-unless-rules.mjs +1 -1
  234. package/esm/packages/seal/src/rules/conditional/present-unless-rules.mjs.map +1 -0
  235. package/esm/{seal → packages/seal}/src/rules/conditional/present-with-rules.mjs +3 -3
  236. package/esm/packages/seal/src/rules/conditional/present-with-rules.mjs.map +1 -0
  237. package/esm/{seal → packages/seal}/src/rules/conditional/present-without-rules.mjs +3 -3
  238. package/esm/packages/seal/src/rules/conditional/present-without-rules.mjs.map +1 -0
  239. package/esm/{seal → packages/seal}/src/rules/conditional/required-if-rules.mjs +3 -3
  240. package/esm/packages/seal/src/rules/conditional/required-if-rules.mjs.map +1 -0
  241. package/esm/{seal → packages/seal}/src/rules/conditional/required-unless-rules.mjs +1 -1
  242. package/esm/packages/seal/src/rules/conditional/required-unless-rules.mjs.map +1 -0
  243. package/esm/{seal → packages/seal}/src/rules/conditional/required-when-rule.mjs +1 -1
  244. package/esm/packages/seal/src/rules/conditional/required-when-rule.mjs.map +1 -0
  245. package/esm/{seal → packages/seal}/src/rules/conditional/required-with-rules.mjs +3 -3
  246. package/esm/packages/seal/src/rules/conditional/required-with-rules.mjs.map +1 -0
  247. package/esm/{seal → packages/seal}/src/rules/conditional/required-without-rules.mjs +3 -3
  248. package/esm/packages/seal/src/rules/conditional/required-without-rules.mjs.map +1 -0
  249. package/esm/{seal → packages/seal}/src/rules/core/equal.mjs +1 -1
  250. package/esm/packages/seal/src/rules/core/equal.mjs.map +1 -0
  251. package/esm/{seal → packages/seal}/src/rules/core/forbidden.mjs +1 -1
  252. package/esm/packages/seal/src/rules/core/forbidden.mjs.map +1 -0
  253. package/esm/{seal → packages/seal}/src/rules/core/required.mjs +1 -1
  254. package/esm/packages/seal/src/rules/core/required.mjs.map +1 -0
  255. package/esm/{seal → packages/seal}/src/rules/core/union.mjs +3 -1
  256. package/esm/packages/seal/src/rules/core/union.mjs.map +1 -0
  257. package/esm/{seal → packages/seal}/src/rules/core/when.mjs +3 -3
  258. package/esm/packages/seal/src/rules/core/when.mjs.map +1 -0
  259. package/esm/{seal → packages/seal}/src/rules/date/date-comparison-rules.mjs +1 -1
  260. package/esm/packages/seal/src/rules/date/date-comparison-rules.mjs.map +1 -0
  261. package/esm/{seal → packages/seal}/src/rules/date/date-day-rules.mjs +1 -1
  262. package/esm/packages/seal/src/rules/date/date-day-rules.mjs.map +1 -0
  263. package/esm/{seal → packages/seal}/src/rules/date/date-field-comparison-rules.mjs +3 -3
  264. package/esm/packages/seal/src/rules/date/date-field-comparison-rules.mjs.map +1 -0
  265. package/esm/{seal → packages/seal}/src/rules/date/date-period-rules.mjs +3 -3
  266. package/esm/packages/seal/src/rules/date/date-period-rules.mjs.map +1 -0
  267. package/esm/{seal → packages/seal}/src/rules/date/date-relative-rules.mjs +1 -1
  268. package/esm/packages/seal/src/rules/date/date-relative-rules.mjs.map +1 -0
  269. package/esm/{seal → packages/seal}/src/rules/date/date-special-rules.mjs +1 -1
  270. package/esm/packages/seal/src/rules/date/date-special-rules.mjs.map +1 -0
  271. package/esm/{seal → packages/seal}/src/rules/date/date.mjs +3 -3
  272. package/esm/packages/seal/src/rules/date/date.mjs.map +1 -0
  273. package/esm/{seal → packages/seal}/src/rules/length/length-rules.mjs +1 -1
  274. package/esm/packages/seal/src/rules/length/length-rules.mjs.map +1 -0
  275. package/esm/{seal → packages/seal}/src/rules/number/number-rules.mjs +3 -3
  276. package/esm/packages/seal/src/rules/number/number-rules.mjs.map +1 -0
  277. package/esm/{seal → packages/seal}/src/rules/scalar/accepted-rule.mjs +1 -1
  278. package/esm/packages/seal/src/rules/scalar/accepted-rule.mjs.map +1 -0
  279. package/esm/{seal → packages/seal}/src/rules/scalar/declined-rule.mjs +1 -1
  280. package/esm/packages/seal/src/rules/scalar/declined-rule.mjs.map +1 -0
  281. package/esm/{seal → packages/seal}/src/rules/string/alpha.mjs +1 -1
  282. package/esm/packages/seal/src/rules/string/alpha.mjs.map +1 -0
  283. package/esm/{seal → packages/seal}/src/rules/string/credit-card.mjs +1 -1
  284. package/esm/packages/seal/src/rules/string/credit-card.mjs.map +1 -0
  285. package/esm/{seal → packages/seal}/src/rules/string/email.mjs +2 -2
  286. package/esm/packages/seal/src/rules/string/email.mjs.map +1 -0
  287. package/esm/{seal → packages/seal}/src/rules/string/id-formats.mjs +1 -1
  288. package/esm/packages/seal/src/rules/string/id-formats.mjs.map +1 -0
  289. package/esm/{seal → packages/seal}/src/rules/string/ip.mjs +1 -1
  290. package/esm/packages/seal/src/rules/string/ip.mjs.map +1 -0
  291. package/esm/packages/seal/src/rules/string/matches.mjs +4 -0
  292. package/esm/{seal → packages/seal}/src/rules/string/pattern.mjs +1 -1
  293. package/esm/packages/seal/src/rules/string/pattern.mjs.map +1 -0
  294. package/esm/{seal → packages/seal}/src/rules/string/string-comparison.mjs +1 -1
  295. package/esm/packages/seal/src/rules/string/string-comparison.mjs.map +1 -0
  296. package/esm/{seal → packages/seal}/src/rules/string/strong-password-rule.mjs +1 -1
  297. package/esm/packages/seal/src/rules/string/strong-password-rule.mjs.map +1 -0
  298. package/esm/{seal → packages/seal}/src/rules/string/url.mjs +1 -1
  299. package/esm/packages/seal/src/rules/string/url.mjs.map +1 -0
  300. package/esm/{seal → packages/seal}/src/rules/string/without-whitespace.mjs +1 -1
  301. package/esm/packages/seal/src/rules/string/without-whitespace.mjs.map +1 -0
  302. package/esm/{seal → packages/seal}/src/standard-schema/json-schema.mjs +1 -1
  303. package/esm/packages/seal/src/standard-schema/json-schema.mjs.map +1 -0
  304. package/esm/{seal → packages/seal}/src/standard-schema/map-result.mjs +1 -1
  305. package/esm/packages/seal/src/standard-schema/map-result.mjs.map +1 -0
  306. package/esm/{seal → packages/seal}/src/string.mjs +1 -1
  307. package/esm/packages/seal/src/string.mjs.map +1 -0
  308. package/esm/{seal → packages/seal}/src/types/date-types.mjs +1 -1
  309. package/esm/packages/seal/src/types/date-types.mjs.map +1 -0
  310. package/esm/{seal → packages/seal}/src/validators/any-validator.mjs +1 -1
  311. package/esm/packages/seal/src/validators/any-validator.mjs.map +1 -0
  312. package/esm/{seal → packages/seal}/src/validators/array-validator.mjs +1 -1
  313. package/esm/packages/seal/src/validators/array-validator.mjs.map +1 -0
  314. package/esm/{seal → packages/seal}/src/validators/base-validator.mjs +25 -6
  315. package/esm/packages/seal/src/validators/base-validator.mjs.map +1 -0
  316. package/esm/{seal → packages/seal}/src/validators/boolean-validator.mjs +1 -1
  317. package/esm/packages/seal/src/validators/boolean-validator.mjs.map +1 -0
  318. package/esm/{seal → packages/seal}/src/validators/computed-validator.mjs +1 -1
  319. package/esm/packages/seal/src/validators/computed-validator.mjs.map +1 -0
  320. package/esm/{seal → packages/seal}/src/validators/date-validator.mjs +3 -3
  321. package/esm/packages/seal/src/validators/date-validator.mjs.map +1 -0
  322. package/esm/{seal → packages/seal}/src/validators/discriminated-union-validator.mjs +7 -2
  323. package/esm/packages/seal/src/validators/discriminated-union-validator.mjs.map +1 -0
  324. package/esm/{seal → packages/seal}/src/validators/float-validator.mjs +1 -1
  325. package/esm/packages/seal/src/validators/float-validator.mjs.map +1 -0
  326. package/esm/{seal → packages/seal}/src/validators/instanceof-validator.mjs +1 -1
  327. package/esm/packages/seal/src/validators/instanceof-validator.mjs.map +1 -0
  328. package/esm/{seal → packages/seal}/src/validators/int-validator.mjs +1 -1
  329. package/esm/packages/seal/src/validators/int-validator.mjs.map +1 -0
  330. package/esm/{seal → packages/seal}/src/validators/lazy-validator.mjs +1 -1
  331. package/esm/packages/seal/src/validators/lazy-validator.mjs.map +1 -0
  332. package/esm/{seal → packages/seal}/src/validators/literal-validator.mjs +5 -2
  333. package/esm/packages/seal/src/validators/literal-validator.mjs.map +1 -0
  334. package/esm/{seal → packages/seal}/src/validators/managed-validator.mjs +1 -1
  335. package/esm/packages/seal/src/validators/managed-validator.mjs.map +1 -0
  336. package/esm/{seal → packages/seal}/src/validators/methods/equality-conditional-methods.mjs +1 -1
  337. package/esm/packages/seal/src/validators/methods/equality-conditional-methods.mjs.map +1 -0
  338. package/esm/{seal → packages/seal}/src/validators/methods/forbidden-methods.mjs +1 -1
  339. package/esm/packages/seal/src/validators/methods/forbidden-methods.mjs.map +1 -0
  340. package/esm/{seal → packages/seal}/src/validators/methods/present-methods.mjs +1 -1
  341. package/esm/packages/seal/src/validators/methods/present-methods.mjs.map +1 -0
  342. package/esm/{seal → packages/seal}/src/validators/methods/required-methods.mjs +1 -1
  343. package/esm/packages/seal/src/validators/methods/required-methods.mjs.map +1 -0
  344. package/esm/{seal → packages/seal}/src/validators/number-validator.mjs +1 -1
  345. package/esm/packages/seal/src/validators/number-validator.mjs.map +1 -0
  346. package/esm/{seal → packages/seal}/src/validators/numeric-validator.mjs +2 -2
  347. package/esm/packages/seal/src/validators/numeric-validator.mjs.map +1 -0
  348. package/esm/{seal → packages/seal}/src/validators/object-validator.mjs +8 -6
  349. package/esm/packages/seal/src/validators/object-validator.mjs.map +1 -0
  350. package/esm/{seal → packages/seal}/src/validators/primitive-validator.mjs +1 -1
  351. package/esm/packages/seal/src/validators/primitive-validator.mjs.map +1 -0
  352. package/esm/{seal → packages/seal}/src/validators/record-validator.mjs +2 -2
  353. package/esm/packages/seal/src/validators/record-validator.mjs.map +1 -0
  354. package/esm/{seal → packages/seal}/src/validators/scalar-validator.mjs +1 -1
  355. package/esm/packages/seal/src/validators/scalar-validator.mjs.map +1 -0
  356. package/esm/{seal → packages/seal}/src/validators/string-validator.mjs +1 -1
  357. package/esm/packages/seal/src/validators/string-validator.mjs.map +1 -0
  358. package/esm/{seal → packages/seal}/src/validators/tuple-validator.mjs +1 -1
  359. package/esm/packages/seal/src/validators/tuple-validator.mjs.map +1 -0
  360. package/esm/{seal → packages/seal}/src/validators/union-validator.mjs +1 -1
  361. package/esm/packages/seal/src/validators/union-validator.mjs.map +1 -0
  362. package/esm/queue/bullmq-queue.d.mts +1 -1
  363. package/esm/queue/bullmq-queue.d.mts.map +1 -1
  364. package/esm/queue/bullmq-queue.mjs +1 -1
  365. package/esm/queue/bullmq-queue.mjs.map +1 -1
  366. package/esm/queue/herald-queue.d.mts +1 -1
  367. package/esm/queue/herald-queue.d.mts.map +1 -1
  368. package/esm/queue/herald-queue.mjs +1 -1
  369. package/esm/queue/herald-queue.mjs.map +1 -1
  370. package/esm/queue/load-herald.d.mts +1 -1
  371. package/esm/queue/load-herald.d.mts.map +1 -1
  372. package/esm/queue/load-herald.mjs +2 -2
  373. package/esm/queue/load-herald.mjs.map +1 -1
  374. package/esm/queue/load-queue.d.mts +1 -1
  375. package/esm/queue/load-queue.d.mts.map +1 -1
  376. package/esm/queue/load-queue.mjs +1 -1
  377. package/esm/queue/load-queue.mjs.map +1 -1
  378. package/esm/queue/notifications-worker.d.mts +1 -1
  379. package/esm/queue/notifications-worker.d.mts.map +1 -1
  380. package/esm/queue/notifications-worker.mjs +1 -1
  381. package/esm/queue/notifications-worker.mjs.map +1 -1
  382. package/esm/queue/queue-package-not-installed.error.d.mts +1 -1
  383. package/esm/queue/queue-package-not-installed.error.d.mts.map +1 -1
  384. package/esm/queue/queue-package-not-installed.error.mjs +1 -1
  385. package/esm/queue/queue-package-not-installed.error.mjs.map +1 -1
  386. package/esm/types.d.mts +1 -1
  387. package/esm/types.d.mts.map +1 -1
  388. package/llms-full.txt +7 -7
  389. package/package.json +9 -8
  390. package/skills/configure-notifications/SKILL.md +1 -1
  391. package/skills/notifications-basics/SKILL.md +1 -1
  392. package/skills/queue-notifications/SKILL.md +1 -1
  393. package/skills/use-in-app/SKILL.md +3 -3
  394. package/skills/write-notification-migration/SKILL.md +1 -1
  395. package/cjs/channel_api-CBB_XoIl.cjs.map +0 -1
  396. package/cjs/rabbitmq-driver-CYeFwv0w.cjs +0 -3
  397. package/cjs/src-B6UVThgW.cjs.map +0 -1
  398. package/esm/herald/src/communicators/broker-registry.mjs.map +0 -1
  399. package/esm/herald/src/communicators/broker.mjs.map +0 -1
  400. package/esm/herald/src/decorators/consumable.mjs.map +0 -1
  401. package/esm/herald/src/drivers/rabbitmq/rabbitmq-channel.mjs.map +0 -1
  402. package/esm/herald/src/drivers/rabbitmq/rabbitmq-driver.mjs.map +0 -1
  403. package/esm/herald/src/message-managers/event-consumer.mjs.map +0 -1
  404. package/esm/herald/src/message-managers/event-message.mjs.map +0 -1
  405. package/esm/herald/src/message-managers/prepare-consumer-subscription.mjs.map +0 -1
  406. package/esm/herald/src/use-case-broadcast.mjs.map +0 -1
  407. package/esm/herald/src/utils/connect-to-broker.mjs.map +0 -1
  408. package/esm/seal/src/config.mjs.map +0 -1
  409. package/esm/seal/src/factory/validate.mjs.map +0 -1
  410. package/esm/seal/src/factory/validators.mjs.map +0 -1
  411. package/esm/seal/src/helpers/date-helpers.mjs.map +0 -1
  412. package/esm/seal/src/helpers/get-field-value.mjs.map +0 -1
  413. package/esm/seal/src/helpers/is-empty-value.mjs +0 -10
  414. package/esm/seal/src/helpers/is-empty-value.mjs.map +0 -1
  415. package/esm/seal/src/helpers/path-helpers.mjs.map +0 -1
  416. package/esm/seal/src/helpers/validation-helpers.mjs.map +0 -1
  417. package/esm/seal/src/mutators/array-mutators.mjs.map +0 -1
  418. package/esm/seal/src/mutators/boolean-mutators.mjs.map +0 -1
  419. package/esm/seal/src/mutators/date-mutators.mjs.map +0 -1
  420. package/esm/seal/src/mutators/number-mutators.mjs.map +0 -1
  421. package/esm/seal/src/mutators/object-mutators.mjs.map +0 -1
  422. package/esm/seal/src/mutators/scalar-mutators.mjs.map +0 -1
  423. package/esm/seal/src/mutators/string-mutators.mjs.map +0 -1
  424. package/esm/seal/src/object.mjs.map +0 -1
  425. package/esm/seal/src/rules/array/array-rules.mjs.map +0 -1
  426. package/esm/seal/src/rules/color/color-rules.mjs.map +0 -1
  427. package/esm/seal/src/rules/common/enum.mjs.map +0 -1
  428. package/esm/seal/src/rules/common/equals-field-rules.mjs.map +0 -1
  429. package/esm/seal/src/rules/common/instanceof.mjs.map +0 -1
  430. package/esm/seal/src/rules/common/literal.mjs.map +0 -1
  431. package/esm/seal/src/rules/common/type-rules.mjs.map +0 -1
  432. package/esm/seal/src/rules/common/unknown-key.mjs.map +0 -1
  433. package/esm/seal/src/rules/conditional/forbidden-if-rules.mjs.map +0 -1
  434. package/esm/seal/src/rules/conditional/present-if-rules.mjs.map +0 -1
  435. package/esm/seal/src/rules/conditional/present-unless-rules.mjs.map +0 -1
  436. package/esm/seal/src/rules/conditional/present-with-rules.mjs.map +0 -1
  437. package/esm/seal/src/rules/conditional/present-without-rules.mjs.map +0 -1
  438. package/esm/seal/src/rules/conditional/required-if-rules.mjs.map +0 -1
  439. package/esm/seal/src/rules/conditional/required-unless-rules.mjs.map +0 -1
  440. package/esm/seal/src/rules/conditional/required-when-rule.mjs.map +0 -1
  441. package/esm/seal/src/rules/conditional/required-with-rules.mjs.map +0 -1
  442. package/esm/seal/src/rules/conditional/required-without-rules.mjs.map +0 -1
  443. package/esm/seal/src/rules/core/equal.mjs.map +0 -1
  444. package/esm/seal/src/rules/core/forbidden.mjs.map +0 -1
  445. package/esm/seal/src/rules/core/required.mjs.map +0 -1
  446. package/esm/seal/src/rules/core/union.mjs.map +0 -1
  447. package/esm/seal/src/rules/core/when.mjs.map +0 -1
  448. package/esm/seal/src/rules/date/date-comparison-rules.mjs.map +0 -1
  449. package/esm/seal/src/rules/date/date-day-rules.mjs.map +0 -1
  450. package/esm/seal/src/rules/date/date-field-comparison-rules.mjs.map +0 -1
  451. package/esm/seal/src/rules/date/date-period-rules.mjs.map +0 -1
  452. package/esm/seal/src/rules/date/date-relative-rules.mjs.map +0 -1
  453. package/esm/seal/src/rules/date/date-special-rules.mjs.map +0 -1
  454. package/esm/seal/src/rules/date/date.mjs.map +0 -1
  455. package/esm/seal/src/rules/length/length-rules.mjs.map +0 -1
  456. package/esm/seal/src/rules/number/number-rules.mjs.map +0 -1
  457. package/esm/seal/src/rules/scalar/accepted-rule.mjs.map +0 -1
  458. package/esm/seal/src/rules/scalar/declined-rule.mjs.map +0 -1
  459. package/esm/seal/src/rules/string/alpha.mjs.map +0 -1
  460. package/esm/seal/src/rules/string/credit-card.mjs.map +0 -1
  461. package/esm/seal/src/rules/string/email.mjs.map +0 -1
  462. package/esm/seal/src/rules/string/id-formats.mjs.map +0 -1
  463. package/esm/seal/src/rules/string/ip.mjs.map +0 -1
  464. package/esm/seal/src/rules/string/matches.mjs +0 -4
  465. package/esm/seal/src/rules/string/pattern.mjs.map +0 -1
  466. package/esm/seal/src/rules/string/string-comparison.mjs.map +0 -1
  467. package/esm/seal/src/rules/string/strong-password-rule.mjs.map +0 -1
  468. package/esm/seal/src/rules/string/url.mjs.map +0 -1
  469. package/esm/seal/src/rules/string/without-whitespace.mjs.map +0 -1
  470. package/esm/seal/src/standard-schema/json-schema.mjs.map +0 -1
  471. package/esm/seal/src/standard-schema/map-result.mjs.map +0 -1
  472. package/esm/seal/src/string.mjs.map +0 -1
  473. package/esm/seal/src/types/date-types.mjs.map +0 -1
  474. package/esm/seal/src/validators/any-validator.mjs.map +0 -1
  475. package/esm/seal/src/validators/array-validator.mjs.map +0 -1
  476. package/esm/seal/src/validators/base-validator.mjs.map +0 -1
  477. package/esm/seal/src/validators/boolean-validator.mjs.map +0 -1
  478. package/esm/seal/src/validators/computed-validator.mjs.map +0 -1
  479. package/esm/seal/src/validators/date-validator.mjs.map +0 -1
  480. package/esm/seal/src/validators/discriminated-union-validator.mjs.map +0 -1
  481. package/esm/seal/src/validators/float-validator.mjs.map +0 -1
  482. package/esm/seal/src/validators/instanceof-validator.mjs.map +0 -1
  483. package/esm/seal/src/validators/int-validator.mjs.map +0 -1
  484. package/esm/seal/src/validators/lazy-validator.mjs.map +0 -1
  485. package/esm/seal/src/validators/literal-validator.mjs.map +0 -1
  486. package/esm/seal/src/validators/managed-validator.mjs.map +0 -1
  487. package/esm/seal/src/validators/methods/equality-conditional-methods.mjs.map +0 -1
  488. package/esm/seal/src/validators/methods/forbidden-methods.mjs.map +0 -1
  489. package/esm/seal/src/validators/methods/present-methods.mjs.map +0 -1
  490. package/esm/seal/src/validators/methods/required-methods.mjs.map +0 -1
  491. package/esm/seal/src/validators/number-validator.mjs.map +0 -1
  492. package/esm/seal/src/validators/numeric-validator.mjs.map +0 -1
  493. package/esm/seal/src/validators/object-validator.mjs.map +0 -1
  494. package/esm/seal/src/validators/primitive-validator.mjs.map +0 -1
  495. package/esm/seal/src/validators/record-validator.mjs.map +0 -1
  496. package/esm/seal/src/validators/scalar-validator.mjs.map +0 -1
  497. package/esm/seal/src/validators/string-validator.mjs.map +0 -1
  498. package/esm/seal/src/validators/tuple-validator.mjs.map +0 -1
  499. package/esm/seal/src/validators/union-validator.mjs.map +0 -1
  500. /package/esm/{herald → packages/herald}/src/communicators/index.mjs +0 -0
  501. /package/esm/{herald → packages/herald}/src/decorators/index.mjs +0 -0
  502. /package/esm/{herald → packages/herald}/src/drivers/index.mjs +0 -0
  503. /package/esm/{herald → packages/herald}/src/drivers/rabbitmq/index.mjs +0 -0
  504. /package/esm/{herald → packages/herald}/src/index.mjs +0 -0
  505. /package/esm/{herald → packages/herald}/src/message-managers/index.mjs +0 -0
  506. /package/esm/{herald → packages/herald}/src/utils/index.mjs +0 -0
  507. /package/esm/{seal → packages/seal}/src/factory/index.mjs +0 -0
  508. /package/esm/{seal → packages/seal}/src/helpers/index.mjs +0 -0
  509. /package/esm/{seal → packages/seal}/src/index.mjs +0 -0
  510. /package/esm/{seal → packages/seal}/src/mutators/index.mjs +0 -0
  511. /package/esm/{seal → packages/seal}/src/rules/array/index.mjs +0 -0
  512. /package/esm/{seal → packages/seal}/src/rules/color/index.mjs +0 -0
  513. /package/esm/{seal → packages/seal}/src/rules/common/index.mjs +0 -0
  514. /package/esm/{seal → packages/seal}/src/rules/conditional/index.mjs +0 -0
  515. /package/esm/{seal → packages/seal}/src/rules/core/index.mjs +0 -0
  516. /package/esm/{seal → packages/seal}/src/rules/date/index.mjs +0 -0
  517. /package/esm/{seal → packages/seal}/src/rules/file/dimensions.mjs +0 -0
  518. /package/esm/{seal → packages/seal}/src/rules/file/file-size.mjs +0 -0
  519. /package/esm/{seal → packages/seal}/src/rules/file/index.mjs +0 -0
  520. /package/esm/{seal → packages/seal}/src/rules/index.mjs +0 -0
  521. /package/esm/{seal → packages/seal}/src/rules/length/index.mjs +0 -0
  522. /package/esm/{seal → packages/seal}/src/rules/number/index.mjs +0 -0
  523. /package/esm/{seal → packages/seal}/src/rules/scalar/index.mjs +0 -0
  524. /package/esm/{seal → packages/seal}/src/rules/string/index.mjs +0 -0
  525. /package/esm/{seal → packages/seal}/src/validators/index.mjs +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"base-notifications-repository.mjs","names":[],"sources":["../../../../../../../notifications/src/in-app/base-notifications-repository.ts"],"sourcesContent":["/**\n * Shipped behavior repository for the in-app store.\n *\n * Concrete (NOT abstract) so `inApp.configure({ model })` can\n * `new BaseNotificationsRepository(model)` without subclassing. The dev only\n * extends this when they need extra query methods.\n *\n * ## The single source of truth: the model's `columnMap`\n *\n * The model declares its physical columns ONCE via `static columnMap`. The\n * constructor resolves that map and derives BOTH sides from it:\n *\n * - the READ path — `filterBy` maps logical keys (`recipientId`, `unread`,\n * `type`, …) onto the model's columns; `RepositoryManager` applies it.\n * - the WRITE / UPDATE / DELETE path — `createFor` / `markRead` / … translate\n * logical keys through the same `filterBy` via `toRow`.\n *\n * Because both come from one `columnMap`, reads and writes can never target\n * different columns. `unread` is mode-agnostic: it filters `is_read = false`\n * when the model has that flag, otherwise `read_at IS NULL`.\n *\n * @example default (SQL snake_case — no subclass needed)\n * inApp.configure({ model: Notification })\n *\n * @example custom columns — declare them on the model, not here\n * class Notification extends DatabaseNotification {\n * public static columnMap = { recipient: \"audience_id\", isRead: \"seen\" };\n * }\n */\nimport { type FilterRules, RepositoryManager } from \"@warlock.js/core\";\nimport type { NotificationContract } from \"../contracts\";\nimport type { DatabasePayload, Id } from \"../types\";\nimport {\n type NotificationColumnMapHost,\n type ResolvedNotificationColumnMap,\n resolveColumnMap,\n} from \"./column-map\";\nimport type { DatabaseNotification } from \"./database-notification\";\n\n/**\n * Filter shape — logical keys the repo understands. `filterBy` maps each to a\n * physical column (or a predicate) derived from the model's `columnMap`.\n */\nexport type NotificationsFilter = {\n id?: Id;\n type?: string;\n /** Mode-agnostic unread filter — resolves to the model's read-state column. */\n unread?: boolean;\n recipientId?: Id;\n idempotencyKey?: string;\n};\n\n/** Class form of a `DatabaseNotification` subclass — what `configure()` accepts. */\nexport type NotificationModelClass = (new (...args: any[]) => DatabaseNotification) &\n NotificationColumnMapHost;\n\nexport class BaseNotificationsRepository<\n TModel extends NotificationContract = NotificationContract,\n> extends RepositoryManager<TModel, NotificationsFilter> {\n /** Resolved physical columns for the bound model — the single source. */\n private readonly columns: ResolvedNotificationColumnMap;\n\n public filterBy: FilterRules;\n\n public constructor(model?: NotificationModelClass) {\n super();\n\n if (model) {\n this.source = model;\n }\n\n this.columns = resolveColumnMap(model?.columnMap);\n this.filterBy = this.buildFilterBy();\n }\n\n /** The tenant column for this model, or `undefined` for single-tenant. */\n public get tenantColumn(): string | undefined {\n return this.columns.tenant;\n }\n\n /**\n * Build `filterBy` from the resolved column map. `unread` is the\n * mode-agnostic read filter; `isRead` / `readAt` / `tenant` are exposed for\n * direct filtering only when the model declares those columns.\n */\n private buildFilterBy(): FilterRules {\n const { recipient, tenant, readAt, isRead } = this.columns;\n\n const rules: FilterRules = {\n id: \"=\",\n type: \"=\",\n recipientId: [\"=\", recipient],\n idempotencyKey: [\"=\", \"idempotency_key\"],\n unread: (value, query) => {\n if (value !== true && value !== \"true\") {\n return;\n }\n\n if (isRead) {\n query.where(isRead, false);\n } else if (readAt) {\n query.whereNull(readAt);\n }\n },\n };\n\n if (isRead) {\n rules.isRead = [\"=\", isRead];\n }\n\n if (readAt) {\n rules.readAt = [\"=\", readAt];\n }\n\n if (tenant) {\n rules.tenant = [\"=\", tenant];\n }\n\n return rules;\n }\n\n /**\n * Translate an object keyed by LOGICAL names into one keyed by PHYSICAL\n * columns, using `filterBy` as the lookup. Keys with no `[op, column]` tuple\n * (e.g. `title`, `body`, `payload`, `type`, `id`) pass through unchanged —\n * they're already physical. Used for every write / update / delete payload +\n * filter (the paths `RepositoryManager` does NOT map).\n */\n protected toRow(obj: Record<string, unknown>): Record<string, unknown> {\n const rules = this.filterBy as Record<string, unknown>;\n const row: Record<string, unknown> = {};\n\n for (const [logical, value] of Object.entries(obj)) {\n const rule = rules[logical];\n const column = Array.isArray(rule) ? (rule[1] as string) : logical;\n row[column] = value;\n }\n\n return row;\n }\n\n /**\n * Runtime backstop for the compile-time `DatabasePayload` `Omit`: untyped\n * callers (`notify.channel(name).send`, payloads assembled from request\n * JSON) can smuggle server-owned keys past the type system, and spreading\n * them into the row would let a payload redirect the notification into\n * another recipient's inbox (recipient spoofing), cross tenants, pre-set\n * read-state, or clobber the primary key. Drops BOTH the logical names and\n * the model's resolved physical columns — `toRow` passes unmapped keys\n * through verbatim, so a payload carrying `user_id` would otherwise reach\n * the recipient column directly.\n */\n private stripServerOwnedKeys(input: DatabasePayload): Record<string, unknown> {\n const { recipient, tenant, readAt, isRead } = this.columns;\n const serverOwned = new Set<string | undefined>([\n \"id\",\n \"recipientId\",\n \"tenant\",\n \"readAt\",\n \"isRead\",\n recipient,\n tenant,\n readAt,\n isRead,\n ]);\n\n const safe: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) {\n if (!serverOwned.has(key)) {\n safe[key] = value;\n }\n }\n\n return safe;\n }\n\n /**\n * Create one row for the recipient. New rows start unread; the tenant column\n * (when the model declares one) is written from `tenantId`, which the\n * database channel reads off the recipient. `recipientId` and the other\n * server-owned keys always come from the trusted arguments — matching keys\n * in `input` are stripped, never merged.\n *\n * Idempotency: when `input.idempotencyKey` is set, find-or-create — return\n * the existing row instead of inserting a duplicate. A unique index on the\n * key is the backstop for the rare insert race (we re-fetch on conflict).\n */\n public async createFor(\n recipientId: Id,\n input: DatabasePayload,\n tenantId?: Id,\n ): Promise<TModel> {\n const { idempotencyKey } = input;\n\n if (idempotencyKey) {\n const existing = await this.firstByIdempotencyKey(recipientId, idempotencyKey);\n if (existing) {\n return existing;\n }\n }\n\n const row: Record<string, unknown> = { ...this.stripServerOwnedKeys(input), recipientId };\n\n if (this.columns.isRead) {\n row.isRead = false;\n }\n\n if (this.columns.tenant && tenantId !== undefined) {\n row.tenant = tenantId;\n }\n\n try {\n return await this.create(this.toRow(row));\n } catch (error) {\n // Lost the insert race to a concurrent send with the same key → re-fetch.\n if (idempotencyKey) {\n const existing = await this.firstByIdempotencyKey(recipientId, idempotencyKey);\n if (existing) {\n return existing;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Bulk-create one row per recipient sharing the same input + tenant. Reserved\n * for the Phase-2 `Channel.sendMany` fan-out hook; not on the per-recipient\n * send path yet.\n */\n public createManyFor(\n recipientIds: Id[],\n input: DatabasePayload,\n tenantId?: Id,\n ): Promise<TModel[]> {\n return Promise.all(\n recipientIds.map((recipientId) => this.createFor(recipientId, input, tenantId)),\n );\n }\n\n /**\n * Mark rows read — recipient-scoped. `id` omitted → all unread rows for the\n * recipient; `id` given → that one row, still scoped to the recipient. Scoped\n * to unread so a re-mark never overwrites an earlier `read_at` timestamp.\n * Sets whichever read-state column(s) the model declares.\n */\n public markRead(recipientId: Id, id?: Id): Promise<number> {\n const { isRead, readAt } = this.columns;\n const unreadScope = isRead ? { isRead: false } : { readAt: null };\n\n const data: Record<string, unknown> = {};\n\n if (isRead) {\n data.isRead = true;\n }\n\n if (readAt) {\n data.readAt = new Date();\n }\n\n return this.updateMany(\n this.toRow({ recipientId, ...unreadScope, ...(id !== undefined ? { id } : {}) }),\n this.toRow(data),\n );\n }\n\n /**\n * Inverse of `markRead`, same recipient-scoping. No unread scope needed —\n * clearing the read-state of an already-unread row is a no-op.\n */\n public markUnread(recipientId: Id, id?: Id): Promise<number> {\n const { isRead, readAt } = this.columns;\n const data: Record<string, unknown> = {};\n\n if (isRead) {\n data.isRead = false;\n }\n\n if (readAt) {\n data.readAt = null;\n }\n\n return this.updateMany(\n this.toRow({ recipientId, ...(id !== undefined ? { id } : {}) }),\n this.toRow(data),\n );\n }\n\n /** Find one row for a recipient (read path — `filterBy` maps the keys). */\n public findFor(recipientId: Id, id: Id): Promise<TModel | null> {\n return this.first({ recipientId, id } as NotificationsFilter);\n }\n\n /**\n * Delete rows — recipient-scoped. `id` omitted → clear all for the\n * recipient; `id` given → that one row.\n */\n public deleteFor(recipientId: Id, id?: Id): Promise<number> {\n return this.deleteMany(this.toRow({ recipientId, ...(id !== undefined ? { id } : {}) }));\n }\n\n /** Read path — `filterBy` maps `recipientId`/`idempotencyKey` to columns. */\n private firstByIdempotencyKey(recipientId: Id, idempotencyKey: string): Promise<TModel | null> {\n return this.first({ recipientId, idempotencyKey } as NotificationsFilter);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,IAAa,8BAAb,cAEU,kBAA+C;;CAEvD,AAAiB;CAEjB,AAAO;CAEP,AAAO,YAAY,OAAgC;EACjD,MAAM;EAEN,IAAI,OACF,KAAK,SAAS;EAGhB,KAAK,UAAU,iBAAiB,OAAO,SAAS;EAChD,KAAK,WAAW,KAAK,cAAc;CACrC;;CAGA,IAAW,eAAmC;EAC5C,OAAO,KAAK,QAAQ;CACtB;;;;;;CAOA,AAAQ,gBAA6B;EACnC,MAAM,EAAE,WAAW,QAAQ,QAAQ,WAAW,KAAK;EAEnD,MAAM,QAAqB;GACzB,IAAI;GACJ,MAAM;GACN,aAAa,CAAC,KAAK,SAAS;GAC5B,gBAAgB,CAAC,KAAK,iBAAiB;GACvC,SAAS,OAAO,UAAU;IACxB,IAAI,UAAU,QAAQ,UAAU,QAC9B;IAGF,IAAI,QACF,MAAM,MAAM,QAAQ,KAAK;SACpB,IAAI,QACT,MAAM,UAAU,MAAM;GAE1B;EACF;EAEA,IAAI,QACF,MAAM,SAAS,CAAC,KAAK,MAAM;EAG7B,IAAI,QACF,MAAM,SAAS,CAAC,KAAK,MAAM;EAG7B,IAAI,QACF,MAAM,SAAS,CAAC,KAAK,MAAM;EAG7B,OAAO;CACT;;;;;;;;CASA,AAAU,MAAM,KAAuD;EACrE,MAAM,QAAQ,KAAK;EACnB,MAAM,MAA+B,CAAC;EAEtC,KAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,GAAG,GAAG;GAClD,MAAM,OAAO,MAAM;GACnB,MAAM,SAAS,MAAM,QAAQ,IAAI,IAAK,KAAK,KAAgB;GAC3D,IAAI,UAAU;EAChB;EAEA,OAAO;CACT;;;;;;;;;;;;CAaA,AAAQ,qBAAqB,OAAiD;EAC5E,MAAM,EAAE,WAAW,QAAQ,QAAQ,WAAW,KAAK;EACnD,MAAM,cAAc,IAAI,IAAwB;GAC9C;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,MAAM,OAAgC,CAAC;EAEvC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAC7C,IAAI,CAAC,YAAY,IAAI,GAAG,GACtB,KAAK,OAAO;EAIhB,OAAO;CACT;;;;;;;;;;;;CAaA,MAAa,UACX,aACA,OACA,UACiB;EACjB,MAAM,EAAE,mBAAmB;EAE3B,IAAI,gBAAgB;GAClB,MAAM,WAAW,MAAM,KAAK,sBAAsB,aAAa,cAAc;GAC7E,IAAI,UACF,OAAO;EAEX;EAEA,MAAM,MAA+B;GAAE,GAAG,KAAK,qBAAqB,KAAK;GAAG;EAAY;EAExF,IAAI,KAAK,QAAQ,QACf,IAAI,SAAS;EAGf,IAAI,KAAK,QAAQ,UAAU,aAAa,QACtC,IAAI,SAAS;EAGf,IAAI;GACF,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC;EAC1C,SAAS,OAAO;GAEd,IAAI,gBAAgB;IAClB,MAAM,WAAW,MAAM,KAAK,sBAAsB,aAAa,cAAc;IAC7E,IAAI,UACF,OAAO;GAEX;GAEA,MAAM;EACR;CACF;;;;;;CAOA,AAAO,cACL,cACA,OACA,UACmB;EACnB,OAAO,QAAQ,IACb,aAAa,KAAK,gBAAgB,KAAK,UAAU,aAAa,OAAO,QAAQ,CAAC,CAChF;CACF;;;;;;;CAQA,AAAO,SAAS,aAAiB,IAA0B;EACzD,MAAM,EAAE,QAAQ,WAAW,KAAK;EAChC,MAAM,cAAc,SAAS,EAAE,QAAQ,MAAM,IAAI,EAAE,QAAQ,KAAK;EAEhE,MAAM,OAAgC,CAAC;EAEvC,IAAI,QACF,KAAK,SAAS;EAGhB,IAAI,QACF,KAAK,yBAAS,IAAI,KAAK;EAGzB,OAAO,KAAK,WACV,KAAK,MAAM;GAAE;GAAa,GAAG;GAAa,GAAI,OAAO,SAAY,EAAE,GAAG,IAAI,CAAC;EAAG,CAAC,GAC/E,KAAK,MAAM,IAAI,CACjB;CACF;;;;;CAMA,AAAO,WAAW,aAAiB,IAA0B;EAC3D,MAAM,EAAE,QAAQ,WAAW,KAAK;EAChC,MAAM,OAAgC,CAAC;EAEvC,IAAI,QACF,KAAK,SAAS;EAGhB,IAAI,QACF,KAAK,SAAS;EAGhB,OAAO,KAAK,WACV,KAAK,MAAM;GAAE;GAAa,GAAI,OAAO,SAAY,EAAE,GAAG,IAAI,CAAC;EAAG,CAAC,GAC/D,KAAK,MAAM,IAAI,CACjB;CACF;;CAGA,AAAO,QAAQ,aAAiB,IAAgC;EAC9D,OAAO,KAAK,MAAM;GAAE;GAAa;EAAG,CAAwB;CAC9D;;;;;CAMA,AAAO,UAAU,aAAiB,IAA0B;EAC1D,OAAO,KAAK,WAAW,KAAK,MAAM;GAAE;GAAa,GAAI,OAAO,SAAY,EAAE,GAAG,IAAI,CAAC;EAAG,CAAC,CAAC;CACzF;;CAGA,AAAQ,sBAAsB,aAAiB,gBAAgD;EAC7F,OAAO,KAAK,MAAM;GAAE;GAAa;EAAe,CAAwB;CAC1E;AACF"}
1
+ {"version":3,"file":"base-notifications-repository.mjs","names":[],"sources":["../../../../../../../../packages/notifications/src/in-app/base-notifications-repository.ts"],"sourcesContent":["/**\n * Shipped behavior repository for the in-app store.\n *\n * Concrete (NOT abstract) so `inApp.configure({ model })` can\n * `new BaseNotificationsRepository(model)` without subclassing. The dev only\n * extends this when they need extra query methods.\n *\n * ## The single source of truth: the model's `columnMap`\n *\n * The model declares its physical columns ONCE via `static columnMap`. The\n * constructor resolves that map and derives BOTH sides from it:\n *\n * - the READ path — `filterBy` maps logical keys (`recipientId`, `unread`,\n * `type`, …) onto the model's columns; `RepositoryManager` applies it.\n * - the WRITE / UPDATE / DELETE path — `createFor` / `markRead` / … translate\n * logical keys through the same `filterBy` via `toRow`.\n *\n * Because both come from one `columnMap`, reads and writes can never target\n * different columns. `unread` is mode-agnostic: it filters `is_read = false`\n * when the model has that flag, otherwise `read_at IS NULL`.\n *\n * @example default (SQL snake_case — no subclass needed)\n * inApp.configure({ model: Notification })\n *\n * @example custom columns — declare them on the model, not here\n * class Notification extends DatabaseNotification {\n * public static columnMap = { recipient: \"audience_id\", isRead: \"seen\" };\n * }\n */\nimport { type FilterRules, RepositoryManager } from \"@warlock.js/core\";\nimport type { NotificationContract } from \"../contracts\";\nimport type { DatabasePayload, Id } from \"../types\";\nimport {\n type NotificationColumnMapHost,\n type ResolvedNotificationColumnMap,\n resolveColumnMap,\n} from \"./column-map\";\nimport type { DatabaseNotification } from \"./database-notification\";\n\n/**\n * Filter shape — logical keys the repo understands. `filterBy` maps each to a\n * physical column (or a predicate) derived from the model's `columnMap`.\n */\nexport type NotificationsFilter = {\n id?: Id;\n type?: string;\n /** Mode-agnostic unread filter — resolves to the model's read-state column. */\n unread?: boolean;\n recipientId?: Id;\n idempotencyKey?: string;\n};\n\n/** Class form of a `DatabaseNotification` subclass — what `configure()` accepts. */\nexport type NotificationModelClass = (new (...args: any[]) => DatabaseNotification) &\n NotificationColumnMapHost;\n\nexport class BaseNotificationsRepository<\n TModel extends NotificationContract = NotificationContract,\n> extends RepositoryManager<TModel, NotificationsFilter> {\n /** Resolved physical columns for the bound model — the single source. */\n private readonly columns: ResolvedNotificationColumnMap;\n\n public filterBy: FilterRules;\n\n public constructor(model?: NotificationModelClass) {\n super();\n\n if (model) {\n this.source = model;\n }\n\n this.columns = resolveColumnMap(model?.columnMap);\n this.filterBy = this.buildFilterBy();\n }\n\n /** The tenant column for this model, or `undefined` for single-tenant. */\n public get tenantColumn(): string | undefined {\n return this.columns.tenant;\n }\n\n /**\n * Build `filterBy` from the resolved column map. `unread` is the\n * mode-agnostic read filter; `isRead` / `readAt` / `tenant` are exposed for\n * direct filtering only when the model declares those columns.\n */\n private buildFilterBy(): FilterRules {\n const { recipient, tenant, readAt, isRead } = this.columns;\n\n const rules: FilterRules = {\n id: \"=\",\n type: \"=\",\n recipientId: [\"=\", recipient],\n idempotencyKey: [\"=\", \"idempotency_key\"],\n unread: (value, query) => {\n if (value !== true && value !== \"true\") {\n return;\n }\n\n if (isRead) {\n query.where(isRead, false);\n } else if (readAt) {\n query.whereNull(readAt);\n }\n },\n };\n\n if (isRead) {\n rules.isRead = [\"=\", isRead];\n }\n\n if (readAt) {\n rules.readAt = [\"=\", readAt];\n }\n\n if (tenant) {\n rules.tenant = [\"=\", tenant];\n }\n\n return rules;\n }\n\n /**\n * Translate an object keyed by LOGICAL names into one keyed by PHYSICAL\n * columns, using `filterBy` as the lookup. Keys with no `[op, column]` tuple\n * (e.g. `title`, `body`, `payload`, `type`, `id`) pass through unchanged —\n * they're already physical. Used for every write / update / delete payload +\n * filter (the paths `RepositoryManager` does NOT map).\n */\n protected toRow(obj: Record<string, unknown>): Record<string, unknown> {\n const rules = this.filterBy as Record<string, unknown>;\n const row: Record<string, unknown> = {};\n\n for (const [logical, value] of Object.entries(obj)) {\n const rule = rules[logical];\n const column = Array.isArray(rule) ? (rule[1] as string) : logical;\n row[column] = value;\n }\n\n return row;\n }\n\n /**\n * Runtime backstop for the compile-time `DatabasePayload` `Omit`: untyped\n * callers (`notify.channel(name).send`, payloads assembled from request\n * JSON) can smuggle server-owned keys past the type system, and spreading\n * them into the row would let a payload redirect the notification into\n * another recipient's inbox (recipient spoofing), cross tenants, pre-set\n * read-state, or clobber the primary key. Drops BOTH the logical names and\n * the model's resolved physical columns — `toRow` passes unmapped keys\n * through verbatim, so a payload carrying `user_id` would otherwise reach\n * the recipient column directly.\n */\n private stripServerOwnedKeys(input: DatabasePayload): Record<string, unknown> {\n const { recipient, tenant, readAt, isRead } = this.columns;\n const serverOwned = new Set<string | undefined>([\n \"id\",\n \"recipientId\",\n \"tenant\",\n \"readAt\",\n \"isRead\",\n recipient,\n tenant,\n readAt,\n isRead,\n ]);\n\n const safe: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(input)) {\n if (!serverOwned.has(key)) {\n safe[key] = value;\n }\n }\n\n return safe;\n }\n\n /**\n * Create one row for the recipient. New rows start unread; the tenant column\n * (when the model declares one) is written from `tenantId`, which the\n * database channel reads off the recipient. `recipientId` and the other\n * server-owned keys always come from the trusted arguments — matching keys\n * in `input` are stripped, never merged.\n *\n * Idempotency: when `input.idempotencyKey` is set, find-or-create — return\n * the existing row instead of inserting a duplicate. A unique index on the\n * key is the backstop for the rare insert race (we re-fetch on conflict).\n */\n public async createFor(\n recipientId: Id,\n input: DatabasePayload,\n tenantId?: Id,\n ): Promise<TModel> {\n const { idempotencyKey } = input;\n\n if (idempotencyKey) {\n const existing = await this.firstByIdempotencyKey(recipientId, idempotencyKey);\n if (existing) {\n return existing;\n }\n }\n\n const row: Record<string, unknown> = { ...this.stripServerOwnedKeys(input), recipientId };\n\n if (this.columns.isRead) {\n row.isRead = false;\n }\n\n if (this.columns.tenant && tenantId !== undefined) {\n row.tenant = tenantId;\n }\n\n try {\n return await this.create(this.toRow(row));\n } catch (error) {\n // Lost the insert race to a concurrent send with the same key → re-fetch.\n if (idempotencyKey) {\n const existing = await this.firstByIdempotencyKey(recipientId, idempotencyKey);\n if (existing) {\n return existing;\n }\n }\n\n throw error;\n }\n }\n\n /**\n * Bulk-create one row per recipient sharing the same input + tenant. Reserved\n * for the Phase-2 `Channel.sendMany` fan-out hook; not on the per-recipient\n * send path yet.\n */\n public createManyFor(\n recipientIds: Id[],\n input: DatabasePayload,\n tenantId?: Id,\n ): Promise<TModel[]> {\n return Promise.all(\n recipientIds.map((recipientId) => this.createFor(recipientId, input, tenantId)),\n );\n }\n\n /**\n * Mark rows read — recipient-scoped. `id` omitted → all unread rows for the\n * recipient; `id` given → that one row, still scoped to the recipient. Scoped\n * to unread so a re-mark never overwrites an earlier `read_at` timestamp.\n * Sets whichever read-state column(s) the model declares.\n */\n public markRead(recipientId: Id, id?: Id): Promise<number> {\n const { isRead, readAt } = this.columns;\n const unreadScope = isRead ? { isRead: false } : { readAt: null };\n\n const data: Record<string, unknown> = {};\n\n if (isRead) {\n data.isRead = true;\n }\n\n if (readAt) {\n data.readAt = new Date();\n }\n\n return this.updateMany(\n this.toRow({ recipientId, ...unreadScope, ...(id !== undefined ? { id } : {}) }),\n this.toRow(data),\n );\n }\n\n /**\n * Inverse of `markRead`, same recipient-scoping. No unread scope needed —\n * clearing the read-state of an already-unread row is a no-op.\n */\n public markUnread(recipientId: Id, id?: Id): Promise<number> {\n const { isRead, readAt } = this.columns;\n const data: Record<string, unknown> = {};\n\n if (isRead) {\n data.isRead = false;\n }\n\n if (readAt) {\n data.readAt = null;\n }\n\n return this.updateMany(\n this.toRow({ recipientId, ...(id !== undefined ? { id } : {}) }),\n this.toRow(data),\n );\n }\n\n /** Find one row for a recipient (read path — `filterBy` maps the keys). */\n public findFor(recipientId: Id, id: Id): Promise<TModel | null> {\n return this.first({ recipientId, id } as NotificationsFilter);\n }\n\n /**\n * Delete rows — recipient-scoped. `id` omitted → clear all for the\n * recipient; `id` given → that one row.\n */\n public deleteFor(recipientId: Id, id?: Id): Promise<number> {\n return this.deleteMany(this.toRow({ recipientId, ...(id !== undefined ? { id } : {}) }));\n }\n\n /** Read path — `filterBy` maps `recipientId`/`idempotencyKey` to columns. */\n private firstByIdempotencyKey(recipientId: Id, idempotencyKey: string): Promise<TModel | null> {\n return this.first({ recipientId, idempotencyKey } as NotificationsFilter);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,IAAa,8BAAb,cAEU,kBAA+C;;CAEvD,AAAiB;CAEjB,AAAO;CAEP,AAAO,YAAY,OAAgC;EACjD,MAAM;EAEN,IAAI,OACF,KAAK,SAAS;EAGhB,KAAK,UAAU,iBAAiB,OAAO,SAAS;EAChD,KAAK,WAAW,KAAK,cAAc;CACrC;;CAGA,IAAW,eAAmC;EAC5C,OAAO,KAAK,QAAQ;CACtB;;;;;;CAOA,AAAQ,gBAA6B;EACnC,MAAM,EAAE,WAAW,QAAQ,QAAQ,WAAW,KAAK;EAEnD,MAAM,QAAqB;GACzB,IAAI;GACJ,MAAM;GACN,aAAa,CAAC,KAAK,SAAS;GAC5B,gBAAgB,CAAC,KAAK,iBAAiB;GACvC,SAAS,OAAO,UAAU;IACxB,IAAI,UAAU,QAAQ,UAAU,QAC9B;IAGF,IAAI,QACF,MAAM,MAAM,QAAQ,KAAK;SACpB,IAAI,QACT,MAAM,UAAU,MAAM;GAE1B;EACF;EAEA,IAAI,QACF,MAAM,SAAS,CAAC,KAAK,MAAM;EAG7B,IAAI,QACF,MAAM,SAAS,CAAC,KAAK,MAAM;EAG7B,IAAI,QACF,MAAM,SAAS,CAAC,KAAK,MAAM;EAG7B,OAAO;CACT;;;;;;;;CASA,AAAU,MAAM,KAAuD;EACrE,MAAM,QAAQ,KAAK;EACnB,MAAM,MAA+B,CAAC;EAEtC,KAAK,MAAM,CAAC,SAAS,UAAU,OAAO,QAAQ,GAAG,GAAG;GAClD,MAAM,OAAO,MAAM;GACnB,MAAM,SAAS,MAAM,QAAQ,IAAI,IAAK,KAAK,KAAgB;GAC3D,IAAI,UAAU;EAChB;EAEA,OAAO;CACT;;;;;;;;;;;;CAaA,AAAQ,qBAAqB,OAAiD;EAC5E,MAAM,EAAE,WAAW,QAAQ,QAAQ,WAAW,KAAK;EACnD,MAAM,cAAc,IAAI,IAAwB;GAC9C;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,MAAM,OAAgC,CAAC;EAEvC,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,KAAK,GAC7C,IAAI,CAAC,YAAY,IAAI,GAAG,GACtB,KAAK,OAAO;EAIhB,OAAO;CACT;;;;;;;;;;;;CAaA,MAAa,UACX,aACA,OACA,UACiB;EACjB,MAAM,EAAE,mBAAmB;EAE3B,IAAI,gBAAgB;GAClB,MAAM,WAAW,MAAM,KAAK,sBAAsB,aAAa,cAAc;GAC7E,IAAI,UACF,OAAO;EAEX;EAEA,MAAM,MAA+B;GAAE,GAAG,KAAK,qBAAqB,KAAK;GAAG;EAAY;EAExF,IAAI,KAAK,QAAQ,QACf,IAAI,SAAS;EAGf,IAAI,KAAK,QAAQ,UAAU,aAAa,QACtC,IAAI,SAAS;EAGf,IAAI;GACF,OAAO,MAAM,KAAK,OAAO,KAAK,MAAM,GAAG,CAAC;EAC1C,SAAS,OAAO;GAEd,IAAI,gBAAgB;IAClB,MAAM,WAAW,MAAM,KAAK,sBAAsB,aAAa,cAAc;IAC7E,IAAI,UACF,OAAO;GAEX;GAEA,MAAM;EACR;CACF;;;;;;CAOA,AAAO,cACL,cACA,OACA,UACmB;EACnB,OAAO,QAAQ,IACb,aAAa,KAAK,gBAAgB,KAAK,UAAU,aAAa,OAAO,QAAQ,CAAC,CAChF;CACF;;;;;;;CAQA,AAAO,SAAS,aAAiB,IAA0B;EACzD,MAAM,EAAE,QAAQ,WAAW,KAAK;EAChC,MAAM,cAAc,SAAS,EAAE,QAAQ,MAAM,IAAI,EAAE,QAAQ,KAAK;EAEhE,MAAM,OAAgC,CAAC;EAEvC,IAAI,QACF,KAAK,SAAS;EAGhB,IAAI,QACF,KAAK,yBAAS,IAAI,KAAK;EAGzB,OAAO,KAAK,WACV,KAAK,MAAM;GAAE;GAAa,GAAG;GAAa,GAAI,OAAO,SAAY,EAAE,GAAG,IAAI,CAAC;EAAG,CAAC,GAC/E,KAAK,MAAM,IAAI,CACjB;CACF;;;;;CAMA,AAAO,WAAW,aAAiB,IAA0B;EAC3D,MAAM,EAAE,QAAQ,WAAW,KAAK;EAChC,MAAM,OAAgC,CAAC;EAEvC,IAAI,QACF,KAAK,SAAS;EAGhB,IAAI,QACF,KAAK,SAAS;EAGhB,OAAO,KAAK,WACV,KAAK,MAAM;GAAE;GAAa,GAAI,OAAO,SAAY,EAAE,GAAG,IAAI,CAAC;EAAG,CAAC,GAC/D,KAAK,MAAM,IAAI,CACjB;CACF;;CAGA,AAAO,QAAQ,aAAiB,IAAgC;EAC9D,OAAO,KAAK,MAAM;GAAE;GAAa;EAAG,CAAwB;CAC9D;;;;;CAMA,AAAO,UAAU,aAAiB,IAA0B;EAC1D,OAAO,KAAK,WAAW,KAAK,MAAM;GAAE;GAAa,GAAI,OAAO,SAAY,EAAE,GAAG,IAAI,CAAC;EAAG,CAAC,CAAC;CACzF;;CAGA,AAAQ,sBAAsB,aAAiB,gBAAgD;EAC7F,OAAO,KAAK,MAAM;GAAE;GAAa;EAAe,CAAwB;CAC1E;AACF"}
@@ -1,4 +1,4 @@
1
- //#region ../notifications/src/in-app/column-map.d.ts
1
+ //#region ../../packages/notifications/src/in-app/column-map.d.ts
2
2
  /**
3
3
  * `columnMap` — how a notification model's logical roles map to the physical
4
4
  * columns of ITS table. The ONE source the model getters, the repository
@@ -1 +1 @@
1
- {"version":3,"file":"column-map.d.mts","names":[],"sources":["../../../../../../../notifications/src/in-app/column-map.ts"],"mappings":";;AAkCA;;;;;;;;;AAQQ;AAQR;;;;;;;;;AAIQ;AAIR;;;;AACmC;AAYnC;;;;;;;KArCY,qBAAA;EAuCoB,iDArC9B,SAAA;EAEA,MAAA;EAEA,MAAA;EAEA,MAAA;AAAA;;;;;;KAQU,6BAAA;EACV,SAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;AAAA;;KAIU,yBAAA;EACV,SAAA,GAAY,qBAAqB;AAAA;;;;;;;iBAYnB,gBAAA,CACd,GAAA,EAAK,qBAAA,eACJ,6BAA6B"}
1
+ {"version":3,"file":"column-map.d.mts","names":[],"sources":["../../../../../../../../packages/notifications/src/in-app/column-map.ts"],"mappings":";;AAkCA;;;;;;;;;AAQQ;AAQR;;;;;;;;;AAIQ;AAIR;;;;AACmC;AAYnC;;;;;;;KArCY,qBAAA;EAuCoB,iDArC9B,SAAA;EAEA,MAAA;EAEA,MAAA;EAEA,MAAA;AAAA;;;;;;KAQU,6BAAA;EACV,SAAA;EACA,MAAA;EACA,MAAA;EACA,MAAA;AAAA;;KAIU,yBAAA;EACV,SAAA,GAAY,qBAAqB;AAAA;;;;;;;iBAYnB,gBAAA,CACd,GAAA,EAAK,qBAAA,eACJ,6BAA6B"}
@@ -1,4 +1,4 @@
1
- //#region ../notifications/src/in-app/column-map.ts
1
+ //#region ../../packages/notifications/src/in-app/column-map.ts
2
2
  const DEFAULT_RECIPIENT_COLUMN = "user_id";
3
3
  const DEFAULT_READ_AT_COLUMN = "read_at";
4
4
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"column-map.mjs","names":[],"sources":["../../../../../../../notifications/src/in-app/column-map.ts"],"sourcesContent":["/**\n * `columnMap` — how a notification model's logical roles map to the physical\n * columns of ITS table. The ONE source the model getters, the repository\n * (read filter + write mapping), the database channel, and the migration\n * factory all read, so they can never drift apart.\n *\n * Declared as a `static columnMap` on the model and ejected to userland, so\n * the dev owns it:\n *\n * @RegisterModel()\n * export class Notification extends DatabaseNotification {\n * public static table = \"notifications\";\n * public static columnMap: NotificationColumnMap = {\n * tenant: \"organization_id\", // omit → single-tenant\n * readAt: \"read_at\", // read-state (see below)\n * };\n * }\n *\n * ## Read-state is chosen by which keys are PRESENT\n *\n * - `readAt` only → unread = `read_at IS NULL`; marking read stamps it.\n * - `isRead` only → unread = `is_read = false`; no timestamp.\n * - both → `is_read` is the indexed flag used for filtering, `read_at`\n * records WHEN; marking read sets both.\n *\n * Declare neither and you get the `readAt`-only default — so a model can omit\n * `columnMap` entirely and still work.\n */\n\n/**\n * The logical → physical column bindings a notification model may declare.\n * Every key is optional; `resolveColumnMap` fills the defaults. Values are the\n * app's real column names (rename-friendly: `readAt: \"seen_at\"`).\n */\nexport type NotificationColumnMap = {\n /** Recipient FK column. Default: `\"user_id\"`. */\n recipient?: string;\n /** Multi-tenant scope column, written from the recipient. Omit → single-tenant. */\n tenant?: string;\n /** Read-timestamp column. Present → read-state records \"when\". */\n readAt?: string;\n /** Read-flag column (indexed → fast unread filter). Present → read-state is a boolean. */\n isRead?: string;\n};\n\n/**\n * A `NotificationColumnMap` with the defaults applied. `recipient` is always\n * set, and at least one of `readAt` / `isRead` is always present (the resolver\n * falls back to `readAt`), so consumers never face a \"no read-state\" map.\n */\nexport type ResolvedNotificationColumnMap = {\n recipient: string;\n tenant?: string;\n readAt?: string;\n isRead?: string;\n};\n\n/** A model class that may carry the `columnMap` static. */\nexport type NotificationColumnMapHost = {\n columnMap?: NotificationColumnMap;\n};\n\nconst DEFAULT_RECIPIENT_COLUMN = \"user_id\";\nconst DEFAULT_READ_AT_COLUMN = \"read_at\";\n\n/**\n * Resolve a model's declared `columnMap` into a complete map: default the\n * recipient column, and fall back to a `read_at` timestamp when the model\n * declares no read-state column. The fallback guarantees the result always\n * has a usable read-state representation, so no boot-time validation is needed.\n */\nexport function resolveColumnMap(\n map: NotificationColumnMap | undefined,\n): ResolvedNotificationColumnMap {\n const recipient = map?.recipient ?? DEFAULT_RECIPIENT_COLUMN;\n const tenant = map?.tenant;\n\n if (!map?.readAt && !map?.isRead) {\n return { recipient, tenant, readAt: DEFAULT_READ_AT_COLUMN };\n }\n\n return {\n recipient,\n tenant,\n readAt: map.readAt,\n isRead: map.isRead,\n };\n}\n"],"mappings":";AA8DA,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;;;;;;;AAQ/B,SAAgB,iBACd,KAC+B;CAC/B,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,SAAS,KAAK;CAEpB,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,QACxB,OAAO;EAAE;EAAW;EAAQ,QAAQ;CAAuB;CAG7D,OAAO;EACL;EACA;EACA,QAAQ,IAAI;EACZ,QAAQ,IAAI;CACd;AACF"}
1
+ {"version":3,"file":"column-map.mjs","names":[],"sources":["../../../../../../../../packages/notifications/src/in-app/column-map.ts"],"sourcesContent":["/**\n * `columnMap` — how a notification model's logical roles map to the physical\n * columns of ITS table. The ONE source the model getters, the repository\n * (read filter + write mapping), the database channel, and the migration\n * factory all read, so they can never drift apart.\n *\n * Declared as a `static columnMap` on the model and ejected to userland, so\n * the dev owns it:\n *\n * @RegisterModel()\n * export class Notification extends DatabaseNotification {\n * public static table = \"notifications\";\n * public static columnMap: NotificationColumnMap = {\n * tenant: \"organization_id\", // omit → single-tenant\n * readAt: \"read_at\", // read-state (see below)\n * };\n * }\n *\n * ## Read-state is chosen by which keys are PRESENT\n *\n * - `readAt` only → unread = `read_at IS NULL`; marking read stamps it.\n * - `isRead` only → unread = `is_read = false`; no timestamp.\n * - both → `is_read` is the indexed flag used for filtering, `read_at`\n * records WHEN; marking read sets both.\n *\n * Declare neither and you get the `readAt`-only default — so a model can omit\n * `columnMap` entirely and still work.\n */\n\n/**\n * The logical → physical column bindings a notification model may declare.\n * Every key is optional; `resolveColumnMap` fills the defaults. Values are the\n * app's real column names (rename-friendly: `readAt: \"seen_at\"`).\n */\nexport type NotificationColumnMap = {\n /** Recipient FK column. Default: `\"user_id\"`. */\n recipient?: string;\n /** Multi-tenant scope column, written from the recipient. Omit → single-tenant. */\n tenant?: string;\n /** Read-timestamp column. Present → read-state records \"when\". */\n readAt?: string;\n /** Read-flag column (indexed → fast unread filter). Present → read-state is a boolean. */\n isRead?: string;\n};\n\n/**\n * A `NotificationColumnMap` with the defaults applied. `recipient` is always\n * set, and at least one of `readAt` / `isRead` is always present (the resolver\n * falls back to `readAt`), so consumers never face a \"no read-state\" map.\n */\nexport type ResolvedNotificationColumnMap = {\n recipient: string;\n tenant?: string;\n readAt?: string;\n isRead?: string;\n};\n\n/** A model class that may carry the `columnMap` static. */\nexport type NotificationColumnMapHost = {\n columnMap?: NotificationColumnMap;\n};\n\nconst DEFAULT_RECIPIENT_COLUMN = \"user_id\";\nconst DEFAULT_READ_AT_COLUMN = \"read_at\";\n\n/**\n * Resolve a model's declared `columnMap` into a complete map: default the\n * recipient column, and fall back to a `read_at` timestamp when the model\n * declares no read-state column. The fallback guarantees the result always\n * has a usable read-state representation, so no boot-time validation is needed.\n */\nexport function resolveColumnMap(\n map: NotificationColumnMap | undefined,\n): ResolvedNotificationColumnMap {\n const recipient = map?.recipient ?? DEFAULT_RECIPIENT_COLUMN;\n const tenant = map?.tenant;\n\n if (!map?.readAt && !map?.isRead) {\n return { recipient, tenant, readAt: DEFAULT_READ_AT_COLUMN };\n }\n\n return {\n recipient,\n tenant,\n readAt: map.readAt,\n isRead: map.isRead,\n };\n}\n"],"mappings":";AA8DA,MAAM,2BAA2B;AACjC,MAAM,yBAAyB;;;;;;;AAQ/B,SAAgB,iBACd,KAC+B;CAC/B,MAAM,YAAY,KAAK,aAAa;CACpC,MAAM,SAAS,KAAK;CAEpB,IAAI,CAAC,KAAK,UAAU,CAAC,KAAK,QACxB,OAAO;EAAE;EAAW;EAAQ,QAAQ;CAAuB;CAG7D,OAAO;EACL;EACA;EACA,QAAQ,IAAI;EACZ,QAAQ,IAAI;CACd;AACF"}
@@ -3,7 +3,7 @@ import { NotificationContract } from "../contracts/notification.contract.mjs";
3
3
  import { NotificationColumnMap, ResolvedNotificationColumnMap } from "./column-map.mjs";
4
4
  import { Model } from "@warlock.js/cascade";
5
5
 
6
- //#region ../notifications/src/in-app/database-notification.d.ts
6
+ //#region ../../packages/notifications/src/in-app/database-notification.d.ts
7
7
  declare abstract class DatabaseNotification extends Model implements NotificationContract {
8
8
  /**
9
9
  * Physical column bindings for THIS model's table. Override in the subclass;
@@ -1 +1 @@
1
- {"version":3,"file":"database-notification.d.mts","names":[],"sources":["../../../../../../../notifications/src/in-app/database-notification.ts"],"mappings":";;;;;;uBA6BsB,oBAAA,SAA6B,KAAA,YAAiB,oBAAA;EAQzC;;;;EAAA,OAHX,SAAA,EAAW,qBAAA;EAiBd;EAAA,cAdG,OAAA,IAAW,6BAAA;EAAA,IAId,WAAA,IAAe,EAAA;EAwBL;EAAA,IAnBV,QAAA,IAAY,EAAA;EAAA,IAKZ,IAAA;EAAA,IAIA,MAAA;EAAA,IAUA,MAAA,IAAU,IAAA;;;;;;EAUR,QAAA,IAAY,OAAA;AAAA"}
1
+ {"version":3,"file":"database-notification.d.mts","names":[],"sources":["../../../../../../../../packages/notifications/src/in-app/database-notification.ts"],"mappings":";;;;;;uBA6BsB,oBAAA,SAA6B,KAAA,YAAiB,oBAAA;EAQzC;;;;EAAA,OAHX,SAAA,EAAW,qBAAA;EAiBd;EAAA,cAdG,OAAA,IAAW,6BAAA;EAAA,IAId,WAAA,IAAe,EAAA;EAwBL;EAAA,IAnBV,QAAA,IAAY,EAAA;EAAA,IAKZ,IAAA;EAAA,IAIA,MAAA;EAAA,IAUA,MAAA,IAAU,IAAA;;;;;;EAUR,QAAA,IAAY,OAAA;AAAA"}
@@ -1,7 +1,7 @@
1
1
  import { resolveColumnMap } from "./column-map.mjs";
2
2
  import { Model } from "@warlock.js/cascade";
3
3
 
4
- //#region ../notifications/src/in-app/database-notification.ts
4
+ //#region ../../packages/notifications/src/in-app/database-notification.ts
5
5
  /**
6
6
  * Shipped BASE in-app notification model. The scaffolded user model
7
7
  * `extends DatabaseNotification`, sets `static table`, and declares its
@@ -1 +1 @@
1
- {"version":3,"file":"database-notification.mjs","names":[],"sources":["../../../../../../../notifications/src/in-app/database-notification.ts"],"sourcesContent":["/**\n * Shipped BASE in-app notification model. The scaffolded user model\n * `extends DatabaseNotification`, sets `static table`, and declares its\n * physical columns ONCE via `static columnMap`. Every accessor below derives\n * from that map, so the model, the repository, and the migration agree by\n * construction.\n *\n * The package ships NO concrete table or migration — those eject to userland\n * (thin eject). See `notificationColumns()` for the matching migration factory.\n *\n * @example\n * @RegisterModel()\n * export class Notification extends DatabaseNotification {\n * public static table = \"notifications\";\n * public static columnMap: NotificationColumnMap = {\n * tenant: \"organization_id\",\n * readAt: \"read_at\",\n * };\n * }\n */\nimport { Model } from \"@warlock.js/cascade\";\nimport type { NotificationContract } from \"../contracts\";\nimport type { Id } from \"../types\";\nimport {\n type NotificationColumnMap,\n type ResolvedNotificationColumnMap,\n resolveColumnMap,\n} from \"./column-map\";\n\nexport abstract class DatabaseNotification extends Model implements NotificationContract {\n /**\n * Physical column bindings for THIS model's table. Override in the subclass;\n * the empty default resolves to `{ recipient: \"user_id\", readAt: \"read_at\" }`.\n */\n public static columnMap: NotificationColumnMap = {};\n\n /** The resolved column map for this row's model — defaults applied. */\n protected get columns(): ResolvedNotificationColumnMap {\n return resolveColumnMap((this.constructor as typeof DatabaseNotification).columnMap);\n }\n\n public get recipientId(): Id {\n return this.get(this.columns.recipient);\n }\n\n /** Tenant scope value, or `undefined` for single-tenant models. */\n public get tenantId(): Id | undefined {\n const { tenant } = this.columns;\n return tenant ? this.get(tenant) : undefined;\n }\n\n public get type(): string {\n return this.get(\"type\");\n }\n\n public get isRead(): boolean {\n const { isRead, readAt } = this.columns;\n\n if (isRead) {\n return Boolean(this.get(isRead));\n }\n\n return readAt ? this.get(readAt) != null : false;\n }\n\n public get readAt(): Date | null {\n const { readAt } = this.columns;\n return readAt ? (this.get(readAt) ?? null) : null;\n }\n\n /**\n * Mark this row read. Sets whichever read-state column(s) the model\n * declares — the boolean (fast unread filtering) and/or the timestamp\n * (when it was read). Persists via `save()`.\n */\n public async markRead(): Promise<void> {\n const { isRead, readAt } = this.columns;\n\n if (isRead) {\n this.set(isRead, true);\n }\n\n if (readAt) {\n this.set(readAt, new Date());\n }\n\n await this.save();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAsB,uBAAtB,cAAmD,MAAsC;;;;;CAKvF,OAAc,YAAmC,CAAC;;CAGlD,IAAc,UAAyC;EACrD,OAAO,iBAAkB,KAAK,YAA4C,SAAS;CACrF;CAEA,IAAW,cAAkB;EAC3B,OAAO,KAAK,IAAI,KAAK,QAAQ,SAAS;CACxC;;CAGA,IAAW,WAA2B;EACpC,MAAM,EAAE,WAAW,KAAK;EACxB,OAAO,SAAS,KAAK,IAAI,MAAM,IAAI;CACrC;CAEA,IAAW,OAAe;EACxB,OAAO,KAAK,IAAI,MAAM;CACxB;CAEA,IAAW,SAAkB;EAC3B,MAAM,EAAE,QAAQ,WAAW,KAAK;EAEhC,IAAI,QACF,OAAO,QAAQ,KAAK,IAAI,MAAM,CAAC;EAGjC,OAAO,SAAS,KAAK,IAAI,MAAM,KAAK,OAAO;CAC7C;CAEA,IAAW,SAAsB;EAC/B,MAAM,EAAE,WAAW,KAAK;EACxB,OAAO,SAAU,KAAK,IAAI,MAAM,KAAK,OAAQ;CAC/C;;;;;;CAOA,MAAa,WAA0B;EACrC,MAAM,EAAE,QAAQ,WAAW,KAAK;EAEhC,IAAI,QACF,KAAK,IAAI,QAAQ,IAAI;EAGvB,IAAI,QACF,KAAK,IAAI,wBAAQ,IAAI,KAAK,CAAC;EAG7B,MAAM,KAAK,KAAK;CAClB;AACF"}
1
+ {"version":3,"file":"database-notification.mjs","names":[],"sources":["../../../../../../../../packages/notifications/src/in-app/database-notification.ts"],"sourcesContent":["/**\n * Shipped BASE in-app notification model. The scaffolded user model\n * `extends DatabaseNotification`, sets `static table`, and declares its\n * physical columns ONCE via `static columnMap`. Every accessor below derives\n * from that map, so the model, the repository, and the migration agree by\n * construction.\n *\n * The package ships NO concrete table or migration — those eject to userland\n * (thin eject). See `notificationColumns()` for the matching migration factory.\n *\n * @example\n * @RegisterModel()\n * export class Notification extends DatabaseNotification {\n * public static table = \"notifications\";\n * public static columnMap: NotificationColumnMap = {\n * tenant: \"organization_id\",\n * readAt: \"read_at\",\n * };\n * }\n */\nimport { Model } from \"@warlock.js/cascade\";\nimport type { NotificationContract } from \"../contracts\";\nimport type { Id } from \"../types\";\nimport {\n type NotificationColumnMap,\n type ResolvedNotificationColumnMap,\n resolveColumnMap,\n} from \"./column-map\";\n\nexport abstract class DatabaseNotification extends Model implements NotificationContract {\n /**\n * Physical column bindings for THIS model's table. Override in the subclass;\n * the empty default resolves to `{ recipient: \"user_id\", readAt: \"read_at\" }`.\n */\n public static columnMap: NotificationColumnMap = {};\n\n /** The resolved column map for this row's model — defaults applied. */\n protected get columns(): ResolvedNotificationColumnMap {\n return resolveColumnMap((this.constructor as typeof DatabaseNotification).columnMap);\n }\n\n public get recipientId(): Id {\n return this.get(this.columns.recipient);\n }\n\n /** Tenant scope value, or `undefined` for single-tenant models. */\n public get tenantId(): Id | undefined {\n const { tenant } = this.columns;\n return tenant ? this.get(tenant) : undefined;\n }\n\n public get type(): string {\n return this.get(\"type\");\n }\n\n public get isRead(): boolean {\n const { isRead, readAt } = this.columns;\n\n if (isRead) {\n return Boolean(this.get(isRead));\n }\n\n return readAt ? this.get(readAt) != null : false;\n }\n\n public get readAt(): Date | null {\n const { readAt } = this.columns;\n return readAt ? (this.get(readAt) ?? null) : null;\n }\n\n /**\n * Mark this row read. Sets whichever read-state column(s) the model\n * declares — the boolean (fast unread filtering) and/or the timestamp\n * (when it was read). Persists via `save()`.\n */\n public async markRead(): Promise<void> {\n const { isRead, readAt } = this.columns;\n\n if (isRead) {\n this.set(isRead, true);\n }\n\n if (readAt) {\n this.set(readAt, new Date());\n }\n\n await this.save();\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA6BA,IAAsB,uBAAtB,cAAmD,MAAsC;;;;;CAKvF,OAAc,YAAmC,CAAC;;CAGlD,IAAc,UAAyC;EACrD,OAAO,iBAAkB,KAAK,YAA4C,SAAS;CACrF;CAEA,IAAW,cAAkB;EAC3B,OAAO,KAAK,IAAI,KAAK,QAAQ,SAAS;CACxC;;CAGA,IAAW,WAA2B;EACpC,MAAM,EAAE,WAAW,KAAK;EACxB,OAAO,SAAS,KAAK,IAAI,MAAM,IAAI;CACrC;CAEA,IAAW,OAAe;EACxB,OAAO,KAAK,IAAI,MAAM;CACxB;CAEA,IAAW,SAAkB;EAC3B,MAAM,EAAE,QAAQ,WAAW,KAAK;EAEhC,IAAI,QACF,OAAO,QAAQ,KAAK,IAAI,MAAM,CAAC;EAGjC,OAAO,SAAS,KAAK,IAAI,MAAM,KAAK,OAAO;CAC7C;CAEA,IAAW,SAAsB;EAC/B,MAAM,EAAE,WAAW,KAAK;EACxB,OAAO,SAAU,KAAK,IAAI,MAAM,KAAK,OAAQ;CAC/C;;;;;;CAOA,MAAa,WAA0B;EACrC,MAAM,EAAE,QAAQ,WAAW,KAAK;EAEhC,IAAI,QACF,KAAK,IAAI,QAAQ,IAAI;EAGvB,IAAI,QACF,KAAK,IAAI,wBAAQ,IAAI,KAAK,CAAC;EAG7B,MAAM,KAAK,KAAK;CAClB;AACF"}
@@ -4,7 +4,7 @@ import { NotificationContract } from "../contracts/notification.contract.mjs";
4
4
  import { BaseNotificationsRepository, NotificationModelClass, NotificationsFilter } from "./base-notifications-repository.mjs";
5
5
  import { TypedRepositoryOptionsWithPages } from "@warlock.js/core";
6
6
 
7
- //#region ../notifications/src/in-app/in-app.d.ts
7
+ //#region ../../packages/notifications/src/in-app/in-app.d.ts
8
8
  /**
9
9
  * List options for the read methods — the repository's paginated options
10
10
  * (`page` / `limit` / `orderBy` / filter keys). `recipientId` is always forced
@@ -1 +1 @@
1
- {"version":3,"file":"in-app.d.mts","names":[],"sources":["../../../../../../../notifications/src/in-app/in-app.ts"],"mappings":";;;;;;;;;;;;KA4CY,wBAAA,GAA2B,+BAA+B,CAAC,mBAAA;;;;;;KAO3D,gBAAA;EACN,KAAA,EAAO,sBAAA;EAAwB,UAAA;AAAA;EAC/B,UAAA,EAAY,2BAA2B;EAAE,KAAA;AAAA;AAAA,cAKzC,KAAA;EAAA,QACI,IAAA;EAqDuB;;;;EA/CxB,SAAA,CAAU,OAAA,EAAS,gBAAA,GAAmB,OAAA,CAAQ,eAAA;EAAA,YAQzC,UAAA;EA4CoC;EAjCzC,IAAA,CAAK,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,OAAA,GAAU,wBAAA,GAAwB,OAAA,4BAAA,gBAAA,CAAA,oBAAA;EAiCxB;EA5B3C,UAAA,CAAW,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,OAAA,GAAU,wBAAA,GAAwB,OAAA,4BAAA,gBAAA,CAAA,oBAAA;EA9BxE;;;;EAsCD,WAAA,CAAY,SAAA,EAAW,UAAA,GAAa,EAAA,GAAE,OAAA;EAhCQ;EAqC9C,IAAA,CAAK,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,EAAI,EAAA,GAAE,OAAA,CAAA,oBAAA;EAlBvC;EAuBA,UAAA,CAAW,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,GAAK,EAAA,GAAE,OAAA;EAvBjB;EA4B7B,YAAA,CAAa,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,GAAK,EAAA,GAAE,OAAA;EA5BL;EAiC3C,OAAA,CAAQ,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,GAAK,EAAA,GAAE,OAAA;AAAA;;cAMvC,KAAA,EAAK,KAAc"}
1
+ {"version":3,"file":"in-app.d.mts","names":[],"sources":["../../../../../../../../packages/notifications/src/in-app/in-app.ts"],"mappings":";;;;;;;;;;;;KA4CY,wBAAA,GAA2B,+BAA+B,CAAC,mBAAA;;;;;;KAO3D,gBAAA;EACN,KAAA,EAAO,sBAAA;EAAwB,UAAA;AAAA;EAC/B,UAAA,EAAY,2BAA2B;EAAE,KAAA;AAAA;AAAA,cAKzC,KAAA;EAAA,QACI,IAAA;EAqDuB;;;;EA/CxB,SAAA,CAAU,OAAA,EAAS,gBAAA,GAAmB,OAAA,CAAQ,eAAA;EAAA,YAQzC,UAAA;EA4CoC;EAjCzC,IAAA,CAAK,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,OAAA,GAAU,wBAAA,GAAwB,OAAA,4BAAA,gBAAA,CAAA,oBAAA;EAiCxB;EA5B3C,UAAA,CAAW,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,OAAA,GAAU,wBAAA,GAAwB,OAAA,4BAAA,gBAAA,CAAA,oBAAA;EA9BxE;;;;EAsCD,WAAA,CAAY,SAAA,EAAW,UAAA,GAAa,EAAA,GAAE,OAAA;EAhCQ;EAqC9C,IAAA,CAAK,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,EAAI,EAAA,GAAE,OAAA,CAAA,oBAAA;EAlBvC;EAuBA,UAAA,CAAW,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,GAAK,EAAA,GAAE,OAAA;EAvBjB;EA4B7B,YAAA,CAAa,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,GAAK,EAAA,GAAE,OAAA;EA5BL;EAiC3C,OAAA,CAAQ,SAAA,EAAW,UAAA,GAAa,EAAA,EAAI,EAAA,GAAK,EAAA,GAAE,OAAA;AAAA;;cAMvC,KAAA,EAAK,KAAc"}
@@ -1,7 +1,7 @@
1
1
  import { databaseChannel } from "../channels/database-channel.mjs";
2
2
  import { BaseNotificationsRepository } from "./base-notifications-repository.mjs";
3
3
 
4
- //#region ../notifications/src/in-app/in-app.ts
4
+ //#region ../../packages/notifications/src/in-app/in-app.ts
5
5
  const idOf = (recipient) => typeof recipient === "object" ? recipient.id : recipient;
6
6
  var InApp = class {
7
7
  repo;
@@ -1 +1 @@
1
- {"version":3,"file":"in-app.mjs","names":[],"sources":["../../../../../../../notifications/src/in-app/in-app.ts"],"sourcesContent":["/**\n * `inApp` — app-facing facade for the in-app/database channel.\n *\n * `inApp.configure({ model | repository })` binds the in-app store AND\n * returns the `database` channel — so the read side and the dispatched\n * write side share ONE repository instance.\n * • `{ model: Notification }` — 90% case; default repo built internally.\n * • `{ repository: myRepo }` — 10% case; custom column mapping / extras.\n *\n * No zero-arg form: the package ships no concrete model/table (thin eject),\n * so the dev MUST tell us which model to use.\n *\n * Every read + mutation is RECIPIENT-SCOPED by construction — `markAsRead(user,\n * id)` cannot flip a row belonging to a different recipient even if handed a\n * foreign id (the recipient id is forced into the filter → 0 rows match).\n *\n * @example\n * // src/config/notifications.ts:\n * inApp.configure({ model: Notification }),\n *\n * // anywhere:\n * const unread = await inApp.listUnread(user);\n * const badge = await inApp.countUnread(user);\n * const one = await inApp.find(user, \"ntf_123\");\n * await inApp.markAsRead(user, \"ntf_123\");\n * await inApp.markAsRead(user); // mark ALL unread\n * await inApp.dismiss(user, \"ntf_123\"); // delete one\n * await inApp.dismiss(user); // clear all for this recipient\n */\nimport type { TypedRepositoryOptionsWithPages } from \"@warlock.js/core\";\nimport { databaseChannel } from \"../channels/database-channel\";\nimport type { Channel } from \"../contracts\";\nimport type { DatabasePayload, Id, Notifiable } from \"../types\";\nimport {\n BaseNotificationsRepository,\n type NotificationModelClass,\n type NotificationsFilter,\n} from \"./base-notifications-repository\";\n\n/**\n * List options for the read methods — the repository's paginated options\n * (`page` / `limit` / `orderBy` / filter keys). `recipientId` is always forced\n * from the recipient argument, so passing it here has no effect.\n */\nexport type NotificationsListOptions = TypedRepositoryOptionsWithPages<NotificationsFilter>;\n\n/**\n * Configure options — discriminated so `model` and `repository` are mutually\n * exclusive at the type level. Future knobs (cache / realtime / naming) slot\n * in here without breaking the signature.\n */\nexport type ConfigureOptions =\n | { model: NotificationModelClass; repository?: never }\n | { repository: BaseNotificationsRepository; model?: never };\n\nconst idOf = (recipient: Notifiable | Id): Id =>\n typeof recipient === \"object\" ? recipient.id : recipient;\n\nclass InApp {\n private repo?: BaseNotificationsRepository;\n\n /**\n * Bind the in-app store AND return the `database` channel. Called once\n * from `config/notifications.ts`. Subsequent calls REPLACE the binding.\n */\n public configure(options: ConfigureOptions): Channel<DatabasePayload> {\n this.repo =\n \"repository\" in options && options.repository\n ? options.repository\n : new BaseNotificationsRepository(options.model);\n return databaseChannel(this.repo);\n }\n\n private get repository(): BaseNotificationsRepository {\n if (!this.repo) {\n throw new Error(\n \"In-app notifications not configured — add \" +\n \"`database: inApp.configure({ model: Notification })` to config/notifications.ts\",\n );\n }\n return this.repo;\n }\n\n /** General list — scoped to recipient; pass `options` for paging + filters. */\n public list(recipient: Notifiable | Id, options?: NotificationsListOptions) {\n return this.repository.list({ ...options, recipientId: idOf(recipient) });\n }\n\n /** Unread-only list — common case for badges + dashboards. */\n public listUnread(recipient: Notifiable | Id, options?: NotificationsListOptions) {\n return this.repository.list({ ...options, recipientId: idOf(recipient), unread: true });\n }\n\n /**\n * Cached unread count — backs the badge. Auto-invalidated by the repo's\n * model create/update events (`RepositoryManager.registerEvents`).\n */\n public countUnread(recipient: Notifiable | Id) {\n return this.repository.countCached({ recipientId: idOf(recipient), unread: true });\n }\n\n /** Find one notification for a recipient — for a detail view. */\n public find(recipient: Notifiable | Id, id: Id) {\n return this.repository.findFor(idOf(recipient), id);\n }\n\n /** Mark read — `id` omitted = all unread for this recipient. */\n public markAsRead(recipient: Notifiable | Id, id?: Id) {\n return this.repository.markRead(idOf(recipient), id);\n }\n\n /** Mark unread — same recipient-scoping. */\n public markAsUnread(recipient: Notifiable | Id, id?: Id) {\n return this.repository.markUnread(idOf(recipient), id);\n }\n\n /** Delete/dismiss — `id` omitted = clear all for this recipient. */\n public dismiss(recipient: Notifiable | Id, id?: Id) {\n return this.repository.deleteFor(idOf(recipient), id);\n }\n}\n\n/** Single in-app facade — bound at boot via `inApp.configure(...)`. */\nexport const inApp = new InApp();\n"],"mappings":";;;;AAuDA,MAAM,QAAQ,cACZ,OAAO,cAAc,WAAW,UAAU,KAAK;AAEjD,IAAM,QAAN,MAAY;CACV,AAAQ;;;;;CAMR,AAAO,UAAU,SAAqD;EACpE,KAAK,OACH,gBAAgB,WAAW,QAAQ,aAC/B,QAAQ,aACR,IAAI,4BAA4B,QAAQ,KAAK;EACnD,OAAO,gBAAgB,KAAK,IAAI;CAClC;CAEA,IAAY,aAA0C;EACpD,IAAI,CAAC,KAAK,MACR,MAAM,IAAI,MACR,2HAEF;EAEF,OAAO,KAAK;CACd;;CAGA,AAAO,KAAK,WAA4B,SAAoC;EAC1E,OAAO,KAAK,WAAW,KAAK;GAAE,GAAG;GAAS,aAAa,KAAK,SAAS;EAAE,CAAC;CAC1E;;CAGA,AAAO,WAAW,WAA4B,SAAoC;EAChF,OAAO,KAAK,WAAW,KAAK;GAAE,GAAG;GAAS,aAAa,KAAK,SAAS;GAAG,QAAQ;EAAK,CAAC;CACxF;;;;;CAMA,AAAO,YAAY,WAA4B;EAC7C,OAAO,KAAK,WAAW,YAAY;GAAE,aAAa,KAAK,SAAS;GAAG,QAAQ;EAAK,CAAC;CACnF;;CAGA,AAAO,KAAK,WAA4B,IAAQ;EAC9C,OAAO,KAAK,WAAW,QAAQ,KAAK,SAAS,GAAG,EAAE;CACpD;;CAGA,AAAO,WAAW,WAA4B,IAAS;EACrD,OAAO,KAAK,WAAW,SAAS,KAAK,SAAS,GAAG,EAAE;CACrD;;CAGA,AAAO,aAAa,WAA4B,IAAS;EACvD,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,GAAG,EAAE;CACvD;;CAGA,AAAO,QAAQ,WAA4B,IAAS;EAClD,OAAO,KAAK,WAAW,UAAU,KAAK,SAAS,GAAG,EAAE;CACtD;AACF;;AAGA,MAAa,QAAQ,IAAI,MAAM"}
1
+ {"version":3,"file":"in-app.mjs","names":[],"sources":["../../../../../../../../packages/notifications/src/in-app/in-app.ts"],"sourcesContent":["/**\n * `inApp` — app-facing facade for the in-app/database channel.\n *\n * `inApp.configure({ model | repository })` binds the in-app store AND\n * returns the `database` channel — so the read side and the dispatched\n * write side share ONE repository instance.\n * • `{ model: Notification }` — 90% case; default repo built internally.\n * • `{ repository: myRepo }` — 10% case; custom column mapping / extras.\n *\n * No zero-arg form: the package ships no concrete model/table (thin eject),\n * so the dev MUST tell us which model to use.\n *\n * Every read + mutation is RECIPIENT-SCOPED by construction — `markAsRead(user,\n * id)` cannot flip a row belonging to a different recipient even if handed a\n * foreign id (the recipient id is forced into the filter → 0 rows match).\n *\n * @example\n * // src/config/notifications.ts:\n * inApp.configure({ model: Notification }),\n *\n * // anywhere:\n * const unread = await inApp.listUnread(user);\n * const badge = await inApp.countUnread(user);\n * const one = await inApp.find(user, \"ntf_123\");\n * await inApp.markAsRead(user, \"ntf_123\");\n * await inApp.markAsRead(user); // mark ALL unread\n * await inApp.dismiss(user, \"ntf_123\"); // delete one\n * await inApp.dismiss(user); // clear all for this recipient\n */\nimport type { TypedRepositoryOptionsWithPages } from \"@warlock.js/core\";\nimport { databaseChannel } from \"../channels/database-channel\";\nimport type { Channel } from \"../contracts\";\nimport type { DatabasePayload, Id, Notifiable } from \"../types\";\nimport {\n BaseNotificationsRepository,\n type NotificationModelClass,\n type NotificationsFilter,\n} from \"./base-notifications-repository\";\n\n/**\n * List options for the read methods — the repository's paginated options\n * (`page` / `limit` / `orderBy` / filter keys). `recipientId` is always forced\n * from the recipient argument, so passing it here has no effect.\n */\nexport type NotificationsListOptions = TypedRepositoryOptionsWithPages<NotificationsFilter>;\n\n/**\n * Configure options — discriminated so `model` and `repository` are mutually\n * exclusive at the type level. Future knobs (cache / realtime / naming) slot\n * in here without breaking the signature.\n */\nexport type ConfigureOptions =\n | { model: NotificationModelClass; repository?: never }\n | { repository: BaseNotificationsRepository; model?: never };\n\nconst idOf = (recipient: Notifiable | Id): Id =>\n typeof recipient === \"object\" ? recipient.id : recipient;\n\nclass InApp {\n private repo?: BaseNotificationsRepository;\n\n /**\n * Bind the in-app store AND return the `database` channel. Called once\n * from `config/notifications.ts`. Subsequent calls REPLACE the binding.\n */\n public configure(options: ConfigureOptions): Channel<DatabasePayload> {\n this.repo =\n \"repository\" in options && options.repository\n ? options.repository\n : new BaseNotificationsRepository(options.model);\n return databaseChannel(this.repo);\n }\n\n private get repository(): BaseNotificationsRepository {\n if (!this.repo) {\n throw new Error(\n \"In-app notifications not configured — add \" +\n \"`database: inApp.configure({ model: Notification })` to config/notifications.ts\",\n );\n }\n return this.repo;\n }\n\n /** General list — scoped to recipient; pass `options` for paging + filters. */\n public list(recipient: Notifiable | Id, options?: NotificationsListOptions) {\n return this.repository.list({ ...options, recipientId: idOf(recipient) });\n }\n\n /** Unread-only list — common case for badges + dashboards. */\n public listUnread(recipient: Notifiable | Id, options?: NotificationsListOptions) {\n return this.repository.list({ ...options, recipientId: idOf(recipient), unread: true });\n }\n\n /**\n * Cached unread count — backs the badge. Auto-invalidated by the repo's\n * model create/update events (`RepositoryManager.registerEvents`).\n */\n public countUnread(recipient: Notifiable | Id) {\n return this.repository.countCached({ recipientId: idOf(recipient), unread: true });\n }\n\n /** Find one notification for a recipient — for a detail view. */\n public find(recipient: Notifiable | Id, id: Id) {\n return this.repository.findFor(idOf(recipient), id);\n }\n\n /** Mark read — `id` omitted = all unread for this recipient. */\n public markAsRead(recipient: Notifiable | Id, id?: Id) {\n return this.repository.markRead(idOf(recipient), id);\n }\n\n /** Mark unread — same recipient-scoping. */\n public markAsUnread(recipient: Notifiable | Id, id?: Id) {\n return this.repository.markUnread(idOf(recipient), id);\n }\n\n /** Delete/dismiss — `id` omitted = clear all for this recipient. */\n public dismiss(recipient: Notifiable | Id, id?: Id) {\n return this.repository.deleteFor(idOf(recipient), id);\n }\n}\n\n/** Single in-app facade — bound at boot via `inApp.configure(...)`. */\nexport const inApp = new InApp();\n"],"mappings":";;;;AAuDA,MAAM,QAAQ,cACZ,OAAO,cAAc,WAAW,UAAU,KAAK;AAEjD,IAAM,QAAN,MAAY;CACV,AAAQ;;;;;CAMR,AAAO,UAAU,SAAqD;EACpE,KAAK,OACH,gBAAgB,WAAW,QAAQ,aAC/B,QAAQ,aACR,IAAI,4BAA4B,QAAQ,KAAK;EACnD,OAAO,gBAAgB,KAAK,IAAI;CAClC;CAEA,IAAY,aAA0C;EACpD,IAAI,CAAC,KAAK,MACR,MAAM,IAAI,MACR,2HAEF;EAEF,OAAO,KAAK;CACd;;CAGA,AAAO,KAAK,WAA4B,SAAoC;EAC1E,OAAO,KAAK,WAAW,KAAK;GAAE,GAAG;GAAS,aAAa,KAAK,SAAS;EAAE,CAAC;CAC1E;;CAGA,AAAO,WAAW,WAA4B,SAAoC;EAChF,OAAO,KAAK,WAAW,KAAK;GAAE,GAAG;GAAS,aAAa,KAAK,SAAS;GAAG,QAAQ;EAAK,CAAC;CACxF;;;;;CAMA,AAAO,YAAY,WAA4B;EAC7C,OAAO,KAAK,WAAW,YAAY;GAAE,aAAa,KAAK,SAAS;GAAG,QAAQ;EAAK,CAAC;CACnF;;CAGA,AAAO,KAAK,WAA4B,IAAQ;EAC9C,OAAO,KAAK,WAAW,QAAQ,KAAK,SAAS,GAAG,EAAE;CACpD;;CAGA,AAAO,WAAW,WAA4B,IAAS;EACrD,OAAO,KAAK,WAAW,SAAS,KAAK,SAAS,GAAG,EAAE;CACrD;;CAGA,AAAO,aAAa,WAA4B,IAAS;EACvD,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS,GAAG,EAAE;CACvD;;CAGA,AAAO,QAAQ,WAA4B,IAAS;EAClD,OAAO,KAAK,WAAW,UAAU,KAAK,SAAS,GAAG,EAAE;CACtD;AACF;;AAGA,MAAa,QAAQ,IAAI,MAAM"}
@@ -1,7 +1,7 @@
1
1
  import { NotificationColumnMapHost } from "../in-app/column-map.mjs";
2
2
  import { ColumnMap } from "@warlock.js/cascade";
3
3
 
4
- //#region ../notifications/src/migration/notification-columns.d.ts
4
+ //#region ../../packages/notifications/src/migration/notification-columns.d.ts
5
5
  type NotificationIdType = "uuid" | "bigint" | "integer" | "string";
6
6
  type NotificationColumnsOptions = {
7
7
  /** The type used for recipient and tenant identifiers. Defaults to UUID. */idType?: NotificationIdType;
@@ -1 +1 @@
1
- {"version":3,"file":"notification-columns.d.mts","names":[],"sources":["../../../../../../../notifications/src/migration/notification-columns.ts"],"mappings":";;;;KA4BY,kBAAA;AAAA,KAEA,0BAAA;EAW2G,4EATrH,MAAA,GAAS,kBAAkB;AAAA;;;;;;iBAQb,mBAAA,CAAoB,OAAA,GAAU,0BAAA,GAA6B,SAAS;AAAA,iBACpE,mBAAA,CAAoB,KAAA,GAAQ,yBAAA,EAA2B,OAAA,GAAU,0BAAA,GAA6B,SAAA"}
1
+ {"version":3,"file":"notification-columns.d.mts","names":[],"sources":["../../../../../../../../packages/notifications/src/migration/notification-columns.ts"],"mappings":";;;;KA4BY,kBAAA;AAAA,KAEA,0BAAA;EAW2G,4EATrH,MAAA,GAAS,kBAAkB;AAAA;;;;;;iBAQb,mBAAA,CAAoB,OAAA,GAAU,0BAAA,GAA6B,SAAS;AAAA,iBACpE,mBAAA,CAAoB,KAAA,GAAQ,yBAAA,EAA2B,OAAA,GAAU,0BAAA,GAA6B,SAAA"}
@@ -1,7 +1,7 @@
1
1
  import { resolveColumnMap } from "../in-app/column-map.mjs";
2
2
  import { bigInteger, boolCol, integer, json, string, text, timestamp, uuid } from "@warlock.js/cascade";
3
3
 
4
- //#region ../notifications/src/migration/notification-columns.ts
4
+ //#region ../../packages/notifications/src/migration/notification-columns.ts
5
5
  /**
6
6
  * Column factory for the notifications table, driven by the model's
7
7
  * `columnMap`. The recipient / read-state / tenant columns take the NAMES the
@@ -1 +1 @@
1
- {"version":3,"file":"notification-columns.mjs","names":[],"sources":["../../../../../../../notifications/src/migration/notification-columns.ts"],"sourcesContent":["/**\n * Column factory for the notifications table, driven by the model's\n * `columnMap`. The recipient / read-state / tenant columns take the NAMES the\n * model declares, so the table, the repository, and the model accessors all\n * agree by construction. The stable lexical columns (`type`, `title`, `body`,\n * `payload`, `idempotency_key`) keep fixed names.\n *\n * Read-state follows the map's presence rules (see `NotificationColumnMap`):\n * `readAt` → a nullable timestamp, `isRead` → an indexed boolean, both → both.\n *\n * Spread + extend for app-specific extras (FK references, composite indexes).\n *\n * @example\n * import { Migration } from \"@warlock.js/cascade\";\n * import { notificationColumns } from \"@warlock.js/notifications\";\n * import { Notification } from \"../notification.model\";\n *\n * export default Migration.create(Notification, notificationColumns(Notification));\n *\n * @example // with extras (multi-tenant FK)\n * export default Migration.create(Notification, {\n * ...notificationColumns(Notification),\n * organization_id: uuid().references(Organization.table).notNullable(),\n * });\n */\nimport { bigInteger, boolCol, type ColumnMap, integer, json, string, text, timestamp, uuid } from \"@warlock.js/cascade\";\nimport { type NotificationColumnMapHost, resolveColumnMap } from \"../in-app/column-map\";\n\nexport type NotificationIdType = \"uuid\" | \"bigint\" | \"integer\" | \"string\";\n\nexport type NotificationColumnsOptions = {\n /** The type used for recipient and tenant identifiers. Defaults to UUID. */\n idType?: NotificationIdType;\n};\n\n/**\n * Returns the column map for a notification table, named from the model's\n * `columnMap`. Without a model, falls back to the resolved defaults\n * (`user_id` recipient + `read_at` read-state).\n */\nexport function notificationColumns(options?: NotificationColumnsOptions): ColumnMap;\nexport function notificationColumns(model?: NotificationColumnMapHost, options?: NotificationColumnsOptions): ColumnMap;\nexport function notificationColumns(\n modelOrOptions?: NotificationColumnMapHost | NotificationColumnsOptions,\n options?: NotificationColumnsOptions,\n): ColumnMap {\n const model = isNotificationColumnsOptions(modelOrOptions) ? undefined : modelOrOptions;\n const idType = (isNotificationColumnsOptions(modelOrOptions) ? modelOrOptions : options)?.idType ?? \"uuid\";\n const { recipient, tenant, readAt, isRead } = resolveColumnMap(model?.columnMap);\n const idColumn = getIdColumn(idType);\n\n const columns: ColumnMap = {\n [recipient]: idColumn().index().notNullable(),\n type: string().index().notNullable(),\n title: string().notNullable(),\n body: text().nullable(),\n payload: json().nullable(),\n };\n\n if (readAt) {\n columns[readAt] = timestamp().nullable();\n }\n\n if (isRead) {\n columns[isRead] = boolCol().default(false).index();\n }\n\n if (tenant) {\n columns[tenant] = idColumn().index().notNullable();\n }\n\n // Unique so a retried send can't insert a duplicate. Nullable: most rows\n // have no key (NULLs are distinct in a unique index). `createFor` does\n // find-or-create; this constraint is the race backstop.\n columns.idempotency_key = string().nullable().unique();\n\n return columns;\n}\n\nfunction isNotificationColumnsOptions(\n value: NotificationColumnMapHost | NotificationColumnsOptions | undefined,\n): value is NotificationColumnsOptions {\n return \"idType\" in (value ?? {});\n}\n\nfunction getIdColumn(idType: NotificationIdType) {\n switch (idType) {\n case \"bigint\":\n return bigInteger;\n case \"integer\":\n return integer;\n case \"string\":\n return string;\n default:\n return uuid;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,oBACd,gBACA,SACW;CACX,MAAM,QAAQ,6BAA6B,cAAc,IAAI,SAAY;CACzE,MAAM,UAAU,6BAA6B,cAAc,IAAI,iBAAiB,QAAO,EAAG,UAAU;CACpG,MAAM,EAAE,WAAW,QAAQ,QAAQ,WAAW,iBAAiB,OAAO,SAAS;CAC/E,MAAM,WAAW,YAAY,MAAM;CAEnC,MAAM,UAAqB;GACxB,YAAY,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;EAC5C,MAAM,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;EACnC,OAAO,OAAO,CAAC,CAAC,YAAY;EAC5B,MAAM,KAAK,CAAC,CAAC,SAAS;EACtB,SAAS,KAAK,CAAC,CAAC,SAAS;CAC3B;CAEA,IAAI,QACF,QAAQ,UAAU,UAAU,CAAC,CAAC,SAAS;CAGzC,IAAI,QACF,QAAQ,UAAU,QAAQ,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,MAAM;CAGnD,IAAI,QACF,QAAQ,UAAU,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;CAMnD,QAAQ,kBAAkB,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;CAErD,OAAO;AACT;AAEA,SAAS,6BACP,OACqC;CACrC,OAAO,aAAa,SAAS,CAAC;AAChC;AAEA,SAAS,YAAY,QAA4B;CAC/C,QAAQ,QAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,SACE,OAAO;CACX;AACF"}
1
+ {"version":3,"file":"notification-columns.mjs","names":[],"sources":["../../../../../../../../packages/notifications/src/migration/notification-columns.ts"],"sourcesContent":["/**\n * Column factory for the notifications table, driven by the model's\n * `columnMap`. The recipient / read-state / tenant columns take the NAMES the\n * model declares, so the table, the repository, and the model accessors all\n * agree by construction. The stable lexical columns (`type`, `title`, `body`,\n * `payload`, `idempotency_key`) keep fixed names.\n *\n * Read-state follows the map's presence rules (see `NotificationColumnMap`):\n * `readAt` → a nullable timestamp, `isRead` → an indexed boolean, both → both.\n *\n * Spread + extend for app-specific extras (FK references, composite indexes).\n *\n * @example\n * import { Migration } from \"@warlock.js/cascade\";\n * import { notificationColumns } from \"@warlock.js/notifications\";\n * import { Notification } from \"../notification.model\";\n *\n * export default Migration.create(Notification, notificationColumns(Notification));\n *\n * @example // with extras (multi-tenant FK)\n * export default Migration.create(Notification, {\n * ...notificationColumns(Notification),\n * organization_id: uuid().references(Organization.table).notNullable(),\n * });\n */\nimport { bigInteger, boolCol, type ColumnMap, integer, json, string, text, timestamp, uuid } from \"@warlock.js/cascade\";\nimport { type NotificationColumnMapHost, resolveColumnMap } from \"../in-app/column-map\";\n\nexport type NotificationIdType = \"uuid\" | \"bigint\" | \"integer\" | \"string\";\n\nexport type NotificationColumnsOptions = {\n /** The type used for recipient and tenant identifiers. Defaults to UUID. */\n idType?: NotificationIdType;\n};\n\n/**\n * Returns the column map for a notification table, named from the model's\n * `columnMap`. Without a model, falls back to the resolved defaults\n * (`user_id` recipient + `read_at` read-state).\n */\nexport function notificationColumns(options?: NotificationColumnsOptions): ColumnMap;\nexport function notificationColumns(model?: NotificationColumnMapHost, options?: NotificationColumnsOptions): ColumnMap;\nexport function notificationColumns(\n modelOrOptions?: NotificationColumnMapHost | NotificationColumnsOptions,\n options?: NotificationColumnsOptions,\n): ColumnMap {\n const model = isNotificationColumnsOptions(modelOrOptions) ? undefined : modelOrOptions;\n const idType = (isNotificationColumnsOptions(modelOrOptions) ? modelOrOptions : options)?.idType ?? \"uuid\";\n const { recipient, tenant, readAt, isRead } = resolveColumnMap(model?.columnMap);\n const idColumn = getIdColumn(idType);\n\n const columns: ColumnMap = {\n [recipient]: idColumn().index().notNullable(),\n type: string().index().notNullable(),\n title: string().notNullable(),\n body: text().nullable(),\n payload: json().nullable(),\n };\n\n if (readAt) {\n columns[readAt] = timestamp().nullable();\n }\n\n if (isRead) {\n columns[isRead] = boolCol().default(false).index();\n }\n\n if (tenant) {\n columns[tenant] = idColumn().index().notNullable();\n }\n\n // Unique so a retried send can't insert a duplicate. Nullable: most rows\n // have no key (NULLs are distinct in a unique index). `createFor` does\n // find-or-create; this constraint is the race backstop.\n columns.idempotency_key = string().nullable().unique();\n\n return columns;\n}\n\nfunction isNotificationColumnsOptions(\n value: NotificationColumnMapHost | NotificationColumnsOptions | undefined,\n): value is NotificationColumnsOptions {\n return \"idType\" in (value ?? {});\n}\n\nfunction getIdColumn(idType: NotificationIdType) {\n switch (idType) {\n case \"bigint\":\n return bigInteger;\n case \"integer\":\n return integer;\n case \"string\":\n return string;\n default:\n return uuid;\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0CA,SAAgB,oBACd,gBACA,SACW;CACX,MAAM,QAAQ,6BAA6B,cAAc,IAAI,SAAY;CACzE,MAAM,UAAU,6BAA6B,cAAc,IAAI,iBAAiB,QAAO,EAAG,UAAU;CACpG,MAAM,EAAE,WAAW,QAAQ,QAAQ,WAAW,iBAAiB,OAAO,SAAS;CAC/E,MAAM,WAAW,YAAY,MAAM;CAEnC,MAAM,UAAqB;GACxB,YAAY,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;EAC5C,MAAM,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;EACnC,OAAO,OAAO,CAAC,CAAC,YAAY;EAC5B,MAAM,KAAK,CAAC,CAAC,SAAS;EACtB,SAAS,KAAK,CAAC,CAAC,SAAS;CAC3B;CAEA,IAAI,QACF,QAAQ,UAAU,UAAU,CAAC,CAAC,SAAS;CAGzC,IAAI,QACF,QAAQ,UAAU,QAAQ,CAAC,CAAC,QAAQ,KAAK,CAAC,CAAC,MAAM;CAGnD,IAAI,QACF,QAAQ,UAAU,SAAS,CAAC,CAAC,MAAM,CAAC,CAAC,YAAY;CAMnD,QAAQ,kBAAkB,OAAO,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO;CAErD,OAAO;AACT;AAEA,SAAS,6BACP,OACqC;CACrC,OAAO,aAAa,SAAS,CAAC;AAChC;AAEA,SAAS,YAAY,QAA4B;CAC/C,QAAQ,QAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,WACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,SACE,OAAO;CACX;AACF"}
@@ -1,4 +1,4 @@
1
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs
1
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs
2
2
  const cryptoRef = typeof globalThis !== "undefined" && globalThis.crypto ? globalThis.crypto : {};
3
3
 
4
4
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"_internal.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs"],"sourcesContent":["//#region ../reinforcements/src/Random/_internal.ts\nconst ALPHANUMERIC = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst URL_SAFE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-\";\nconst cryptoRef = typeof globalThis !== \"undefined\" && globalThis.crypto ? globalThis.crypto : {};\nconst BYTE_VALUES = 256;\n/** Thrown by every security-shaped generator when no CSPRNG exists. */\nconst NO_CSPRNG_ERROR = \"No CSPRNG available: crypto.getRandomValues is required\";\n/**\n* Return the runtime CSPRNG, throwing when there is none. Tokens, ids\n* and uuids must never silently degrade to the seedable `next()` — a\n* predictable token is worse than a loud failure.\n*/\nfunction requireCsprng() {\n\tif (typeof cryptoRef.getRandomValues !== \"function\") throw new Error(NO_CSPRNG_ERROR);\n\treturn cryptoRef.getRandomValues.bind(cryptoRef);\n}\n/** Cryptographically secure random bytes. Throws without a CSPRNG. */\nfunction cryptoBytes(size) {\n\treturn requireCsprng()(new Uint8Array(size));\n}\n/**\n* Build a `length`-character string out of `charset` using CSPRNG\n* bytes. Bytes above the largest multiple of the charset size are\n* rejected and redrawn so every character stays equally likely — a\n* plain `byte % charset.length` would bias the leading characters.\n*\n* Throws when no CSPRNG is available, whatever the requested length.\n*/\nfunction cryptoStringOf(charset, length) {\n\tconst getRandomValues = requireCsprng();\n\tconst size = charset.length;\n\tconst limit = Math.floor(BYTE_VALUES / size) * size;\n\tlet text = \"\";\n\twhile (text.length < length) {\n\t\tconst bytes = getRandomValues(new Uint8Array(length - text.length));\n\t\tfor (let i = 0; i < bytes.length && text.length < length; i++) {\n\t\t\tif (bytes[i] >= limit) continue;\n\t\t\ttext += charset.charAt(bytes[i] % size);\n\t\t}\n\t}\n\treturn text;\n}\nlet rngState;\nfunction setSeed(seed) {\n\trngState = seed;\n}\n/**\n* Return the next pseudo-random value in `[0, 1)`. Uses `Math.random` by\n* default; switches to a seeded mulberry32 PRNG when `setSeed` is called\n* with a numeric seed.\n*/\nfunction next() {\n\tif (rngState === void 0) return Math.random();\n\trngState |= 0;\n\trngState = rngState + 1831565813 | 0;\n\tlet t = rngState;\n\tt = Math.imul(t ^ t >>> 15, t | 1);\n\tt ^= t + Math.imul(t ^ t >>> 7, t | 61);\n\treturn ((t ^ t >>> 14) >>> 0) / 4294967296;\n}\n\n//#endregion\nexport { ALPHANUMERIC, URL_SAFE, cryptoBytes, cryptoRef, cryptoStringOf, next, setSeed };\n//# sourceMappingURL=_internal.mjs.map"],"x_google_ignoreList":[0],"mappings":";AAGA,MAAM,YAAY,OAAO,eAAe,eAAe,WAAW,SAAS,WAAW,SAAS,CAAC"}
1
+ {"version":3,"file":"_internal.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/Random/_internal.mjs"],"sourcesContent":["//#region ../reinforcements/src/Random/_internal.ts\nconst ALPHANUMERIC = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\nconst URL_SAFE = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789_-\";\nconst cryptoRef = typeof globalThis !== \"undefined\" && globalThis.crypto ? globalThis.crypto : {};\nconst BYTE_VALUES = 256;\n/** Thrown by every security-shaped generator when no CSPRNG exists. */\nconst NO_CSPRNG_ERROR = \"No CSPRNG available: crypto.getRandomValues is required\";\n/**\n* Return the runtime CSPRNG, throwing when there is none. Tokens, ids\n* and uuids must never silently degrade to the seedable `next()` — a\n* predictable token is worse than a loud failure.\n*/\nfunction requireCsprng() {\n\tif (typeof cryptoRef.getRandomValues !== \"function\") throw new Error(NO_CSPRNG_ERROR);\n\treturn cryptoRef.getRandomValues.bind(cryptoRef);\n}\n/** Cryptographically secure random bytes. Throws without a CSPRNG. */\nfunction cryptoBytes(size) {\n\treturn requireCsprng()(new Uint8Array(size));\n}\n/**\n* Build a `length`-character string out of `charset` using CSPRNG\n* bytes. Bytes above the largest multiple of the charset size are\n* rejected and redrawn so every character stays equally likely — a\n* plain `byte % charset.length` would bias the leading characters.\n*\n* Throws when no CSPRNG is available, whatever the requested length.\n*/\nfunction cryptoStringOf(charset, length) {\n\tconst getRandomValues = requireCsprng();\n\tconst size = charset.length;\n\tconst limit = Math.floor(BYTE_VALUES / size) * size;\n\tlet text = \"\";\n\twhile (text.length < length) {\n\t\tconst bytes = getRandomValues(new Uint8Array(length - text.length));\n\t\tfor (let i = 0; i < bytes.length && text.length < length; i++) {\n\t\t\tif (bytes[i] >= limit) continue;\n\t\t\ttext += charset.charAt(bytes[i] % size);\n\t\t}\n\t}\n\treturn text;\n}\nlet rngState;\nfunction setSeed(seed) {\n\trngState = seed;\n}\n/**\n* Return the next pseudo-random value in `[0, 1)`. Uses `Math.random` by\n* default; switches to a seeded mulberry32 PRNG when `setSeed` is called\n* with a numeric seed.\n*/\nfunction next() {\n\tif (rngState === void 0) return Math.random();\n\trngState |= 0;\n\trngState = rngState + 1831565813 | 0;\n\tlet t = rngState;\n\tt = Math.imul(t ^ t >>> 15, t | 1);\n\tt ^= t + Math.imul(t ^ t >>> 7, t | 61);\n\treturn ((t ^ t >>> 14) >>> 0) / 4294967296;\n}\n\n//#endregion\nexport { ALPHANUMERIC, URL_SAFE, cryptoBytes, cryptoRef, cryptoStringOf, next, setSeed };\n//# sourceMappingURL=_internal.mjs.map"],"x_google_ignoreList":[0],"mappings":";AAGA,MAAM,YAAY,OAAO,eAAe,eAAe,WAAW,SAAS,WAAW,SAAS,CAAC"}
@@ -1,4 +1,4 @@
1
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs
1
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs
2
2
  /**
3
3
  * Deep-clone a value. Supports plain objects, arrays, `Date`, `RegExp`,
4
4
  * `Map`, `Set`, `Error`, and typed arrays. Handles circular references
@@ -1 +1 @@
1
- {"version":3,"file":"clone.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs"],"sourcesContent":["//#region ../reinforcements/src/mixed/clone/clone.ts\n/**\n* Deep-clone a value. Supports plain objects, arrays, `Date`, `RegExp`,\n* `Map`, `Set`, `Error`, and typed arrays. Handles circular references\n* via an internal `WeakMap`.\n*\n* Non-plain class instances are returned by reference — cloning custom\n* constructors requires the class's own copy logic, so this function\n* stops at that boundary rather than silently producing a half-clone.\n*\n* @example\n* const original = { user: { name: \"Ada\" }, tags: [\"x\"] };\n* const copy = clone(original);\n*\n* copy.user.name = \"Bob\";\n* original.user.name; // \"Ada\"\n*/\nfunction clone(value) {\n\tif (value === null || typeof value !== \"object\") return value;\n\treturn cloneDeep(value, /* @__PURE__ */ new WeakMap());\n}\nfunction cloneDeep(value, seen) {\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (seen.has(value)) return seen.get(value);\n\tif (value instanceof Date) return new Date(value.getTime());\n\tif (value instanceof RegExp) return cloneRegExp(value);\n\tif (value instanceof Error) return cloneError(value, seen);\n\tif (Array.isArray(value)) return cloneArray(value, seen);\n\tif (value instanceof Map) return cloneMap(value, seen);\n\tif (value instanceof Set) return cloneSet(value, seen);\n\tif (ArrayBuffer.isView(value) && !(value instanceof DataView)) return cloneTypedArray(value);\n\tif (value instanceof ArrayBuffer) return value.slice(0);\n\treturn clonePlainObject(value, seen);\n}\nfunction cloneRegExp(value) {\n\tconst copy = new RegExp(value.source, value.flags);\n\tcopy.lastIndex = value.lastIndex;\n\treturn copy;\n}\nfunction cloneError(value, seen) {\n\tconst Ctor = value.constructor;\n\tconst copy = new Ctor(value.message);\n\tcopy.stack = value.stack;\n\tcopy.name = value.name;\n\tseen.set(value, copy);\n\tfor (const key of Object.keys(value)) copy[key] = cloneDeep(value[key], seen);\n\treturn copy;\n}\nfunction cloneArray(value, seen) {\n\tconst copy = [];\n\tseen.set(value, copy);\n\tfor (const item of value) copy.push(cloneDeep(item, seen));\n\treturn copy;\n}\nfunction cloneMap(value, seen) {\n\tconst copy = /* @__PURE__ */ new Map();\n\tseen.set(value, copy);\n\tfor (const [key, val] of value) copy.set(cloneDeep(key, seen), cloneDeep(val, seen));\n\treturn copy;\n}\nfunction cloneSet(value, seen) {\n\tconst copy = /* @__PURE__ */ new Set();\n\tseen.set(value, copy);\n\tfor (const item of value) copy.add(cloneDeep(item, seen));\n\treturn copy;\n}\nfunction cloneTypedArray(value) {\n\tconst Ctor = value.constructor;\n\treturn new Ctor(value.buffer.slice(0));\n}\nfunction clonePlainObject(value, seen) {\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!(proto === Object.prototype || proto === null)) return value;\n\tconst copy = Object.create(proto);\n\tseen.set(value, copy);\n\tfor (const key of Object.keys(value)) copy[key] = cloneDeep(value[key], seen);\n\treturn copy;\n}\n\n//#endregion\nexport { clone as default };\n//# sourceMappingURL=clone.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAS,MAAM,OAAO;CACrB,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,OAAO,UAAU,uBAAuB,IAAI,QAAQ,CAAC;AACtD;AACA,SAAS,UAAU,OAAO,MAAM;CAC/B,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO,KAAK,IAAI,KAAK;CAC1C,IAAI,iBAAiB,MAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,CAAC;CAC1D,IAAI,iBAAiB,QAAQ,OAAO,YAAY,KAAK;CACrD,IAAI,iBAAiB,OAAO,OAAO,WAAW,OAAO,IAAI;CACzD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,WAAW,OAAO,IAAI;CACvD,IAAI,iBAAiB,KAAK,OAAO,SAAS,OAAO,IAAI;CACrD,IAAI,iBAAiB,KAAK,OAAO,SAAS,OAAO,IAAI;CACrD,IAAI,YAAY,OAAO,KAAK,KAAK,EAAE,iBAAiB,WAAW,OAAO,gBAAgB,KAAK;CAC3F,IAAI,iBAAiB,aAAa,OAAO,MAAM,MAAM,CAAC;CACtD,OAAO,iBAAiB,OAAO,IAAI;AACpC;AACA,SAAS,YAAY,OAAO;CAC3B,MAAM,OAAO,IAAI,OAAO,MAAM,QAAQ,MAAM,KAAK;CACjD,KAAK,YAAY,MAAM;CACvB,OAAO;AACR;AACA,SAAS,WAAW,OAAO,MAAM;CAChC,MAAM,OAAO,MAAM;CACnB,MAAM,OAAO,IAAI,KAAK,MAAM,OAAO;CACnC,KAAK,QAAQ,MAAM;CACnB,KAAK,OAAO,MAAM;CAClB,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG,KAAK,OAAO,UAAU,MAAM,MAAM,IAAI;CAC5E,OAAO;AACR;AACA,SAAS,WAAW,OAAO,MAAM;CAChC,MAAM,OAAO,CAAC;CACd,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,QAAQ,OAAO,KAAK,KAAK,UAAU,MAAM,IAAI,CAAC;CACzD,OAAO;AACR;AACA,SAAS,SAAS,OAAO,MAAM;CAC9B,MAAM,uBAAuB,IAAI,IAAI;CACrC,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,UAAU,KAAK,IAAI,CAAC;CACnF,OAAO;AACR;AACA,SAAS,SAAS,OAAO,MAAM;CAC9B,MAAM,uBAAuB,IAAI,IAAI;CACrC,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,QAAQ,OAAO,KAAK,IAAI,UAAU,MAAM,IAAI,CAAC;CACxD,OAAO;AACR;AACA,SAAS,gBAAgB,OAAO;CAC/B,MAAM,OAAO,MAAM;CACnB,OAAO,IAAI,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC;AACtC;AACA,SAAS,iBAAiB,OAAO,MAAM;CACtC,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,IAAI,EAAE,UAAU,OAAO,aAAa,UAAU,OAAO,OAAO;CAC5D,MAAM,OAAO,OAAO,OAAO,KAAK;CAChC,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG,KAAK,OAAO,UAAU,MAAM,MAAM,IAAI;CAC5E,OAAO;AACR"}
1
+ {"version":3,"file":"clone.mjs","names":[],"sources":["../../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/mixed/clone/clone.mjs"],"sourcesContent":["//#region ../reinforcements/src/mixed/clone/clone.ts\n/**\n* Deep-clone a value. Supports plain objects, arrays, `Date`, `RegExp`,\n* `Map`, `Set`, `Error`, and typed arrays. Handles circular references\n* via an internal `WeakMap`.\n*\n* Non-plain class instances are returned by reference — cloning custom\n* constructors requires the class's own copy logic, so this function\n* stops at that boundary rather than silently producing a half-clone.\n*\n* @example\n* const original = { user: { name: \"Ada\" }, tags: [\"x\"] };\n* const copy = clone(original);\n*\n* copy.user.name = \"Bob\";\n* original.user.name; // \"Ada\"\n*/\nfunction clone(value) {\n\tif (value === null || typeof value !== \"object\") return value;\n\treturn cloneDeep(value, /* @__PURE__ */ new WeakMap());\n}\nfunction cloneDeep(value, seen) {\n\tif (value === null || typeof value !== \"object\") return value;\n\tif (seen.has(value)) return seen.get(value);\n\tif (value instanceof Date) return new Date(value.getTime());\n\tif (value instanceof RegExp) return cloneRegExp(value);\n\tif (value instanceof Error) return cloneError(value, seen);\n\tif (Array.isArray(value)) return cloneArray(value, seen);\n\tif (value instanceof Map) return cloneMap(value, seen);\n\tif (value instanceof Set) return cloneSet(value, seen);\n\tif (ArrayBuffer.isView(value) && !(value instanceof DataView)) return cloneTypedArray(value);\n\tif (value instanceof ArrayBuffer) return value.slice(0);\n\treturn clonePlainObject(value, seen);\n}\nfunction cloneRegExp(value) {\n\tconst copy = new RegExp(value.source, value.flags);\n\tcopy.lastIndex = value.lastIndex;\n\treturn copy;\n}\nfunction cloneError(value, seen) {\n\tconst Ctor = value.constructor;\n\tconst copy = new Ctor(value.message);\n\tcopy.stack = value.stack;\n\tcopy.name = value.name;\n\tseen.set(value, copy);\n\tfor (const key of Object.keys(value)) copy[key] = cloneDeep(value[key], seen);\n\treturn copy;\n}\nfunction cloneArray(value, seen) {\n\tconst copy = [];\n\tseen.set(value, copy);\n\tfor (const item of value) copy.push(cloneDeep(item, seen));\n\treturn copy;\n}\nfunction cloneMap(value, seen) {\n\tconst copy = /* @__PURE__ */ new Map();\n\tseen.set(value, copy);\n\tfor (const [key, val] of value) copy.set(cloneDeep(key, seen), cloneDeep(val, seen));\n\treturn copy;\n}\nfunction cloneSet(value, seen) {\n\tconst copy = /* @__PURE__ */ new Set();\n\tseen.set(value, copy);\n\tfor (const item of value) copy.add(cloneDeep(item, seen));\n\treturn copy;\n}\nfunction cloneTypedArray(value) {\n\tconst Ctor = value.constructor;\n\treturn new Ctor(value.buffer.slice(0));\n}\nfunction clonePlainObject(value, seen) {\n\tconst proto = Object.getPrototypeOf(value);\n\tif (!(proto === Object.prototype || proto === null)) return value;\n\tconst copy = Object.create(proto);\n\tseen.set(value, copy);\n\tfor (const key of Object.keys(value)) copy[key] = cloneDeep(value[key], seen);\n\treturn copy;\n}\n\n//#endregion\nexport { clone as default };\n//# sourceMappingURL=clone.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;;;;;;;AAiBA,SAAS,MAAM,OAAO;CACrB,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,OAAO,UAAU,uBAAuB,IAAI,QAAQ,CAAC;AACtD;AACA,SAAS,UAAU,OAAO,MAAM;CAC/B,IAAI,UAAU,QAAQ,OAAO,UAAU,UAAU,OAAO;CACxD,IAAI,KAAK,IAAI,KAAK,GAAG,OAAO,KAAK,IAAI,KAAK;CAC1C,IAAI,iBAAiB,MAAM,OAAO,IAAI,KAAK,MAAM,QAAQ,CAAC;CAC1D,IAAI,iBAAiB,QAAQ,OAAO,YAAY,KAAK;CACrD,IAAI,iBAAiB,OAAO,OAAO,WAAW,OAAO,IAAI;CACzD,IAAI,MAAM,QAAQ,KAAK,GAAG,OAAO,WAAW,OAAO,IAAI;CACvD,IAAI,iBAAiB,KAAK,OAAO,SAAS,OAAO,IAAI;CACrD,IAAI,iBAAiB,KAAK,OAAO,SAAS,OAAO,IAAI;CACrD,IAAI,YAAY,OAAO,KAAK,KAAK,EAAE,iBAAiB,WAAW,OAAO,gBAAgB,KAAK;CAC3F,IAAI,iBAAiB,aAAa,OAAO,MAAM,MAAM,CAAC;CACtD,OAAO,iBAAiB,OAAO,IAAI;AACpC;AACA,SAAS,YAAY,OAAO;CAC3B,MAAM,OAAO,IAAI,OAAO,MAAM,QAAQ,MAAM,KAAK;CACjD,KAAK,YAAY,MAAM;CACvB,OAAO;AACR;AACA,SAAS,WAAW,OAAO,MAAM;CAChC,MAAM,OAAO,MAAM;CACnB,MAAM,OAAO,IAAI,KAAK,MAAM,OAAO;CACnC,KAAK,QAAQ,MAAM;CACnB,KAAK,OAAO,MAAM;CAClB,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG,KAAK,OAAO,UAAU,MAAM,MAAM,IAAI;CAC5E,OAAO;AACR;AACA,SAAS,WAAW,OAAO,MAAM;CAChC,MAAM,OAAO,CAAC;CACd,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,QAAQ,OAAO,KAAK,KAAK,UAAU,MAAM,IAAI,CAAC;CACzD,OAAO;AACR;AACA,SAAS,SAAS,OAAO,MAAM;CAC9B,MAAM,uBAAuB,IAAI,IAAI;CACrC,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,CAAC,KAAK,QAAQ,OAAO,KAAK,IAAI,UAAU,KAAK,IAAI,GAAG,UAAU,KAAK,IAAI,CAAC;CACnF,OAAO;AACR;AACA,SAAS,SAAS,OAAO,MAAM;CAC9B,MAAM,uBAAuB,IAAI,IAAI;CACrC,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,QAAQ,OAAO,KAAK,IAAI,UAAU,MAAM,IAAI,CAAC;CACxD,OAAO;AACR;AACA,SAAS,gBAAgB,OAAO;CAC/B,MAAM,OAAO,MAAM;CACnB,OAAO,IAAI,KAAK,MAAM,OAAO,MAAM,CAAC,CAAC;AACtC;AACA,SAAS,iBAAiB,OAAO,MAAM;CACtC,MAAM,QAAQ,OAAO,eAAe,KAAK;CACzC,IAAI,EAAE,UAAU,OAAO,aAAa,UAAU,OAAO,OAAO;CAC5D,MAAM,OAAO,OAAO,OAAO,KAAK;CAChC,KAAK,IAAI,OAAO,IAAI;CACpB,KAAK,MAAM,OAAO,OAAO,KAAK,KAAK,GAAG,KAAK,OAAO,UAAU,MAAM,MAAM,IAAI;CAC5E,OAAO;AACR"}
@@ -1,4 +1,4 @@
1
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs
1
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs
2
2
  /**
3
3
  * Round `value` to the given number of decimal places (banker's-style
4
4
  * `Math.round`).
@@ -1 +1 @@
1
- {"version":3,"file":"round.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs"],"sourcesContent":["//#region ../reinforcements/src/number/round.ts\n/**\n* Round `value` to the given number of decimal places (banker's-style\n* `Math.round`).\n*\n* @example\n* round(1.235, 2); // 1.24\n* round(1.5); // 2\n*/\nfunction round(value, precision = 2) {\n\tconst multiplier = Math.pow(10, precision || 0);\n\treturn Math.round(value * multiplier) / multiplier;\n}\n\n//#endregion\nexport { round as default };\n//# sourceMappingURL=round.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;AASA,SAAS,MAAM,OAAO,YAAY,GAAG;CACpC,MAAM,aAAa,KAAK,IAAI,IAAI,aAAa,CAAC;CAC9C,OAAO,KAAK,MAAM,QAAQ,UAAU,IAAI;AACzC"}
1
+ {"version":3,"file":"round.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/number/round.mjs"],"sourcesContent":["//#region ../reinforcements/src/number/round.ts\n/**\n* Round `value` to the given number of decimal places (banker's-style\n* `Math.round`).\n*\n* @example\n* round(1.235, 2); // 1.24\n* round(1.5); // 2\n*/\nfunction round(value, precision = 2) {\n\tconst multiplier = Math.pow(10, precision || 0);\n\treturn Math.round(value * multiplier) / multiplier;\n}\n\n//#endregion\nexport { round as default };\n//# sourceMappingURL=round.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;AASA,SAAS,MAAM,OAAO,YAAY,GAAG;CACpC,MAAM,aAAa,KAAK,IAAI,IAAI,aAAa,CAAC;CAC9C,OAAO,KAAK,MAAM,QAAQ,UAAU,IAAI;AACzC"}
@@ -1,6 +1,6 @@
1
1
  import { omit } from "./omit.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs
4
4
  /**
5
5
  * @deprecated Use {@link omit} instead. Will be removed in a future major release.
6
6
  */
@@ -1 +1 @@
1
- {"version":3,"file":"except.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs"],"sourcesContent":["import omit from \"./omit.mjs\";\n\n//#region ../reinforcements/src/object/except.ts\n/**\n* @deprecated Use {@link omit} instead. Will be removed in a future major release.\n*/\nfunction except(object, keys) {\n\treturn omit(object, keys);\n}\n\n//#endregion\nexport { except as default };\n//# sourceMappingURL=except.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;AAMA,SAAS,OAAO,QAAQ,MAAM;CAC7B,OAAO,KAAK,QAAQ,IAAI;AACzB"}
1
+ {"version":3,"file":"except.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/except.mjs"],"sourcesContent":["import omit from \"./omit.mjs\";\n\n//#region ../reinforcements/src/object/except.ts\n/**\n* @deprecated Use {@link omit} instead. Will be removed in a future major release.\n*/\nfunction except(object, keys) {\n\treturn omit(object, keys);\n}\n\n//#endregion\nexport { except as default };\n//# sourceMappingURL=except.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;AAMA,SAAS,OAAO,QAAQ,MAAM;CAC7B,OAAO,KAAK,QAAQ,IAAI;AACzB"}
@@ -1,4 +1,4 @@
1
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs
1
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs
2
2
  function get(object, path, defaultValue) {
3
3
  if (object === null || object === void 0) return defaultValue;
4
4
  if (path === "") return defaultValue;
@@ -1 +1 @@
1
- {"version":3,"file":"get.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs"],"sourcesContent":["//#region ../reinforcements/src/object/get.ts\nfunction get(object, path, defaultValue) {\n\tif (object === null || object === void 0) return defaultValue;\n\tif (path === \"\") return defaultValue;\n\tconst segments = path.split(\".\");\n\tlet current = object;\n\tfor (const key of segments) {\n\t\tif (current === null || current === void 0) return defaultValue;\n\t\tif (typeof current !== \"object\") return defaultValue;\n\t\tif (!Object.prototype.hasOwnProperty.call(current, key)) return defaultValue;\n\t\tcurrent = current[key];\n\t}\n\treturn current === void 0 ? defaultValue : current;\n}\n\n//#endregion\nexport { get as default };\n//# sourceMappingURL=get.mjs.map"],"x_google_ignoreList":[0],"mappings":";AACA,SAAS,IAAI,QAAQ,MAAM,cAAc;CACxC,IAAI,WAAW,QAAQ,WAAW,KAAK,GAAG,OAAO;CACjD,IAAI,SAAS,IAAI,OAAO;CACxB,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,UAAU;CACd,KAAK,MAAM,OAAO,UAAU;EAC3B,IAAI,YAAY,QAAQ,YAAY,KAAK,GAAG,OAAO;EACnD,IAAI,OAAO,YAAY,UAAU,OAAO;EACxC,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG,GAAG,OAAO;EAChE,UAAU,QAAQ;CACnB;CACA,OAAO,YAAY,KAAK,IAAI,eAAe;AAC5C"}
1
+ {"version":3,"file":"get.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/get.mjs"],"sourcesContent":["//#region ../reinforcements/src/object/get.ts\nfunction get(object, path, defaultValue) {\n\tif (object === null || object === void 0) return defaultValue;\n\tif (path === \"\") return defaultValue;\n\tconst segments = path.split(\".\");\n\tlet current = object;\n\tfor (const key of segments) {\n\t\tif (current === null || current === void 0) return defaultValue;\n\t\tif (typeof current !== \"object\") return defaultValue;\n\t\tif (!Object.prototype.hasOwnProperty.call(current, key)) return defaultValue;\n\t\tcurrent = current[key];\n\t}\n\treturn current === void 0 ? defaultValue : current;\n}\n\n//#endregion\nexport { get as default };\n//# sourceMappingURL=get.mjs.map"],"x_google_ignoreList":[0],"mappings":";AACA,SAAS,IAAI,QAAQ,MAAM,cAAc;CACxC,IAAI,WAAW,QAAQ,WAAW,KAAK,GAAG,OAAO;CACjD,IAAI,SAAS,IAAI,OAAO;CACxB,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,UAAU;CACd,KAAK,MAAM,OAAO,UAAU;EAC3B,IAAI,YAAY,QAAQ,YAAY,KAAK,GAAG,OAAO;EACnD,IAAI,OAAO,YAAY,UAAU,OAAO;EACxC,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,SAAS,GAAG,GAAG,OAAO;EAChE,UAAU,QAAQ;CACnB;CACA,OAAO,YAAY,KAAK,IAAI,eAAe;AAC5C"}
@@ -1,6 +1,6 @@
1
1
  import { unset } from "./unset.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs
4
4
  function omit(object, keysOrPredicate) {
5
5
  if (!object || typeof object !== "object" || Array.isArray(object)) return object;
6
6
  if (typeof keysOrPredicate === "function") return omitByPredicate(object, keysOrPredicate);
@@ -1 +1 @@
1
- {"version":3,"file":"omit.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs"],"sourcesContent":["import unset from \"./unset.mjs\";\n\n//#region ../reinforcements/src/object/omit.ts\nfunction omit(object, keysOrPredicate) {\n\tif (!object || typeof object !== \"object\" || Array.isArray(object)) return object;\n\tif (typeof keysOrPredicate === \"function\") return omitByPredicate(object, keysOrPredicate);\n\treturn unset({ ...object }, keysOrPredicate);\n}\nfunction omitByPredicate(object, predicate) {\n\tconst result = {};\n\tfor (const key of Object.keys(object)) if (!predicate(object[key], key)) result[key] = object[key];\n\treturn result;\n}\n\n//#endregion\nexport { omit as default };\n//# sourceMappingURL=omit.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;AAGA,SAAS,KAAK,QAAQ,iBAAiB;CACtC,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG,OAAO;CAC3E,IAAI,OAAO,oBAAoB,YAAY,OAAO,gBAAgB,QAAQ,eAAe;CACzF,OAAO,MAAM,EAAE,GAAG,OAAO,GAAG,eAAe;AAC5C;AACA,SAAS,gBAAgB,QAAQ,WAAW;CAC3C,MAAM,SAAS,CAAC;CAChB,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,OAAO,MAAM,GAAG,GAAG,OAAO,OAAO,OAAO;CAC9F,OAAO;AACR"}
1
+ {"version":3,"file":"omit.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/omit.mjs"],"sourcesContent":["import unset from \"./unset.mjs\";\n\n//#region ../reinforcements/src/object/omit.ts\nfunction omit(object, keysOrPredicate) {\n\tif (!object || typeof object !== \"object\" || Array.isArray(object)) return object;\n\tif (typeof keysOrPredicate === \"function\") return omitByPredicate(object, keysOrPredicate);\n\treturn unset({ ...object }, keysOrPredicate);\n}\nfunction omitByPredicate(object, predicate) {\n\tconst result = {};\n\tfor (const key of Object.keys(object)) if (!predicate(object[key], key)) result[key] = object[key];\n\treturn result;\n}\n\n//#endregion\nexport { omit as default };\n//# sourceMappingURL=omit.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;AAGA,SAAS,KAAK,QAAQ,iBAAiB;CACtC,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG,OAAO;CAC3E,IAAI,OAAO,oBAAoB,YAAY,OAAO,gBAAgB,QAAQ,eAAe;CACzF,OAAO,MAAM,EAAE,GAAG,OAAO,GAAG,eAAe;AAC5C;AACA,SAAS,gBAAgB,QAAQ,WAAW;CAC3C,MAAM,SAAS,CAAC;CAChB,KAAK,MAAM,OAAO,OAAO,KAAK,MAAM,GAAG,IAAI,CAAC,UAAU,OAAO,MAAM,GAAG,GAAG,OAAO,OAAO,OAAO;CAC9F,OAAO;AACR"}
@@ -1,6 +1,6 @@
1
1
  import { get } from "./get.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs
4
4
  /**
5
5
  * Remove one or more dot-notation paths from `object`. Mutates and
6
6
  * returns the input.
@@ -1 +1 @@
1
- {"version":3,"file":"unset.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs"],"sourcesContent":["import get from \"./get.mjs\";\n\n//#region ../reinforcements/src/object/unset.ts\n/**\n* Remove one or more dot-notation paths from `object`. Mutates and\n* returns the input.\n*\n* @example\n* unset({ a: 1, b: 2 }, [\"a\"]); // { b: 2 }\n* unset({ a: { b: 1, c: 2 } }, [\"a.b\"]); // { a: { c: 2 } }\n*/\nfunction unset(object, keys) {\n\tif (!object || typeof object !== \"object\" || Array.isArray(object)) return object;\n\tfor (const key of keys) deletePath(object, key);\n\treturn object;\n}\nfunction deletePath(object, path) {\n\tconst segments = path.split(\".\");\n\tif (segments.length === 1) {\n\t\tdelete object[path];\n\t\treturn;\n\t}\n\tconst lastKey = segments.pop();\n\tconst parent = get(object, segments.join(\".\"));\n\tif (parent && typeof parent === \"object\") delete parent[lastKey];\n}\n\n//#endregion\nexport { unset as default };\n//# sourceMappingURL=unset.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;AAWA,SAAS,MAAM,QAAQ,MAAM;CAC5B,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG,OAAO;CAC3E,KAAK,MAAM,OAAO,MAAM,WAAW,QAAQ,GAAG;CAC9C,OAAO;AACR;AACA,SAAS,WAAW,QAAQ,MAAM;CACjC,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,SAAS,WAAW,GAAG;EAC1B,OAAO,OAAO;EACd;CACD;CACA,MAAM,UAAU,SAAS,IAAI;CAC7B,MAAM,SAAS,IAAI,QAAQ,SAAS,KAAK,GAAG,CAAC;CAC7C,IAAI,UAAU,OAAO,WAAW,UAAU,OAAO,OAAO;AACzD"}
1
+ {"version":3,"file":"unset.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/object/unset.mjs"],"sourcesContent":["import get from \"./get.mjs\";\n\n//#region ../reinforcements/src/object/unset.ts\n/**\n* Remove one or more dot-notation paths from `object`. Mutates and\n* returns the input.\n*\n* @example\n* unset({ a: 1, b: 2 }, [\"a\"]); // { b: 2 }\n* unset({ a: { b: 1, c: 2 } }, [\"a.b\"]); // { a: { c: 2 } }\n*/\nfunction unset(object, keys) {\n\tif (!object || typeof object !== \"object\" || Array.isArray(object)) return object;\n\tfor (const key of keys) deletePath(object, key);\n\treturn object;\n}\nfunction deletePath(object, path) {\n\tconst segments = path.split(\".\");\n\tif (segments.length === 1) {\n\t\tdelete object[path];\n\t\treturn;\n\t}\n\tconst lastKey = segments.pop();\n\tconst parent = get(object, segments.join(\".\"));\n\tif (parent && typeof parent === \"object\") delete parent[lastKey];\n}\n\n//#endregion\nexport { unset as default };\n//# sourceMappingURL=unset.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;AAWA,SAAS,MAAM,QAAQ,MAAM;CAC5B,IAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG,OAAO;CAC3E,KAAK,MAAM,OAAO,MAAM,WAAW,QAAQ,GAAG;CAC9C,OAAO;AACR;AACA,SAAS,WAAW,QAAQ,MAAM;CACjC,MAAM,WAAW,KAAK,MAAM,GAAG;CAC/B,IAAI,SAAS,WAAW,GAAG;EAC1B,OAAO,OAAO;EACd;CACD;CACA,MAAM,UAAU,SAAS,IAAI;CAC7B,MAAM,SAAS,IAAI,QAAQ,SAAS,KAAK,GAAG,CAAC;CAC7C,IAAI,UAAU,OAAO,WAAW,UAAU,OAAO,OAAO;AACzD"}
@@ -1,6 +1,6 @@
1
1
  import { ucfirst } from "./ucfirst.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs
4
4
  const WHITESPACE_RUN = /\s+/;
5
5
  const WHITESPACE_GROUP = /(\s+)/;
6
6
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"capitalize.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs"],"sourcesContent":["import ucfirst from \"./ucfirst.mjs\";\n\n//#region ../reinforcements/src/string/capitalize.ts\nconst WHITESPACE_RUN = /\\s+/;\nconst WHITESPACE_GROUP = /(\\s+)/;\n/**\n* Capitalize the first letter of each whitespace-separated word.\n*\n* @example\n* capitalize(\"hello world\"); // \"Hello World\"\n*/\nfunction capitalize(string) {\n\tif (!string) return \"\";\n\treturn string.split(WHITESPACE_GROUP).map((part) => WHITESPACE_RUN.test(part) ? part : ucfirst(part)).join(\"\");\n}\n\n//#endregion\nexport { capitalize as default };\n//# sourceMappingURL=capitalize.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;AAGA,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;;;;;;;AAOzB,SAAS,WAAW,QAAQ;CAC3B,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,OAAO,MAAM,gBAAgB,CAAC,CAAC,KAAK,SAAS,eAAe,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;AAC9G"}
1
+ {"version":3,"file":"capitalize.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/capitalize.mjs"],"sourcesContent":["import ucfirst from \"./ucfirst.mjs\";\n\n//#region ../reinforcements/src/string/capitalize.ts\nconst WHITESPACE_RUN = /\\s+/;\nconst WHITESPACE_GROUP = /(\\s+)/;\n/**\n* Capitalize the first letter of each whitespace-separated word.\n*\n* @example\n* capitalize(\"hello world\"); // \"Hello World\"\n*/\nfunction capitalize(string) {\n\tif (!string) return \"\";\n\treturn string.split(WHITESPACE_GROUP).map((part) => WHITESPACE_RUN.test(part) ? part : ucfirst(part)).join(\"\");\n}\n\n//#endregion\nexport { capitalize as default };\n//# sourceMappingURL=capitalize.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;AAGA,MAAM,iBAAiB;AACvB,MAAM,mBAAmB;;;;;;;AAOzB,SAAS,WAAW,QAAQ;CAC3B,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,OAAO,MAAM,gBAAgB,CAAC,CAAC,KAAK,SAAS,eAAe,KAAK,IAAI,IAAI,OAAO,QAAQ,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;AAC9G"}
@@ -1,6 +1,6 @@
1
1
  import { escapeRegex } from "../utils/escapeRegex.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs
4
4
  /**
5
5
  * Remove the given needle from the start of string
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ltrim.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs"],"sourcesContent":["import escapeRegex from \"../utils/escapeRegex.mjs\";\n\n//#region ../reinforcements/src/string/ltrim.ts\n/**\n* Remove the given needle from the start of string\n*\n* @param string needle\n* @return string\n*/\nfunction ltrim(string, needle = \" \") {\n\tif (!string) return \"\";\n\tconst pattern = \"^\" + escapeRegex(needle) + \"+\", regex = new RegExp(pattern, \"g\");\n\treturn string.replace(regex, \"\");\n}\n\n//#endregion\nexport { ltrim as default };\n//# sourceMappingURL=ltrim.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;AASA,SAAS,MAAM,QAAQ,SAAS,KAAK;CACpC,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,UAAU,MAAM,YAAY,MAAM,IAAI,KAAK,QAAQ,IAAI,OAAO,SAAS,GAAG;CAChF,OAAO,OAAO,QAAQ,OAAO,EAAE;AAChC"}
1
+ {"version":3,"file":"ltrim.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/ltrim.mjs"],"sourcesContent":["import escapeRegex from \"../utils/escapeRegex.mjs\";\n\n//#region ../reinforcements/src/string/ltrim.ts\n/**\n* Remove the given needle from the start of string\n*\n* @param string needle\n* @return string\n*/\nfunction ltrim(string, needle = \" \") {\n\tif (!string) return \"\";\n\tconst pattern = \"^\" + escapeRegex(needle) + \"+\", regex = new RegExp(pattern, \"g\");\n\treturn string.replace(regex, \"\");\n}\n\n//#endregion\nexport { ltrim as default };\n//# sourceMappingURL=ltrim.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;AASA,SAAS,MAAM,QAAQ,SAAS,KAAK;CACpC,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,UAAU,MAAM,YAAY,MAAM,IAAI,KAAK,QAAQ,IAAI,OAAO,SAAS,GAAG;CAChF,OAAO,OAAO,QAAQ,OAAO,EAAE;AAChC"}
@@ -1,4 +1,4 @@
1
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs
1
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs
2
2
  /**
3
3
  * Cut string for the given length and append ... if string is larger than the given length
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"readMoreChars.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs"],"sourcesContent":["//#region ../reinforcements/src/string/readMoreChars.ts\n/**\n* Cut string for the given length and append ... if string is larger than the given length\n*\n*/\nfunction readMoreChars(string, length, readMoreDots = \"...\") {\n\tif (!string) return \"\";\n\tif (string.length <= length) return string;\n\treturn string.substring(0, length) + readMoreDots;\n}\n\n//#endregion\nexport { readMoreChars as default };\n//# sourceMappingURL=readMoreChars.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;AAKA,SAAS,cAAc,QAAQ,QAAQ,eAAe,OAAO;CAC5D,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,OAAO,UAAU,QAAQ,OAAO;CACpC,OAAO,OAAO,UAAU,GAAG,MAAM,IAAI;AACtC"}
1
+ {"version":3,"file":"readMoreChars.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/readMoreChars.mjs"],"sourcesContent":["//#region ../reinforcements/src/string/readMoreChars.ts\n/**\n* Cut string for the given length and append ... if string is larger than the given length\n*\n*/\nfunction readMoreChars(string, length, readMoreDots = \"...\") {\n\tif (!string) return \"\";\n\tif (string.length <= length) return string;\n\treturn string.substring(0, length) + readMoreDots;\n}\n\n//#endregion\nexport { readMoreChars as default };\n//# sourceMappingURL=readMoreChars.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;AAKA,SAAS,cAAc,QAAQ,QAAQ,eAAe,OAAO;CAC5D,IAAI,CAAC,QAAQ,OAAO;CACpB,IAAI,OAAO,UAAU,QAAQ,OAAO;CACpC,OAAO,OAAO,UAAU,GAAG,MAAM,IAAI;AACtC"}
@@ -1,6 +1,6 @@
1
1
  import { escapeRegex } from "../utils/escapeRegex.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs
4
4
  /**
5
5
  * Remove the given needle from the start of string
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"rtrim.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs"],"sourcesContent":["import escapeRegex from \"../utils/escapeRegex.mjs\";\n\n//#region ../reinforcements/src/string/rtrim.ts\n/**\n* Remove the given needle from the start of string\n*\n* @param string needle\n* @return string\n*/\nfunction rtrim(string, needle = \" \") {\n\tif (!string) return \"\";\n\tconst pattern = escapeRegex(needle) + \"+$\", regex = new RegExp(pattern, \"g\");\n\treturn string.replace(regex, \"\");\n}\n\n//#endregion\nexport { rtrim as default };\n//# sourceMappingURL=rtrim.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;AASA,SAAS,MAAM,QAAQ,SAAS,KAAK;CACpC,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,UAAU,YAAY,MAAM,IAAI,MAAM,QAAQ,IAAI,OAAO,SAAS,GAAG;CAC3E,OAAO,OAAO,QAAQ,OAAO,EAAE;AAChC"}
1
+ {"version":3,"file":"rtrim.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/rtrim.mjs"],"sourcesContent":["import escapeRegex from \"../utils/escapeRegex.mjs\";\n\n//#region ../reinforcements/src/string/rtrim.ts\n/**\n* Remove the given needle from the start of string\n*\n* @param string needle\n* @return string\n*/\nfunction rtrim(string, needle = \" \") {\n\tif (!string) return \"\";\n\tconst pattern = escapeRegex(needle) + \"+$\", regex = new RegExp(pattern, \"g\");\n\treturn string.replace(regex, \"\");\n}\n\n//#endregion\nexport { rtrim as default };\n//# sourceMappingURL=rtrim.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;AASA,SAAS,MAAM,QAAQ,SAAS,KAAK;CACpC,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,UAAU,YAAY,MAAM,IAAI,MAAM,QAAQ,IAAI,OAAO,SAAS,GAAG;CAC3E,OAAO,OAAO,QAAQ,OAAO,EAAE;AAChC"}
@@ -1,6 +1,6 @@
1
1
  import { words } from "./words.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs
4
4
  /**
5
5
  * Convert a string to camelCase.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"toCamelCase.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs"],"sourcesContent":["import words from \"./words.mjs\";\n\n//#region ../reinforcements/src/string/toCamelCase.ts\n/**\n* Convert a string to camelCase.\n*\n* @example\n* toCamelCase(\"hello-world\"); // \"helloWorld\"\n* toCamelCase(\"XMLHttpRequest\"); // \"xmlHttpRequest\"\n*/\nfunction toCamelCase(string) {\n\tif (!string) return \"\";\n\treturn words(string).map(toSegment).join(\"\");\n}\nfunction toSegment(word, index) {\n\tif (index === 0) return word.toLowerCase();\n\treturn word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n\n//#endregion\nexport { toCamelCase as default };\n//# sourceMappingURL=toCamelCase.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,QAAQ;CAC5B,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,MAAM,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,EAAE;AAC5C;AACA,SAAS,UAAU,MAAM,OAAO;CAC/B,IAAI,UAAU,GAAG,OAAO,KAAK,YAAY;CACzC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY;AACjE"}
1
+ {"version":3,"file":"toCamelCase.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toCamelCase.mjs"],"sourcesContent":["import words from \"./words.mjs\";\n\n//#region ../reinforcements/src/string/toCamelCase.ts\n/**\n* Convert a string to camelCase.\n*\n* @example\n* toCamelCase(\"hello-world\"); // \"helloWorld\"\n* toCamelCase(\"XMLHttpRequest\"); // \"xmlHttpRequest\"\n*/\nfunction toCamelCase(string) {\n\tif (!string) return \"\";\n\treturn words(string).map(toSegment).join(\"\");\n}\nfunction toSegment(word, index) {\n\tif (index === 0) return word.toLowerCase();\n\treturn word.charAt(0).toUpperCase() + word.slice(1).toLowerCase();\n}\n\n//#endregion\nexport { toCamelCase as default };\n//# sourceMappingURL=toCamelCase.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,QAAQ;CAC5B,IAAI,CAAC,QAAQ,OAAO;CACpB,OAAO,MAAM,MAAM,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,KAAK,EAAE;AAC5C;AACA,SAAS,UAAU,MAAM,OAAO;CAC/B,IAAI,UAAU,GAAG,OAAO,KAAK,YAAY;CACzC,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,YAAY,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,YAAY;AACjE"}
@@ -1,6 +1,6 @@
1
1
  import { toSnakeCase } from "./toSnakeCase.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs
4
4
  /**
5
5
  * Convert a string to kebab-case.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"toKebabCase.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs"],"sourcesContent":["import toSnakeCase from \"./toSnakeCase.mjs\";\n\n//#region ../reinforcements/src/string/toKebabCase.ts\n/**\n* Convert a string to kebab-case.\n*\n* @example\n* toKebabCase(\"HelloWorld\"); // \"hello-world\"\n* toKebabCase(\"AIAgent\"); // \"ai-agent\"\n*/\nfunction toKebabCase(string, lowerAll = true) {\n\treturn toSnakeCase(string, \"-\", lowerAll);\n}\n\n//#endregion\nexport { toKebabCase as default };\n//# sourceMappingURL=toKebabCase.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,QAAQ,WAAW,MAAM;CAC7C,OAAO,YAAY,QAAQ,KAAK,QAAQ;AACzC"}
1
+ {"version":3,"file":"toKebabCase.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toKebabCase.mjs"],"sourcesContent":["import toSnakeCase from \"./toSnakeCase.mjs\";\n\n//#region ../reinforcements/src/string/toKebabCase.ts\n/**\n* Convert a string to kebab-case.\n*\n* @example\n* toKebabCase(\"HelloWorld\"); // \"hello-world\"\n* toKebabCase(\"AIAgent\"); // \"ai-agent\"\n*/\nfunction toKebabCase(string, lowerAll = true) {\n\treturn toSnakeCase(string, \"-\", lowerAll);\n}\n\n//#endregion\nexport { toKebabCase as default };\n//# sourceMappingURL=toKebabCase.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;AAUA,SAAS,YAAY,QAAQ,WAAW,MAAM;CAC7C,OAAO,YAAY,QAAQ,KAAK,QAAQ;AACzC"}
@@ -1,6 +1,6 @@
1
1
  import { words } from "./words.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs
4
4
  /**
5
5
  * Convert a string to snake_case (or any underscore-style with a
6
6
  * custom separator).
@@ -1 +1 @@
1
- {"version":3,"file":"toSnakeCase.mjs","names":[],"sources":["../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs"],"sourcesContent":["import words from \"./words.mjs\";\n\n//#region ../reinforcements/src/string/toSnakeCase.ts\n/**\n* Convert a string to snake_case (or any underscore-style with a\n* custom separator).\n*\n* @example\n* toSnakeCase(\"HelloWorld\"); // \"hello_world\"\n* toSnakeCase(\"AIAgent\"); // \"ai_agent\"\n*/\nfunction toSnakeCase(string, separator = \"_\", lowerAll = true) {\n\tif (!string) return \"\";\n\tconst tokens = words(string);\n\tif (!lowerAll) return tokens.join(separator);\n\treturn tokens.map((word) => word.toLowerCase()).join(separator);\n}\n\n//#endregion\nexport { toSnakeCase as default };\n//# sourceMappingURL=toSnakeCase.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;AAWA,SAAS,YAAY,QAAQ,YAAY,KAAK,WAAW,MAAM;CAC9D,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,SAAS,MAAM,MAAM;CAC3B,IAAI,CAAC,UAAU,OAAO,OAAO,KAAK,SAAS;CAC3C,OAAO,OAAO,KAAK,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS;AAC/D"}
1
+ {"version":3,"file":"toSnakeCase.mjs","names":[],"sources":["../../../../../../../../../../../../../../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toSnakeCase.mjs"],"sourcesContent":["import words from \"./words.mjs\";\n\n//#region ../reinforcements/src/string/toSnakeCase.ts\n/**\n* Convert a string to snake_case (or any underscore-style with a\n* custom separator).\n*\n* @example\n* toSnakeCase(\"HelloWorld\"); // \"hello_world\"\n* toSnakeCase(\"AIAgent\"); // \"ai_agent\"\n*/\nfunction toSnakeCase(string, separator = \"_\", lowerAll = true) {\n\tif (!string) return \"\";\n\tconst tokens = words(string);\n\tif (!lowerAll) return tokens.join(separator);\n\treturn tokens.map((word) => word.toLowerCase()).join(separator);\n}\n\n//#endregion\nexport { toSnakeCase as default };\n//# sourceMappingURL=toSnakeCase.mjs.map"],"x_google_ignoreList":[0],"mappings":";;;;;;;;;;;AAWA,SAAS,YAAY,QAAQ,YAAY,KAAK,WAAW,MAAM;CAC9D,IAAI,CAAC,QAAQ,OAAO;CACpB,MAAM,SAAS,MAAM,MAAM;CAC3B,IAAI,CAAC,UAAU,OAAO,OAAO,KAAK,SAAS;CAC3C,OAAO,OAAO,KAAK,SAAS,KAAK,YAAY,CAAC,CAAC,CAAC,KAAK,SAAS;AAC/D"}
@@ -1,6 +1,6 @@
1
1
  import { words } from "./words.mjs";
2
2
 
3
- //#region ../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toStudlyCase.mjs
3
+ //#region ../../node_modules/.pnpm/@mongez+reinforcements@4.0.2/node_modules/@mongez/reinforcements/esm/string/toStudlyCase.mjs
4
4
  /**
5
5
  * Convert a string to StudlyCase (PascalCase).
6
6
  *