@azurioh/discord-kernel 0.1.0 → 1.0.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 (529) hide show
  1. package/README.md +318 -1
  2. package/dist/authz/require-level-guard.d.ts +1 -1
  3. package/dist/authz/require-level-guard.d.ts.map +1 -1
  4. package/dist/color.d.ts +42 -0
  5. package/dist/color.d.ts.map +1 -0
  6. package/dist/color.js +130 -0
  7. package/dist/color.js.map +1 -0
  8. package/dist/discord/command/all-required.d.ts +8 -0
  9. package/dist/discord/command/all-required.d.ts.map +1 -0
  10. package/dist/discord/command/all-required.js +12 -0
  11. package/dist/discord/command/all-required.js.map +1 -0
  12. package/dist/discord/command/autocomplete-dispatcher.d.ts.map +1 -1
  13. package/dist/discord/command/autocomplete-dispatcher.js +2 -1
  14. package/dist/discord/command/autocomplete-dispatcher.js.map +1 -1
  15. package/dist/discord/command/autocomplete-limits.d.ts +3 -0
  16. package/dist/discord/command/autocomplete-limits.d.ts.map +1 -0
  17. package/dist/discord/command/autocomplete-limits.js +6 -0
  18. package/dist/discord/command/autocomplete-limits.js.map +1 -0
  19. package/dist/discord/command/autocomplete.d.ts +6 -1
  20. package/dist/discord/command/autocomplete.d.ts.map +1 -1
  21. package/dist/discord/command/autocomplete.js +6 -6
  22. package/dist/discord/command/autocomplete.js.map +1 -1
  23. package/dist/discord/command/command-responders.d.ts +26 -0
  24. package/dist/discord/command/command-responders.d.ts.map +1 -0
  25. package/dist/discord/command/command-responders.js +16 -0
  26. package/dist/discord/command/command-responders.js.map +1 -0
  27. package/dist/discord/command/context.d.ts +8 -17
  28. package/dist/discord/command/context.d.ts.map +1 -1
  29. package/dist/discord/command/context.js +8 -37
  30. package/dist/discord/command/context.js.map +1 -1
  31. package/dist/discord/command/cooldown-guard.d.ts +1 -1
  32. package/dist/discord/command/cooldown-guard.d.ts.map +1 -1
  33. package/dist/discord/command/create-command.d.ts +1 -8
  34. package/dist/discord/command/create-command.d.ts.map +1 -1
  35. package/dist/discord/command/create-command.js +17 -65
  36. package/dist/discord/command/create-command.js.map +1 -1
  37. package/dist/discord/command/create-context-menu-command.d.ts +3 -9
  38. package/dist/discord/command/create-context-menu-command.d.ts.map +1 -1
  39. package/dist/discord/command/create-context-menu-command.js +14 -65
  40. package/dist/discord/command/create-context-menu-command.js.map +1 -1
  41. package/dist/discord/command/errors.d.ts +1 -1
  42. package/dist/discord/command/errors.d.ts.map +1 -1
  43. package/dist/discord/command/errors.js +2 -2
  44. package/dist/discord/command/errors.js.map +1 -1
  45. package/dist/discord/command/guard.d.ts +15 -8
  46. package/dist/discord/command/guard.d.ts.map +1 -1
  47. package/dist/discord/command/guard.js +4 -4
  48. package/dist/discord/command/guard.js.map +1 -1
  49. package/dist/discord/command/options.d.ts +1 -10
  50. package/dist/discord/command/options.d.ts.map +1 -1
  51. package/dist/discord/command/options.js +127 -320
  52. package/dist/discord/command/options.js.map +1 -1
  53. package/dist/discord/command/passes-guard.d.ts +14 -0
  54. package/dist/discord/command/passes-guard.d.ts.map +1 -0
  55. package/dist/discord/command/passes-guard.js +27 -0
  56. package/dist/discord/command/passes-guard.js.map +1 -0
  57. package/dist/discord/command/permission-guard.d.ts +1 -1
  58. package/dist/discord/command/permission-guard.d.ts.map +1 -1
  59. package/dist/discord/command/render-command-failure.d.ts +23 -0
  60. package/dist/discord/command/render-command-failure.d.ts.map +1 -0
  61. package/dist/discord/command/render-command-failure.js +40 -0
  62. package/dist/discord/command/render-command-failure.js.map +1 -0
  63. package/dist/discord/command/route-key.d.ts +8 -0
  64. package/dist/discord/command/route-key.d.ts.map +1 -0
  65. package/dist/discord/command/route-key.js +13 -0
  66. package/dist/discord/command/route-key.js.map +1 -0
  67. package/dist/discord/command/router.d.ts +32 -7
  68. package/dist/discord/command/router.d.ts.map +1 -1
  69. package/dist/discord/command/router.js +48 -10
  70. package/dist/discord/command/router.js.map +1 -1
  71. package/dist/discord/command/send-embed.d.ts +14 -0
  72. package/dist/discord/command/send-embed.d.ts.map +1 -0
  73. package/dist/discord/command/send-embed.js +37 -0
  74. package/dist/discord/command/send-embed.js.map +1 -0
  75. package/dist/discord/command/types.d.ts +7 -1
  76. package/dist/discord/command/types.d.ts.map +1 -1
  77. package/dist/discord/components/component-access.d.ts +12 -0
  78. package/dist/discord/components/component-access.d.ts.map +1 -0
  79. package/dist/discord/components/component-access.js +21 -0
  80. package/dist/discord/components/component-access.js.map +1 -0
  81. package/dist/discord/components/component-router.d.ts +37 -15
  82. package/dist/discord/components/component-router.d.ts.map +1 -1
  83. package/dist/discord/components/component-router.js +44 -32
  84. package/dist/discord/components/component-router.js.map +1 -1
  85. package/dist/discord/components/interactive-message/index.d.ts +3 -1
  86. package/dist/discord/components/interactive-message/index.d.ts.map +1 -1
  87. package/dist/discord/components/interactive-message/index.js +5 -3
  88. package/dist/discord/components/interactive-message/index.js.map +1 -1
  89. package/dist/discord/components/interactive-message/interactive-message-collector.d.ts +3 -28
  90. package/dist/discord/components/interactive-message/interactive-message-collector.d.ts.map +1 -1
  91. package/dist/discord/components/interactive-message/interactive-message-collector.js +6 -53
  92. package/dist/discord/components/interactive-message/interactive-message-collector.js.map +1 -1
  93. package/dist/discord/components/interactive-message/message-edit-options.d.ts +18 -0
  94. package/dist/discord/components/interactive-message/message-edit-options.d.ts.map +1 -0
  95. package/dist/discord/components/interactive-message/message-edit-options.js +40 -0
  96. package/dist/discord/components/interactive-message/message-edit-options.js.map +1 -0
  97. package/dist/discord/components/interactive-message/mount-interactive-message.d.ts +2 -1
  98. package/dist/discord/components/interactive-message/mount-interactive-message.d.ts.map +1 -1
  99. package/dist/discord/components/interactive-message/mount-interactive-message.js +4 -2
  100. package/dist/discord/components/interactive-message/mount-interactive-message.js.map +1 -1
  101. package/dist/discord/components/interactive-message/state-store.d.ts +12 -0
  102. package/dist/discord/components/interactive-message/state-store.d.ts.map +1 -0
  103. package/dist/discord/components/interactive-message/state-store.js +14 -0
  104. package/dist/discord/components/interactive-message/state-store.js.map +1 -0
  105. package/dist/discord/components/paginator/mount-paginator.js +7 -5
  106. package/dist/discord/components/paginator/mount-paginator.js.map +1 -1
  107. package/dist/discord/components/paginator/paginator-view.d.ts +1 -1
  108. package/dist/discord/components/paginator/paginator-view.d.ts.map +1 -1
  109. package/dist/discord/components/persistent-paginator.d.ts +1 -1
  110. package/dist/discord/components/persistent-paginator.d.ts.map +1 -1
  111. package/dist/discord/components/persistent-paginator.js +6 -6
  112. package/dist/discord/components/persistent-paginator.js.map +1 -1
  113. package/dist/discord/components/settings-editor/from-declaration-controls.d.ts +67 -0
  114. package/dist/discord/components/settings-editor/from-declaration-controls.d.ts.map +1 -0
  115. package/dist/discord/components/settings-editor/from-declaration-controls.js +245 -0
  116. package/dist/discord/components/settings-editor/from-declaration-controls.js.map +1 -0
  117. package/dist/discord/components/settings-editor/from-declaration-display.d.ts +23 -0
  118. package/dist/discord/components/settings-editor/from-declaration-display.d.ts.map +1 -0
  119. package/dist/discord/components/settings-editor/from-declaration-display.js +114 -0
  120. package/dist/discord/components/settings-editor/from-declaration-display.js.map +1 -0
  121. package/dist/discord/components/settings-editor/from-declaration-layout.d.ts +33 -0
  122. package/dist/discord/components/settings-editor/from-declaration-layout.d.ts.map +1 -0
  123. package/dist/discord/components/settings-editor/from-declaration-layout.js +178 -0
  124. package/dist/discord/components/settings-editor/from-declaration-layout.js.map +1 -0
  125. package/dist/discord/components/settings-editor/from-declaration-search.d.ts +27 -0
  126. package/dist/discord/components/settings-editor/from-declaration-search.d.ts.map +1 -0
  127. package/dist/discord/components/settings-editor/from-declaration-search.js +58 -0
  128. package/dist/discord/components/settings-editor/from-declaration-search.js.map +1 -0
  129. package/dist/discord/components/settings-editor/from-declaration-stored.d.ts +21 -0
  130. package/dist/discord/components/settings-editor/from-declaration-stored.d.ts.map +1 -0
  131. package/dist/discord/components/settings-editor/from-declaration-stored.js +37 -0
  132. package/dist/discord/components/settings-editor/from-declaration-stored.js.map +1 -0
  133. package/dist/discord/components/settings-editor/from-declaration-subject.d.ts +32 -0
  134. package/dist/discord/components/settings-editor/from-declaration-subject.d.ts.map +1 -0
  135. package/dist/discord/components/settings-editor/from-declaration-subject.js +65 -0
  136. package/dist/discord/components/settings-editor/from-declaration-subject.js.map +1 -0
  137. package/dist/discord/components/settings-editor/from-declaration-values.d.ts +57 -0
  138. package/dist/discord/components/settings-editor/from-declaration-values.d.ts.map +1 -0
  139. package/dist/discord/components/settings-editor/from-declaration-values.js +187 -0
  140. package/dist/discord/components/settings-editor/from-declaration-values.js.map +1 -0
  141. package/dist/discord/components/settings-editor/from-declaration.d.ts +39 -0
  142. package/dist/discord/components/settings-editor/from-declaration.d.ts.map +1 -0
  143. package/dist/discord/components/settings-editor/from-declaration.js +132 -0
  144. package/dist/discord/components/settings-editor/from-declaration.js.map +1 -0
  145. package/dist/discord/components/settings-editor/index.d.ts +3 -1
  146. package/dist/discord/components/settings-editor/index.d.ts.map +1 -1
  147. package/dist/discord/components/settings-editor/index.js +6 -3
  148. package/dist/discord/components/settings-editor/index.js.map +1 -1
  149. package/dist/discord/components/settings-editor/mount-settings-editor.d.ts +16 -2
  150. package/dist/discord/components/settings-editor/mount-settings-editor.d.ts.map +1 -1
  151. package/dist/discord/components/settings-editor/mount-settings-editor.js +14 -10
  152. package/dist/discord/components/settings-editor/mount-settings-editor.js.map +1 -1
  153. package/dist/discord/components/settings-editor/navigation.d.ts +20 -0
  154. package/dist/discord/components/settings-editor/navigation.d.ts.map +1 -1
  155. package/dist/discord/components/settings-editor/navigation.js +22 -0
  156. package/dist/discord/components/settings-editor/navigation.js.map +1 -1
  157. package/dist/discord/components/settings-editor/settings-editor-card.view.d.ts +4 -3
  158. package/dist/discord/components/settings-editor/settings-editor-card.view.d.ts.map +1 -1
  159. package/dist/discord/components/settings-editor/settings-editor-card.view.js +60 -34
  160. package/dist/discord/components/settings-editor/settings-editor-card.view.js.map +1 -1
  161. package/dist/discord/components/settings-editor/settings-editor-field-modal.d.ts +2 -1
  162. package/dist/discord/components/settings-editor/settings-editor-field-modal.d.ts.map +1 -1
  163. package/dist/discord/components/settings-editor/settings-editor-field-modal.js +48 -72
  164. package/dist/discord/components/settings-editor/settings-editor-field-modal.js.map +1 -1
  165. package/dist/discord/components/settings-editor/settings-editor-field-values.d.ts +6 -0
  166. package/dist/discord/components/settings-editor/settings-editor-field-values.d.ts.map +1 -0
  167. package/dist/discord/components/settings-editor/settings-editor-field-values.js +13 -0
  168. package/dist/discord/components/settings-editor/settings-editor-field-values.js.map +1 -0
  169. package/dist/discord/components/settings-editor/settings-editor-fields.d.ts +6 -5
  170. package/dist/discord/components/settings-editor/settings-editor-fields.d.ts.map +1 -1
  171. package/dist/discord/components/settings-editor/settings-editor-fields.js +0 -10
  172. package/dist/discord/components/settings-editor/settings-editor-fields.js.map +1 -1
  173. package/dist/discord/components/settings-editor/settings-editor.view.d.ts +3 -2
  174. package/dist/discord/components/settings-editor/settings-editor.view.d.ts.map +1 -1
  175. package/dist/discord/components/settings-editor/settings-editor.view.js +4 -21
  176. package/dist/discord/components/settings-editor/settings-editor.view.js.map +1 -1
  177. package/dist/discord/events/event-guild-id.d.ts +10 -0
  178. package/dist/discord/events/event-guild-id.d.ts.map +1 -0
  179. package/dist/discord/events/event-guild-id.js +37 -0
  180. package/dist/discord/events/event-guild-id.js.map +1 -0
  181. package/dist/discord/events/event-router.d.ts +17 -3
  182. package/dist/discord/events/event-router.d.ts.map +1 -1
  183. package/dist/discord/events/event-router.js +33 -9
  184. package/dist/discord/events/event-router.js.map +1 -1
  185. package/dist/discord/i18n.d.ts +17 -2
  186. package/dist/discord/i18n.d.ts.map +1 -1
  187. package/dist/discord/i18n.js +43 -6
  188. package/dist/discord/i18n.js.map +1 -1
  189. package/dist/discord/interaction/interaction-locale.d.ts +14 -0
  190. package/dist/discord/interaction/interaction-locale.d.ts.map +1 -0
  191. package/dist/discord/interaction/interaction-locale.js +12 -0
  192. package/dist/discord/interaction/interaction-locale.js.map +1 -0
  193. package/dist/discord/interaction/locale-resolver.d.ts +27 -0
  194. package/dist/discord/interaction/locale-resolver.d.ts.map +1 -0
  195. package/dist/discord/interaction/locale-resolver.js +3 -0
  196. package/dist/discord/interaction/locale-resolver.js.map +1 -0
  197. package/dist/discord/interaction/modal.d.ts.map +1 -1
  198. package/dist/discord/interaction/modal.js +5 -40
  199. package/dist/discord/interaction/modal.js.map +1 -1
  200. package/dist/discord/interaction/reply-locale.d.ts +18 -0
  201. package/dist/discord/interaction/reply-locale.d.ts.map +1 -0
  202. package/dist/discord/interaction/reply-locale.js +25 -0
  203. package/dist/discord/interaction/reply-locale.js.map +1 -0
  204. package/dist/discord/interaction/select-bounds.d.ts +19 -0
  205. package/dist/discord/interaction/select-bounds.d.ts.map +1 -0
  206. package/dist/discord/interaction/select-bounds.js +17 -0
  207. package/dist/discord/interaction/select-bounds.js.map +1 -0
  208. package/dist/discord/interaction/select-menu.d.ts.map +1 -1
  209. package/dist/discord/interaction/select-menu.js +2 -9
  210. package/dist/discord/interaction/select-menu.js.map +1 -1
  211. package/dist/discord/placeholder-registry.d.ts +1 -1
  212. package/dist/discord/placeholder-registry.d.ts.map +1 -1
  213. package/dist/discord/presenter.d.ts +1 -1
  214. package/dist/discord/presenter.d.ts.map +1 -1
  215. package/dist/discord/settings/discord-guild-directory.d.ts +28 -0
  216. package/dist/discord/settings/discord-guild-directory.d.ts.map +1 -0
  217. package/dist/discord/settings/discord-guild-directory.js +171 -0
  218. package/dist/discord/settings/discord-guild-directory.js.map +1 -0
  219. package/dist/discord/settings/guild-locale-resolver.d.ts +25 -0
  220. package/dist/discord/settings/guild-locale-resolver.d.ts.map +1 -0
  221. package/dist/discord/settings/guild-locale-resolver.js +33 -0
  222. package/dist/discord/settings/guild-locale-resolver.js.map +1 -0
  223. package/dist/discord/settings/is-module-disabled.d.ts +16 -0
  224. package/dist/discord/settings/is-module-disabled.d.ts.map +1 -0
  225. package/dist/discord/settings/is-module-disabled.js +20 -0
  226. package/dist/discord/settings/is-module-disabled.js.map +1 -0
  227. package/dist/discord/settings/module-disabled-embed.d.ts +13 -0
  228. package/dist/discord/settings/module-disabled-embed.d.ts.map +1 -0
  229. package/dist/discord/settings/module-disabled-embed.js +16 -0
  230. package/dist/discord/settings/module-disabled-embed.js.map +1 -0
  231. package/dist/discord/settings/require-configured.d.ts +26 -0
  232. package/dist/discord/settings/require-configured.d.ts.map +1 -0
  233. package/dist/discord/settings/require-configured.js +62 -0
  234. package/dist/discord/settings/require-configured.js.map +1 -0
  235. package/dist/discord/ui/color-aliases.d.ts +31 -0
  236. package/dist/discord/ui/color-aliases.d.ts.map +1 -0
  237. package/dist/discord/ui/color-aliases.js +66 -0
  238. package/dist/discord/ui/color-aliases.js.map +1 -0
  239. package/dist/discord/ui/color-input.d.ts +5 -32
  240. package/dist/discord/ui/color-input.d.ts.map +1 -1
  241. package/dist/discord/ui/color-input.js +8 -157
  242. package/dist/discord/ui/color-input.js.map +1 -1
  243. package/dist/discord/ui/colors.d.ts +0 -2
  244. package/dist/discord/ui/colors.d.ts.map +1 -1
  245. package/dist/discord/ui/colors.js +4 -5
  246. package/dist/discord/ui/colors.js.map +1 -1
  247. package/dist/discord/ui/embed.d.ts.map +1 -1
  248. package/dist/discord/ui/embed.js +3 -8
  249. package/dist/discord/ui/embed.js.map +1 -1
  250. package/dist/discord/ui/truncate-text.d.ts +11 -0
  251. package/dist/discord/ui/truncate-text.d.ts.map +1 -0
  252. package/dist/discord/ui/truncate-text.js +19 -0
  253. package/dist/discord/ui/truncate-text.js.map +1 -0
  254. package/dist/errors/error-message.d.ts +9 -0
  255. package/dist/errors/error-message.d.ts.map +1 -0
  256. package/dist/errors/error-message.js +14 -0
  257. package/dist/errors/error-message.js.map +1 -0
  258. package/dist/i18n/business-message.d.ts +1 -1
  259. package/dist/i18n/business-message.d.ts.map +1 -1
  260. package/dist/i18n/catalog.d.ts +9 -0
  261. package/dist/i18n/catalog.d.ts.map +1 -1
  262. package/dist/i18n/catalog.js +4 -0
  263. package/dist/i18n/catalog.js.map +1 -1
  264. package/dist/i18n/locale.d.ts +2 -0
  265. package/dist/i18n/locale.d.ts.map +1 -1
  266. package/dist/i18n/locale.js +3 -1
  267. package/dist/i18n/locale.js.map +1 -1
  268. package/dist/i18n/translator.d.ts +2 -0
  269. package/dist/i18n/translator.d.ts.map +1 -1
  270. package/dist/i18n/translator.js.map +1 -1
  271. package/dist/module/module.d.ts +15 -1
  272. package/dist/module/module.d.ts.map +1 -1
  273. package/dist/resilience/retry.js +2 -2
  274. package/dist/resilience/retry.js.map +1 -1
  275. package/dist/scheduler/scheduler.d.ts.map +1 -1
  276. package/dist/scheduler/scheduler.js +2 -4
  277. package/dist/scheduler/scheduler.js.map +1 -1
  278. package/dist/settings/cache.d.ts +29 -0
  279. package/dist/settings/cache.d.ts.map +1 -0
  280. package/dist/settings/cache.js +47 -0
  281. package/dist/settings/cache.js.map +1 -0
  282. package/dist/settings/choice.d.ts +10 -0
  283. package/dist/settings/choice.d.ts.map +1 -0
  284. package/dist/settings/choice.js +3 -0
  285. package/dist/settings/choice.js.map +1 -0
  286. package/dist/settings/decode-stored.d.ts +20 -0
  287. package/dist/settings/decode-stored.d.ts.map +1 -0
  288. package/dist/settings/decode-stored.js +35 -0
  289. package/dist/settings/decode-stored.js.map +1 -0
  290. package/dist/settings/define-settings.d.ts +52 -0
  291. package/dist/settings/define-settings.d.ts.map +1 -0
  292. package/dist/settings/define-settings.js +141 -0
  293. package/dist/settings/define-settings.js.map +1 -0
  294. package/dist/settings/describe-field.d.ts +19 -0
  295. package/dist/settings/describe-field.d.ts.map +1 -0
  296. package/dist/settings/describe-field.js +131 -0
  297. package/dist/settings/describe-field.js.map +1 -0
  298. package/dist/settings/describe.d.ts +27 -0
  299. package/dist/settings/describe.d.ts.map +1 -0
  300. package/dist/settings/describe.js +62 -0
  301. package/dist/settings/describe.js.map +1 -0
  302. package/dist/settings/duration.d.ts +16 -0
  303. package/dist/settings/duration.d.ts.map +1 -0
  304. package/dist/settings/duration.js +56 -0
  305. package/dist/settings/duration.js.map +1 -0
  306. package/dist/settings/field-order.d.ts +37 -0
  307. package/dist/settings/field-order.d.ts.map +1 -0
  308. package/dist/settings/field-order.js +100 -0
  309. package/dist/settings/field-order.js.map +1 -0
  310. package/dist/settings/field-search.d.ts +10 -0
  311. package/dist/settings/field-search.d.ts.map +1 -0
  312. package/dist/settings/field-search.js +18 -0
  313. package/dist/settings/field-search.js.map +1 -0
  314. package/dist/settings/fields/builders.d.ts +41 -0
  315. package/dist/settings/fields/builders.d.ts.map +1 -0
  316. package/dist/settings/fields/builders.js +83 -0
  317. package/dist/settings/fields/builders.js.map +1 -0
  318. package/dist/settings/fields/field.d.ts +199 -0
  319. package/dist/settings/fields/field.d.ts.map +1 -0
  320. package/dist/settings/fields/field.js +33 -0
  321. package/dist/settings/fields/field.js.map +1 -0
  322. package/dist/settings/fields/zod-schema.d.ts +67 -0
  323. package/dist/settings/fields/zod-schema.d.ts.map +1 -0
  324. package/dist/settings/fields/zod-schema.js +281 -0
  325. package/dist/settings/fields/zod-schema.js.map +1 -0
  326. package/dist/settings/in-memory/in-memory-guild-directory.d.ts +24 -0
  327. package/dist/settings/in-memory/in-memory-guild-directory.d.ts.map +1 -0
  328. package/dist/settings/in-memory/in-memory-guild-directory.js +42 -0
  329. package/dist/settings/in-memory/in-memory-guild-directory.js.map +1 -0
  330. package/dist/settings/in-memory/in-memory-settings-store.d.ts +8 -0
  331. package/dist/settings/in-memory/in-memory-settings-store.d.ts.map +1 -0
  332. package/dist/settings/in-memory/in-memory-settings-store.js +43 -0
  333. package/dist/settings/in-memory/in-memory-settings-store.js.map +1 -0
  334. package/dist/settings/in-memory/in-process-notifier.d.ts +9 -0
  335. package/dist/settings/in-memory/in-process-notifier.d.ts.map +1 -0
  336. package/dist/settings/in-memory/in-process-notifier.js +32 -0
  337. package/dist/settings/in-memory/in-process-notifier.js.map +1 -0
  338. package/dist/settings/index.d.ts +22 -0
  339. package/dist/settings/index.d.ts.map +1 -0
  340. package/dist/settings/index.js +31 -0
  341. package/dist/settings/index.js.map +1 -0
  342. package/dist/settings/is-plain-object.d.ts +6 -0
  343. package/dist/settings/is-plain-object.d.ts.map +1 -0
  344. package/dist/settings/is-plain-object.js +15 -0
  345. package/dist/settings/is-plain-object.js.map +1 -0
  346. package/dist/settings/messages.d.ts +61 -0
  347. package/dist/settings/messages.d.ts.map +1 -0
  348. package/dist/settings/messages.js +155 -0
  349. package/dist/settings/messages.js.map +1 -0
  350. package/dist/settings/migrate.d.ts +35 -0
  351. package/dist/settings/migrate.d.ts.map +1 -0
  352. package/dist/settings/migrate.js +42 -0
  353. package/dist/settings/migrate.js.map +1 -0
  354. package/dist/settings/ports/guild-directory.d.ts +61 -0
  355. package/dist/settings/ports/guild-directory.d.ts.map +1 -0
  356. package/dist/settings/ports/guild-directory.js +3 -0
  357. package/dist/settings/ports/guild-directory.js.map +1 -0
  358. package/dist/settings/ports/settings-changed-notifier.d.ts +20 -0
  359. package/dist/settings/ports/settings-changed-notifier.d.ts.map +1 -0
  360. package/dist/settings/ports/settings-changed-notifier.js +3 -0
  361. package/dist/settings/ports/settings-changed-notifier.js.map +1 -0
  362. package/dist/settings/ports/settings-store.d.ts +76 -0
  363. package/dist/settings/ports/settings-store.d.ts.map +1 -0
  364. package/dist/settings/ports/settings-store.js +3 -0
  365. package/dist/settings/ports/settings-store.js.map +1 -0
  366. package/dist/settings/registry.d.ts +31 -0
  367. package/dist/settings/registry.d.ts.map +1 -0
  368. package/dist/settings/registry.js +102 -0
  369. package/dist/settings/registry.js.map +1 -0
  370. package/dist/settings/settings-declaration-error.d.ts +13 -0
  371. package/dist/settings/settings-declaration-error.d.ts.map +1 -0
  372. package/dist/settings/settings-declaration-error.js +22 -0
  373. package/dist/settings/settings-declaration-error.js.map +1 -0
  374. package/dist/settings/settings-service.d.ts +148 -0
  375. package/dist/settings/settings-service.d.ts.map +1 -0
  376. package/dist/settings/settings-service.js +279 -0
  377. package/dist/settings/settings-service.js.map +1 -0
  378. package/dist/settings/settings-validation-error.d.ts +23 -0
  379. package/dist/settings/settings-validation-error.d.ts.map +1 -0
  380. package/dist/settings/settings-validation-error.js +17 -0
  381. package/dist/settings/settings-validation-error.js.map +1 -0
  382. package/dist/settings/status.d.ts +16 -0
  383. package/dist/settings/status.d.ts.map +1 -0
  384. package/dist/settings/status.js +18 -0
  385. package/dist/settings/status.js.map +1 -0
  386. package/dist/settings/suggest.d.ts +77 -0
  387. package/dist/settings/suggest.d.ts.map +1 -0
  388. package/dist/settings/suggest.js +192 -0
  389. package/dist/settings/suggest.js.map +1 -0
  390. package/dist/settings/system/kernel-settings.d.ts +43 -0
  391. package/dist/settings/system/kernel-settings.d.ts.map +1 -0
  392. package/dist/settings/system/kernel-settings.js +53 -0
  393. package/dist/settings/system/kernel-settings.js.map +1 -0
  394. package/dist/settings/system/module-gate.d.ts +31 -0
  395. package/dist/settings/system/module-gate.d.ts.map +1 -0
  396. package/dist/settings/system/module-gate.js +34 -0
  397. package/dist/settings/system/module-gate.js.map +1 -0
  398. package/dist/settings/testing/index.d.ts +2 -0
  399. package/dist/settings/testing/index.d.ts.map +1 -0
  400. package/dist/settings/testing/index.js +6 -0
  401. package/dist/settings/testing/index.js.map +1 -0
  402. package/dist/settings/testing/settings-store-contract.d.ts +29 -0
  403. package/dist/settings/testing/settings-store-contract.d.ts.map +1 -0
  404. package/dist/settings/testing/settings-store-contract.js +192 -0
  405. package/dist/settings/testing/settings-store-contract.js.map +1 -0
  406. package/dist/settings/timed-search.d.ts +26 -0
  407. package/dist/settings/timed-search.d.ts.map +1 -0
  408. package/dist/settings/timed-search.js +48 -0
  409. package/dist/settings/timed-search.js.map +1 -0
  410. package/dist/settings/types.d.ts +37 -0
  411. package/dist/settings/types.d.ts.map +1 -0
  412. package/dist/settings/types.js +3 -0
  413. package/dist/settings/types.js.map +1 -0
  414. package/dist/settings/validate.d.ts +55 -0
  415. package/dist/settings/validate.d.ts.map +1 -0
  416. package/dist/settings/validate.js +196 -0
  417. package/dist/settings/validate.js.map +1 -0
  418. package/package.json +463 -88
  419. package/src/authz/require-level-guard.ts +1 -1
  420. package/src/color.ts +134 -0
  421. package/src/discord/command/all-required.ts +12 -0
  422. package/src/discord/command/autocomplete-dispatcher.ts +2 -1
  423. package/src/discord/command/autocomplete-limits.ts +2 -0
  424. package/src/discord/command/autocomplete.ts +8 -7
  425. package/src/discord/command/command-responders.ts +39 -0
  426. package/src/discord/command/context.ts +14 -54
  427. package/src/discord/command/cooldown-guard.ts +1 -1
  428. package/src/discord/command/create-command.ts +19 -94
  429. package/src/discord/command/create-context-menu-command.ts +19 -97
  430. package/src/discord/command/errors.ts +1 -1
  431. package/src/discord/command/guard.ts +24 -12
  432. package/src/discord/command/options.ts +202 -412
  433. package/src/discord/command/passes-guard.ts +37 -0
  434. package/src/discord/command/permission-guard.ts +1 -1
  435. package/src/discord/command/render-command-failure.ts +71 -0
  436. package/src/discord/command/route-key.ts +9 -0
  437. package/src/discord/command/router.ts +73 -12
  438. package/src/discord/command/send-embed.ts +42 -0
  439. package/src/discord/command/types.ts +7 -1
  440. package/src/discord/components/component-access.ts +20 -0
  441. package/src/discord/components/component-router.ts +73 -36
  442. package/src/discord/components/interactive-message/index.ts +5 -3
  443. package/src/discord/components/interactive-message/interactive-message-collector.ts +4 -68
  444. package/src/discord/components/interactive-message/message-edit-options.ts +47 -0
  445. package/src/discord/components/interactive-message/mount-interactive-message.ts +5 -3
  446. package/src/discord/components/interactive-message/state-store.ts +20 -0
  447. package/src/discord/components/paginator/mount-paginator.ts +3 -3
  448. package/src/discord/components/paginator/paginator-view.ts +1 -1
  449. package/src/discord/components/persistent-paginator.ts +8 -9
  450. package/src/discord/components/settings-editor/from-declaration-controls.ts +371 -0
  451. package/src/discord/components/settings-editor/from-declaration-display.ts +155 -0
  452. package/src/discord/components/settings-editor/from-declaration-layout.ts +247 -0
  453. package/src/discord/components/settings-editor/from-declaration-search.ts +77 -0
  454. package/src/discord/components/settings-editor/from-declaration-stored.ts +39 -0
  455. package/src/discord/components/settings-editor/from-declaration-subject.ts +110 -0
  456. package/src/discord/components/settings-editor/from-declaration-values.ts +240 -0
  457. package/src/discord/components/settings-editor/from-declaration.ts +218 -0
  458. package/src/discord/components/settings-editor/index.ts +5 -2
  459. package/src/discord/components/settings-editor/mount-settings-editor.ts +28 -10
  460. package/src/discord/components/settings-editor/navigation.ts +41 -0
  461. package/src/discord/components/settings-editor/settings-editor-card.view.ts +79 -36
  462. package/src/discord/components/settings-editor/settings-editor-field-modal.ts +76 -68
  463. package/src/discord/components/settings-editor/settings-editor-field-values.ts +11 -0
  464. package/src/discord/components/settings-editor/settings-editor-fields.ts +6 -11
  465. package/src/discord/components/settings-editor/settings-editor.view.ts +11 -24
  466. package/src/discord/events/event-guild-id.ts +35 -0
  467. package/src/discord/events/event-router.ts +46 -13
  468. package/src/discord/i18n.ts +47 -8
  469. package/src/discord/interaction/interaction-locale.ts +19 -0
  470. package/src/discord/interaction/locale-resolver.ts +28 -0
  471. package/src/discord/interaction/modal.ts +5 -40
  472. package/src/discord/interaction/reply-locale.ts +35 -0
  473. package/src/discord/interaction/select-bounds.ts +33 -0
  474. package/src/discord/interaction/select-menu.ts +2 -9
  475. package/src/discord/placeholder-registry.ts +1 -1
  476. package/src/discord/presenter.ts +1 -1
  477. package/src/discord/settings/discord-guild-directory.ts +214 -0
  478. package/src/discord/settings/guild-locale-resolver.ts +38 -0
  479. package/src/discord/settings/is-module-disabled.ts +22 -0
  480. package/src/discord/settings/module-disabled-embed.ts +19 -0
  481. package/src/discord/settings/require-configured.ts +68 -0
  482. package/src/discord/ui/color-aliases.ts +70 -0
  483. package/src/discord/ui/color-input.ts +8 -173
  484. package/src/discord/ui/colors.ts +2 -3
  485. package/src/discord/ui/embed.ts +3 -9
  486. package/src/discord/ui/truncate-text.ts +15 -0
  487. package/src/errors/error-message.ts +10 -0
  488. package/src/i18n/business-message.ts +1 -1
  489. package/src/i18n/catalog.ts +14 -0
  490. package/src/i18n/locale.ts +3 -0
  491. package/src/i18n/translator.ts +3 -0
  492. package/src/module/module.ts +15 -1
  493. package/src/resilience/retry.ts +1 -1
  494. package/src/scheduler/scheduler.ts +2 -5
  495. package/src/settings/cache.ts +70 -0
  496. package/src/settings/choice.ts +9 -0
  497. package/src/settings/decode-stored.ts +40 -0
  498. package/src/settings/define-settings.ts +214 -0
  499. package/src/settings/describe-field.ts +155 -0
  500. package/src/settings/describe.ts +90 -0
  501. package/src/settings/duration.ts +54 -0
  502. package/src/settings/field-order.ts +128 -0
  503. package/src/settings/field-search.ts +16 -0
  504. package/src/settings/fields/builders.ts +161 -0
  505. package/src/settings/fields/field.ts +205 -0
  506. package/src/settings/fields/zod-schema.ts +300 -0
  507. package/src/settings/in-memory/in-memory-guild-directory.ts +69 -0
  508. package/src/settings/in-memory/in-memory-settings-store.ts +46 -0
  509. package/src/settings/in-memory/in-process-notifier.ts +40 -0
  510. package/src/settings/index.ts +72 -0
  511. package/src/settings/is-plain-object.ts +11 -0
  512. package/src/settings/messages.ts +161 -0
  513. package/src/settings/migrate.ts +58 -0
  514. package/src/settings/ports/guild-directory.ts +48 -0
  515. package/src/settings/ports/settings-changed-notifier.ts +20 -0
  516. package/src/settings/ports/settings-store.ts +74 -0
  517. package/src/settings/registry.ts +137 -0
  518. package/src/settings/settings-declaration-error.ts +16 -0
  519. package/src/settings/settings-service.ts +535 -0
  520. package/src/settings/settings-validation-error.ts +41 -0
  521. package/src/settings/status.ts +25 -0
  522. package/src/settings/suggest.ts +267 -0
  523. package/src/settings/system/kernel-settings.ts +74 -0
  524. package/src/settings/system/module-gate.ts +49 -0
  525. package/src/settings/testing/index.ts +7 -0
  526. package/src/settings/testing/settings-store-contract.ts +278 -0
  527. package/src/settings/timed-search.ts +56 -0
  528. package/src/settings/types.ts +42 -0
  529. package/src/settings/validate.ts +298 -0
