@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,187 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.controlValue = controlValue;
4
+ exports.isUnchanged = isUnchanged;
5
+ exports.withSubmission = withSubmission;
6
+ const from_declaration_stored_1 = require("../../../discord/components/settings-editor/from-declaration-stored");
7
+ const settings_editor_field_values_1 = require("../../../discord/components/settings-editor/settings-editor-field-values");
8
+ const settings_editor_fields_1 = require("../../../discord/components/settings-editor/settings-editor-fields");
9
+ const duration_1 = require("../../../settings/duration");
10
+ const messages_1 = require("../../../settings/messages");
11
+ /** A decimal number as typed: optional sign, digits with an optional fraction, optional exponent. */
12
+ const DECIMAL_PATTERN = /^[+-]?(?:\d+\.?\d*|\.\d+)(?:e[+-]?\d+)?$/i;
13
+ /** Separates the items of a list typed one per line. */
14
+ const LINE_BREAK = /\r?\n/;
15
+ /**
16
+ * What the modal of a control opens on: the stored value as text for a typed
17
+ * control, whether a secret is set (never its value), the picked ids for a
18
+ * picker, minus the entities the guild no longer has, which the text then
19
+ * reports as unavailable.
20
+ *
21
+ * @param params.control - the control being opened.
22
+ * @param params.subject - the screen's current subject.
23
+ * @param params.translate - translates the texts shown in place of a value.
24
+ * @returns the control's prefill.
25
+ */
26
+ function controlValue(params) {
27
+ const { control, subject, translate } = params;
28
+ const value = subject.values[control.fieldKey];
29
+ const { shape } = control;
30
+ switch (shape.kind) {
31
+ case "text":
32
+ return (0, settings_editor_field_values_1.textFieldValue)(typeof value === "string" ? value : null);
33
+ case "number":
34
+ return (0, settings_editor_field_values_1.textFieldValue)(typeof value === "number" ? String(value) : null);
35
+ case "duration":
36
+ return (0, settings_editor_field_values_1.textFieldValue)(typeof value === "number" ? (0, duration_1.formatDuration)(value) : null);
37
+ case "secret":
38
+ return (0, settings_editor_field_values_1.textFieldValue)(translate((0, from_declaration_stored_1.secretStateKey)(value)));
39
+ case "lines":
40
+ return (0, settings_editor_field_values_1.textFieldValue)(Array.isArray(value) && value.length > 0 ? value.join("\n") : null);
41
+ case "boolean":
42
+ return (0, settings_editor_field_values_1.pickedFieldValue)(typeof value === "boolean" ? [String(value)] : []);
43
+ case "single":
44
+ case "many":
45
+ return pickedValue({ control, subject, translate });
46
+ case "toggles":
47
+ return (0, settings_editor_field_values_1.pickedFieldValue)(shape.keys.filter((key) => (0, from_declaration_stored_1.isToggledOn)({ value, key })));
48
+ case "search":
49
+ return (0, settings_editor_field_values_1.pickedFieldValue)(typeof value === "string" || typeof value === "number" ? [String(value)] : []);
50
+ case "other":
51
+ // Opens empty: the value it would repeat is already picked in the select beside it.
52
+ return (0, settings_editor_field_values_1.textFieldValue)(null);
53
+ default:
54
+ return shape;
55
+ }
56
+ }
57
+ /** The picked ids the guild still has, with a notice when any stored one is gone. */
58
+ function pickedValue(params) {
59
+ const { control, subject, translate } = params;
60
+ const stored = (0, from_declaration_stored_1.storedIds)(subject.values[control.fieldKey]);
61
+ const missing = subject.unavailable[control.fieldKey] ?? [];
62
+ const picked = (0, settings_editor_field_values_1.pickedFieldValue)(stored.filter((id) => !missing.includes(id)));
63
+ if (missing.length === 0) {
64
+ return picked;
65
+ }
66
+ return { ...picked, text: translate(messages_1.SETTINGS_MESSAGES.valueUnavailable) };
67
+ }
68
+ /**
69
+ * Whether a submission leaves a control as its modal opened: the same picked
70
+ * ids in the same order for a picker (whatever notice its text carries), the
71
+ * same text for a typed control (an empty box and no value alike).
72
+ *
73
+ * @param params.control - the control submitted.
74
+ * @param params.submission - what it came back with.
75
+ * @param params.current - what its modal opened on.
76
+ * @returns `true` when nothing was changed.
77
+ */
78
+ function isUnchanged(params) {
79
+ const { control, submission, current } = params;
80
+ if ((0, settings_editor_fields_1.isPickerField)(control.entry)) {
81
+ const ids = submission.ids ?? [];
82
+ return (ids.length === current.picked.length && ids.every((id, index) => current.picked[index] === id));
83
+ }
84
+ return (submission.value ?? "") === (current.text ?? "");
85
+ }
86
+ /**
87
+ * Add what one control submitted to a settings patch, in the form the
88
+ * settings service takes: typed text converted to the value it denotes and
89
+ * left as text when it denotes none (the service then refuses it with the same
90
+ * issue as any surface), `null` for a cleared control, and a toggles select
91
+ * merged into the full record of its field.
92
+ *
93
+ * @param params.control - the control submitted.
94
+ * @param params.submission - what it came back with.
95
+ * @param params.subject - the screen's current subject, for the toggles the
96
+ * select does not show.
97
+ * @param params.patch - the patch built so far.
98
+ * @returns the patch with the control's value.
99
+ */
100
+ function withSubmission(params) {
101
+ const { control, submission, subject, patch } = params;
102
+ const { fieldKey, shape } = control;
103
+ const current = Object.hasOwn(patch, fieldKey) ? patch[fieldKey] : subject.values[fieldKey];
104
+ return { ...patch, [fieldKey]: submittedValue({ shape, submission, current }) };
105
+ }
106
+ /** What one control submitted, as the settings service takes it; `current` is its field's value so far. */
107
+ function submittedValue(params) {
108
+ const { shape, submission } = params;
109
+ const { value, ids } = submission;
110
+ switch (shape.kind) {
111
+ case "text":
112
+ case "duration":
113
+ case "secret":
114
+ return value;
115
+ case "number":
116
+ return value === null ? null : typedNumber(value);
117
+ case "lines":
118
+ return value === null ? null : typedLines({ text: value, numeric: shape.numeric });
119
+ case "boolean":
120
+ return ids === null || ids.length === 0 ? null : pickedBoolean(ids[0]);
121
+ case "single":
122
+ return ids === null || ids.length === 0 ? null : singleId(ids);
123
+ case "many":
124
+ return ids === null ? null : [...ids];
125
+ case "toggles":
126
+ return { ...toggleRecord(params.current), ...pickedToggles({ keys: shape.keys, ids }) };
127
+ case "search":
128
+ if (ids === null || ids.length === 0) {
129
+ return null;
130
+ }
131
+ return shape.numeric ? singleNumber(ids) : singleId(ids);
132
+ case "other":
133
+ if (value === null) {
134
+ return null;
135
+ }
136
+ return shape.numeric ? typedNumber(value) : value;
137
+ default:
138
+ return shape;
139
+ }
140
+ }
141
+ /** The one number picked, from its option's value; anything else is left for the service to refuse. */
142
+ function singleNumber(ids) {
143
+ const picked = singleId(ids);
144
+ return typeof picked === "string" ? typedNumber(picked) : picked;
145
+ }
146
+ /** A toggles value as a record, or an empty one when the field holds none. */
147
+ function toggleRecord(value) {
148
+ return typeof value === "object" && value !== null ? { ...value } : {};
149
+ }
150
+ /** Each key of one toggles select, on when picked. */
151
+ function pickedToggles(params) {
152
+ const picked = params.ids ?? [];
153
+ // A picked id the select does not offer is kept, for the service to refuse.
154
+ const keys = [...params.keys, ...picked.filter((id) => !params.keys.includes(id))];
155
+ return Object.fromEntries(keys.map((key) => [key, picked.includes(key)]));
156
+ }
157
+ /** The number typed, or the text itself when it is not one. */
158
+ function typedNumber(text) {
159
+ const trimmed = text.trim();
160
+ return DECIMAL_PATTERN.test(trimmed) ? Number(trimmed) : text;
161
+ }
162
+ /** Each non-empty trimmed line as one item; `null` when no line holds one. */
163
+ function typedLines(params) {
164
+ const lines = params.text
165
+ .split(LINE_BREAK)
166
+ .map((line) => line.trim())
167
+ .filter((line) => line !== "");
168
+ if (lines.length === 0) {
169
+ return null;
170
+ }
171
+ return params.numeric ? lines.map(typedNumber) : lines;
172
+ }
173
+ /** `true` and `false` from their options; any other id is left for the service to refuse. */
174
+ function pickedBoolean(id) {
175
+ if (id === String(true)) {
176
+ return true;
177
+ }
178
+ if (id === String(false)) {
179
+ return false;
180
+ }
181
+ return id;
182
+ }
183
+ /** The one id a single picker took; several are left as a list for the service to refuse. */
184
+ function singleId(ids) {
185
+ return ids.length === 1 && ids[0] !== undefined ? ids[0] : ids;
186
+ }
187
+ //# sourceMappingURL=from-declaration-values.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-declaration-values.js","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/from-declaration-values.ts"],"names":[],"mappings":";;AAwCA,oCAoCC;AA4BD,kCAaC;AAgBD,wCAUC;AA3ID,0GAIsE;AAGtE,oHAG2E;AAC3E,wGAGqE;AAErE,kDAAqD;AACrD,kDAAwD;AAExD,qGAAqG;AACrG,MAAM,eAAe,GAAG,2CAA2C,CAAC;AAEpE,wDAAwD;AACxD,MAAM,UAAU,GAAG,OAAO,CAAC;AAE3B;;;;;;;;;;GAUG;AACH,SAAgB,YAAY,CAAC,MAI5B;IACA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC/C,MAAM,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IAC1B,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM;YACV,OAAO,IAAA,6CAAc,EAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjE,KAAK,QAAQ;YACZ,OAAO,IAAA,6CAAc,EAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACzE,KAAK,UAAU;YACd,OAAO,IAAA,6CAAc,EAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAA,yBAAc,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACjF,KAAK,QAAQ;YACZ,OAAO,IAAA,6CAAc,EAAC,SAAS,CAAC,IAAA,wCAAc,EAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QACzD,KAAK,OAAO;YACX,OAAO,IAAA,6CAAc,EAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC3F,KAAK,SAAS;YACb,OAAO,IAAA,+CAAgB,EAAC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC5E,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACV,OAAO,WAAW,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;QACrD,KAAK,SAAS;YACb,OAAO,IAAA,+CAAgB,EAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAA,qCAAW,EAAC,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAClF,KAAK,QAAQ;YACZ,OAAO,IAAA,+CAAgB,EACtB,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAC7E,CAAC;QACH,KAAK,OAAO;YACX,oFAAoF;YACpF,OAAO,IAAA,6CAAc,EAAC,IAAI,CAAC,CAAC;QAC7B;YACC,OAAO,KAAqB,CAAC;IAC/B,CAAC;AACF,CAAC;AAED,qFAAqF;AACrF,SAAS,WAAW,CAAC,MAIpB;IACA,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,MAAM,CAAC;IAC/C,MAAM,MAAM,GAAG,IAAA,mCAAS,EAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;IAC5D,MAAM,MAAM,GAAG,IAAA,+CAAgB,EAAC,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,MAAM,CAAC;IACf,CAAC;IACD,OAAO,EAAE,GAAG,MAAM,EAAE,IAAI,EAAE,SAAS,CAAC,4BAAiB,CAAC,gBAAgB,CAAC,EAAE,CAAC;AAC3E,CAAC;AAED;;;;;;;;;GASG;AACH,SAAgB,WAAW,CAAC,MAI3B;IACA,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;IAChD,IAAI,IAAA,sCAAa,EAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAClC,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,IAAI,EAAE,CAAC;QACjC,OAAO,CACN,GAAG,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,CAC9F,CAAC;IACH,CAAC;IACD,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAC1D,CAAC;AAED;;;;;;;;;;;;;GAaG;AACH,SAAgB,cAAc,CAAC,MAK9B;IACA,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC;IACvD,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5F,OAAO,EAAE,GAAG,KAAK,EAAE,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,2GAA2G;AAC3G,SAAS,cAAc,CAAC,MAIvB;IACA,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;IACrC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,UAAU,CAAC;IAClC,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC;QACZ,KAAK,UAAU,CAAC;QAChB,KAAK,QAAQ;YACZ,OAAO,KAAK,CAAC;QACd,KAAK,QAAQ;YACZ,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACnD,KAAK,OAAO;YACX,OAAO,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACpF,KAAK,SAAS;YACb,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACxE,KAAK,QAAQ;YACZ,OAAO,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAChE,KAAK,MAAM;YACV,OAAO,GAAG,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC;QACvC,KAAK,SAAS;YACb,OAAO,EAAE,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,GAAG,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC;QACzF,KAAK,QAAQ;YACZ,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtC,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC1D,KAAK,OAAO;YACX,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACpB,OAAO,IAAI,CAAC;YACb,CAAC;YACD,OAAO,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QACnD;YACC,OAAO,KAAqB,CAAC;IAC/B,CAAC;AACF,CAAC;AAED,uGAAuG;AACvG,SAAS,YAAY,CAAC,GAAsB;IAC3C,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7B,OAAO,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;AAClE,CAAC;AAED,8EAA8E;AAC9E,SAAS,YAAY,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;AACxE,CAAC;AAED,sDAAsD;AACtD,SAAS,aAAa,CAAC,MAGtB;IACA,MAAM,MAAM,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC;IAChC,4EAA4E;IAC5E,MAAM,IAAI,GAAG,CAAC,GAAG,MAAM,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IACnF,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AAC3E,CAAC;AAED,+DAA+D;AAC/D,SAAS,WAAW,CAAC,IAAY;IAChC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,OAAO,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAED,8EAA8E;AAC9E,SAAS,UAAU,CAAC,MAA0C;IAC7D,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI;SACvB,KAAK,CAAC,UAAU,CAAC;SACjB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;SAC1B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAC;IAChC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;AACxD,CAAC;AAED,6FAA6F;AAC7F,SAAS,aAAa,CAAC,EAAsB;IAC5C,IAAI,EAAE,KAAK,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACb,CAAC;IACD,IAAI,EAAE,KAAK,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACd,CAAC;IACD,OAAO,EAAE,CAAC;AACX,CAAC;AAED,6FAA6F;AAC7F,SAAS,QAAQ,CAAC,GAAsB;IACvC,OAAO,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAChE,CAAC"}
@@ -0,0 +1,39 @@
1
+ import type { SettingsEditorOptions } from "../../../discord/components/settings-editor/mount-settings-editor";
2
+ import type { Locale } from "../../../i18n/locale";
3
+ import type { Translator } from "../../../i18n/translator";
4
+ import type { SettingsDeclaration } from "../../../settings/define-settings";
5
+ import type { SettingsService } from "../../../settings/settings-service";
6
+ /** What the adapter hands `mountSettingsEditor`; the caller adds its own ids, chrome, clock and logger. */
7
+ type DeclarationEditorOptions = Pick<SettingsEditorOptions<unknown, never, string>, "fields" | "levels" | "initial" | "currentValue" | "displayValue" | "save" | "saveGroup" | "reset">;
8
+ /**
9
+ * Build the settings-editor options of a declaration for one guild: its
10
+ * fields and levels, the subject it opens on, and the hooks that read and
11
+ * write through the settings service. The caller spreads the result into
12
+ * `mountSettingsEditor` with its own `ids`, `chrome`, `clock` and `logger`.
13
+ *
14
+ * Every write goes through `service.set` as the administrator, so the screen
15
+ * accepts and refuses exactly what every other surface does; a group's modal
16
+ * is one write carrying only the members the administrator changed.
17
+ *
18
+ * A searchable field (FR-026a) is a select of the first 25 results of its
19
+ * search for an empty query, read when the screen opens, and shows its
20
+ * search's label as its current value. A non-strict one also gets an "Other
21
+ * value" text entry in the same modal: a value typed there replaces the pick
22
+ * and is validated on save like any other. A field whose search offered
23
+ * nothing is typed instead.
24
+ *
25
+ * @param declaration - the module's settings declaration.
26
+ * @param service - the settings service the screen reads and writes through.
27
+ * @param context - the guild, the administrator, their locale and the
28
+ * translator of the texts shown in place of a value.
29
+ * @returns the editor options, the initial subject read from the service.
30
+ * @throws SettingsDeclarationError when a list holds an item kind lists cannot hold.
31
+ */
32
+ export declare function settingsEditorFromDeclaration<D extends SettingsDeclaration>(declaration: D, service: SettingsService, context: {
33
+ readonly guildId: string;
34
+ readonly userId: string;
35
+ readonly locale: Locale;
36
+ readonly translator: Translator;
37
+ }): Promise<DeclarationEditorOptions>;
38
+ export {};
39
+ //# sourceMappingURL=from-declaration.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-declaration.d.ts","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/from-declaration.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EACX,qBAAqB,EAErB,MAAM,4DAA4D,CAAC;AAOpE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAgB,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAClE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,OAAO,KAAK,EAAkB,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnF,2GAA2G;AAC3G,KAAK,wBAAwB,GAAG,IAAI,CACnC,qBAAqB,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,EAC7C,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,cAAc,GAAG,cAAc,GAAG,MAAM,GAAG,WAAW,GAAG,OAAO,CAClG,CAAC;AAeF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAsB,6BAA6B,CAAC,CAAC,SAAS,mBAAmB,EAChF,WAAW,EAAE,CAAC,EACd,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE;IACR,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;CAChC,GACC,OAAO,CAAC,wBAAwB,CAAC,CAwCnC"}
@@ -0,0 +1,132 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.settingsEditorFromDeclaration = settingsEditorFromDeclaration;
4
+ const from_declaration_controls_1 = require("../../../discord/components/settings-editor/from-declaration-controls");
5
+ const from_declaration_display_1 = require("../../../discord/components/settings-editor/from-declaration-display");
6
+ const from_declaration_layout_1 = require("../../../discord/components/settings-editor/from-declaration-layout");
7
+ const from_declaration_search_1 = require("../../../discord/components/settings-editor/from-declaration-search");
8
+ const from_declaration_subject_1 = require("../../../discord/components/settings-editor/from-declaration-subject");
9
+ const from_declaration_values_1 = require("../../../discord/components/settings-editor/from-declaration-values");
10
+ const business_error_1 = require("../../../errors/business-error");
11
+ const field_order_1 = require("../../../settings/field-order");
12
+ /**
13
+ * Build the settings-editor options of a declaration for one guild: its
14
+ * fields and levels, the subject it opens on, and the hooks that read and
15
+ * write through the settings service. The caller spreads the result into
16
+ * `mountSettingsEditor` with its own `ids`, `chrome`, `clock` and `logger`.
17
+ *
18
+ * Every write goes through `service.set` as the administrator, so the screen
19
+ * accepts and refuses exactly what every other surface does; a group's modal
20
+ * is one write carrying only the members the administrator changed.
21
+ *
22
+ * A searchable field (FR-026a) is a select of the first 25 results of its
23
+ * search for an empty query, read when the screen opens, and shows its
24
+ * search's label as its current value. A non-strict one also gets an "Other
25
+ * value" text entry in the same modal: a value typed there replaces the pick
26
+ * and is validated on save like any other. A field whose search offered
27
+ * nothing is typed instead.
28
+ *
29
+ * @param declaration - the module's settings declaration.
30
+ * @param service - the settings service the screen reads and writes through.
31
+ * @param context - the guild, the administrator, their locale and the
32
+ * translator of the texts shown in place of a value.
33
+ * @returns the editor options, the initial subject read from the service.
34
+ * @throws SettingsDeclarationError when a list holds an item kind lists cannot hold.
35
+ */
36
+ async function settingsEditorFromDeclaration(declaration, service, context) {
37
+ const { guildId, userId, locale, translator } = context;
38
+ const ctx = { guildId, userId, locale };
39
+ const subject = await (0, from_declaration_subject_1.loadDeclarationSubject)({ declaration, service, ctx });
40
+ const searchOptions = await (0, from_declaration_search_1.loadSearchOptions)({ declaration, service, ctx, subject });
41
+ const controls = displayedControls(declaration, searchOptions);
42
+ const layout = (0, from_declaration_layout_1.layoutDeclaration)({ declaration, controls });
43
+ const scope = {
44
+ declaration,
45
+ service,
46
+ ctx,
47
+ translate: (key) => translator.translate(locale, key),
48
+ controls: new Map(controls.map((control) => [control.entry.key, control])),
49
+ groups: layout.groups,
50
+ };
51
+ return {
52
+ fields: layout.fields,
53
+ levels: layout.levels,
54
+ initial: { subject, assets: [] },
55
+ currentValue: (subject, key) => (0, from_declaration_values_1.controlValue)({ translate: scope.translate, subject, control: controlAt({ scope, key }) }),
56
+ displayValue: (subject, key) => {
57
+ const control = controlAt({ scope, key });
58
+ // The free entry holds nothing of its own: its field shows beside the select.
59
+ return (0, from_declaration_controls_1.isFreeEntry)(control)
60
+ ? null
61
+ : (0, from_declaration_display_1.controlDisplay)({ translate: scope.translate, subject, control });
62
+ },
63
+ save: (subject, key, submission) => saveControl({ scope, subject, control: controlAt({ scope, key }), submission }),
64
+ saveGroup: (subject, groupKey, submissions) => saveGroupControls({ scope, subject, groupKey, submissions }),
65
+ reset: async () => {
66
+ await service.reset(declaration, guildId, "all", scope.ctx);
67
+ return reload(scope);
68
+ },
69
+ };
70
+ }
71
+ /** The controls of a declaration in its display order, the one every surface shows. */
72
+ function displayedControls(declaration, searchOptions) {
73
+ const rank = new Map((0, field_order_1.displayOrder)(declaration)
74
+ .entries.flatMap((entry) => (entry.kind === "field" ? [entry.key] : entry.fields))
75
+ .map((key, index) => [key, index]));
76
+ const place = (control) => rank.get(control.fieldKey) ?? rank.size;
77
+ return (0, from_declaration_controls_1.declarationControls)(declaration, searchOptions).sort((left, right) => place(left) - place(right));
78
+ }
79
+ /** The screen's subject, read back from the service. */
80
+ async function reload(scope) {
81
+ const { declaration, service, ctx } = scope;
82
+ return { subject: await (0, from_declaration_subject_1.loadDeclarationSubject)({ declaration, service, ctx }), assets: [] };
83
+ }
84
+ /** Write `patch` in one `service.set` (nothing when it is empty), then read the screen back. */
85
+ async function write(params) {
86
+ const { scope, patch } = params;
87
+ if (Object.keys(patch).length > 0) {
88
+ await scope.service.set(scope.declaration, scope.ctx.guildId, patch, scope.ctx);
89
+ }
90
+ return reload(scope);
91
+ }
92
+ function controlAt(params) {
93
+ const { scope, key } = params;
94
+ const control = scope.controls.get(key);
95
+ if (control === undefined) {
96
+ throw new business_error_1.NotFoundError(`Settings screen of "${scope.declaration.id}" has no field "${key}"`);
97
+ }
98
+ return control;
99
+ }
100
+ /**
101
+ * Save one entry as submitted. A secret opens on whether it is set, not on
102
+ * its value: sent back untouched, that text must not replace the secret.
103
+ */
104
+ function saveControl(params) {
105
+ const { scope, subject, control, submission } = params;
106
+ const untouchedSecret = control.shape.kind === "secret" &&
107
+ (0, from_declaration_values_1.isUnchanged)({
108
+ control,
109
+ submission,
110
+ current: (0, from_declaration_values_1.controlValue)({ translate: scope.translate, subject, control }),
111
+ });
112
+ const patch = untouchedSecret ? {} : (0, from_declaration_values_1.withSubmission)({ control, submission, subject, patch: {} });
113
+ return write({ scope, patch });
114
+ }
115
+ /**
116
+ * Save a group's modal in one write carrying only the members changed from
117
+ * what the modal opened on: a picker whose stored entity is gone, or a
118
+ * secret showing whether it is set, left untouched keeps its stored value.
119
+ */
120
+ function saveGroupControls(params) {
121
+ const { scope, subject, groupKey, submissions } = params;
122
+ let patch = {};
123
+ for (const control of scope.groups.get(groupKey) ?? []) {
124
+ const submission = submissions[control.entry.key];
125
+ const current = (0, from_declaration_values_1.controlValue)({ translate: scope.translate, subject, control });
126
+ if (submission !== undefined && !(0, from_declaration_values_1.isUnchanged)({ control, submission, current })) {
127
+ patch = (0, from_declaration_values_1.withSubmission)({ control, submission, subject, patch });
128
+ }
129
+ }
130
+ return write({ scope, patch });
131
+ }
132
+ //# sourceMappingURL=from-declaration.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"from-declaration.js","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/from-declaration.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
+ export { settingsEditorFromDeclaration } from "../../../discord/components/settings-editor/from-declaration";
1
2
  export { mountSettingsEditor, type SettingsEditorOptions, type SettingsEditorWrite, } from "../../../discord/components/settings-editor/mount-settings-editor";
