semola 0.5.2 → 0.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (262) hide show
  1. package/README.md +88 -13
  2. package/dist/cron/builder/index.cjs +166 -0
  3. package/dist/cron/builder/index.d.cts +28 -0
  4. package/dist/cron/builder/index.d.cts.map +1 -0
  5. package/dist/cron/builder/index.d.mts +28 -0
  6. package/dist/cron/builder/index.d.mts.map +1 -0
  7. package/dist/cron/builder/index.mjs +163 -0
  8. package/dist/cron/builder/index.mjs.map +1 -0
  9. package/dist/cron/builder/types.cjs +27 -0
  10. package/dist/cron/builder/types.d.cts +79 -0
  11. package/dist/cron/builder/types.d.cts.map +1 -0
  12. package/dist/cron/builder/types.d.mts +79 -0
  13. package/dist/cron/builder/types.d.mts.map +1 -0
  14. package/dist/cron/builder/types.mjs +28 -0
  15. package/dist/cron/builder/types.mjs.map +1 -0
  16. package/dist/cron/core/index.cjs +308 -0
  17. package/dist/cron/core/index.d.cts +39 -0
  18. package/dist/cron/core/index.d.cts.map +1 -0
  19. package/dist/cron/core/index.d.mts +39 -0
  20. package/dist/cron/core/index.d.mts.map +1 -0
  21. package/dist/cron/core/index.mjs +310 -0
  22. package/dist/cron/core/index.mjs.map +1 -0
  23. package/dist/cron/{scanner.cjs → core/scanner.cjs} +2 -2
  24. package/dist/cron/{scanner.mjs → core/scanner.mjs} +2 -2
  25. package/dist/cron/core/scanner.mjs.map +1 -0
  26. package/dist/cron/{types.d.cts → core/types.d.cts} +1 -1
  27. package/dist/cron/core/types.d.cts.map +1 -0
  28. package/dist/cron/{types.d.mts → core/types.d.mts} +1 -1
  29. package/dist/cron/core/types.d.mts.map +1 -0
  30. package/dist/errors/types.d.cts +1 -1
  31. package/dist/errors/types.d.mts +1 -1
  32. package/dist/lib/cache/index.d.cts +3 -3
  33. package/dist/lib/cache/index.d.mts +3 -3
  34. package/dist/lib/cron/index.cjs +12 -275
  35. package/dist/lib/cron/index.d.cts +4 -39
  36. package/dist/lib/cron/index.d.mts +4 -39
  37. package/dist/lib/cron/index.mjs +4 -277
  38. package/dist/lib/errors/index.d.cts +2 -2
  39. package/dist/lib/errors/index.d.cts.map +1 -1
  40. package/dist/lib/errors/index.d.mts +2 -2
  41. package/dist/lib/errors/index.d.mts.map +1 -1
  42. package/dist/lib/errors/index.mjs.map +1 -1
  43. package/dist/lib/i18n/index.cjs +6 -1
  44. package/dist/lib/i18n/index.d.cts.map +1 -1
  45. package/dist/lib/i18n/index.d.mts.map +1 -1
  46. package/dist/lib/i18n/index.mjs +6 -1
  47. package/dist/lib/i18n/index.mjs.map +1 -1
  48. package/dist/lib/logging/index.cjs +18 -0
  49. package/dist/lib/logging/index.d.cts +7 -0
  50. package/dist/lib/logging/index.d.mts +7 -0
  51. package/dist/lib/logging/index.mjs +5 -0
  52. package/dist/lib/orm/index.cjs +20 -0
  53. package/dist/lib/orm/index.d.cts +7 -0
  54. package/dist/lib/orm/index.d.mts +7 -0
  55. package/dist/lib/orm/index.mjs +6 -0
  56. package/dist/lib/prompts/index.d.cts +8 -8
  57. package/dist/lib/prompts/index.d.mts +8 -8
  58. package/dist/lib/pubsub/index.cjs +82 -13
  59. package/dist/lib/pubsub/index.d.cts +14 -5
  60. package/dist/lib/pubsub/index.d.cts.map +1 -1
  61. package/dist/lib/pubsub/index.d.mts +14 -5
  62. package/dist/lib/pubsub/index.d.mts.map +1 -1
  63. package/dist/lib/pubsub/index.mjs +82 -13
  64. package/dist/lib/pubsub/index.mjs.map +1 -1
  65. package/dist/lib/queue/index.d.cts +2 -2
  66. package/dist/lib/queue/index.d.mts +2 -2
  67. package/dist/lib/workflow/index.cjs +534 -0
  68. package/dist/lib/workflow/index.d.cts +7 -0
  69. package/dist/lib/workflow/index.d.cts.map +1 -0
  70. package/dist/lib/workflow/index.d.mts +7 -0
  71. package/dist/lib/workflow/index.d.mts.map +1 -0
  72. package/dist/lib/workflow/index.mjs +535 -0
  73. package/dist/lib/workflow/index.mjs.map +1 -0
  74. package/dist/logging/core/index.cjs +99 -0
  75. package/dist/logging/core/index.d.cts +26 -0
  76. package/dist/logging/core/index.d.cts.map +1 -0
  77. package/dist/logging/core/index.d.mts +26 -0
  78. package/dist/logging/core/index.d.mts.map +1 -0
  79. package/dist/logging/core/index.mjs +99 -0
  80. package/dist/logging/core/index.mjs.map +1 -0
  81. package/dist/logging/core/types.cjs +10 -0
  82. package/dist/logging/core/types.d.cts +22 -0
  83. package/dist/logging/core/types.d.cts.map +1 -0
  84. package/dist/logging/core/types.d.mts +22 -0
  85. package/dist/logging/core/types.d.mts.map +1 -0
  86. package/dist/logging/core/types.mjs +12 -0
  87. package/dist/logging/core/types.mjs.map +1 -0
  88. package/dist/logging/formatter/index.cjs +119 -0
  89. package/dist/logging/formatter/index.d.cts +27 -0
  90. package/dist/logging/formatter/index.d.cts.map +1 -0
  91. package/dist/logging/formatter/index.d.mts +27 -0
  92. package/dist/logging/formatter/index.d.mts.map +1 -0
  93. package/dist/logging/formatter/index.mjs +115 -0
  94. package/dist/logging/formatter/index.mjs.map +1 -0
  95. package/dist/logging/formatter/types.d.cts +5 -0
  96. package/dist/logging/formatter/types.d.cts.map +1 -0
  97. package/dist/logging/formatter/types.d.mts +5 -0
  98. package/dist/logging/formatter/types.d.mts.map +1 -0
  99. package/dist/logging/provider/index.cjs +165 -0
  100. package/dist/logging/provider/index.d.cts +28 -0
  101. package/dist/logging/provider/index.d.cts.map +1 -0
  102. package/dist/logging/provider/index.d.mts +28 -0
  103. package/dist/logging/provider/index.d.mts.map +1 -0
  104. package/dist/logging/provider/index.mjs +165 -0
  105. package/dist/logging/provider/index.mjs.map +1 -0
  106. package/dist/logging/provider/types.d.cts +23 -0
  107. package/dist/logging/provider/types.d.cts.map +1 -0
  108. package/dist/logging/provider/types.d.mts +23 -0
  109. package/dist/logging/provider/types.d.mts.map +1 -0
  110. package/dist/orm/column.cjs +137 -0
  111. package/dist/orm/column.d.cts +121 -0
  112. package/dist/orm/column.d.cts.map +1 -0
  113. package/dist/orm/column.d.mts +121 -0
  114. package/dist/orm/column.d.mts.map +1 -0
  115. package/dist/orm/column.mjs +132 -0
  116. package/dist/orm/column.mjs.map +1 -0
  117. package/dist/orm/dialect/index.cjs +14 -0
  118. package/dist/orm/dialect/index.mjs +16 -0
  119. package/dist/orm/dialect/index.mjs.map +1 -0
  120. package/dist/orm/dialect/mysql.cjs +31 -0
  121. package/dist/orm/dialect/mysql.mjs +33 -0
  122. package/dist/orm/dialect/mysql.mjs.map +1 -0
  123. package/dist/orm/dialect/postgres.cjs +23 -0
  124. package/dist/orm/dialect/postgres.mjs +25 -0
  125. package/dist/orm/dialect/postgres.mjs.map +1 -0
  126. package/dist/orm/dialect/sqlite.cjs +31 -0
  127. package/dist/orm/dialect/sqlite.mjs +33 -0
  128. package/dist/orm/dialect/sqlite.mjs.map +1 -0
  129. package/dist/orm/dialect/utils.cjs +8 -0
  130. package/dist/orm/dialect/utils.mjs +10 -0
  131. package/dist/orm/dialect/utils.mjs.map +1 -0
  132. package/dist/orm/internal/table-columns.cjs +31 -0
  133. package/dist/orm/internal/table-columns.mjs +32 -0
  134. package/dist/orm/internal/table-columns.mjs.map +1 -0
  135. package/dist/orm/internal/table-lookup.cjs +35 -0
  136. package/dist/orm/internal/table-lookup.mjs +35 -0
  137. package/dist/orm/internal/table-lookup.mjs.map +1 -0
  138. package/dist/orm/internal/table-relations.cjs +28 -0
  139. package/dist/orm/internal/table-relations.mjs +29 -0
  140. package/dist/orm/internal/table-relations.mjs.map +1 -0
  141. package/dist/orm/migration/config.cjs +7 -0
  142. package/dist/orm/migration/config.d.cts +7 -0
  143. package/dist/orm/migration/config.d.cts.map +1 -0
  144. package/dist/orm/migration/config.d.mts +7 -0
  145. package/dist/orm/migration/config.d.mts.map +1 -0
  146. package/dist/orm/migration/config.mjs +8 -0
  147. package/dist/orm/migration/config.mjs.map +1 -0
  148. package/dist/orm/migration/types.d.cts +20 -0
  149. package/dist/orm/migration/types.d.cts.map +1 -0
  150. package/dist/orm/migration/types.d.mts +20 -0
  151. package/dist/orm/migration/types.d.mts.map +1 -0
  152. package/dist/orm/orm.cjs +41 -0
  153. package/dist/orm/orm.d.cts +18 -0
  154. package/dist/orm/orm.d.cts.map +1 -0
  155. package/dist/orm/orm.d.mts +18 -0
  156. package/dist/orm/orm.d.mts.map +1 -0
  157. package/dist/orm/orm.mjs +43 -0
  158. package/dist/orm/orm.mjs.map +1 -0
  159. package/dist/orm/relation.cjs +18 -0
  160. package/dist/orm/relation.d.cts +8 -0
  161. package/dist/orm/relation.d.cts.map +1 -0
  162. package/dist/orm/relation.d.mts +8 -0
  163. package/dist/orm/relation.d.mts.map +1 -0
  164. package/dist/orm/relation.mjs +19 -0
  165. package/dist/orm/relation.mjs.map +1 -0
  166. package/dist/orm/runtime/builders/mutations.cjs +29 -0
  167. package/dist/orm/runtime/builders/mutations.mjs +28 -0
  168. package/dist/orm/runtime/builders/mutations.mjs.map +1 -0
  169. package/dist/orm/runtime/builders/select.cjs +18 -0
  170. package/dist/orm/runtime/builders/select.mjs +19 -0
  171. package/dist/orm/runtime/builders/select.mjs.map +1 -0
  172. package/dist/orm/runtime/client.cjs +90 -0
  173. package/dist/orm/runtime/client.mjs +92 -0
  174. package/dist/orm/runtime/client.mjs.map +1 -0
  175. package/dist/orm/runtime/context.cjs +49 -0
  176. package/dist/orm/runtime/context.mjs +51 -0
  177. package/dist/orm/runtime/context.mjs.map +1 -0
  178. package/dist/orm/runtime/dialect/index.cjs +11 -0
  179. package/dist/orm/runtime/dialect/index.mjs +13 -0
  180. package/dist/orm/runtime/dialect/index.mjs.map +1 -0
  181. package/dist/orm/runtime/dialect/mysql.cjs +95 -0
  182. package/dist/orm/runtime/dialect/mysql.mjs +97 -0
  183. package/dist/orm/runtime/dialect/mysql.mjs.map +1 -0
  184. package/dist/orm/runtime/dialect/postgres.cjs +51 -0
  185. package/dist/orm/runtime/dialect/postgres.mjs +53 -0
  186. package/dist/orm/runtime/dialect/postgres.mjs.map +1 -0
  187. package/dist/orm/runtime/dialect/sqlite.cjs +4 -0
  188. package/dist/orm/runtime/dialect/sqlite.mjs +7 -0
  189. package/dist/orm/runtime/dialect/sqlite.mjs.map +1 -0
  190. package/dist/orm/runtime/errors.cjs +19 -0
  191. package/dist/orm/runtime/errors.mjs +21 -0
  192. package/dist/orm/runtime/errors.mjs.map +1 -0
  193. package/dist/orm/runtime/hydrate/many.cjs +46 -0
  194. package/dist/orm/runtime/hydrate/many.mjs +48 -0
  195. package/dist/orm/runtime/hydrate/many.mjs.map +1 -0
  196. package/dist/orm/runtime/hydrate/one.cjs +38 -0
  197. package/dist/orm/runtime/hydrate/one.mjs +40 -0
  198. package/dist/orm/runtime/hydrate/one.mjs.map +1 -0
  199. package/dist/orm/runtime/hydrate.cjs +49 -0
  200. package/dist/orm/runtime/hydrate.mjs +51 -0
  201. package/dist/orm/runtime/hydrate.mjs.map +1 -0
  202. package/dist/orm/runtime/rows.cjs +30 -0
  203. package/dist/orm/runtime/rows.mjs +31 -0
  204. package/dist/orm/runtime/rows.mjs.map +1 -0
  205. package/dist/orm/runtime/utils.cjs +27 -0
  206. package/dist/orm/runtime/utils.mjs +27 -0
  207. package/dist/orm/runtime/utils.mjs.map +1 -0
  208. package/dist/orm/sql/parse-array.cjs +64 -0
  209. package/dist/orm/sql/parse-array.mjs +66 -0
  210. package/dist/orm/sql/parse-array.mjs.map +1 -0
  211. package/dist/orm/sql/plan/select.cjs +36 -0
  212. package/dist/orm/sql/plan/select.mjs +38 -0
  213. package/dist/orm/sql/plan/select.mjs.map +1 -0
  214. package/dist/orm/sql/plan/where/operators.cjs +95 -0
  215. package/dist/orm/sql/plan/where/operators.mjs +97 -0
  216. package/dist/orm/sql/plan/where/operators.mjs.map +1 -0
  217. package/dist/orm/sql/plan/where.cjs +59 -0
  218. package/dist/orm/sql/plan/where.mjs +61 -0
  219. package/dist/orm/sql/plan/where.mjs.map +1 -0
  220. package/dist/orm/sql/serialize/clauses.cjs +36 -0
  221. package/dist/orm/sql/serialize/clauses.mjs +37 -0
  222. package/dist/orm/sql/serialize/clauses.mjs.map +1 -0
  223. package/dist/orm/sql/serialize/joins.cjs +31 -0
  224. package/dist/orm/sql/serialize/joins.mjs +33 -0
  225. package/dist/orm/sql/serialize/joins.mjs.map +1 -0
  226. package/dist/orm/sql/serialize/values.cjs +30 -0
  227. package/dist/orm/sql/serialize/values.mjs +32 -0
  228. package/dist/orm/sql/serialize/values.mjs.map +1 -0
  229. package/dist/orm/sql/serialize/where/predicate.cjs +73 -0
  230. package/dist/orm/sql/serialize/where/predicate.mjs +75 -0
  231. package/dist/orm/sql/serialize/where/predicate.mjs.map +1 -0
  232. package/dist/orm/sql/serialize/where/tree.cjs +26 -0
  233. package/dist/orm/sql/serialize/where/tree.mjs +28 -0
  234. package/dist/orm/sql/serialize/where/tree.mjs.map +1 -0
  235. package/dist/orm/sql/serialize/where.cjs +10 -0
  236. package/dist/orm/sql/serialize/where.mjs +12 -0
  237. package/dist/orm/sql/serialize/where.mjs.map +1 -0
  238. package/dist/orm/sql/serialize.cjs +24 -0
  239. package/dist/orm/sql/serialize.mjs +25 -0
  240. package/dist/orm/sql/serialize.mjs.map +1 -0
  241. package/dist/orm/table.cjs +12 -0
  242. package/dist/orm/table.d.cts +12 -0
  243. package/dist/orm/table.d.cts.map +1 -0
  244. package/dist/orm/table.d.mts +12 -0
  245. package/dist/orm/table.d.mts.map +1 -0
  246. package/dist/orm/table.mjs +14 -0
  247. package/dist/orm/table.mjs.map +1 -0
  248. package/dist/orm/types.d.cts +183 -0
  249. package/dist/orm/types.d.cts.map +1 -0
  250. package/dist/orm/types.d.mts +183 -0
  251. package/dist/orm/types.d.mts.map +1 -0
  252. package/dist/workflow/types.d.cts +83 -0
  253. package/dist/workflow/types.d.cts.map +1 -0
  254. package/dist/workflow/types.d.mts +83 -0
  255. package/dist/workflow/types.d.mts.map +1 -0
  256. package/package.json +29 -3
  257. package/dist/cron/scanner.mjs.map +0 -1
  258. package/dist/cron/types.d.cts.map +0 -1
  259. package/dist/cron/types.d.mts.map +0 -1
  260. package/dist/lib/cron/index.d.cts.map +0 -1
  261. package/dist/lib/cron/index.d.mts.map +0 -1
  262. package/dist/lib/cron/index.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/errors/index.ts"],"mappings":";;;cAEa,EAAA,MAAS,IAAA,EAAM,CAAA,qBAAC,CAAA;AAAA,cAIhB,GAAA,aAAiB,WAAA,EAAa,IAAA,EAAM,CAAA,EAAG,OAAA;EAAA;;;cAIvC,cAAA,MAAqB,EAAA,QAAU,CAAA,gDAAC,CAAA;AAAA,cAShC,UAAA,MAAuB,OAAA,EAAS,OAAA,CAAQ,CAAA,MAAE,OAAA,iBAAA,OAAA,CAAA,CAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/errors/index.ts"],"mappings":";;;cAEa,EAAA,MAAS,IAAA,EAAM,CAAA,qBAAC,CAAA;AAAA,cAIhB,GAAA,aAAiB,WAAA,EAAa,IAAA,EAAM,CAAA,EAAG,OAAA;EAAA;;;cAIvC,cAAA,UAAyB,KAAA,EACpC,EAAA,QAAU,CAAA,qBACO,CAAA,cAAe,CAAA;AAAA,cASrB,UAAA,UAA2B,KAAA,EACtC,OAAA,EAAS,OAAA,CAAQ,CAAA,MAChB,OAAA,iBAAwB,CAAA,cAAe,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/errors/index.ts"],"sourcesContent":["import type { CommonError } from \"./types.js\";\n\nexport const ok = <T>(data: T) => {\n return [null, data] as const;\n};\n\nexport const err = <T extends CommonError>(type: T, message: string) => {\n return [{ type, message }, null] as const;\n};\n\nexport const mightThrowSync = <T>(fn: () => T) => {\n try {\n const result = fn();\n return [null, result] as const;\n } catch (error) {\n return [error, null] as const;\n }\n};\n\nexport const mightThrow = async <T>(promise: Promise<T>) => {\n try {\n const data = await promise;\n return [null, data] as const;\n } catch (error) {\n return [error, null] as const;\n }\n};\n"],"mappings":";AAEA,MAAa,MAAS,SAAY;AAChC,QAAO,CAAC,MAAM,KAAK;;AAGrB,MAAa,OAA8B,MAAS,YAAoB;AACtE,QAAO,CAAC;EAAE;EAAM;EAAS,EAAE,KAAK;;AAGlC,MAAa,kBAAqB,OAAgB;AAChD,KAAI;AAEF,SAAO,CAAC,MADO,IAAI,CACE;UACd,OAAO;AACd,SAAO,CAAC,OAAO,KAAK;;;AAIxB,MAAa,aAAa,OAAU,YAAwB;AAC1D,KAAI;AAEF,SAAO,CAAC,MADK,MAAM,QACA;UACZ,OAAO;AACd,SAAO,CAAC,OAAO,KAAK"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/errors/index.ts"],"sourcesContent":["import type { CommonError } from \"./types.js\";\n\nexport const ok = <T>(data: T) => {\n return [null, data] as const;\n};\n\nexport const err = <T extends CommonError>(type: T, message: string) => {\n return [{ type, message }, null] as const;\n};\n\nexport const mightThrowSync = <T, E = Error>(\n fn: () => T,\n): readonly [null, T] | readonly [E, null] => {\n try {\n const result = fn();\n return [null, result] as const;\n } catch (error) {\n return [error as E, null] as const;\n }\n};\n\nexport const mightThrow = async <T, E = Error>(\n promise: Promise<T>,\n): Promise<readonly [null, T] | readonly [E, null]> => {\n try {\n const data = await promise;\n return [null, data] as const;\n } catch (error) {\n return [error as E, null] as const;\n }\n};\n"],"mappings":";AAEA,MAAa,MAAS,SAAY;AAChC,QAAO,CAAC,MAAM,KAAK;;AAGrB,MAAa,OAA8B,MAAS,YAAoB;AACtE,QAAO,CAAC;EAAE;EAAM;EAAS,EAAE,KAAK;;AAGlC,MAAa,kBACX,OAC4C;AAC5C,KAAI;AAEF,SAAO,CAAC,MADO,IAAI,CACE;UACd,OAAO;AACd,SAAO,CAAC,OAAY,KAAK;;;AAI7B,MAAa,aAAa,OACxB,YACqD;AACrD,KAAI;AAEF,SAAO,CAAC,MADK,MAAM,QACA;UACZ,OAAO;AACd,SAAO,CAAC,OAAY,KAAK"}
