@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,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.passesGuard = passesGuard;
4
+ const discord_js_1 = require("discord.js");
5
+ const reply_locale_1 = require("../../discord/interaction/reply-locale");
6
+ /**
7
+ * Run a command's or a component's guard, if it has one. The guard gets the
8
+ * reply dependencies, to word its denial in the reply language. On a denial,
9
+ * answer with the guard's own message (ephemeral) and return `false`, so the
10
+ * handler never runs.
11
+ */
12
+ async function passesGuard(interaction, guard, runtime) {
13
+ if (!guard) {
14
+ return true;
15
+ }
16
+ const result = await guard.check(interaction, runtime);
17
+ if (result.ok) {
18
+ return true;
19
+ }
20
+ const locale = await (0, reply_locale_1.replyLocale)(interaction, runtime);
21
+ await interaction.reply({
22
+ embeds: [runtime.presenter.denial(runtime.translator.resolve(locale, result.message), locale)],
23
+ flags: discord_js_1.MessageFlags.Ephemeral,
24
+ });
25
+ return false;
26
+ }
27
+ //# sourceMappingURL=passes-guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"passes-guard.js","sourceRoot":"","sources":["../../../src/discord/command/passes-guard.ts"],"names":[],"mappings":";;AAgBA,kCAoBC;AApCD,2CAKoB;AAEpB,qEAAuF;AAGvF;;;;;GAKG;AACI,KAAK,UAAU,WAAW,CAGhC,WAAc,EACd,KAA2B,EAC3B,OAA4D;IAE5D,IAAI,CAAC,KAAK,EAAE,CAAC;QACZ,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,MAAM,CAAC,EAAE,EAAE,CAAC;QACf,OAAO,IAAI,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAW,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACvD,MAAM,WAAW,CAAC,KAAK,CAAC;QACvB,MAAM,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC,CAAC;QAC9F,KAAK,EAAE,yBAAY,CAAC,SAAS;KAC7B,CAAC,CAAC;IACH,OAAO,KAAK,CAAC;AACd,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import type { Guard } from "../../discord/command/guard";
2
2
  import { type PermissionBit } from "../../discord/permissions";