2
3
  export { currentLevelKey, type SettingsEditorLevel, } from "../../../discord/components/settings-editor/navigation";
3
4
  export { editorComponentIds, MAX_SELECT_OPTION_TEXT, MAX_SELECT_OPTIONS, SETTINGS_EDITOR_RESET_CONFIRMING, type SettingsEditorCardChrome, type SettingsEditorChrome, type SettingsEditorEmbedsChrome, type SettingsEditorIds, type SettingsEditorState, } from "../../../discord/components/settings-editor/settings-editor.view";
4
5
  export { fieldButtonId, MAX_CARD_BUTTON_LEVEL_ENTRIES, MAX_CARD_LEVEL_ENTRIES, } from "../../../discord/components/settings-editor/settings-editor-card.view";
5
6
  export type { SettingsEditorGroupSubmission, SettingsEditorSubmission, } from "../../../discord/components/settings-editor/settings-editor-field-modal";
6
- export { MAX_MODAL_COMPONENTS, MAX_MODAL_INPUT_LENGTH, pickedFieldValue, type SettingsEditorChoice, type SettingsEditorField, type SettingsEditorFieldValue, type SettingsEditorGroupField, type SettingsEditorPickerField, type SettingsEditorValueField, textFieldValue, } from "../../../discord/components/settings-editor/settings-editor-fields";
7
+ export { pickedFieldValue, textFieldValue, } from "../../../discord/components/settings-editor/settings-editor-field-values";
8
+ export { MAX_MODAL_COMPONENTS, MAX_MODAL_INPUT_LENGTH, type SettingsEditorChoice, type SettingsEditorField, type SettingsEditorFieldValue, type SettingsEditorGroupField, type SettingsEditorPickerField, type SettingsEditorValueField, } from "../../../discord/components/settings-editor/settings-editor-fields";
7
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACxB,MAAM,4DAA4D,CAAC;AACpE,OAAO,EACN,eAAe,EACf,KAAK,mBAAmB,GACxB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,gCAAgC,EAChC,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACxB,MAAM,2DAA2D,CAAC;AACnE,OAAO,EACN,aAAa,EACb,6BAA6B,EAC7B,sBAAsB,GACtB,MAAM,gEAAgE,CAAC;AACxE,YAAY,EACX,6BAA6B,EAC7B,wBAAwB,GACxB,MAAM,kEAAkE,CAAC;AAC1E,OAAO,EACN,oBAAoB,EACpB,sBAAsB,EACtB,gBAAgB,EAChB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,cAAc,GACd,MAAM,6DAA6D,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,uDAAuD,CAAC;AACtG,OAAO,EACN,mBAAmB,EACnB,KAAK,qBAAqB,EAC1B,KAAK,mBAAmB,GACxB,MAAM,4DAA4D,CAAC;AACpE,OAAO,EACN,eAAe,EACf,KAAK,mBAAmB,GACxB,MAAM,iDAAiD,CAAC;AACzD,OAAO,EACN,kBAAkB,EAClB,sBAAsB,EACtB,kBAAkB,EAClB,gCAAgC,EAChC,KAAK,wBAAwB,EAC7B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,GACxB,MAAM,2DAA2D,CAAC;AACnE,OAAO,EACN,aAAa,EACb,6BAA6B,EAC7B,sBAAsB,GACtB,MAAM,gEAAgE,CAAC;AACxE,YAAY,EACX,6BAA6B,EAC7B,wBAAwB,GACxB,MAAM,kEAAkE,CAAC;AAC1E,OAAO,EACN,gBAAgB,EAChB,cAAc,GACd,MAAM,mEAAmE,CAAC;AAC3E,OAAO,EACN,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,oBAAoB,EACzB,KAAK,mBAAmB,EACxB,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,GAC7B,MAAM,6DAA6D,CAAC"}
@@ -1,6 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.textFieldValue = exports.pickedFieldValue = exports.MAX_MODAL_INPUT_LENGTH = exports.MAX_MODAL_COMPONENTS = exports.MAX_CARD_LEVEL_ENTRIES = exports.MAX_CARD_BUTTON_LEVEL_ENTRIES = exports.fieldButtonId = exports.SETTINGS_EDITOR_RESET_CONFIRMING = exports.MAX_SELECT_OPTIONS = exports.MAX_SELECT_OPTION_TEXT = exports.editorComponentIds = exports.currentLevelKey = exports.mountSettingsEditor = void 0;
3
+ exports.MAX_MODAL_INPUT_LENGTH = exports.MAX_MODAL_COMPONENTS = exports.textFieldValue = exports.pickedFieldValue = exports.MAX_CARD_LEVEL_ENTRIES = exports.MAX_CARD_BUTTON_LEVEL_ENTRIES = exports.fieldButtonId = exports.SETTINGS_EDITOR_RESET_CONFIRMING = exports.MAX_SELECT_OPTIONS = exports.MAX_SELECT_OPTION_TEXT = exports.editorComponentIds = exports.currentLevelKey = exports.mountSettingsEditor = exports.settingsEditorFromDeclaration = void 0;
4
+ var from_declaration_1 = require("../../../discord/components/settings-editor/from-declaration");
5
+ Object.defineProperty(exports, "settingsEditorFromDeclaration", { enumerable: true, get: function () { return from_declaration_1.settingsEditorFromDeclaration; } });
4
6
  var mount_settings_editor_1 = require("../../../discord/components/settings-editor/mount-settings-editor");