@@ -19,12 +19,17 @@ var I18n = class {
19
19
  const currentTranslations = this.locales[this.currentLocale];
20
20
  const defaultTranslations = this.locales[this.defaultLocale];
21
21
  const translation = this.getNestedValue(currentTranslations, key) ?? this.getNestedValue(defaultTranslations, key);
22
+ if (typeof translation !== "string") return key;
22
23
  if (!translation) return key;
23
24
  const paramObj = params[0];
24
25
  return this.substituteParams(translation, paramObj);
25
26
  }
26
27
  getNestedValue(obj, path) {
27
- return path.split(".").reduce((current, key) => current?.[key], obj);
28
+ return path.split(".").reduce((current, key) => {
29
+ if (typeof current !== "object") return;
30
+ if (current === null) return;
31
+ return current[key];
32
+ }, obj);
28
33
  }
29
34
  substituteParams(template, params) {
30
35
  if (!params) return template;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/i18n/index.ts"],"mappings":";;;cAEa,IAAA,wBACY,MAAA,SAAe,MAAA,iDACT,QAAA;EAAA,QAErB,OAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;cAEW,MAAA;IACjB,aAAA,EAAe,cAAA;IACf,OAAA,EAAS,QAAA;EAAA;EAOJ,SAAA,CAAU,MAAA,QAAc,QAAA;EAIxB,SAAA,CAAA,SAAS,QAAA;EAIT,SAAA,cAAuB,WAAA,CAAY,QAAA,CAAS,cAAA,GAAA,CACjD,GAAA,EAAK,IAAA,KACF,MAAA,EAAQ,gBAAA,CACT,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBAErC,MAAA,wBAGJ,gBAAA,CACE,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA;EAAA,QAoB/C,cAAA;EAAA,QAOA,gBAAA;AAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/i18n/index.ts"],"mappings":";;;cAEa,IAAA,wBACY,MAAA,SAAe,MAAA,iDACT,QAAA;EAAA,QAErB,OAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;cAEW,MAAA;IACjB,aAAA,EAAe,cAAA;IACf,OAAA,EAAS,QAAA;EAAA;EAOJ,SAAA,CAAU,MAAA,QAAc,QAAA;EAIxB,SAAA,CAAA,SAAS,QAAA;EAIT,SAAA,cAAuB,WAAA,CAAY,QAAA,CAAS,cAAA,GAAA,CACjD,GAAA,EAAK,IAAA,KACF,MAAA,EAAQ,gBAAA,CACT,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBAErC,MAAA,wBAGJ,gBAAA,CACE,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA;EAAA,QAwB/C,cAAA;EAAA,QAiBA,gBAAA;AAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/i18n/index.ts"],"mappings":";;;cAEa,IAAA,wBACY,MAAA,SAAe,MAAA,iDACT,QAAA;EAAA,QAErB,OAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;cAEW,MAAA;IACjB,aAAA,EAAe,cAAA;IACf,OAAA,EAAS,QAAA;EAAA;EAOJ,SAAA,CAAU,MAAA,QAAc,QAAA;EAIxB,SAAA,CAAA,SAAS,QAAA;EAIT,SAAA,cAAuB,WAAA,CAAY,QAAA,CAAS,cAAA,GAAA,CACjD,GAAA,EAAK,IAAA,KACF,MAAA,EAAQ,gBAAA,CACT,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBAErC,MAAA,wBAGJ,gBAAA,CACE,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA;EAAA,QAoB/C,cAAA;EAAA,QAOA,gBAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/i18n/index.ts"],"mappings":";;;cAEa,IAAA,wBACY,MAAA,SAAe,MAAA,iDACT,QAAA;EAAA,QAErB,OAAA;EAAA,QACA,aAAA;EAAA,QACA,aAAA;cAEW,MAAA;IACjB,aAAA,EAAe,cAAA;IACf,OAAA,EAAS,QAAA;EAAA;EAOJ,SAAA,CAAU,MAAA,QAAc,QAAA;EAIxB,SAAA,CAAA,SAAS,QAAA;EAIT,SAAA,cAAuB,WAAA,CAAY,QAAA,CAAS,cAAA,GAAA,CACjD,GAAA,EAAK,IAAA,KACF,MAAA,EAAQ,gBAAA,CACT,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBAErC,MAAA,wBAGJ,gBAAA,CACE,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA,mBACrC,cAAA,CAAe,QAAA,CAAS,cAAA,GAAiB,IAAA;EAAA,QAwB/C,cAAA;EAAA,QAiBA,gBAAA;AAAA"}
@@ -18,12 +18,17 @@ var I18n = class {
18
18
  const currentTranslations = this.locales[this.currentLocale];
19
19
  const defaultTranslations = this.locales[this.defaultLocale];
20
20
  const translation = this.getNestedValue(currentTranslations, key) ?? this.getNestedValue(defaultTranslations, key);
21
+ if (typeof translation !== "string") return key;
21
22
  if (!translation) return key;
22
23
  const paramObj = params[0];
23
24
  return this.substituteParams(translation, paramObj);
24
25
  }
25
26
  getNestedValue(obj, path) {
26
- return path.split(".").reduce((current, key) => current?.[key], obj);
27
+ return path.split(".").reduce((current, key) => {
28
+ if (typeof current !== "object") return;
29
+ if (current === null) return;
30
+ return current[key];
31
+ }, obj);
27
32
  }
28
33
  substituteParams(template, params) {
29
34
  if (!params) return template;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/i18n/index.ts"],"sourcesContent":["import type { BuildParamObject, GetNestedValue, NestedKeyOf } from \"./types.js\";\n\nexport class I18n<\n const TLocales extends Record<string, Record<string, unknown>>,\n TDefaultLocale extends keyof TLocales,\n> {\n private locales: TLocales;\n private currentLocale: keyof TLocales;\n private defaultLocale: TDefaultLocale;\n\n public constructor(config: {\n defaultLocale: TDefaultLocale;\n locales: TLocales;\n }) {\n this.defaultLocale = config.defaultLocale;\n this.currentLocale = config.defaultLocale;\n this.locales = config.locales;\n }\n\n public setLocale(locale: keyof TLocales) {\n this.currentLocale = locale;\n }\n\n public getLocale() {\n return this.currentLocale;\n }\n\n public translate<TKey extends NestedKeyOf<TLocales[TDefaultLocale]>>(\n key: TKey,\n ...params: BuildParamObject<\n GetNestedValue<TLocales[TDefaultLocale], TKey> extends string\n ? GetNestedValue<TLocales[TDefaultLocale], TKey>\n : never\n > extends Record<string, never>\n ? []\n : [\n BuildParamObject<\n GetNestedValue<TLocales[TDefaultLocale], TKey> extends string\n ? GetNestedValue<TLocales[TDefaultLocale], TKey>\n : never\n >,\n ]\n ) {\n const currentTranslations = this.locales[this.currentLocale];\n const defaultTranslations = this.locales[this.defaultLocale];\n\n const translation =\n this.getNestedValue(currentTranslations, key) ??\n this.getNestedValue(defaultTranslations, key);\n\n if (!translation) {\n return key;\n }\n\n const paramObj = params[0] as Record<string, unknown> | undefined;\n return this.substituteParams(translation, paramObj);\n }\n\n private getNestedValue(\n obj: Record<string, unknown> | undefined,\n path: string,\n ) {\n return path.split(\".\").reduce((current: any, key) => current?.[key], obj);\n }\n\n private substituteParams(template: string, params?: Record<string, unknown>) {\n if (!params) return template;\n\n return template.replace(/\\{(\\w+):(\\w+)\\}/g, (_match, name) => {\n return String(params[name]);\n });\n }\n}\n"],"mappings":";AAEA,IAAa,OAAb,MAGE;CACA;CACA;CACA;CAEA,YAAmB,QAGhB;AACD,OAAK,gBAAgB,OAAO;AAC5B,OAAK,gBAAgB,OAAO;AAC5B,OAAK,UAAU,OAAO;;CAGxB,UAAiB,QAAwB;AACvC,OAAK,gBAAgB;;CAGvB,YAAmB;AACjB,SAAO,KAAK;;CAGd,UACE,KACA,GAAG,QAaH;EACA,MAAM,sBAAsB,KAAK,QAAQ,KAAK;EAC9C,MAAM,sBAAsB,KAAK,QAAQ,KAAK;EAE9C,MAAM,cACJ,KAAK,eAAe,qBAAqB,IAAI,IAC7C,KAAK,eAAe,qBAAqB,IAAI;AAE/C,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,WAAW,OAAO;AACxB,SAAO,KAAK,iBAAiB,aAAa,SAAS;;CAGrD,eACE,KACA,MACA;AACA,SAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,SAAc,QAAQ,UAAU,MAAM,IAAI;;CAG3E,iBAAyB,UAAkB,QAAkC;AAC3E,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,SAAS,QAAQ,qBAAqB,QAAQ,SAAS;AAC5D,UAAO,OAAO,OAAO,MAAM;IAC3B"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/i18n/index.ts"],"sourcesContent":["import type { BuildParamObject, GetNestedValue, NestedKeyOf } from \"./types.js\";\n\nexport class I18n<\n const TLocales extends Record<string, Record<string, unknown>>,\n TDefaultLocale extends keyof TLocales,\n> {\n private locales: TLocales;\n private currentLocale: keyof TLocales;\n private defaultLocale: TDefaultLocale;\n\n public constructor(config: {\n defaultLocale: TDefaultLocale;\n locales: TLocales;\n }) {\n this.defaultLocale = config.defaultLocale;\n this.currentLocale = config.defaultLocale;\n this.locales = config.locales;\n }\n\n public setLocale(locale: keyof TLocales) {\n this.currentLocale = locale;\n }\n\n public getLocale() {\n return this.currentLocale;\n }\n\n public translate<TKey extends NestedKeyOf<TLocales[TDefaultLocale]>>(\n key: TKey,\n ...params: BuildParamObject<\n GetNestedValue<TLocales[TDefaultLocale], TKey> extends string\n ? GetNestedValue<TLocales[TDefaultLocale], TKey>\n : never\n > extends Record<string, never>\n ? []\n : [\n BuildParamObject<\n GetNestedValue<TLocales[TDefaultLocale], TKey> extends string\n ? GetNestedValue<TLocales[TDefaultLocale], TKey>\n : never\n >,\n ]\n ) {\n const currentTranslations = this.locales[this.currentLocale];\n const defaultTranslations = this.locales[this.defaultLocale];\n\n const translation =\n this.getNestedValue(currentTranslations, key) ??\n this.getNestedValue(defaultTranslations, key);\n\n if (typeof translation !== \"string\") {\n return key;\n }\n\n if (!translation) {\n return key;\n }\n\n const paramObj = params[0] as Record<string, unknown> | undefined;\n return this.substituteParams(translation, paramObj);\n }\n\n private getNestedValue(\n obj: Record<string, unknown> | undefined,\n path: string,\n ) {\n return path.split(\".\").reduce((current: unknown, key: string) => {\n if (typeof current !== \"object\") {\n return undefined;\n }\n\n if (current === null) {\n return undefined;\n }\n\n return (current as Record<string, unknown>)[key];\n }, obj);\n }\n\n private substituteParams(template: string, params?: Record<string, unknown>) {\n if (!params) return template;\n\n return template.replace(/\\{(\\w+):(\\w+)\\}/g, (_match, name) => {\n return String(params[name]);\n });\n }\n}\n"],"mappings":";AAEA,IAAa,OAAb,MAGE;CACA;CACA;CACA;CAEA,YAAmB,QAGhB;AACD,OAAK,gBAAgB,OAAO;AAC5B,OAAK,gBAAgB,OAAO;AAC5B,OAAK,UAAU,OAAO;;CAGxB,UAAiB,QAAwB;AACvC,OAAK,gBAAgB;;CAGvB,YAAmB;AACjB,SAAO,KAAK;;CAGd,UACE,KACA,GAAG,QAaH;EACA,MAAM,sBAAsB,KAAK,QAAQ,KAAK;EAC9C,MAAM,sBAAsB,KAAK,QAAQ,KAAK;EAE9C,MAAM,cACJ,KAAK,eAAe,qBAAqB,IAAI,IAC7C,KAAK,eAAe,qBAAqB,IAAI;AAE/C,MAAI,OAAO,gBAAgB,SACzB,QAAO;AAGT,MAAI,CAAC,YACH,QAAO;EAGT,MAAM,WAAW,OAAO;AACxB,SAAO,KAAK,iBAAiB,aAAa,SAAS;;CAGrD,eACE,KACA,MACA;AACA,SAAO,KAAK,MAAM,IAAI,CAAC,QAAQ,SAAkB,QAAgB;AAC/D,OAAI,OAAO,YAAY,SACrB;AAGF,OAAI,YAAY,KACd;AAGF,UAAQ,QAAoC;KAC3C,IAAI;;CAGT,iBAAyB,UAAkB,QAAkC;AAC3E,MAAI,CAAC,OAAQ,QAAO;AAEpB,SAAO,SAAS,QAAQ,qBAAqB,QAAQ,SAAS;AAC5D,UAAO,OAAO,OAAO,MAAM;IAC3B"}