3
- import type { LocalizedText } from "../../i18n";
3
+ import type { LocalizedText } from "../../i18n/translator";
4
4
  /**
5
5
  * Deny unless the member holds every permission in `required`.
6
6
  *
@@ -1 +1 @@
1
- {"version":3,"file":"permission-guard.d.ts","sourceRoot":"","sources":["../../../src/discord/command/permission-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAe,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAW5C;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,WAAW,CAAC,EAAE,aAAa,GACzB,KAAK,CAgBP;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,aAAa,GAAG,KAAK,CAc9F;AAED,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC"}
1
+ {"version":3,"file":"permission-guard.d.ts","sourceRoot":"","sources":["../../../src/discord/command/permission-guard.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,KAAK,EAAe,MAAM,yBAAyB,CAAC;AAElE,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAWvD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACpC,QAAQ,EAAE,SAAS,aAAa,EAAE,EAClC,WAAW,CAAC,EAAE,aAAa,GACzB,KAAK,CAgBP;AAED;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,aAAa,GAAG,KAAK,CAc9F;AAED,iFAAiF;AACjF,eAAO,MAAM,cAAc,EAAE,KAO5B,CAAC"}
@@ -0,0 +1,23 @@
1
+ import type { CommandInteraction } from "discord.js";
2
+ import type { CommandRuntime } from "../../discord/command/types";
3
+ import type { LocalizedText } from "../../i18n/translator";
4
+ /** How one command pipeline wants a failed handler reported. */
5
+ export interface CommandFailure {
6
+ readonly error: unknown;
7
+ /** Whether the answer is ephemeral, as the command declared. */
8
+ readonly ephemeral: boolean;
9
+ /** Shown instead of the generic message for an unexpected error. */
10
+ readonly fallbackError?: LocalizedText;
11
+ /** Extra fields identifying the route in the incident log. */
12
+ readonly logFields?: Readonly<Record<string, unknown>>;
13
+ /** The incident log's message. */
14
+ readonly logMessage: string;
15
+ }
16
+ /**
17
+ * Answer a handler that threw. A {@link BusinessError} is user feedback: its
18
+ * own (translated) message, as a warning or an error by its severity, with no
19
+ * incident minted. Anything else is an incident: logged with a fresh
20
+ * reference, and answered with the fallback message carrying that reference.
21
+ */
22
+ export declare function renderCommandFailure(interaction: CommandInteraction, failure: CommandFailure, runtime: CommandRuntime): Promise<void>;
23
+ //# sourceMappingURL=render-command-failure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-command-failure.d.ts","sourceRoot":"","sources":["../../../src/discord/command/render-command-failure.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAO9D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,gEAAgE;AAChE,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,gEAAgE;IAChE,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,aAAa,CAAC,EAAE,aAAa,CAAC;IACvC,8DAA8D;IAC9D,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACvD,kCAAkC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC5B;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CACzC,WAAW,EAAE,kBAAkB,EAC/B,OAAO,EAAE,cAAc,EACvB,OAAO,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC,CAoCf"}
@@ -0,0 +1,40 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.renderCommandFailure = renderCommandFailure;
4
+ const send_embed_1 = require("../../discord/command/send-embed");
5
+ const i18n_1 = require("../../discord/i18n");
6
+ const reply_locale_1 = require("../../discord/interaction/reply-locale");
7
+ const business_error_1 = require("../../errors/business-error");
8
+ const error_message_1 = require("../../errors/error-message");
9
+ const incident_ref_1 = require("../../errors/incident-ref");
10
+ const business_message_1 = require("../../i18n/business-message");
11
+ /**
12
+ * Answer a handler that threw. A {@link BusinessError} is user feedback: its
13
+ * own (translated) message, as a warning or an error by its severity, with no
14
+ * incident minted. Anything else is an incident: logged with a fresh
15
+ * reference, and answered with the fallback message carrying that reference.
16
+ */
17
+ async function renderCommandFailure(interaction, failure, runtime) {
18
+ const { presenter, logger, translator } = runtime;
19
+ const { error, ephemeral } = failure;
20
+ const locale = await (0, reply_locale_1.replyLocale)(interaction, runtime);
21
+ if (error instanceof business_error_1.BusinessError) {
22
+ const text = (0, business_message_1.resolveBusinessMessage)(error, translator, locale);
23
+ const embed = error.severity === "warning"
24
+ ? presenter.warning(text, locale)
25
+ : presenter.error(text, locale);
26
+ await (0, send_embed_1.sendEmbed)(interaction, embed, ephemeral, logger);
27
+ return;
28
+ }
29
+ const ref = (0, incident_ref_1.createIncidentRef)();
30
+ logger.error({
31
+ command: interaction.commandName,
32
+ ...failure.logFields,
33
+ userId: interaction.user.id,
34
+ ref,
35
+ err: (0, error_message_1.errorMessage)(error),
36
+ stack: error instanceof Error ? error.stack : undefined,
37
+ }, failure.logMessage);
38
+ await (0, send_embed_1.sendEmbed)(interaction, presenter.systemError(translator.resolve(locale, failure.fallbackError ?? { key: i18n_1.CORE_MESSAGES.genericError }), ref, locale), ephemeral, logger);
39
+ }
40
+ //# sourceMappingURL=render-command-failure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render-command-failure.js","sourceRoot":"","sources":["../../../src/discord/command/render-command-failure.ts"],"names":[],"mappings":";;AA8BA,oDAwCC;AArED,6DAAyD;AAEzD,yCAA+C;AAC/C,qEAAiE;AACjE,4DAAwD;AACxD,0DAAsD;AACtD,wDAA0D;AAC1D,8DAAiE;AAgBjE;;;;;GAKG;AACI,KAAK,UAAU,oBAAoB,CACzC,WAA+B,EAC/B,OAAuB,EACvB,OAAuB;IAEvB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,OAAO,CAAC;IAClD,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IACrC,MAAM,MAAM,GAAG,MAAM,IAAA,0BAAW,EAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACvD,IAAI,KAAK,YAAY,8BAAa,EAAE,CAAC;QACpC,MAAM,IAAI,GAAG,IAAA,yCAAsB,EAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC/D,MAAM,KAAK,GACV,KAAK,CAAC,QAAQ,KAAK,SAAS;YAC3B,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;YACjC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAClC,MAAM,IAAA,sBAAS,EAAC,WAAW,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;QACvD,OAAO;IACR,CAAC;IAED,MAAM,GAAG,GAAG,IAAA,gCAAiB,GAAE,CAAC;IAChC,MAAM,CAAC,KAAK,CACX;QACC,OAAO,EAAE,WAAW,CAAC,WAAW;QAChC,GAAG,OAAO,CAAC,SAAS;QACpB,MAAM,EAAE,WAAW,CAAC,IAAI,CAAC,EAAE;QAC3B,GAAG;QACH,GAAG,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC;QACxB,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS;KACvD,EACD,OAAO,CAAC,UAAU,CAClB,CAAC;IACF,MAAM,IAAA,sBAAS,EACd,WAAW,EACX,SAAS,CAAC,WAAW,CACpB,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,IAAI,EAAE,GAAG,EAAE,oBAAa,CAAC,YAAY,EAAE,CAAC,EACxF,GAAG,EACH,MAAM,CACN,EACD,SAAS,EACT,MAAM,CACN,CAAC;AACH,CAAC"}
@@ -0,0 +1,8 @@
1
+ /**
2
+ * The key a subcommand is stored and looked up under. Its own module because
3
+ * dispatch and autocomplete must agree on it: if they ever built it
4
+ * differently, an autocomplete inside a group would silently resolve to no
5
+ * options instead of failing loudly.
6
+ */
7
+ export declare function routeKey(group: string | null, name: string): string;
8
+ //# sourceMappingURL=route-key.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-key.d.ts","sourceRoot":"","sources":["../../../src/discord/command/route-key.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnE"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.routeKey = routeKey;
4
+ /**
5
+ * The key a subcommand is stored and looked up under. Its own module because
6
+ * dispatch and autocomplete must agree on it: if they ever built it
7
+ * differently, an autocomplete inside a group would silently resolve to no
8
+ * options instead of failing loudly.
9
+ */
10
+ function routeKey(group, name) {
11
+ return group ? `${group}/${name}` : name;
12
+ }
13
+ //# sourceMappingURL=route-key.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"route-key.js","sourceRoot":"","sources":["../../../src/discord/command/route-key.ts"],"names":[],"mappings":";;AAMA,4BAEC;AARD;;;;;GAKG;AACH,SAAgB,QAAQ,CAAC,KAAoB,EAAE,IAAY;IAC1D,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC1C,CAAC"}
@@ -1,13 +1,27 @@
1
1
  import { type Interaction } from "discord.js";