5
7
  Object.defineProperty(exports, "mountSettingsEditor", { enumerable: true, get: function () { return mount_settings_editor_1.mountSettingsEditor; } });
6
8
  var navigation_1 = require("../../../discord/components/settings-editor/navigation");
@@ -14,9 +16,10 @@ var settings_editor_card_view_1 = require("../../../discord/components/settings-
14
16
  Object.defineProperty(exports, "fieldButtonId", { enumerable: true, get: function () { return settings_editor_card_view_1.fieldButtonId; } });
15
17
  Object.defineProperty(exports, "MAX_CARD_BUTTON_LEVEL_ENTRIES", { enumerable: true, get: function () { return settings_editor_card_view_1.MAX_CARD_BUTTON_LEVEL_ENTRIES; } });
16
18
  Object.defineProperty(exports, "MAX_CARD_LEVEL_ENTRIES", { enumerable: true, get: function () { return settings_editor_card_view_1.MAX_CARD_LEVEL_ENTRIES; } });
19
+ var settings_editor_field_values_1 = require("../../../discord/components/settings-editor/settings-editor-field-values");
20
+ Object.defineProperty(exports, "pickedFieldValue", { enumerable: true, get: function () { return settings_editor_field_values_1.pickedFieldValue; } });
21
+ Object.defineProperty(exports, "textFieldValue", { enumerable: true, get: function () { return settings_editor_field_values_1.textFieldValue; } });
17
22
  var settings_editor_fields_1 = require("../../../discord/components/settings-editor/settings-editor-fields");
18
23
  Object.defineProperty(exports, "MAX_MODAL_COMPONENTS", { enumerable: true, get: function () { return settings_editor_fields_1.MAX_MODAL_COMPONENTS; } });
19
24
  Object.defineProperty(exports, "MAX_MODAL_INPUT_LENGTH", { enumerable: true, get: function () { return settings_editor_fields_1.MAX_MODAL_INPUT_LENGTH; } });
20
- Object.defineProperty(exports, "pickedFieldValue", { enumerable: true, get: function () { return settings_editor_fields_1.pickedFieldValue; } });
21
- Object.defineProperty(exports, "textFieldValue", { enumerable: true, get: function () { return settings_editor_fields_1.textFieldValue; } });
22
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/index.ts"],"names":[],"mappings":";;;AAAA,oGAIoE;AAHnE,4HAAA,mBAAmB,OAAA;AAIpB,8EAGyD;AAFxD,6GAAA,eAAe,OAAA;AAGhB,kGAUmE;AATlE,0HAAA,kBAAkB,OAAA;AAClB,8HAAA,sBAAsB,OAAA;AACtB,0HAAA,kBAAkB,OAAA;AAClB,wIAAA,gCAAgC,OAAA;AAOjC,4GAIwE;AAHvE,0HAAA,aAAa,OAAA;AACb,0IAAA,6BAA6B,OAAA;AAC7B,mIAAA,sBAAsB,OAAA;AAMvB,sGAWqE;AAVpE,8HAAA,oBAAoB,OAAA;AACpB,gIAAA,sBAAsB,OAAA;AACtB,0HAAA,gBAAgB,OAAA;AAOhB,wHAAA,cAAc,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/index.ts"],"names":[],"mappings":";;;AAAA,0FAAsG;AAA7F,iIAAA,6BAA6B,OAAA;AACtC,oGAIoE;AAHnE,4HAAA,mBAAmB,OAAA;AAIpB,8EAGyD;AAFxD,6GAAA,eAAe,OAAA;AAGhB,kGAUmE;AATlE,0HAAA,kBAAkB,OAAA;AAClB,8HAAA,sBAAsB,OAAA;AACtB,0HAAA,kBAAkB,OAAA;AAClB,wIAAA,gCAAgC,OAAA;AAOjC,4GAIwE;AAHvE,0HAAA,aAAa,OAAA;AACb,0IAAA,6BAA6B,OAAA;AAC7B,mIAAA,sBAAsB,OAAA;AAMvB,kHAG2E;AAF1E,gIAAA,gBAAgB,OAAA;AAChB,8HAAA,cAAc,OAAA;AAEf,sGASqE;AARpE,8HAAA,oBAAoB,OAAA;AACpB,gIAAA,sBAAsB,OAAA"}
@@ -1,12 +1,14 @@
1
1
  import type { ChatInputCommandInteraction, ModalMessageModalSubmitInteraction } from "discord.js";
2
2
  import type { Clock } from "../../../clock";
3
- import { type InteractiveMessageHandle, type InteractiveSelect, type StateStore } from "../../../discord/components/interactive-message";
3
+ import type { InteractiveMessageHandle, InteractiveSelect } from "../../../discord/components/interactive-message/interactive-message-collector";
4
+ import type { StateStore } from "../../../discord/components/interactive-message/state-store";
4
5
  import { type SettingsEditorLevel } from "../../../discord/components/settings-editor/navigation";
5
6
  import { type SettingsEditorChrome, type SettingsEditorIds, type SettingsEditorState } from "../../../discord/components/settings-editor/settings-editor.view";
6
7
  import type { SettingsEditorGroupSubmission, SettingsEditorSubmission } from "../../../discord/components/settings-editor/settings-editor-field-modal";
7
8
  import { type SettingsEditorField, type SettingsEditorFieldValue } from "../../../discord/components/settings-editor/settings-editor-fields";
8
9
  import { type Button } from "../../../discord/interaction/button";
9
- import { type Locale, type Translator } from "../../../i18n";
10
+ import type { Locale } from "../../../i18n/locale";
11
+ import type { Translator } from "../../../i18n/translator";
10
12
  import type { Logger } from "../../../logger";
11
13
  /**
12
14
  * What one write leaves behind: the new subject, and the files the message must
@@ -36,6 +38,18 @@ export interface SettingsEditorOptions<S, A, F extends string> {
36
38
  readonly initial: SettingsEditorWrite<S, A>;
37
39
  /** What the modal for `field` opens on. */
38
40
  currentValue(subject: S, field: F): SettingsEditorFieldValue;
41
+ /**
42
+ * What `field` currently holds, already translated, shown on the card under
43
+ * the entry's hint as "Current: …" so an administrator reads it without
44
+ * opening the modal. Rendered from the state's subject, so it follows every
45
+ * write. `null` shows no line for that field; a group shows one
46
+ * `label: value` per member answering one; a level shows nothing. A long
47
+ * value is cut with an ellipsis.
48
+ *
49
+ * Read by the card layout only: the embeds layout ignores it. Left out, the
50
+ * card renders exactly as it did without it.
51
+ */
52
+ displayValue?(subject: S, field: F): string | null;
39
53
  /**
40
54
  * Persist one field — its typed value, its upload, or what a picker's select
41
55
  * came back with, whichever `submission` carries.
@@ -1 +1 @@
1
- {"version":3,"file":"mount-settings-editor.d.ts","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/mount-settings-editor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mount-settings-editor.d.ts","sourceRoot":"","sources":["../../../../src/discord/components/settings-editor/mount-settings-editor.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.mountSettingsEditor = mountSettingsEditor;
4
- const interactive_message_1 = require("../../../discord/components/interactive-message");
4
+ const message_edit_options_1 = require("../../../discord/components/interactive-message/message-edit-options");
5
+ const mount_interactive_message_1 = require("../../../discord/components/interactive-message/mount-interactive-message");
5
6
  const navigation_1 = require("../../../discord/components/settings-editor/navigation");
6
7
  const settings_editor_view_1 = require("../../../discord/components/settings-editor/settings-editor.view");
7
8
  const settings_editor_card_view_1 = require("../../../discord/components/settings-editor/settings-editor-card.view");
@@ -9,8 +10,9 @@ const settings_editor_field_modal_1 = require("../../../discord/components/setti
9
10
  const settings_editor_fields_1 = require("../../../discord/components/settings-editor/settings-editor-fields");
10
11
  const i18n_1 = require("../../../discord/i18n");
11
12
  const button_1 = require("../../../discord/interaction/button");
12
- const errors_1 = require("../../../errors");
13
- const i18n_2 = require("../../../i18n");
13
+ const business_error_1 = require("../../../errors/business-error");
14
+ const describe_error_1 = require("../../../errors/describe-error");
15
+ const business_message_1 = require("../../../i18n/business-message");
14
16
  /**
15
17
  * Mount the editor every customisable ticket embed is edited through: a preview
16
18
  * of what members see, a menu of fields, a modal per field, and a confirmed
@@ -60,12 +62,12 @@ async function mountSettingsEditor(interaction, options) {
60
62
  written = await write();
61
63
  }
62
64
  catch (error) {
63
- if (error instanceof errors_1.BusinessError) {
65
+ if (error instanceof business_error_1.BusinessError) {
64
66
  // A refusal is the one outcome the screen has to say out loud:
65
67
  // nothing was written, so the preview shows no trace of it.
66
68
  return {
67
69
  ...state,
68
- notice: { text: (0, i18n_2.resolveBusinessMessage)(error, translator, locale), tone: "refusal" },
70
+ notice: { text: (0, business_message_1.resolveBusinessMessage)(error, translator, locale), tone: "refusal" },
69
71
  };
70
72
  }
71
73
  throw error;
@@ -74,7 +76,7 @@ async function mountSettingsEditor(interaction, options) {
74
76
  await options.onWritten?.();
75
77
  }
76
78
  catch (error) {
77
- options.logger.error({ err: (0, errors_1.describeError)(error) }, "onWritten failed after a settings editor write had already landed");
79
+ options.logger.error({ err: (0, describe_error_1.describeError)(error) }, "onWritten failed after a settings editor write had already landed");
78
80
  }
79
81
  const { subject, assets } = written;
80
82
  return { ...state, subject, assets, notice: { text: notice, tone: "confirmation" } };
@@ -149,7 +151,7 @@ async function mountSettingsEditor(interaction, options) {
149
151
  const state = mounted.screen?.store.read() ?? ctx.state;
150
152
  const next = await applyChange(state, () => options.save(state.subject, fieldKey, submission), fieldNotice(field, submission));
151
153
  mounted.screen?.store.write(next);
152
- await submission.interaction.update((0, interactive_message_1.toMessageEditOptions)(view.render(next), [...submission.interaction.message.attachments.values()], next));
154
+ await submission.interaction.update((0, message_edit_options_1.toMessageEditOptions)(view.render(next), [...submission.interaction.message.attachments.values()], next));
153
155
  }
154
156
  /**
155
157
  * Edit a group: ask for every member field it declares in one modal,
@@ -181,7 +183,7 @@ async function mountSettingsEditor(interaction, options) {
181
183
  field: translator.translate(locale, group.labelKey),
182
184
  }));
183
185
  mounted.screen?.store.write(next);
184
- await prompt.interaction.update((0, interactive_message_1.toMessageEditOptions)(view.render(next), [...prompt.interaction.message.attachments.values()], next));
186
+ await prompt.interaction.update((0, message_edit_options_1.toMessageEditOptions)(view.render(next), [...prompt.interaction.message.attachments.values()], next));
185
187
  }
186
188
  const buttons = (0, settings_editor_view_1.createEditorButtons)(ids, translator, locale, {
187
189
  // Nothing is written here. Clearing an override that names an uploaded
@@ -285,7 +287,9 @@ async function mountSettingsEditor(interaction, options) {
285
287
  if (options.chrome.layout === "card") {
286
288
  const fieldButtonMap = new Map(allFields.map((field) => [field.key, buildFieldButton(field)]));
287
289
  fieldButtons.push(...fieldButtonMap.values());
288
- view = (0, settings_editor_card_view_1.createCardEditorView)(options.fields, options.levels, buttons, fieldButtonMap, options.chrome, translator, locale, dressing);
290
+ view = (0, settings_editor_card_view_1.createCardEditorView)(options.fields, options.levels, buttons, fieldButtonMap, options.chrome, translator, locale, dressing, options.displayValue === undefined
291
+ ? undefined
292
+ : (subject, field) => options.displayValue?.(subject, field) ?? null);
289
293
  }
290
294
  else {
291
295
  view = (0, settings_editor_view_1.createEditorView)(ids, options.fields, options.levels, buttons, options.chrome, translator, locale, dressing,
@@ -306,7 +310,7 @@ async function mountSettingsEditor(interaction, options) {
306
310
  // The screen's own after the editor's, so a caller cannot shadow a control
307
311
  // the editor depends on: `mountInteractiveMessage` routes to the first match.
308
312
  const allButtons = [...buttons.all, ...fieldButtons, ...(options.buttons ?? [])];
309
- mounted.screen = await (0, interactive_message_1.mountInteractiveMessage)(interaction, {
313
+ mounted.screen = await (0, mount_interactive_message_1.mountInteractiveMessage)(interaction, {
310
314
  initialState: {
311
315
  subject: options.initial.subject,
312
316
  assets: options.initial.assets,