@@ -0,0 +1,102 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSettingsRegistry = createSettingsRegistry;
4
+ const field_1 = require("../settings/fields/field");
5
+ const settings_declaration_error_1 = require("../settings/settings-declaration-error");
6
+ const kernel_settings_1 = require("../settings/system/kernel-settings");
7
+ /**
8
+ * Collect the modules' settings declarations at boot, after the kernel's own
9
+ * declaration ({@link kernelSettings}), which is always included.
10
+ *
11
+ * @param input.declarations - every module's declaration.
12
+ * @param input.translations - must already contain the modules' catalogs and
13
+ * `SETTINGS_CATALOG`, which holds the kernel declaration's texts.
14
+ * @param input.modules - the registered modules (a `BotModule` fits), whose
15
+ * names and `defaultEnabled` build the kernel's module toggles. None by default.
16
+ * @returns the registry of declarations, by id.
17
+ * @throws SettingsDeclarationError when two declarations share an id (FR-005)
18
+ * or a declaration references a catalog key without an English source (FR-028),
19
+ * or two modules share a name.
20
+ */
21
+ function createSettingsRegistry(input) {
22
+ const kernel = (0, kernel_settings_1.kernelSettings)(input.modules ?? []);
23
+ const byId = new Map();
24
+ for (const declaration of [kernel, ...input.declarations]) {
25
+ if (byId.has(declaration.id)) {
26
+ throw new settings_declaration_error_1.SettingsDeclarationError(declaration.id, "is declared more than once");
27
+ }
28
+ checkKeys({ declaration, translations: input.translations });
29
+ byId.set(declaration.id, declaration);
30
+ }
31
+ return {
32
+ declarations: [...byId.values()],
33
+ kernel,
34
+ get: (id) => byId.get(id),
35
+ };
36
+ }
37
+ function checkKeys(params) {
38
+ const { declaration, translations } = params;
39
+ for (const key of catalogKeys(declaration)) {
40
+ if (!translations.has(key)) {
41
+ throw new settings_declaration_error_1.SettingsDeclarationError(declaration.id, `catalog key "${key}" has no English source`);
42
+ }
43
+ }
44
+ }
45
+ /**
46
+ * Every catalog key a declaration references: labels, groups, fields, choices
47
+ * and toggle key labels.
48
+ */
49
+ function* catalogKeys(declaration) {
50
+ yield* defined([declaration.labels.title, declaration.labels.description]);
51
+ for (const group of Object.values(declaration.groups ?? {})) {
52
+ yield* defined([group.label, group.description]);
53
+ }
54
+ for (const declared of Object.values(declaration.fields)) {
55
+ yield* fieldKeys(declared);
56
+ }
57
+ }
58
+ function* fieldKeys(declared) {
59
+ yield* defined([declared.label, declared.description, declared.placeholder, declared.unit]);
60
+ yield* specKeys(declared.spec);
61
+ }
62
+ function* specKeys(spec) {
63
+ switch (spec.kind) {
64
+ case "enum":
65
+ yield* spec.choices.map(choiceLabel);
66
+ return;
67
+ case "integer":
68
+ case "text":
69
+ yield* suggestionKeys(spec.suggest);
70
+ return;
71
+ case "list":
72
+ yield* fieldKeys(spec.item);
73
+ return;
74
+ case "toggles":
75
+ yield* defined(Object.values(spec.keyLabels ?? {}));
76
+ return;
77
+ case "channel":
78
+ case "role":
79
+ case "user":
80
+ case "color":
81
+ case "duration":
82
+ case "number":
83
+ case "boolean":
84
+ case "secret":
85
+ return;
86
+ default:
87
+ (0, field_1.unhandledFieldKind)(spec);
88
+ }
89
+ }
90
+ function suggestionKeys(suggest) {
91
+ if (suggest === undefined || !("choices" in suggest)) {
92
+ return [];
93
+ }
94
+ return suggest.choices.map(choiceLabel);
95
+ }
96
+ function choiceLabel(choice) {
97
+ return choice.label;
98
+ }
99
+ function defined(keys) {
100
+ return keys.filter((key) => key !== undefined);
101
+ }
102
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/settings/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * A module's settings declaration breaks a rule that can be checked without a
3
+ * guild: a default failing its own field, a secret with a default, too many
4
+ * choices, a duplicate id, a catalog key with no English source… Raised by
5
+ * `defineSettings` and `createSettingsRegistry` at boot, so a broken
6
+ * declaration never reaches a server.
7
+ */
8
+ export declare class SettingsDeclarationError extends Error {
9
+ readonly declarationId: string;
10
+ readonly reason: string;
11
+ constructor(declarationId: string, reason: string);
12
+ }
13
+ //# sourceMappingURL=settings-declaration-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-declaration-error.d.ts","sourceRoot":"","sources":["../../src/settings/settings-declaration-error.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;IAEjD,QAAQ,CAAC,aAAa,EAAE,MAAM;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM;gBADd,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM;CAKxB"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsDeclarationError = void 0;
4
+ /**
5
+ * A module's settings declaration breaks a rule that can be checked without a
6
+ * guild: a default failing its own field, a secret with a default, too many
7
+ * choices, a duplicate id, a catalog key with no English source… Raised by
8
+ * `defineSettings` and `createSettingsRegistry` at boot, so a broken
9
+ * declaration never reaches a server.
10
+ */
11
+ class SettingsDeclarationError extends Error {
12
+ declarationId;
13
+ reason;
14
+ constructor(declarationId, reason) {
15
+ super(`Settings declaration "${declarationId}": ${reason}`);
16
+ this.declarationId = declarationId;
17
+ this.reason = reason;
18
+ this.name = "SettingsDeclarationError";
19
+ }
20
+ }
21
+ exports.SettingsDeclarationError = SettingsDeclarationError;
22
+ //# sourceMappingURL=settings-declaration-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-declaration-error.js","sourceRoot":"","sources":["../../src/settings/settings-declaration-error.ts"],"names":[],"mappings":";;;AAAA;;;;;;GAMG;AACH,MAAa,wBAAyB,SAAQ,KAAK;IAExC;IACA;IAFV,YACU,aAAqB,EACrB,MAAc;QAEvB,KAAK,CAAC,yBAAyB,aAAa,MAAM,MAAM,EAAE,CAAC,CAAC;QAHnD,kBAAa,GAAb,aAAa,CAAQ;QACrB,WAAM,GAAN,MAAM,CAAQ;QAGvB,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;IACxC,CAAC;CACD;AARD,4DAQC"}
@@ -0,0 +1,148 @@
1
+ import type { Clock } from "../clock";
2
+ import type { Translator } from "../i18n/translator";
3
+ import type { Logger } from "../logger";
4
+ import type { Choice } from "../settings/choice";
5
+ import type { SettingsDeclaration } from "../settings/define-settings";
6
+ import { type SettingsSchema } from "../settings/describe";
7
+ import type { GuildDirectory } from "../settings/ports/guild-directory";
8
+ import type { SettingsChangedNotifier } from "../settings/ports/settings-changed-notifier";
9
+ import type { SettingsStore, StoredSettings } from "../settings/ports/settings-store";
10
+ import type { SettingsRegistry } from "../settings/registry";
11
+ import { type SettingsIssue } from "../settings/settings-validation-error";
12
+ import { type SettingsStatus } from "../settings/status";
13
+ import type { SettingsValues, SurfaceValues } from "../settings/types";
14
+ /** Who asks, for which guild and in which language. */
15
+ export interface RequestContext {
16
+ readonly guildId: string;
17
+ readonly userId: string;
18
+ readonly locale: string;
19
+ }
20
+ /**
21
+ * Outcome of {@link SettingsService.validate}: the submitted fields in their
22
+ * stored form (an unset field maps to `undefined`), or every issue found.
23
+ */
24
+ export type ValidationResult<D extends SettingsDeclaration> = {
25
+ readonly ok: true;
26
+ readonly values: Partial<SettingsValues<D>>;
27
+ } | {
28
+ readonly ok: false;
29
+ readonly issues: readonly SettingsIssue[];
30
+ };
31
+ /** Reads and writes the settings modules declare, per guild. */
32
+ export interface SettingsService {
33
+ /**
34
+ * Module logic read: every declared field, secrets included. A field with
35
+ * no valid stored value reads as its default. Cached per guild and module
36
+ * until a change of them (this service's writes, or a notifier event) or
37
+ * `SETTINGS_CACHE_TTL_MS`, whichever comes first.
38
+ *
39
+ * Writes only to migrate (FR-018): values stored under an older declaration
40
+ * version go through the declaration's `migrate`, are validated, and are
41
+ * written back once under the declared version, like any other write. A
42
+ * migration that throws or yields invalid values writes nothing and is
43
+ * logged; the guild then reads defaults for the fields it cannot read.
44
+ * Values stored under a newer version are never written (FR-019).
45
+ */
46
+ get<D extends SettingsDeclaration>(declaration: D, guildId: string): Promise<SettingsValues<D>>;
47
+ /**
48
+ * Surface read: like {@link get}, with each secret replaced by whether it
49
+ * is set. A secret's value never leaves the service through a surface.
50
+ */
51
+ getForSurface<D extends SettingsDeclaration>(declaration: D, guildId: string): Promise<SurfaceValues<D>>;
52
+ /**
53
+ * Configuration status (FR-040): the required fields without default the
54
+ * guild left unset, read through the same cache as {@link get}, so a write
55
+ * shows at once. A stored value that fails validation counts as unset.
56
+ */
57
+ status(declaration: SettingsDeclaration, guildId: string): Promise<SettingsStatus>;
58
+ /**
59
+ * Validate a submission without writing: the same checks as {@link set},
60
+ * shared by every surface.
61
+ *
62
+ * @throws ValidationError when `ctx` is for another guild than `guildId`.
63
+ */
64
+ validate<D extends SettingsDeclaration>(declaration: D, guildId: string, patch: unknown, ctx: RequestContext): Promise<ValidationResult<D>>;
65
+ /**
66
+ * Validate a submission, then merge it onto the stored values in one write:
67
+ * nothing is stored unless every field is valid. A field submitted as
68
+ * `null` is unset; stored fields the declaration no longer declares are
69
+ * dropped. Values stored under an older declaration version are migrated
70
+ * first, so the patch merges onto the values the guild reads. Emits a
71
+ * settings change once written.
72
+ *
73
+ * @returns the written record.
74
+ * @throws SettingsValidationError listing every invalid field.
75
+ * @throws ConflictError when `ctx.expectedRevision` is not the stored
76
+ * revision, or when the stored record was written under a newer declaration
77
+ * version.
78
+ * @throws ValidationError when `ctx` is for another guild than `guildId`.
79
+ */
80
+ set<D extends SettingsDeclaration>(declaration: D, guildId: string, patch: unknown, ctx: RequestContext & {
81
+ readonly expectedRevision?: number;
82
+ }): Promise<StoredSettings>;
83
+ /**
84
+ * Unset the given fields (or every field), so they read as their defaults.
85
+ * Writes nothing for a guild that never stored settings. Like
86
+ * {@link set}, migrates older stored values before unsetting.
87
+ *
88
+ * @throws SettingsValidationError when a key is not declared.
89
+ * @throws ConflictError when the stored record changed concurrently or was
90
+ * written under a newer declaration version.
91
+ * @throws ValidationError when `ctx` is for another guild than `guildId`.
92
+ */
93
+ reset<D extends SettingsDeclaration>(declaration: D, guildId: string, keys: readonly string[] | "all", ctx: RequestContext): Promise<void>;
94
+ /**
95
+ * Describe a module's settings for surfaces other than Discord (FR-030), as
96
+ * a JSON Schema with every text translated.
97
+ *
98
+ * @param locale - any locale string; an unsupported one falls back to English.
99
+ */
100
+ describe(declaration: SettingsDeclaration, locale: string): SettingsSchema;
101
+ /**
102
+ * Suggestions for one field (FR-021 to FR-026), in the command
103
+ * autocomplete's own `Choice` format, so one search serves both. A channel,
104
+ * role or member field searches the guild; static choices are translated
105
+ * to `ctx.locale` and kept when their name or value contains `query`; a
106
+ * dynamic search gets `query` and `ctx` (with `ctx.values`, the other
107
+ * values currently entered). A list suggests for its item. At most 25
108
+ * results; a search slower than `SUGGESTION_TIMEOUT_MS` (2.5 s) or failing
109
+ * yields none and is logged at `warn`.
110
+ *
111
+ * @throws ValidationError when `fieldKey` is not declared: a malformed
112
+ * request, like a patch that is not an object.
113
+ */
114
+ suggest<D extends SettingsDeclaration>(declaration: D, fieldKey: string, query: string, ctx: RequestContext & {
115
+ readonly values: Readonly<Record<string, unknown>>;
116
+ }): Promise<readonly Choice[]>;
117
+ /**
118
+ * The readable label of one value of a field, in `ctx.locale` (FR-022): a
119
+ * channel, role or member's name on the guild, a static choice's
120
+ * translated label, a dynamic search's `label`, or, without one, the name
121
+ * of the exact match in `resolve(String(value))`. A list reads `value` as
122
+ * one item. A search gets the guild's current values as `ctx.values`.
123
+ *
124
+ * @returns the label, or `undefined` when none is known (the value is not
125
+ * suggested, the entity is gone, or the search timed out or failed, logged).
126
+ * @throws ValidationError when `fieldKey` is not declared.
127
+ */
128
+ label<D extends SettingsDeclaration>(declaration: D, fieldKey: string, value: unknown, ctx: RequestContext): Promise<string | undefined>;
129
+ }
130
+ interface SettingsServiceDeps {
131
+ readonly registry: SettingsRegistry;
132
+ readonly store: SettingsStore;
133
+ readonly guilds: GuildDirectory;
134
+ readonly notifier: SettingsChangedNotifier;
135
+ readonly translator: Translator;
136
+ readonly clock: Clock;
137
+ readonly logger: Logger;
138
+ }
139
+ /**
140
+ * Create the settings service over its ports.
141
+ *
142
+ * @param deps - the registry of declarations and the ports the service reads,
143
+ * writes, notifies and logs through.
144
+ * @returns the service shared by module logic and every configuration surface.
145
+ */
146
+ export declare function createSettingsService(deps: SettingsServiceDeps): SettingsService;
147
+ export {};
148
+ //# sourceMappingURL=settings-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-service.d.ts","sourceRoot":"","sources":["../../src/settings/settings-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,279 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createSettingsService = createSettingsService;
4
+ const node_util_1 = require("node:util");
5
+ const business_error_1 = require("../errors/business-error");
6
+ const error_message_1 = require("../errors/error-message");
7
+ const cache_1 = require("../settings/cache");
8
+ const decode_stored_1 = require("../settings/decode-stored");
9
+ const describe_1 = require("../settings/describe");
10
+ const messages_1 = require("../settings/messages");
11
+ const migrate_1 = require("../settings/migrate");
12
+ const settings_validation_error_1 = require("../settings/settings-validation-error");
13
+ const status_1 = require("../settings/status");
14
+ const suggest_1 = require("../settings/suggest");
15
+ const validate_1 = require("../settings/validate");
16
+ /**
17
+ * Create the settings service over its ports.
18
+ *
19
+ * @param deps - the registry of declarations and the ports the service reads,
20
+ * writes, notifies and logs through.
21
+ * @returns the service shared by module logic and every configuration surface.
22
+ */
23
+ function createSettingsService(deps) {
24
+ const { store, guilds, notifier, translator, clock, logger } = deps;
25
+ const cache = (0, cache_1.createSettingsCache)({ clock, notifier });
26
+ const ports = { guilds, translator, logger };
27
+ /**
28
+ * What a guild reads of `stored`: its valid declared fields, defaults not
29
+ * applied, migrated in memory when stored under an older version. Logs
30
+ * every field it has to drop and every failed migration.
31
+ *
32
+ * @returns the values, and whether they are a successful migration still to
33
+ * be written back.
34
+ */
35
+ function readable(declaration, stored) {
36
+ if (stored === null) {
37
+ return { values: {}, migrated: false };
38
+ }
39
+ const at = { guildId: stored.guildId, moduleId: declaration.id };
40
+ if (stored.version < declaration.version) {
41
+ const outcome = (0, migrate_1.migrateStored)(declaration, stored);
42
+ if (!outcome.ok) {
43
+ logger.error({
44
+ ...at,
45
+ fromVersion: stored.version,
46
+ toVersion: declaration.version,
47
+ keys: outcome.invalidKeys,
48
+ ...(outcome.error === undefined ? {} : { err: (0, error_message_1.errorMessage)(outcome.error) }),
49
+ }, "Settings migration failed; storage left unchanged, reading defaults for the fields it cannot read");
50
+ }
51
+ return { values: outcome.values, migrated: outcome.ok };
52
+ }
53
+ const decoded = (0, decode_stored_1.decodeStored)(declaration, stored.values);
54
+ if (decoded.invalidKeys.length > 0) {
55
+ logger.error({ ...at, keys: decoded.invalidKeys }, "Stored settings failed validation; reading defaults for these fields");
56
+ }
57
+ return { values: decoded.values, migrated: false };
58
+ }
59
+ /**
60
+ * Write a successful migration back, expecting the revision it was read at.
61
+ * When another reader (another shard) wrote first, its record is read
62
+ * again instead: the conflict is not the caller's to handle.
63
+ */
64
+ async function writeBack(params) {
65
+ const { declaration, stored, values } = params;
66
+ const keys = new Set([...Object.keys(stored.values), ...Object.keys(values)]);
67
+ const changedKeys = [...keys].filter((key) => !(0, node_util_1.isDeepStrictEqual)(stored.values[key], values[key]));
68
+ try {
69
+ await write({
70
+ declaration,
71
+ guildId: stored.guildId,
72
+ stored,
73
+ expectedRevision: stored.revision,
74
+ values,
75
+ changedKeys,
76
+ author: undefined,
77
+ });
78
+ return values;
79
+ }
80
+ catch (error) {
81
+ if (error instanceof business_error_1.ConflictError) {
82
+ const latest = await store.read(stored.guildId, declaration.id);
83
+ return readable(declaration, latest).values;
84
+ }
85
+ logger.error({
86
+ guildId: stored.guildId,
87
+ moduleId: declaration.id,
88
+ fromVersion: stored.version,
89
+ toVersion: declaration.version,
90
+ err: (0, error_message_1.errorMessage)(error),
91
+ }, "Failed to write migrated settings back; reading the migrated values");
92
+ return values;
93
+ }
94
+ }
95
+ /** Read and decode a guild's stored settings, bypassing the cache. */
96
+ async function load(declaration, guildId) {
97
+ const stored = await store.read(guildId, declaration.id);
98
+ const read = readable(declaration, stored);
99
+ const values = read.migrated && stored !== null
100
+ ? await writeBack({ declaration, stored, values: read.values })
101
+ : read.values;
102
+ const withDefaults = Object.entries(declaration.fields).map(([key, declared]) => [
103
+ key,
104
+ Object.hasOwn(values, key) ? values[key] : declared.default,
105
+ ]);
106
+ return Object.fromEntries(withDefaults);
107
+ }
108
+ function get(declaration, guildId) {
109
+ return cache.read(guildId, declaration.id, () => load(declaration, guildId));
110
+ }
111
+ /**
112
+ * Write `values` over `stored` under the declared version and tell
113
+ * listeners which keys changed. `author` is the user who asked, or
114
+ * `undefined` for a write the kernel makes on its own (a migration).
115
+ */
116
+ async function write(params) {
117
+ const { declaration, guildId, stored, author } = params;
118
+ const next = {
119
+ guildId,
120
+ moduleId: declaration.id,
121
+ version: declaration.version,
122
+ revision: (stored?.revision ?? 0) + 1,
123
+ values: params.values,
124
+ updatedAt: clock.now().toISOString(),
125
+ ...(author === undefined ? {} : { updatedBy: author }),
126
+ };
127
+ await store.write(next, { expectedRevision: params.expectedRevision });
128
+ // Before notifying: a listener that reads back must see the new values.
129
+ cache.invalidate(guildId, declaration.id);
130
+ notifier.notify({
131
+ guildId,
132
+ moduleId: declaration.id,
133
+ changedKeys: params.changedKeys,
134
+ revision: next.revision,
135
+ ...(author === undefined ? {} : { changedBy: author }),
136
+ });
137
+ return next;
138
+ }
139
+ async function getForSurface(declaration, guildId) {
140
+ const values = await get(declaration, guildId);
141
+ const surface = Object.entries(values).map(([key, value]) => declaration.fields[key]?.spec.kind === "secret"
142
+ ? [key, { isSet: value !== undefined }]
143
+ : [key, value]);
144
+ return Object.fromEntries(surface);
145
+ }
146
+ /** What a strict field's search is checked with while validating a submission. */
147
+ function validationScope(declaration, ctx) {
148
+ return {
149
+ ports,
150
+ guildId: ctx.guildId,
151
+ userId: ctx.userId,
152
+ locale: ctx.locale,
153
+ currentValues: () => getForSurface(declaration, ctx.guildId),
154
+ };
155
+ }
156
+ return {
157
+ get,
158
+ getForSurface,
159
+ async status(declaration, guildId) {
160
+ return (0, status_1.settingsStatus)(declaration, await get(declaration, guildId));
161
+ },
162
+ async validate(declaration, guildId, patch, ctx) {
163
+ assertSameGuild(guildId, ctx);
164
+ const scope = validationScope(declaration, ctx);
165
+ const result = await (0, validate_1.validateSettings)({ declaration, patch, scope });
166
+ return result;
167
+ },
168
+ async set(declaration, guildId, patch, ctx) {
169
+ assertSameGuild(guildId, ctx);
170
+ const scope = validationScope(declaration, ctx);
171
+ const result = await (0, validate_1.validateSettings)({ declaration, patch, scope });
172
+ if (!result.ok) {
173
+ throw new settings_validation_error_1.SettingsValidationError(result.issues);
174
+ }
175
+ const stored = await store.read(guildId, declaration.id);
176
+ assertWritable(declaration, stored);
177
+ const values = { ...readable(declaration, stored).values };
178
+ for (const [key, value] of Object.entries(result.values)) {
179
+ if (value === undefined) {
180
+ delete values[key];
181
+ }
182
+ else {
183
+ values[key] = value;
184
+ }
185
+ }
186
+ return write({
187
+ declaration,
188
+ guildId,
189
+ stored,
190
+ expectedRevision: ctx.expectedRevision === undefined ? (stored?.revision ?? null) : ctx.expectedRevision,
191
+ values,
192
+ changedKeys: Object.keys(result.values),
193
+ author: ctx.userId,
194
+ });
195
+ },
196
+ async reset(declaration, guildId, keys, ctx) {
197
+ assertSameGuild(guildId, ctx);
198
+ const declaredKeys = Object.keys(declaration.fields);
199
+ const resetKeys = keys === "all" ? declaredKeys : keys;
200
+ const issues = resetKeys.filter((key) => !declaredKeys.includes(key)).map(unknownField);
201
+ if (issues.length > 0) {
202
+ throw new settings_validation_error_1.SettingsValidationError(issues);
203
+ }
204
+ const stored = await store.read(guildId, declaration.id);
205
+ if (stored === null) {
206
+ return;
207
+ }
208
+ assertWritable(declaration, stored);
209
+ const values = { ...readable(declaration, stored).values };
210
+ for (const key of resetKeys) {
211
+ delete values[key];
212
+ }
213
+ await write({
214
+ declaration,
215
+ guildId,
216
+ stored,
217
+ expectedRevision: stored.revision,
218
+ values,
219
+ changedKeys: resetKeys,
220
+ author: ctx.userId,
221
+ });
222
+ },
223
+ describe(declaration, locale) {
224
+ return (0, describe_1.describeSettings)({ declaration, locale, translator });
225
+ },
226
+ async suggest(declaration, fieldKey, query, ctx) {
227
+ const spec = declaredField(declaration, fieldKey).spec;
228
+ const scope = { ...ports, moduleId: declaration.id, key: fieldKey, ctx };
229
+ return (0, suggest_1.suggestChoices)({ scope, spec, query });
230
+ },
231
+ async label(declaration, fieldKey, value, ctx) {
232
+ const spec = declaredField(declaration, fieldKey).spec;
233
+ const values = await getForSurface(declaration, ctx.guildId);
234
+ const scope = {
235
+ ...ports,
236
+ moduleId: declaration.id,
237
+ key: fieldKey,
238
+ ctx: { ...ctx, values },
239
+ };
240
+ return (0, suggest_1.suggestionLabel)({ scope, spec, value });
241
+ },
242
+ };
243
+ }
244
+ /**
245
+ * A surface acts for the guild of its request only: a context of another
246
+ * guild is a malformed request, rejected before anything is read or written.
247
+ */
248
+ function assertSameGuild(guildId, ctx) {
249
+ if (ctx.guildId !== guildId) {
250
+ throw new business_error_1.ValidationError(`Settings request for guild ${ctx.guildId} cannot target guild ${guildId}`);
251
+ }
252
+ }
253
+ /** A record written under a newer declaration version is never overwritten (FR-019). */
254
+ function assertWritable(declaration, stored) {
255
+ if (stored !== null && stored.version > declaration.version) {
256
+ throw new business_error_1.ConflictError(`Settings of module "${declaration.id}" in guild ${stored.guildId} were written under version ${stored.version}, newer than the declared version ${declaration.version}`);
257
+ }
258
+ }
259
+ /**
260
+ * The declared field under `key`.
261
+ *
262
+ * @throws ValidationError when the declaration has none: asking a field's
263
+ * suggestions or labels by a wrong key is a malformed request.
264
+ */
265
+ function declaredField(declaration, key) {
266
+ const declared = Object.hasOwn(declaration.fields, key) ? declaration.fields[key] : undefined;
267
+ if (declared === undefined) {
268
+ throw new business_error_1.ValidationError(`Settings of module "${declaration.id}" have no field "${key}"`);
269
+ }
270
+ return declared;
271
+ }
272
+ function unknownField(key) {
273
+ return {
274
+ field: key,
275
+ code: "unknownField",
276
+ translation: { key: messages_1.SETTINGS_ISSUE_MESSAGES.unknownField },
277
+ };
278
+ }
279
+ //# sourceMappingURL=settings-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-service.js","sourceRoot":"","sources":["../../src/settings/settings-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type ErrorTranslation, ValidationError } from "../errors/business-error";
2
+ /** Why one submitted settings value was rejected. */
3
+ export type SettingsIssueCode = "required" | "type" | "min" | "max" | "minLength" | "maxLength" | "minItems" | "maxItems" | "duplicate" | "channelType" | "notFound" | "unknownChoice" | "unknownField";
4
+ /**
5
+ * One rejected value of a settings submission. `field` is the field key, a
6
+ * `key[index]` path for a list item (e.g. `pingRoles[2]`), or a `key.name` path
7
+ * for a toggle (e.g. `modules.music`); `translation` points at the settings
8
+ * catalog so every surface shows the same wording for the same failure.
9
+ */
10
+ export interface SettingsIssue {
11
+ readonly field: string;
12
+ readonly code: SettingsIssueCode;
13
+ readonly translation: ErrorTranslation;
14
+ }
15
+ /**
16
+ * A settings submission failed validation. Carries every issue at once, so a
17
+ * surface can flag all faulty fields in one round trip; nothing was stored.
18
+ */
19
+ export declare class SettingsValidationError extends ValidationError {
20
+ readonly issues: readonly SettingsIssue[];
21
+ constructor(issues: readonly SettingsIssue[]);
22
+ }
23
+ //# sourceMappingURL=settings-validation-error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-validation-error.d.ts","sourceRoot":"","sources":["../../src/settings/settings-validation-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAEjF,qDAAqD;AACrD,MAAM,MAAM,iBAAiB,GAC1B,UAAU,GACV,MAAM,GACN,KAAK,GACL,KAAK,GACL,WAAW,GACX,WAAW,GACX,UAAU,GACV,UAAU,GACV,WAAW,GACX,aAAa,GACb,UAAU,GACV,eAAe,GACf,cAAc,CAAC;AAElB;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC7B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,IAAI,EAAE,iBAAiB,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAC;CACvC;AAED;;;GAGG;AACH,qBAAa,uBAAwB,SAAQ,eAAe;IAC/C,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE;gBAAhC,MAAM,EAAE,SAAS,aAAa,EAAE;CAKrD"}
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SettingsValidationError = void 0;
4
+ const business_error_1 = require("../errors/business-error");
5
+ /**
6
+ * A settings submission failed validation. Carries every issue at once, so a
7
+ * surface can flag all faulty fields in one round trip; nothing was stored.
8
+ */
9
+ class SettingsValidationError extends business_error_1.ValidationError {
10
+ issues;
11
+ constructor(issues) {
12
+ super(`Invalid settings: ${issues.map((issue) => `${issue.field} (${issue.code})`).join(", ")}`);
13
+ this.issues = issues;
14
+ }
15
+ }
16
+ exports.SettingsValidationError = SettingsValidationError;
17
+ //# sourceMappingURL=settings-validation-error.js.map