2
2
  import type { ContextMenuCommand, SlashCommand } from "../../discord/command/types";
3
3
  import type { InteractionDispatcher } from "../../discord/interaction/interaction-router";
4
+ import type { LocaleResolver } from "../../discord/interaction/locale-resolver";
4
5
  import type { Presenter } from "../../discord/presenter";
5
- import type { Translator } from "../../i18n";
6
+ import type { Translator } from "../../i18n/translator";
6
7
  import type { Logger } from "../../logger";
8
+ import type { ModuleGate } from "../../settings/system/module-gate";
7
9
  export interface CommandRouterDeps {
8
10
  presenter: Presenter;
9
11
  logger: Logger;
10
12
  translator: Translator;
13
+ /**
14
+ * When given, a command registered with a module does not run on a guild
15
+ * where that module is disabled: the member gets the translated "disabled
16
+ * on this server" message instead (FR-036).
17
+ */
18
+ gate?: ModuleGate;
19
+ /**
20
+ * Where every reply of the pipeline reads its language (e.g.
21
+ * `createGuildLocaleResolver`, or the bot's own). Without one, the
22
+ * interaction's own locales are used.
23
+ */
24
+ localeResolver?: LocaleResolver;
11
25
  }
12
26
  /**
13
27
  * Owns the registered slash commands and dispatches chat-input interactions to
@@ -19,23 +33,34 @@ export declare class CommandRouter implements InteractionDispatcher {
19
33
  private readonly deps;
20
34
  private readonly commands;
21
35
  private readonly contextMenuCommands;
36
+ /** The module each command was registered for, by command; absent means never gated. */
37
+ private readonly modules;
22
38
  private readonly runtime;
23
39
  constructor(deps: CommandRouterDeps);
24
- /** Register a command (last registration of a name wins). */
25
- register(command: SlashCommand): this;
26
- /** Register many commands at once. */
27
- registerAll(commands: Iterable<SlashCommand>): this;
40
+ /**
41
+ * Register a command (last registration of a name wins).
42
+ *
43
+ * @param moduleName - the module the command belongs to, so the gate can
44
+ * skip it on guilds where that module is disabled. Omit it for a command
45
+ * that always runs.
46
+ */
47
+ register(command: SlashCommand, moduleName?: string): this;
48
+ /** Register many commands at once, all of `moduleName` when given. */
49
+ registerAll(commands: Iterable<SlashCommand>, moduleName?: string): this;
28
50
  /**
29
51
  * Register a context-menu entry. Kept in its own map because Discord treats a
30
52
  * slash command and a context-menu entry as distinct application command
31
53
  * types, and therefore lets them share a name.
32
54
  */
33
- registerContextMenu(command: ContextMenuCommand): this;
34
- registerAllContextMenus(commands: Iterable<ContextMenuCommand>): this;
55
+ registerContextMenu(command: ContextMenuCommand, moduleName?: string): this;
56
+ registerAllContextMenus(commands: Iterable<ContextMenuCommand>, moduleName?: string): this;
35
57
  /** Look up a registered slash command, for dispatchers that share this registry. */
36
58
  get(name: string): SlashCommand | undefined;
37
59
  /** Claim and dispatch chat-input and context-menu commands; ignore everything else. */
38
60
  handle(interaction: Interaction): Promise<boolean>;