@@ -0,0 +1,18 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_index = require("../../logging/formatter/index.cjs");
3
+ const require_index$1 = require("../../logging/core/index.cjs");
4
+ const require_types = require("../../logging/core/types.cjs");
5
+ const require_index$2 = require("../../logging/provider/index.cjs");
6
+ exports.AbstractLogger = require_index$1.AbstractLogger;
7
+ exports.BaseFormatter = require_index.BaseFormatter;
8
+ exports.ConsoleProvider = require_index$2.ConsoleProvider;
9
+ exports.FileProvider = require_index$2.FileProvider;
10
+ exports.Formatter = require_index.Formatter;
11
+ exports.JSONFormatter = require_index.JSONFormatter;
12
+ exports.LogLevel = require_types.LogLevel;
13
+ exports.Logger = require_index$1.Logger;
14
+ exports.LoggerProvider = require_index$2.LoggerProvider;
15
+ exports.dmyFormat = require_index.dmyFormat;
16
+ exports.isoDateFormat = require_index.isoDateFormat;
17
+ exports.isoDateTimeFormat = require_index.isoDateTimeFormat;
18
+ exports.mdyFormat = require_index.mdyFormat;
@@ -0,0 +1,7 @@
1
+ import { LogDataType, LogLevel, LogLevelType, LogMessageType } from "../../logging/core/types.cjs";
2
+ import { DateFmtFnType } from "../../logging/formatter/types.cjs";
3
+ import { BaseFormatter, Formatter, JSONFormatter, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat } from "../../logging/formatter/index.cjs";
4
+ import { FileProviderOptions, ProviderOptions, SizeBasedPolicyType, TimeBasedPolicyType } from "../../logging/provider/types.cjs";
5
+ import { ConsoleProvider, FileProvider, LoggerProvider } from "../../logging/provider/index.cjs";
6
+ import { AbstractLogger, Logger } from "../../logging/core/index.cjs";
7
+ export { AbstractLogger, BaseFormatter, ConsoleProvider, type DateFmtFnType, FileProvider, type FileProviderOptions, Formatter, JSONFormatter, type LogDataType, LogLevel, type LogLevelType, type LogMessageType, Logger, LoggerProvider, type ProviderOptions, type SizeBasedPolicyType, type TimeBasedPolicyType, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat };
@@ -0,0 +1,7 @@
1
+ import { LogDataType, LogLevel, LogLevelType, LogMessageType } from "../../logging/core/types.mjs";
2
+ import { DateFmtFnType } from "../../logging/formatter/types.mjs";
3
+ import { BaseFormatter, Formatter, JSONFormatter, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat } from "../../logging/formatter/index.mjs";
4
+ import { FileProviderOptions, ProviderOptions, SizeBasedPolicyType, TimeBasedPolicyType } from "../../logging/provider/types.mjs";
5
+ import { ConsoleProvider, FileProvider, LoggerProvider } from "../../logging/provider/index.mjs";
6
+ import { AbstractLogger, Logger } from "../../logging/core/index.mjs";
7
+ export { AbstractLogger, BaseFormatter, ConsoleProvider, type DateFmtFnType, FileProvider, type FileProviderOptions, Formatter, JSONFormatter, type LogDataType, LogLevel, type LogLevelType, type LogMessageType, Logger, LoggerProvider, type ProviderOptions, type SizeBasedPolicyType, type TimeBasedPolicyType, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat };
@@ -0,0 +1,5 @@
1
+ import { BaseFormatter, Formatter, JSONFormatter, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat } from "../../logging/formatter/index.mjs";
2
+ import { AbstractLogger, Logger } from "../../logging/core/index.mjs";
3
+ import { LogLevel } from "../../logging/core/types.mjs";
4
+ import { ConsoleProvider, FileProvider, LoggerProvider } from "../../logging/provider/index.mjs";
5
+ export { AbstractLogger, BaseFormatter, ConsoleProvider, FileProvider, Formatter, JSONFormatter, LogLevel, Logger, LoggerProvider, dmyFormat, isoDateFormat, isoDateTimeFormat, mdyFormat };
@@ -0,0 +1,20 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_column = require("../../orm/column.cjs");
3
+ const require_config = require("../../orm/migration/config.cjs");
4
+ const require_orm = require("../../orm/orm.cjs");
5
+ const require_relation = require("../../orm/relation.cjs");
6
+ const require_table = require("../../orm/table.cjs");
7
+ exports.boolean = require_column.boolean;
8
+ exports.createOrm = require_orm.createOrm;
9
+ exports.createTable = require_table.createTable;
10
+ exports.date = require_column.date;
11
+ exports.defineConfig = require_config.defineConfig;
12
+ exports.enumColumn = require_column.enumeration;
13
+ exports.enumeration = require_column.enumeration;
14
+ exports.json = require_column.json;
15
+ exports.jsonb = require_column.jsonb;
16
+ exports.many = require_relation.many;
17
+ exports.number = require_column.number;
18
+ exports.one = require_relation.one;
19
+ exports.string = require_column.string;
20
+ exports.uuid = require_column.uuid;
@@ -0,0 +1,7 @@
1
+ import { createTable } from "../../orm/table.cjs";
2
+ import { CreateInput, CreateManyInput, DeleteBuilderInput, DeleteInput, DeleteManyInput, Dialect, DialectAdapter, FindFirstInput, FindManyInput, FindUniqueInput, InsertInput, JoinNode, OrderDirection, SelectInput, SelectPlan, TableRow, TinyTableClient, UpdateBuilderInput, UpdateInput, UpdateManyInput, WhereNode } from "../../orm/types.cjs";
3
+ import { boolean, date, enumeration, json, jsonb, number, string, uuid } from "../../orm/column.cjs";
4
+ import { defineConfig } from "../../orm/migration/config.cjs";
5
+ import { createOrm } from "../../orm/orm.cjs";
6
+ import { many, one } from "../../orm/relation.cjs";
7
+ export { type CreateInput, type CreateManyInput, type DeleteBuilderInput, type DeleteInput, type DeleteManyInput, type Dialect, type DialectAdapter, type FindFirstInput, type FindManyInput, type FindUniqueInput, type InsertInput, type JoinNode, type OrderDirection, type SelectInput, type SelectPlan, type TableRow, type TinyTableClient, type UpdateBuilderInput, type UpdateInput, type UpdateManyInput, type WhereNode, boolean, createOrm, createTable, date, defineConfig, enumeration as enumColumn, enumeration, json, jsonb, many, number, one, string, uuid };
@@ -0,0 +1,7 @@
1
+ import { createTable } from "../../orm/table.mjs";
2
+ import { CreateInput, CreateManyInput, DeleteBuilderInput, DeleteInput, DeleteManyInput, Dialect, DialectAdapter, FindFirstInput, FindManyInput, FindUniqueInput, InsertInput, JoinNode, OrderDirection, SelectInput, SelectPlan, TableRow, TinyTableClient, UpdateBuilderInput, UpdateInput, UpdateManyInput, WhereNode } from "../../orm/types.mjs";
3
+ import { boolean, date, enumeration, json, jsonb, number, string, uuid } from "../../orm/column.mjs";
4
+ import { defineConfig } from "../../orm/migration/config.mjs";
5
+ import { createOrm } from "../../orm/orm.mjs";
6
+ import { many, one } from "../../orm/relation.mjs";
7
+ export { type CreateInput, type CreateManyInput, type DeleteBuilderInput, type DeleteInput, type DeleteManyInput, type Dialect, type DialectAdapter, type FindFirstInput, type FindManyInput, type FindUniqueInput, type InsertInput, type JoinNode, type OrderDirection, type SelectInput, type SelectPlan, type TableRow, type TinyTableClient, type UpdateBuilderInput, type UpdateInput, type UpdateManyInput, type WhereNode, boolean, createOrm, createTable, date, defineConfig, enumeration as enumColumn, enumeration, json, jsonb, many, number, one, string, uuid };
@@ -0,0 +1,6 @@
1
+ import { boolean, date, enumeration, json, jsonb, number, string, uuid } from "../../orm/column.mjs";
2
+ import { defineConfig } from "../../orm/migration/config.mjs";
3
+ import { createOrm } from "../../orm/orm.mjs";
4
+ import { many, one } from "../../orm/relation.mjs";
5
+ import { createTable } from "../../orm/table.mjs";
6
+ export { boolean, createOrm, createTable, date, defineConfig, enumeration as enumColumn, enumeration, json, jsonb, many, number, one, string, uuid };
@@ -2,22 +2,22 @@ import { PromptRuntime } from "../../prompts/core/types.cjs";
2
2
  import { ConfirmOptions, InputOptions, MultiselectOptions, NumberOptions, PasswordOptions, PromptErrorType, SelectChoice, SelectOptions } from "../../prompts/types.cjs";