61
+ private remember;
62
+ /** Answer the member and return `false` when the command's module is disabled on the guild. */
63
+ private passesGate;
39
64
  /**
40
65
  * Push every registered command to its declared scope: commands with
41
66
  * `guildIds` go to those guild(s) (instant availability), the rest are
@@ -1 +1 @@
1
- {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/discord/command/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAgB,MAAM,YAAY,CAAC;AAC5D,OAAO,KAAK,EAEX,kBAAkB,EAElB,YAAY,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;CACvB;AAED;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,qBAAqB;IAK9C,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyC;IAC7E,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAEZ,IAAI,EAAE,iBAAiB;IAQpD,6DAA6D;IAC7D,QAAQ,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAKrC,sCAAsC;IACtC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,GAAG,IAAI;IAOnD;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,IAAI;IAKtD,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,CAAC,GAAG,IAAI;IAOrE,oFAAoF;IACpF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI3C,uFAAuF;IACjF,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAsBxD;;;;;;OAMG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAsCtE"}
1
+ {"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/discord/command/router.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,WAAW,EAAgB,MAAM,YAAY,CAAC;AAErF,OAAO,KAAK,EAEX,kBAAkB,EAElB,YAAY,EACZ,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAGrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAEhE,MAAM,WAAW,iBAAiB;IACjC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;IACvB;;;;OAIG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB;;;;OAIG;IACH,cAAc,CAAC,EAAE,cAAc,CAAC;CAChC;AAED;;;;;GAKG;AACH,qBAAa,aAAc,YAAW,qBAAqB;IAO9C,OAAO,CAAC,QAAQ,CAAC,IAAI;IANjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAC5D,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAyC;IAC7E,wFAAwF;IACxF,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwC;IAChE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;gBAEZ,IAAI,EAAE,iBAAiB;IASpD;;;;;;OAMG;IACH,QAAQ,CAAC,OAAO,EAAE,YAAY,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAM1D,sEAAsE;IACtE,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,YAAY,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAOxE;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAM3E,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,CAAC,kBAAkB,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI;IAO1F,oFAAoF;IACpF,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS;IAI3C,uFAAuF;IACjF,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IA0BxD,OAAO,CAAC,QAAQ;IAQhB,+FAA+F;YACjF,UAAU;IAoBxB;;;;;;OAMG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAsCtE"}
@@ -2,6 +2,9 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.CommandRouter = void 0;
4
4
  const discord_js_1 = require("discord.js");
5
+ const send_embed_1 = require("../../discord/command/send-embed");
6
+ const is_module_disabled_1 = require("../../discord/settings/is-module-disabled");
7
+ const module_disabled_embed_1 = require("../../discord/settings/module-disabled-embed");
5
8
  /**
6
9
  * Owns the registered slash commands and dispatches chat-input interactions to
7
10
  * them, injecting the shared {@link CommandRuntime}. Also registers the command
@@ -12,6 +15,8 @@ class CommandRouter {
12
15
  deps;
13
16
  commands = new Map();
14
17
  contextMenuCommands = new Map();
18
+ /** The module each command was registered for, by command; absent means never gated. */
19
+ modules = new Map();
15
20
  runtime;
16
21
  constructor(deps) {
17
22
  this.deps = deps;
@@ -19,17 +24,25 @@ class CommandRouter {
19
24
  presenter: deps.presenter,
20
25
  logger: deps.logger,
21
26
  translator: deps.translator,
27
+ localeResolver: deps.localeResolver,
22
28
  };
23
29
  }
24
- /** Register a command (last registration of a name wins). */
25
- register(command) {
30
+ /**
31
+ * Register a command (last registration of a name wins).
32
+ *
33
+ * @param moduleName - the module the command belongs to, so the gate can
34
+ * skip it on guilds where that module is disabled. Omit it for a command
35
+ * that always runs.
36
+ */
37
+ register(command, moduleName) {
26
38
  this.commands.set(command.data.name, command);
39
+ this.remember(command, moduleName);
27
40
  return this;
28
41
  }
29
- /** Register many commands at once. */
30
- registerAll(commands) {
42
+ /** Register many commands at once, all of `moduleName` when given. */
43
+ registerAll(commands, moduleName) {
31
44
  for (const command of commands) {
32
- this.register(command);
45
+ this.register(command, moduleName);
33
46
  }
34
47
  return this;
35
48
  }
@@ -38,13 +51,14 @@ class CommandRouter {
38
51
  * slash command and a context-menu entry as distinct application command
39
52
  * types, and therefore lets them share a name.
40
53
  */
41
- registerContextMenu(command) {
54
+ registerContextMenu(command, moduleName) {
42
55
  this.contextMenuCommands.set(command.data.name, command);
56
+ this.remember(command, moduleName);
43
57
  return this;
44
58
  }
45
- registerAllContextMenus(commands) {
59
+ registerAllContextMenus(commands, moduleName) {
46
60
  for (const command of commands) {
47
- this.registerContextMenu(command);
61
+ this.registerContextMenu(command, moduleName);
48
62
  }
49
63
  return this;
50
64
  }
@@ -59,7 +73,9 @@ class CommandRouter {
59
73
  if (!command) {
60
74
  return false;
61
75
  }
62
- await command.dispatch(interaction, this.runtime);
76
+ if (await this.passesGate(interaction, command)) {
77
+ await command.dispatch(interaction, this.runtime);
78
+ }
63
79
  return true;
64
80
  }
65
81
  if (interaction.isContextMenuCommand()) {
@@ -67,11 +83,33 @@ class CommandRouter {
67
83
  if (!command) {
68
84
  return false;
69
85
  }
70
- await command.dispatch(interaction, this.runtime);
86
+ if (await this.passesGate(interaction, command)) {
87
+ await command.dispatch(interaction, this.runtime);
88
+ }
71
89
  return true;
72
90
  }
73
91
  return false;
74
92
  }
93
+ remember(command, moduleName) {
94
+ if (moduleName === undefined) {
95
+ this.modules.delete(command);
96
+ }
97
+ else {
98
+ this.modules.set(command, moduleName);
99
+ }
100
+ }
101
+ /** Answer the member and return `false` when the command's module is disabled on the guild. */
102
+ async passesGate(interaction, command) {
103
+ const disabled = await (0, is_module_disabled_1.isModuleDisabled)({
104
+ gate: this.deps.gate,
105
+ moduleName: this.modules.get(command),
106
+ guildId: interaction.guildId,
107
+ });
108
+ if (disabled) {
109
+ await (0, send_embed_1.sendEmbed)(interaction, await (0, module_disabled_embed_1.moduleDisabledEmbed)(interaction, this.deps), true, this.deps.logger);
110
+ }
111
+ return !disabled;
112
+ }
75
113
  /**
76
114
  * Push every registered command to its declared scope: commands with
77
115
  * `guildIds` go to those guild(s) (instant availability), the rest are
@@ -1 +1 @@
1
- {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/discord/command/router.ts"],"names":[],"mappings":";;;AAAA,2CAA4D;AAkB5D;;;;;GAKG;AACH,MAAa,aAAa;IAKI;IAJZ,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IAC3C,mBAAmB,GAAG,IAAI,GAAG,EAA8B,CAAC;IAC5D,OAAO,CAAiB;IAEzC,YAA6B,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;QACnD,IAAI,CAAC,OAAO,GAAG;YACd,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,UAAU,EAAE,IAAI,CAAC,UAAU;SAC3B,CAAC;IACH,CAAC;IAED,6DAA6D;IAC7D,QAAQ,CAAC,OAAqB;QAC7B,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC9C,OAAO,IAAI,CAAC;IACb,CAAC;IAED,sCAAsC;IACtC,WAAW,CAAC,QAAgC;QAC3C,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED;;;;OAIG;IACH,mBAAmB,CAAC,OAA2B;QAC9C,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACzD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,uBAAuB,CAAC,QAAsC;QAC7D,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAChC,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;QACnC,CAAC;QACD,OAAO,IAAI,CAAC;IACb,CAAC;IAED,oFAAoF;IACpF,GAAG,CAAC,IAAY;QACf,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,uFAAuF;IACvF,KAAK,CAAC,MAAM,CAAC,WAAwB;QACpC,IAAI,WAAW,CAAC,kBAAkB,EAAE,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YAC3D,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC;YACd,CAAC;YACD,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACb,CAAC;QAED,IAAI,WAAW,CAAC,oBAAoB,EAAE,EAAE,CAAC;YACxC,MAAM,OAAO,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACtE,IAAI,CAAC,OAAO,EAAE,CAAC;gBACd,OAAO,KAAK,CAAC;YACd,CAAC;YACD,MAAM,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;YAClD,OAAO,IAAI,CAAC;QACb,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,cAAc,CAAC,KAAa,EAAE,QAAgB;QACnD,MAAM,IAAI,GAAG,IAAI,iBAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACzD,MAAM,MAAM,GAAc,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAC;QAC7C,IAAI,QAAQ,GAAG,CAAC,CAAC;QAEjB,MAAM,GAAG,GAAwB;YAChC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE;YACzB,GAAG,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE;SACpC,CAAC;QAEF,KAAK,MAAM,OAAO,IAAI,GAAG,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;YAChE,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;gBACnB,SAAS;YACV,CAAC;YACD,QAAQ,IAAI,CAAC,CAAC;YACd,IAAI,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrD,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;oBACxC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;oBAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAClB,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBAC9B,CAAC;YACF,CAAC;iBAAM,CAAC;gBACP,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,CAAC;QACF,CAAC;QAED,MAAM,IAAI,CAAC,GAAG,CAAC,mBAAM,CAAC,mBAAmB,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;QACvE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,EAAE,gCAAgC,CAAC,CAAC;QAElF,KAAK,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,OAAO,EAAE,CAAC;YACvC,MAAM,IAAI,CAAC,GAAG,CAAC,mBAAM,CAAC,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7E,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE,EAAE,+BAA+B,CAAC,CAAC;QACzF,CAAC;QAED,OAAO,QAAQ,CAAC;IACjB,CAAC;CACD;AArHD,sCAqHC"}
1
+ {"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/discord/command/router.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type CommandInteraction, type EmbedBuilder } from "discord.js";
2
+ import type { Logger } from "../../logger";
3
+ /**
4
+ * Deliver an embed regardless of the interaction's lifecycle state, and never
5
+ * throw: a failed delivery (e.g. an expired/unknown interaction, code 10062)
6
+ * must not escape a handler and reach the client's unhandled `error` event,
7
+ * which would crash the process. Visibility on a deferred interaction is fixed
8
+ * at deferReply time, so editReply carries no flags.
9
+ *
10
+ * Typed on `CommandInteraction`, the base shared by chat-input and context-menu
11
+ * commands, so both pipelines answer through this one path.
12
+ */
13
+ export declare function sendEmbed(interaction: CommandInteraction, embed: EmbedBuilder, ephemeral: boolean, logger: Logger): Promise<void>;
14
+ //# sourceMappingURL=send-embed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-embed.d.ts","sourceRoot":"","sources":["../../../src/discord/command/send-embed.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAgB,MAAM,YAAY,CAAC;AAEtF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;;;;;;GASG;AACH,wBAAsB,SAAS,CAC9B,WAAW,EAAE,kBAAkB,EAC/B,KAAK,EAAE,YAAY,EACnB,SAAS,EAAE,OAAO,EAClB,MAAM,EAAE,MAAM,GACZ,OAAO,CAAC,IAAI,CAAC,CAsBf"}
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.sendEmbed = sendEmbed;
4
+ const discord_js_1 = require("discord.js");
5
+ const error_message_1 = require("../../errors/error-message");
6
+ /**
7
+ * Deliver an embed regardless of the interaction's lifecycle state, and never
8
+ * throw: a failed delivery (e.g. an expired/unknown interaction, code 10062)
9
+ * must not escape a handler and reach the client's unhandled `error` event,
10
+ * which would crash the process. Visibility on a deferred interaction is fixed
11
+ * at deferReply time, so editReply carries no flags.
12
+ *
13
+ * Typed on `CommandInteraction`, the base shared by chat-input and context-menu
14
+ * commands, so both pipelines answer through this one path.
15
+ */
16
+ async function sendEmbed(interaction, embed, ephemeral, logger) {
17
+ const flags = ephemeral ? discord_js_1.MessageFlags.Ephemeral : undefined;
18
+ try {
19
+ if (interaction.deferred) {
20
+ await interaction.editReply({ embeds: [embed] });
21
+ return;
22
+ }
23
+ if (interaction.replied) {
24
+ await interaction.followUp({ embeds: [embed], flags });
25
+ return;
26
+ }
27
+ await interaction.reply({ embeds: [embed], flags });
28
+ }
29
+ catch (error) {
30
+ logger.error({
31
+ commandName: interaction.commandName,
32
+ interactionId: interaction.id,
33
+ err: (0, error_message_1.errorMessage)(error),
34
+ }, "Failed to deliver interaction response");
35
+ }
36
+ }
37
+ //# sourceMappingURL=send-embed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send-embed.js","sourceRoot":"","sources":["../../../src/discord/command/send-embed.ts"],"names":[],"mappings":";;AAcA,8BA2BC;AAzCD,2CAAsF;AACtF,0DAAsD;AAGtD;;;;;;;;;GASG;AACI,KAAK,UAAU,SAAS,CAC9B,WAA+B,EAC/B,KAAmB,EACnB,SAAkB,EAClB,MAAc;IAEd,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,yBAAY,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,IAAI,CAAC;QACJ,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;YAC1B,MAAM,WAAW,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;YACjD,OAAO;QACR,CAAC;QACD,IAAI,WAAW,CAAC,OAAO,EAAE,CAAC;YACzB,MAAM,WAAW,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;YACvD,OAAO;QACR,CAAC;QACD,MAAM,WAAW,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;IACrD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,KAAK,CACX;YACC,WAAW,EAAE,WAAW,CAAC,WAAW;YACpC,aAAa,EAAE,WAAW,CAAC,EAAE;YAC7B,GAAG,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC;SACxB,EACD,wCAAwC,CACxC,CAAC;IACH,CAAC;AACF,CAAC"}
@@ -1,6 +1,7 @@
1
1
  import type { AutocompleteInteraction, ChatInputCommandInteraction, ContextMenuCommandInteraction } from "discord.js";
2
+ import type { LocaleResolver } from "../../discord/interaction/locale-resolver";
2
3
  import type { Presenter } from "../../discord/presenter";
3
- import type { Translator } from "../../i18n";
4
+ import type { Translator } from "../../i18n/translator";
4
5
  import type { Logger } from "../../logger";
5
6
  /**
6
7
  * Per-request dependencies injected into the command pipeline by the router.
@@ -11,6 +12,11 @@ export interface CommandRuntime {
11
12
  readonly presenter: Presenter;
12
13
  readonly logger: Logger;
13
14
  readonly translator: Translator;
15
+ /**
16
+ * Where the pipeline reads the reply language. Without one, it uses the
17
+ * interaction's own locales (`interactionLocale`).
18
+ */
19
+ readonly localeResolver?: LocaleResolver;
14
20
  }
15
21
  /**
16
22
  * The framework's slash-command contract. `data` is a discord.js builder (or
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/discord/command/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,uBAAuB,EACvB,2BAA2B,EAC3B,6BAA6B,EAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACzC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CAChC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F;;;;OAIG;IACH,YAAY,CAAC,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,6BAA6B,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7F;AAED,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,kBAAkB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/discord/command/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACX,uBAAuB,EACvB,2BAA2B,EAC3B,6BAA6B,EAC7B,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uCAAuC,CAAC;AAC5E,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;;GAIG;AACH,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC;;;OAGG;IACH,QAAQ,CAAC,cAAc,CAAC,EAAE,cAAc,CAAC;CACzC;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC5B,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F;;;;OAIG;IACH,YAAY,CAAC,CAAC,WAAW,EAAE,uBAAuB,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAED;;;;;GAKG;AACH,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,OAAO,CAAA;KAAE,CAAC;IACxD,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACtC,QAAQ,CAAC,WAAW,EAAE,6BAA6B,EAAE,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7F;AAED,sEAAsE;AACtE,MAAM,MAAM,iBAAiB,GAAG,YAAY,GAAG,kBAAkB,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { ComponentAuthorization } from "../../discord/components/component-router";
2
+ import type { PermissionBit } from "../../discord/permissions";
3
+ /** Any member may click; `because` records why that is acceptable. */
4
+ export declare function openToAnyone(because: string): ComponentAuthorization;
5
+ /** The router denies the click unless the member holds every permission. */
6
+ export declare function requiresPermissions(...required: readonly PermissionBit[]): ComponentAuthorization;
7
+ /**
8
+ * The decision needs per-resource state, so the handler makes it. `because`
9
+ * names the rule it applies, so a reviewer can go and check that it does.
10
+ */
11
+ export declare function checkedByHandler(because: string): ComponentAuthorization;
12
+ //# sourceMappingURL=component-access.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-access.d.ts","sourceRoot":"","sources":["../../../src/discord/components/component-access.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAC;AACpF,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAE3D,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAEpE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,GAAG,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,sBAAsB,CAEjG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAExE"}
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.openToAnyone = openToAnyone;
4
+ exports.requiresPermissions = requiresPermissions;
5
+ exports.checkedByHandler = checkedByHandler;
6
+ /** Any member may click; `because` records why that is acceptable. */
7
+ function openToAnyone(because) {
8
+ return { kind: "anyone", because };
9
+ }
10
+ /** The router denies the click unless the member holds every permission. */
11
+ function requiresPermissions(...required) {
12
+ return { kind: "permissions", required };
13
+ }
14
+ /**
15
+ * The decision needs per-resource state, so the handler makes it. `because`
16
+ * names the rule it applies, so a reviewer can go and check that it does.
17
+ */
18
+ function checkedByHandler(because) {
19
+ return { kind: "handler", because };
20
+ }
21
+ //# sourceMappingURL=component-access.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"component-access.js","sourceRoot":"","sources":["../../../src/discord/components/component-access.ts"],"names":[],"mappings":";;AAIA,oCAEC;AAGD,kDAEC;AAMD,4CAEC;AAhBD,sEAAsE;AACtE,SAAgB,YAAY,CAAC,OAAe;IAC3C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AACpC,CAAC;AAED,4EAA4E;AAC5E,SAAgB,mBAAmB,CAAC,GAAG,QAAkC;IACxE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;AAC1C,CAAC;AAED;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,OAAe;IAC/C,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC;AACrC,CAAC"}
@@ -1,9 +1,12 @@
1
1
  import { type AnySelectMenuInteraction, type ButtonInteraction, type Interaction, type ModalSubmitInteraction } from "discord.js";
2
+ import type { Guard } from "../../discord/command/guard";
2
3
  import type { InteractionDispatcher } from "../../discord/interaction/interaction-router";
4
+ import type { LocaleResolver } from "../../discord/interaction/locale-resolver";
3
5
  import { type PermissionBit } from "../../discord/permissions";
4
6
  import type { Presenter } from "../../discord/presenter";
5
- import { type Translator } from "../../i18n";
7
+ import type { Translator } from "../../i18n/translator";
6
8
  import type { Logger } from "../../logger";
9
+ import type { ModuleGate } from "../../settings/system/module-gate";
7
10
  /**
8
11
  * Interactions a {@link ComponentHandler} can be routed: message components
9
12
  * (buttons, any select menu) and modal submissions.
@@ -14,6 +17,8 @@ export interface ComponentRuntime {
14
17
  readonly presenter: Presenter;
15
18
  readonly logger: Logger;
16
19
  readonly translator: Translator;
20
+ /** The bot's reply-language resolver, if it gave one (see `ComponentRouterDeps`). */
21
+ readonly localeResolver?: LocaleResolver;
17
22
  }
18
23
  /**
19
24
  * Who may act on a component.
@@ -49,15 +54,6 @@ export type ComponentAuthorization =
49
54
  readonly kind: "handler";
50
55
  readonly because: string;
51
56
  };
52
- /** Any member may click; `because` records why that is acceptable. */
53
- export declare function openToAnyone(because: string): ComponentAuthorization;
54
- /** The router denies the click unless the member holds every permission. */
55
- export declare function requiresPermissions(...required: readonly PermissionBit[]): ComponentAuthorization;
56
- /**
57
- * The decision needs per-resource state, so the handler makes it. `because`
58
- * names the rule it applies, so a reviewer can go and check that it does.
59
- */
60
- export declare function checkedByHandler(because: string): ComponentAuthorization;
61
57
  /**
62
58
  * A persistent component handler, routed by `customId`. It claims an interaction
63
59
  * whose customId equals `customId` or starts with `${customId}:`, so dynamic
@@ -75,14 +71,31 @@ export interface ComponentHandler {
75
71
  readonly customId: string;
76
72
  /** Who may act on this component. Required: see {@link ComponentAuthorization}. */
77
73
  readonly authorize: ComponentAuthorization;
74
+ /**
75
+ * A check run after `authorize` and before the handler, as a command's
76
+ * guard is: on a denial the member gets its message (ephemeral) and the
77
+ * handler never runs. A guard over `BaseInteraction`, such as
78
+ * `requireConfigured`, fits both a command and a component.
79
+ */
80
+ readonly guard?: Guard<RoutableInteraction>;
78
81
  handle(interaction: RoutableInteraction, runtime: ComponentRuntime): Promise<void> | void;
79
82
  }
80
- /** Declare a {@link ComponentHandler}. Identity helper kept for a consistent DSL. */
81
- export declare function createComponentHandler(handler: ComponentHandler): ComponentHandler;
82
83
  export interface ComponentRouterDeps {
83
84
  presenter: Presenter;
84
85
  logger: Logger;
85
86
  translator: Translator;
87
+ /**
88
+ * When given, a handler registered with a module does not run on a guild
89
+ * where that module is disabled: the member gets the translated "disabled
90
+ * on this server" message instead (FR-036).
91
+ */
92
+ gate?: ModuleGate;
93
+ /**
94
+ * Where the router's own replies (denials) read their language, also handed
95
+ * to the handlers through the runtime. Without one, the interaction's own
96
+ * locales are used.
97
+ */
98
+ localeResolver?: LocaleResolver;
86
99
  }
87
100
  /**
88
101
  * Routes persistent component/modal interactions to registered handlers by
@@ -94,13 +107,23 @@ export interface ComponentRouterDeps {
94
107
  export declare class ComponentRouter implements InteractionDispatcher {
95
108
  private readonly deps;
96
109
  private readonly handlers;
110
+ /** The module each handler was registered for; absent means never gated. */
111
+ private readonly modules;
97
112
  private readonly runtime;
98
113
  constructor(deps: ComponentRouterDeps);
99
- register(handler: ComponentHandler): this;
100
- registerAll(handlers: Iterable<ComponentHandler>): this;
114
+ /**
115
+ * @param moduleName - the module the handler belongs to, so the gate can
116
+ * skip it on guilds where that module is disabled. Omit it for a handler
117
+ * that always runs.
118
+ */
119
+ register(handler: ComponentHandler, moduleName?: string): this;
120
+ /** Register many handlers at once, all of `moduleName` when given. */
121
+ registerAll(handlers: Iterable<ComponentHandler>, moduleName?: string): this;
101
122
  private match;
102
123
  /** Claim and route component/modal interactions by `customId`; ignore the rest. */
103
124
  handle(interaction: Interaction): Promise<boolean>;
125
+ /** Answer the member and return `false` when the handler's module is disabled on the guild. */
126
+ private passesGate;
104
127
  /**
105
128
  * Enforce the handler's declared audience. Only `permissions` is enforceable
106
129
  * here — the other two kinds are statements about a decision made elsewhere,
@@ -111,6 +134,5 @@ export declare class ComponentRouter implements InteractionDispatcher {
111
134
  * `createPermissionGuard` follows for commands.
112
135
  */
113
136
  private passesAuthorization;
114
- private localeOf;
115
137
  }
116
138
  //# sourceMappingURL=component-router.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"component-router.d.ts","sourceRoot":"","sources":["../../../src/discord/components/component-router.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,wBAAwB,EAC7B,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAEhB,KAAK,sBAAsB,EAC3B,MAAM,YAAY,CAAC;AAEpB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,0CAA0C,CAAC;AACtF,OAAO,EAAyC,KAAK,aAAa,EAAE,MAAM,uBAAuB,CAAC;AAClG,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAA8B,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AACrE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAC5B,iBAAiB,GACjB,wBAAwB,GACxB,sBAAsB,CAAC;AAE1B,oFAAoF;AACpF,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CAChC;AAED;;;;;;;;;;;;;;GAcG;AACH,MAAM,MAAM,sBAAsB;AACjC,2EAA2E;AACzE;IAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AACvD,yEAAyE;GACvE;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE;AAC/E;;;GAGG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE1D,sEAAsE;AACtE,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAEpE;AAED,4EAA4E;AAC5E,wBAAgB,mBAAmB,CAAC,GAAG,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,sBAAsB,CAEjG;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,sBAAsB,CAExE;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,mFAAmF;IACnF,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;IAC3C,MAAM,CAAC,WAAW,EAAE,mBAAmB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1F;AAED,qFAAqF;AACrF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,gBAAgB,GAAG,gBAAgB,CAElF;AAED,MAAM,WAAW,mBAAmB;IACnC,SAAS,EAAE,SAAS,CAAC;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,UAAU,CAAC;CACvB;AAMD;;;;;;GAMG;AACH,qBAAa,eAAgB,YAAW,qBAAqB;IAIhD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA0B;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;gBAEd,IAAI,EAAE,mBAAmB;IAQtD,QAAQ,CAAC,OAAO,EAAE,gBAAgB,GAAG,IAAI;IAKzC,WAAW,CAAC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,GAAG,IAAI;IAOvD,OAAO,CAAC,KAAK;IAMb,mFAAmF;IAC7E,MAAM,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IA2BxD;;;;;;;;OAQG;YACW,mBAAmB;IAuBjC,OAAO,CAAC,QAAQ;CAMhB"}
1
+ {"version":3,"file":"component-router.d.ts","sourceRoot":"","sources":["../../../src/discord/components/component-router.ts"],"names":[],"mappings":"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"}