3
3
 
4
4
  //#region src/lib/prompts/index.d.ts
5
- declare const input: (options: InputOptions, runtime?: PromptRuntime) => Promise<readonly [{
5
+ declare const input: (options: InputOptions, runtime?: PromptRuntime) => Promise<readonly [null, string] | readonly [{
6
6
  readonly type: string;
7
7
  readonly message: string;
8
- }, null] | readonly [null, string]>;
9
- declare const password: (options: PasswordOptions, runtime?: PromptRuntime) => Promise<readonly [{
8
+ }, null]>;
9
+ declare const password: (options: PasswordOptions, runtime?: PromptRuntime) => Promise<readonly [null, string] | readonly [{
10
10
  readonly type: string;
11
11
  readonly message: string;
12
- }, null] | readonly [null, string]>;
13
- declare const confirm: (options: ConfirmOptions, runtime?: PromptRuntime) => Promise<readonly [{
12
+ }, null]>;
13
+ declare const confirm: (options: ConfirmOptions, runtime?: PromptRuntime) => Promise<readonly [null, boolean] | readonly [{
14
14
  readonly type: string;
15
15
  readonly message: string;
16
- }, null] | readonly [null, boolean]>;
17
- declare const number: (options: NumberOptions, runtime?: PromptRuntime) => Promise<readonly [{
16
+ }, null]>;
17
+ declare const number: (options: NumberOptions, runtime?: PromptRuntime) => Promise<readonly [null, number] | readonly [{
18
18
  readonly type: string;
19
19
  readonly message: string;
20
- }, null] | readonly [null, number]>;
20
+ }, null]>;
21
21
  declare const select: <TValue extends string>(options: SelectOptions<TValue>, runtime?: PromptRuntime) => Promise<readonly [{
22
22
  readonly type: string;
23
23
  readonly message: string;
@@ -2,22 +2,22 @@ import { PromptRuntime } from "../../prompts/core/types.mjs";
2
2
  import { ConfirmOptions, InputOptions, MultiselectOptions, NumberOptions, PasswordOptions, PromptErrorType, SelectChoice, SelectOptions } from "../../prompts/types.mjs";
3
3
 
4
4
  //#region src/lib/prompts/index.d.ts
5
- declare const input: (options: InputOptions, runtime?: PromptRuntime) => Promise<readonly [{
5
+ declare const input: (options: InputOptions, runtime?: PromptRuntime) => Promise<readonly [null, string] | readonly [{
6
6
  readonly type: string;
7
7
  readonly message: string;
8
- }, null] | readonly [null, string]>;
9
- declare const password: (options: PasswordOptions, runtime?: PromptRuntime) => Promise<readonly [{
8
+ }, null]>;
9
+ declare const password: (options: PasswordOptions, runtime?: PromptRuntime) => Promise<readonly [null, string] | readonly [{
10
10
  readonly type: string;
11
11
  readonly message: string;
12
- }, null] | readonly [null, string]>;
13
- declare const confirm: (options: ConfirmOptions, runtime?: PromptRuntime) => Promise<readonly [{
12
+ }, null]>;
13
+ declare const confirm: (options: ConfirmOptions, runtime?: PromptRuntime) => Promise<readonly [null, boolean] | readonly [{
14
14
  readonly type: string;
15
15
  readonly message: string;
16
- }, null] | readonly [null, boolean]>;
17
- declare const number: (options: NumberOptions, runtime?: PromptRuntime) => Promise<readonly [{
16
+ }, null]>;
17
+ declare const number: (options: NumberOptions, runtime?: PromptRuntime) => Promise<readonly [null, number] | readonly [{
18
18
  readonly type: string;
19
19
  readonly message: string;
20
- }, null] | readonly [null, number]>;
20
+ }, null]>;
21
21
  declare const select: <TValue extends string>(options: SelectOptions<TValue>, runtime?: PromptRuntime) => Promise<readonly [{
22
22
  readonly type: string;
23
23
  readonly message: string;
@@ -4,9 +4,45 @@ const require_lib_errors_index = require("../errors/index.cjs");
4
4
  var PubSub = class {
5
5
  options;
6
6
  isSubscribed = false;
7
+ nextHandlerId = 0;
8
+ handlers = /* @__PURE__ */ new Map();
9
+ unsubscribeInFlight = null;
10
+ subscribeInFlight = null;
7
11
  constructor(options) {
8
12
  this.options = options;
9
13
  }
14
+ async onMessage(message, channel) {
15
+ const [parseError, parsed] = require_lib_errors_index.mightThrowSync(() => JSON.parse(message));
16
+ if (parseError) return;
17
+ if (!parsed) return;
18
+ const handlers = Array.from(this.handlers.values());
19
+ for (const handler of handlers) await require_lib_errors_index.mightThrow(Promise.resolve().then(() => handler(parsed, channel)));
20
+ }
21
+ async unsubscribeHandler(handlerId) {
22
+ const inFlightUnsubscribe = this.unsubscribeInFlight;
23
+ if (inFlightUnsubscribe) await inFlightUnsubscribe;
24
+ const handler = this.handlers.get(handlerId);
25
+ if (!handler) return require_lib_errors_index.err("UnsubscribeError", "Not subscribed");
26
+ this.handlers.delete(handlerId);
27
+ if (this.handlers.size > 0) return require_lib_errors_index.ok(true);
28
+ this.isSubscribed = false;
29
+ this.unsubscribeInFlight = require_lib_errors_index.mightThrow(this.options.subscriber.unsubscribe(this.options.channel));
30
+ const unsubscribeInFlight = this.unsubscribeInFlight;
31
+ if (!unsubscribeInFlight) {
32
+ this.handlers.set(handlerId, handler);
33
+ this.isSubscribed = true;
34
+ return require_lib_errors_index.err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
35
+ }
36
+ const [unsubscribeError] = await unsubscribeInFlight;
37
+ if (unsubscribeError) {
38
+ this.handlers.set(handlerId, handler);
39
+ this.isSubscribed = true;
40
+ this.unsubscribeInFlight = null;
41
+ return require_lib_errors_index.err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
42
+ }
43
+ this.unsubscribeInFlight = null;
44
+ return require_lib_errors_index.ok(true);
45
+ }
10
46
  async publish(message) {
11
47
  const [stringifyError, stringified] = require_lib_errors_index.mightThrowSync(() => JSON.stringify(message));
12
48
  if (stringifyError || !stringified) return require_lib_errors_index.err("SerializationError", "Unable to serialize message");
@@ -15,33 +51,66 @@ var PubSub = class {
15
51
  return require_lib_errors_index.ok(count);
16
52
  }
17
53
  async subscribe(handler) {
18
- if (this.isActive()) return require_lib_errors_index.err("SubscribeError", "Already subscribed");
19
- this.isSubscribed = true;
20
- const wrappedHandler = async (message, channel) => {
21
- const [parseError, parsed] = require_lib_errors_index.mightThrowSync(() => JSON.parse(message));
22
- if (parseError) return;
23
- if (!parsed) return;
24
- await require_lib_errors_index.mightThrow(Promise.resolve(handler(parsed, channel)));
25
- };
26
- const [subscribeError, count] = await require_lib_errors_index.mightThrow(this.options.subscriber.subscribe(this.options.channel, wrappedHandler));
54
+ const inFlightUnsubscribe = this.unsubscribeInFlight;
55
+ if (inFlightUnsubscribe) await inFlightUnsubscribe;
56
+ const handlerId = this.nextHandlerId;
57
+ this.nextHandlerId += 1;
58
+ this.handlers.set(handlerId, handler);
59
+ if (this.isActive()) return require_lib_errors_index.ok(() => this.unsubscribeHandler(handlerId));
60
+ const inFlightSubscribe = this.subscribeInFlight;
61
+ if (inFlightSubscribe) {
62
+ const [inFlightError] = await inFlightSubscribe;
63
+ if (inFlightError || !this.isSubscribed) {
64
+ this.handlers.delete(handlerId);
65
+ return require_lib_errors_index.err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
66
+ }
67
+ return require_lib_errors_index.ok(() => this.unsubscribeHandler(handlerId));
68
+ }
69
+ this.subscribeInFlight = require_lib_errors_index.mightThrow(this.options.subscriber.subscribe(this.options.channel, async (message, channel) => this.onMessage(message, channel)));
70
+ const subscribeInFlight = this.subscribeInFlight;
71
+ if (!subscribeInFlight) {
72
+ this.handlers.delete(handlerId);
73
+ return require_lib_errors_index.err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
74
+ }
75
+ const [subscribeError, count] = await subscribeInFlight;
76
+ this.subscribeInFlight = null;
27
77
  if (subscribeError) {
28
- this.isSubscribed = false;
78
+ this.handlers.delete(handlerId);
29
79
  return require_lib_errors_index.err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
30
80
  }
31
- return require_lib_errors_index.ok(count);
81
+ if (!count) {
82
+ this.handlers.delete(handlerId);
83
+ return require_lib_errors_index.err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
84
+ }
85
+ this.isSubscribed = true;
86
+ return require_lib_errors_index.ok(() => this.unsubscribeHandler(handlerId));
32
87
  }
33
88
  async unsubscribe() {
89
+ const inFlightUnsubscribe = this.unsubscribeInFlight;
90
+ if (inFlightUnsubscribe) await inFlightUnsubscribe;
34
91
  if (!this.isActive()) return require_lib_errors_index.err("UnsubscribeError", "Not subscribed");
92
+ const handlers = new Map(this.handlers);
93
+ this.handlers.clear();
35
94
  this.isSubscribed = false;
36
- const [unsubscribeError] = await require_lib_errors_index.mightThrow(this.options.subscriber.unsubscribe(this.options.channel));
95
+ this.unsubscribeInFlight = require_lib_errors_index.mightThrow(this.options.subscriber.unsubscribe(this.options.channel));
96
+ const unsubscribeInFlight = this.unsubscribeInFlight;
97
+ if (!unsubscribeInFlight) {
98
+ this.handlers = handlers;
99
+ this.isSubscribed = true;
100
+ return require_lib_errors_index.err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
101
+ }
102
+ const [unsubscribeError] = await unsubscribeInFlight;
37
103
  if (unsubscribeError) {
104
+ this.handlers = handlers;
38
105
  this.isSubscribed = true;
106
+ this.unsubscribeInFlight = null;
39
107
  return require_lib_errors_index.err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
40
108
  }
109
+ this.unsubscribeInFlight = null;
41
110
  return require_lib_errors_index.ok(true);
42
111
  }
43
112
  isActive() {
44
- return this.isSubscribed;
113
+ return this.handlers.size > 0 && this.isSubscribed;
45
114
  }
46
115
  };
47
116
  //#endregion
@@ -4,22 +4,31 @@ import { MessageHandler, PubSubOptions } from "../../pubsub/types.cjs";
4
4
  declare class PubSub<T extends Record<string, unknown>> {
5
5
  private options;
6
6
  private isSubscribed;
7
+ private nextHandlerId;
8
+ private handlers;
9
+ private unsubscribeInFlight;
10
+ private subscribeInFlight;
7
11
  constructor(options: PubSubOptions);
8
- publish(message: T): Promise<readonly [null, number | null] | readonly [{
12
+ private onMessage;
13
+ private unsubscribeHandler;
14
+ publish(message: T): Promise<readonly [{
9
15
  readonly type: "SerializationError";
10
16
  readonly message: string;
11
17
  }, null] | readonly [{
12
18
  readonly type: "PublishError";
13
19
  readonly message: string;
14
- }, null]>;
15
- subscribe(handler: MessageHandler<T>): Promise<readonly [null, number | null] | readonly [{
20
+ }, null] | readonly [null, number]>;
21
+ subscribe(handler: MessageHandler<T>): Promise<readonly [null, () => Promise<readonly [{
22
+ readonly type: "UnsubscribeError";
23
+ readonly message: string;
24
+ }, null] | readonly [null, boolean]>] | readonly [{
16
25
  readonly type: "SubscribeError";
17
26
  readonly message: string;
18
27
  }, null]>;
19
- unsubscribe(): Promise<readonly [null, boolean] | readonly [{
28
+ unsubscribe(): Promise<readonly [{
20
29
  readonly type: "UnsubscribeError";
21
30
  readonly message: string;
22
- }, null]>;
31
+ }, null] | readonly [null, boolean]>;
23
32
  isActive(): boolean;
24
33
  }
25
34
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"mappings":";;;cAGa,MAAA,WAAiB,MAAA;EAAA,QACpB,OAAA;EAAA,QACA,YAAA;cAEW,OAAA,EAAS,aAAA;EAIf,OAAA,CAAQ,OAAA,EAAS,CAAA,GAAC,OAAA;IAAA;;;;;;EAuBlB,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,CAAA,IAAE,OAAA;IAAA;;;EAgCpC,WAAA,CAAA,GAAW,OAAA;IAAA;;;EAuBjB,QAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"index.d.cts","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"mappings":";;;cAGa,MAAA,WAAiB,MAAA;EAAA,QACpB,OAAA;EAAA,QACA,YAAA;EAAA,QACA,aAAA;EAAA,QACA,QAAA;EAAA,QACA,mBAAA;EAAA,QAGA,iBAAA;cAIW,OAAA,EAAS,aAAA;EAAA,QAId,SAAA;EAAA,QAaA,kBAAA;EAuDD,OAAA,CAAQ,OAAA,EAAS,CAAA,GAAC,OAAA;IAAA;;;;;;EAuBlB,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,CAAA,IAAE,OAAA,uBAAA,OAAA;IAAA;;;;;;EA8EpC,WAAA,CAAA,GAAW,OAAA;IAAA;;;EAmDjB,QAAA,CAAA;AAAA"}
@@ -4,22 +4,31 @@ import { MessageHandler, PubSubOptions } from "../../pubsub/types.mjs";
4
4
  declare class PubSub<T extends Record<string, unknown>> {
5
5
  private options;
6
6
  private isSubscribed;
7
+ private nextHandlerId;
8
+ private handlers;
9
+ private unsubscribeInFlight;
10
+ private subscribeInFlight;
7
11
  constructor(options: PubSubOptions);
8
- publish(message: T): Promise<readonly [null, number | null] | readonly [{
12
+ private onMessage;
13
+ private unsubscribeHandler;
14
+ publish(message: T): Promise<readonly [{
9
15
  readonly type: "SerializationError";
10
16
  readonly message: string;
11
17
  }, null] | readonly [{
12
18
  readonly type: "PublishError";
13
19
  readonly message: string;
14
- }, null]>;
15
- subscribe(handler: MessageHandler<T>): Promise<readonly [null, number | null] | readonly [{
20
+ }, null] | readonly [null, number]>;
21
+ subscribe(handler: MessageHandler<T>): Promise<readonly [null, () => Promise<readonly [{
22
+ readonly type: "UnsubscribeError";
23
+ readonly message: string;
24
+ }, null] | readonly [null, boolean]>] | readonly [{
16
25
  readonly type: "SubscribeError";
17
26
  readonly message: string;
18
27
  }, null]>;
19
- unsubscribe(): Promise<readonly [null, boolean] | readonly [{
28
+ unsubscribe(): Promise<readonly [{
20
29
  readonly type: "UnsubscribeError";
21
30
  readonly message: string;
22
- }, null]>;
31
+ }, null] | readonly [null, boolean]>;
23
32
  isActive(): boolean;
24
33
  }
25
34
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"mappings":";;;cAGa,MAAA,WAAiB,MAAA;EAAA,QACpB,OAAA;EAAA,QACA,YAAA;cAEW,OAAA,EAAS,aAAA;EAIf,OAAA,CAAQ,OAAA,EAAS,CAAA,GAAC,OAAA;IAAA;;;;;;EAuBlB,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,CAAA,IAAE,OAAA;IAAA;;;EAgCpC,WAAA,CAAA,GAAW,OAAA;IAAA;;;EAuBjB,QAAA,CAAA;AAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"mappings":";;;cAGa,MAAA,WAAiB,MAAA;EAAA,QACpB,OAAA;EAAA,QACA,YAAA;EAAA,QACA,aAAA;EAAA,QACA,QAAA;EAAA,QACA,mBAAA;EAAA,QAGA,iBAAA;cAIW,OAAA,EAAS,aAAA;EAAA,QAId,SAAA;EAAA,QAaA,kBAAA;EAuDD,OAAA,CAAQ,OAAA,EAAS,CAAA,GAAC,OAAA;IAAA;;;;;;EAuBlB,SAAA,CAAU,OAAA,EAAS,cAAA,CAAe,CAAA,IAAE,OAAA,uBAAA,OAAA;IAAA;;;;;;EA8EpC,WAAA,CAAA,GAAW,OAAA;IAAA;;;EAmDjB,QAAA,CAAA;AAAA"}
@@ -3,9 +3,45 @@ import { err, mightThrow, mightThrowSync, ok } from "../errors/index.mjs";
3
3
  var PubSub = class {
4
4
  options;
5
5
  isSubscribed = false;
6
+ nextHandlerId = 0;
7
+ handlers = /* @__PURE__ */ new Map();
8
+ unsubscribeInFlight = null;
9
+ subscribeInFlight = null;
6
10
  constructor(options) {
7
11
  this.options = options;
8
12
  }
13
+ async onMessage(message, channel) {
14
+ const [parseError, parsed] = mightThrowSync(() => JSON.parse(message));
15
+ if (parseError) return;
16
+ if (!parsed) return;
17
+ const handlers = Array.from(this.handlers.values());
18
+ for (const handler of handlers) await mightThrow(Promise.resolve().then(() => handler(parsed, channel)));
19
+ }
20
+ async unsubscribeHandler(handlerId) {
21
+ const inFlightUnsubscribe = this.unsubscribeInFlight;
22
+ if (inFlightUnsubscribe) await inFlightUnsubscribe;
23
+ const handler = this.handlers.get(handlerId);
24
+ if (!handler) return err("UnsubscribeError", "Not subscribed");
25
+ this.handlers.delete(handlerId);
26
+ if (this.handlers.size > 0) return ok(true);
27
+ this.isSubscribed = false;
28
+ this.unsubscribeInFlight = mightThrow(this.options.subscriber.unsubscribe(this.options.channel));
29
+ const unsubscribeInFlight = this.unsubscribeInFlight;
30
+ if (!unsubscribeInFlight) {
31
+ this.handlers.set(handlerId, handler);
32
+ this.isSubscribed = true;
33
+ return err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
34
+ }
35
+ const [unsubscribeError] = await unsubscribeInFlight;
36
+ if (unsubscribeError) {
37
+ this.handlers.set(handlerId, handler);
38
+ this.isSubscribed = true;
39
+ this.unsubscribeInFlight = null;
40
+ return err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
41
+ }
42
+ this.unsubscribeInFlight = null;
43
+ return ok(true);
44
+ }
9
45
  async publish(message) {
10
46
  const [stringifyError, stringified] = mightThrowSync(() => JSON.stringify(message));
11
47
  if (stringifyError || !stringified) return err("SerializationError", "Unable to serialize message");
@@ -14,33 +50,66 @@ var PubSub = class {
14
50
  return ok(count);
15
51
  }
16
52
  async subscribe(handler) {
17
- if (this.isActive()) return err("SubscribeError", "Already subscribed");
18
- this.isSubscribed = true;
19
- const wrappedHandler = async (message, channel) => {
20
- const [parseError, parsed] = mightThrowSync(() => JSON.parse(message));
21
- if (parseError) return;
22
- if (!parsed) return;
23
- await mightThrow(Promise.resolve(handler(parsed, channel)));
24
- };
25
- const [subscribeError, count] = await mightThrow(this.options.subscriber.subscribe(this.options.channel, wrappedHandler));
53
+ const inFlightUnsubscribe = this.unsubscribeInFlight;
54
+ if (inFlightUnsubscribe) await inFlightUnsubscribe;
55
+ const handlerId = this.nextHandlerId;
56
+ this.nextHandlerId += 1;
57
+ this.handlers.set(handlerId, handler);
58
+ if (this.isActive()) return ok(() => this.unsubscribeHandler(handlerId));
59
+ const inFlightSubscribe = this.subscribeInFlight;
60
+ if (inFlightSubscribe) {
61
+ const [inFlightError] = await inFlightSubscribe;
62
+ if (inFlightError || !this.isSubscribed) {
63
+ this.handlers.delete(handlerId);
64
+ return err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
65
+ }
66
+ return ok(() => this.unsubscribeHandler(handlerId));
67
+ }
68
+ this.subscribeInFlight = mightThrow(this.options.subscriber.subscribe(this.options.channel, async (message, channel) => this.onMessage(message, channel)));
69
+ const subscribeInFlight = this.subscribeInFlight;
70
+ if (!subscribeInFlight) {
71
+ this.handlers.delete(handlerId);
72
+ return err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
73
+ }
74
+ const [subscribeError, count] = await subscribeInFlight;
75
+ this.subscribeInFlight = null;
26
76
  if (subscribeError) {
27
- this.isSubscribed = false;
77
+ this.handlers.delete(handlerId);
28
78
  return err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
29
79
  }
30
- return ok(count);
80
+ if (!count) {
81
+ this.handlers.delete(handlerId);
82
+ return err("SubscribeError", `Unable to subscribe to ${this.options.channel}`);
83
+ }
84
+ this.isSubscribed = true;
85
+ return ok(() => this.unsubscribeHandler(handlerId));
31
86
  }
32
87
  async unsubscribe() {
88
+ const inFlightUnsubscribe = this.unsubscribeInFlight;
89
+ if (inFlightUnsubscribe) await inFlightUnsubscribe;
33
90
  if (!this.isActive()) return err("UnsubscribeError", "Not subscribed");
91
+ const handlers = new Map(this.handlers);
92
+ this.handlers.clear();
34
93
  this.isSubscribed = false;
35
- const [unsubscribeError] = await mightThrow(this.options.subscriber.unsubscribe(this.options.channel));
94
+ this.unsubscribeInFlight = mightThrow(this.options.subscriber.unsubscribe(this.options.channel));
95
+ const unsubscribeInFlight = this.unsubscribeInFlight;
96
+ if (!unsubscribeInFlight) {
97
+ this.handlers = handlers;
98
+ this.isSubscribed = true;
99
+ return err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
100
+ }
101
+ const [unsubscribeError] = await unsubscribeInFlight;
36
102
  if (unsubscribeError) {
103
+ this.handlers = handlers;
37
104
  this.isSubscribed = true;
105
+ this.unsubscribeInFlight = null;
38
106
  return err("UnsubscribeError", `Unable to unsubscribe from ${this.options.channel}`);
39
107
  }
108
+ this.unsubscribeInFlight = null;
40
109
  return ok(true);
41
110
  }
42
111
  isActive() {
43
- return this.isSubscribed;
112
+ return this.handlers.size > 0 && this.isSubscribed;
44
113
  }
45
114
  };
46
115
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"sourcesContent":["import { err, mightThrow, mightThrowSync, ok } from \"../errors/index.js\";\nimport type { MessageHandler, PubSubOptions } from \"./types.js\";\n\nexport class PubSub<T extends Record<string, unknown>> {\n private options: PubSubOptions;\n private isSubscribed = false;\n\n public constructor(options: PubSubOptions) {\n this.options = options;\n }\n\n public async publish(message: T) {\n const [stringifyError, stringified] = mightThrowSync(() =>\n JSON.stringify(message),\n );\n\n if (stringifyError || !stringified) {\n return err(\"SerializationError\", \"Unable to serialize message\");\n }\n\n const [publishError, count] = await mightThrow(\n this.options.publisher.publish(this.options.channel, stringified),\n );\n\n if (publishError) {\n return err(\n \"PublishError\",\n `Unable to publish to ${this.options.channel}`,\n );\n }\n\n return ok(count);\n }\n\n public async subscribe(handler: MessageHandler<T>) {\n if (this.isActive()) {\n return err(\"SubscribeError\", \"Already subscribed\");\n }\n\n this.isSubscribed = true;\n\n const wrappedHandler = async (message: string, channel: string) => {\n const [parseError, parsed] = mightThrowSync<T>(() => JSON.parse(message));\n\n if (parseError) return;\n if (!parsed) return;\n\n await mightThrow(Promise.resolve(handler(parsed, channel)));\n };\n\n const [subscribeError, count] = await mightThrow(\n this.options.subscriber.subscribe(this.options.channel, wrappedHandler),\n );\n\n if (subscribeError) {\n this.isSubscribed = false;\n\n return err(\n \"SubscribeError\",\n `Unable to subscribe to ${this.options.channel}`,\n );\n }\n\n return ok(count);\n }\n\n public async unsubscribe() {\n if (!this.isActive()) {\n return err(\"UnsubscribeError\", \"Not subscribed\");\n }\n\n this.isSubscribed = false;\n\n const [unsubscribeError] = await mightThrow(\n this.options.subscriber.unsubscribe(this.options.channel),\n );\n\n if (unsubscribeError) {\n this.isSubscribed = true;\n\n return err(\n \"UnsubscribeError\",\n `Unable to unsubscribe from ${this.options.channel}`,\n );\n }\n\n return ok(true);\n }\n\n public isActive() {\n return this.isSubscribed;\n }\n}\n"],"mappings":";;AAGA,IAAa,SAAb,MAAuD;CACrD;CACA,eAAuB;CAEvB,YAAmB,SAAwB;AACzC,OAAK,UAAU;;CAGjB,MAAa,QAAQ,SAAY;EAC/B,MAAM,CAAC,gBAAgB,eAAe,qBACpC,KAAK,UAAU,QAAQ,CACxB;AAED,MAAI,kBAAkB,CAAC,YACrB,QAAO,IAAI,sBAAsB,8BAA8B;EAGjE,MAAM,CAAC,cAAc,SAAS,MAAM,WAClC,KAAK,QAAQ,UAAU,QAAQ,KAAK,QAAQ,SAAS,YAAY,CAClE;AAED,MAAI,aACF,QAAO,IACL,gBACA,wBAAwB,KAAK,QAAQ,UACtC;AAGH,SAAO,GAAG,MAAM;;CAGlB,MAAa,UAAU,SAA4B;AACjD,MAAI,KAAK,UAAU,CACjB,QAAO,IAAI,kBAAkB,qBAAqB;AAGpD,OAAK,eAAe;EAEpB,MAAM,iBAAiB,OAAO,SAAiB,YAAoB;GACjE,MAAM,CAAC,YAAY,UAAU,qBAAwB,KAAK,MAAM,QAAQ,CAAC;AAEzE,OAAI,WAAY;AAChB,OAAI,CAAC,OAAQ;AAEb,SAAM,WAAW,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,CAAC,CAAC;;EAG7D,MAAM,CAAC,gBAAgB,SAAS,MAAM,WACpC,KAAK,QAAQ,WAAW,UAAU,KAAK,QAAQ,SAAS,eAAe,CACxE;AAED,MAAI,gBAAgB;AAClB,QAAK,eAAe;AAEpB,UAAO,IACL,kBACA,0BAA0B,KAAK,QAAQ,UACxC;;AAGH,SAAO,GAAG,MAAM;;CAGlB,MAAa,cAAc;AACzB,MAAI,CAAC,KAAK,UAAU,CAClB,QAAO,IAAI,oBAAoB,iBAAiB;AAGlD,OAAK,eAAe;EAEpB,MAAM,CAAC,oBAAoB,MAAM,WAC/B,KAAK,QAAQ,WAAW,YAAY,KAAK,QAAQ,QAAQ,CAC1D;AAED,MAAI,kBAAkB;AACpB,QAAK,eAAe;AAEpB,UAAO,IACL,oBACA,8BAA8B,KAAK,QAAQ,UAC5C;;AAGH,SAAO,GAAG,KAAK;;CAGjB,WAAkB;AAChB,SAAO,KAAK"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../src/lib/pubsub/index.ts"],"sourcesContent":["import { err, mightThrow, mightThrowSync, ok } from \"../errors/index.js\";\nimport type { MessageHandler, PubSubOptions } from \"./types.js\";\n\nexport class PubSub<T extends Record<string, unknown>> {\n private options: PubSubOptions;\n private isSubscribed = false;\n private nextHandlerId = 0;\n private handlers = new Map<number, MessageHandler<T>>();\n private unsubscribeInFlight: Promise<\n readonly [null, unknown] | readonly [unknown, null]\n > | null = null;\n private subscribeInFlight: Promise<\n readonly [null, number] | readonly [unknown, null]\n > | null = null;\n\n public constructor(options: PubSubOptions) {\n this.options = options;\n }\n\n private async onMessage(message: string, channel: string) {\n const [parseError, parsed] = mightThrowSync<T>(() => JSON.parse(message));\n\n if (parseError) return;\n if (!parsed) return;\n\n const handlers = Array.from(this.handlers.values());\n\n for (const handler of handlers) {\n await mightThrow(Promise.resolve().then(() => handler(parsed, channel)));\n }\n }\n\n private async unsubscribeHandler(handlerId: number) {\n const inFlightUnsubscribe = this.unsubscribeInFlight;\n\n if (inFlightUnsubscribe) {\n await inFlightUnsubscribe;\n }\n\n const handler = this.handlers.get(handlerId);\n\n if (!handler) {\n return err(\"UnsubscribeError\", \"Not subscribed\");\n }\n\n this.handlers.delete(handlerId);\n\n if (this.handlers.size > 0) {\n return ok(true);\n }\n\n this.isSubscribed = false;\n\n this.unsubscribeInFlight = mightThrow(\n this.options.subscriber.unsubscribe(this.options.channel),\n );\n\n const unsubscribeInFlight = this.unsubscribeInFlight;\n\n if (!unsubscribeInFlight) {\n this.handlers.set(handlerId, handler);\n this.isSubscribed = true;\n\n return err(\n \"UnsubscribeError\",\n `Unable to unsubscribe from ${this.options.channel}`,\n );\n }\n\n const [unsubscribeError] = await unsubscribeInFlight;\n\n if (unsubscribeError) {\n this.handlers.set(handlerId, handler);\n this.isSubscribed = true;\n this.unsubscribeInFlight = null;\n\n return err(\n \"UnsubscribeError\",\n `Unable to unsubscribe from ${this.options.channel}`,\n );\n }\n\n this.unsubscribeInFlight = null;\n\n return ok(true);\n }\n\n public async publish(message: T) {\n const [stringifyError, stringified] = mightThrowSync(() =>\n JSON.stringify(message),\n );\n\n if (stringifyError || !stringified) {\n return err(\"SerializationError\", \"Unable to serialize message\");\n }\n\n const [publishError, count] = await mightThrow(\n this.options.publisher.publish(this.options.channel, stringified),\n );\n\n if (publishError) {\n return err(\n \"PublishError\",\n `Unable to publish to ${this.options.channel}`,\n );\n }\n\n return ok(count);\n }\n\n public async subscribe(handler: MessageHandler<T>) {\n const inFlightUnsubscribe = this.unsubscribeInFlight;\n\n if (inFlightUnsubscribe) {\n await inFlightUnsubscribe;\n }\n\n const handlerId = this.nextHandlerId;\n\n this.nextHandlerId += 1;\n this.handlers.set(handlerId, handler);\n\n if (this.isActive()) {\n return ok(() => this.unsubscribeHandler(handlerId));\n }\n\n const inFlightSubscribe = this.subscribeInFlight;\n\n if (inFlightSubscribe) {\n const [inFlightError] = await inFlightSubscribe;\n\n if (inFlightError || !this.isSubscribed) {\n this.handlers.delete(handlerId);\n\n return err(\n \"SubscribeError\",\n `Unable to subscribe to ${this.options.channel}`,\n );\n }\n\n return ok(() => this.unsubscribeHandler(handlerId));\n }\n\n this.subscribeInFlight = mightThrow(\n this.options.subscriber.subscribe(\n this.options.channel,\n async (message, channel) => this.onMessage(message, channel),\n ),\n );\n\n const subscribeInFlight = this.subscribeInFlight;\n\n if (!subscribeInFlight) {\n this.handlers.delete(handlerId);\n\n return err(\n \"SubscribeError\",\n `Unable to subscribe to ${this.options.channel}`,\n );\n }\n\n const [subscribeError, count] = await subscribeInFlight;\n\n this.subscribeInFlight = null;\n\n if (subscribeError) {\n this.handlers.delete(handlerId);\n\n return err(\n \"SubscribeError\",\n `Unable to subscribe to ${this.options.channel}`,\n );\n }\n\n if (!count) {\n this.handlers.delete(handlerId);\n\n return err(\n \"SubscribeError\",\n `Unable to subscribe to ${this.options.channel}`,\n );\n }\n\n this.isSubscribed = true;\n\n return ok(() => this.unsubscribeHandler(handlerId));\n }\n\n public async unsubscribe() {\n const inFlightUnsubscribe = this.unsubscribeInFlight;\n\n if (inFlightUnsubscribe) {\n await inFlightUnsubscribe;\n }\n\n if (!this.isActive()) {\n return err(\"UnsubscribeError\", \"Not subscribed\");\n }\n\n const handlers = new Map(this.handlers);\n\n this.handlers.clear();\n\n this.isSubscribed = false;\n\n this.unsubscribeInFlight = mightThrow(\n this.options.subscriber.unsubscribe(this.options.channel),\n );\n\n const unsubscribeInFlight = this.unsubscribeInFlight;\n\n if (!unsubscribeInFlight) {\n this.handlers = handlers;\n this.isSubscribed = true;\n\n return err(\n \"UnsubscribeError\",\n `Unable to unsubscribe from ${this.options.channel}`,\n );\n }\n\n const [unsubscribeError] = await unsubscribeInFlight;\n\n if (unsubscribeError) {\n this.handlers = handlers;\n this.isSubscribed = true;\n this.unsubscribeInFlight = null;\n\n return err(\n \"UnsubscribeError\",\n `Unable to unsubscribe from ${this.options.channel}`,\n );\n }\n\n this.unsubscribeInFlight = null;\n\n return ok(true);\n }\n\n public isActive() {\n return this.handlers.size > 0 && this.isSubscribed;\n }\n}\n"],"mappings":"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"}