@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 @@
1
+ {"version":3,"file":"settings-validation-error.js","sourceRoot":"","sources":["../../src/settings/settings-validation-error.ts"],"names":[],"mappings":";;;AAAA,4DAAiF;AA8BjF;;;GAGG;AACH,MAAa,uBAAwB,SAAQ,gCAAe;IACtC;IAArB,YAAqB,MAAgC;QACpD,KAAK,CACJ,qBAAqB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,KAAK,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACzF,CAAC;QAHkB,WAAM,GAAN,MAAM,CAA0B;IAIrD,CAAC;CACD;AAND,0DAMC"}
@@ -0,0 +1,16 @@
1
+ import type { SettingsDeclaration } from "../settings/define-settings";
2
+ /** Whether a module can run on a guild: what an administrator still has to set. */
3
+ export interface SettingsStatus {
4
+ /** Keys of the required fields without default the guild left unset, in declared order. */
5
+ readonly missing: readonly string[];
6
+ }
7
+ /**
8
+ * The configuration status of a module's values on one guild (FR-040). A
9
+ * required field with a default always has a value, so it is never missing.
10
+ *
11
+ * @param declaration - the module's settings declaration.
12
+ * @param values - the guild's values as the service reads them: an unset (or
13
+ * invalid) field is `undefined` unless it has a default.
14
+ */
15
+ export declare function settingsStatus(declaration: SettingsDeclaration, values: Readonly<Record<string, unknown>>): SettingsStatus;
16
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/settings/status.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAEtE,mFAAmF;AACnF,MAAM,WAAW,cAAc;IAC9B,2FAA2F;IAC3F,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;CACpC;AAED;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC7B,WAAW,EAAE,mBAAmB,EAChC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACvC,cAAc,CAKhB"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.settingsStatus = settingsStatus;
4
+ /**
5
+ * The configuration status of a module's values on one guild (FR-040). A
6
+ * required field with a default always has a value, so it is never missing.
7
+ *
8
+ * @param declaration - the module's settings declaration.
9
+ * @param values - the guild's values as the service reads them: an unset (or
10
+ * invalid) field is `undefined` unless it has a default.
11
+ */
12
+ function settingsStatus(declaration, values) {
13
+ const missing = Object.entries(declaration.fields)
14
+ .filter(([key, declared]) => declared.required && values[key] === undefined)
15
+ .map(([key]) => key);
16
+ return { missing };
17
+ }
18
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/settings/status.ts"],"names":[],"mappings":";;AAgBA,wCAQC;AAhBD;;;;;;;GAOG;AACH,SAAgB,cAAc,CAC7B,WAAgC,EAChC,MAAyC;IAEzC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,MAAM,CAAC;SAChD,MAAM,CAAC,CAAC,CAAC,GAAG,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,QAAQ,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC;SAC3E,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IACtB,OAAO,EAAE,OAAO,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,77 @@
1
+ import type { Translator } from "../i18n/translator";
2
+ import type { Logger } from "../logger";
3
+ import type { Choice } from "../settings/choice";
4
+ import { type DynamicSuggestions, type FieldSpec, type SuggestionContext } from "../settings/fields/field";
5
+ import type { GuildDirectory } from "../settings/ports/guild-directory";
6
+ /**
7
+ * The ports suggestions read: the guild's directory, the translator of static
8
+ * labels, and where a slow or failed search is logged.
9
+ */
10
+ export interface SuggestionPorts {
11
+ readonly guilds: GuildDirectory;
12
+ readonly translator: Translator;
13
+ readonly logger: Logger;
14
+ }
15
+ /** What one field's suggestions are computed with: the ports, the field, and who asks. */
16
+ export interface SuggestionScope extends SuggestionPorts {
17
+ readonly moduleId: string;
18
+ /** The field's key, named in logs. */
19
+ readonly key: string;
20
+ readonly ctx: SuggestionContext;
21
+ }
22
+ /** A search the kernel runs on the module's behalf, whatever the value type it suggests. */
23
+ type AnyDynamicSuggestions = DynamicSuggestions<unknown>;
24
+ /**
25
+ * The suggestions of one field for `query` (FR-021, FR-025): a channel, role
26
+ * or member field searches the guild; an enum and static suggestions offer
27
+ * their choices translated to the requester's locale, those whose name or
28
+ * value contains the query (case-insensitive); a dynamic search gets the
29
+ * query and the context as is. A list suggests for its item. At most
30
+ * {@link MAX_AUTOCOMPLETE_CHOICES} results, the first ones kept; a search
31
+ * slower than the budget or failing yields none (logged). Never throws.
32
+ *
33
+ * @param params.scope - who asks and the ports the search reads.
34
+ * @param params.spec - the field's kind and constraints.
35
+ * @param params.query - what was typed so far; empty for a first page.
36
+ * @returns the suggestions, labels already translated.
37
+ */
38
+ export declare function suggestChoices(params: {
39
+ scope: SuggestionScope;
40
+ spec: FieldSpec;
41
+ query: string;
42
+ }): Promise<readonly Choice[]>;
43
+ /**
44
+ * The readable label of one stored value of a field, in the requester's
45
+ * locale: a channel, role or member's name on the guild, a static choice's
46
+ * translated label, or what a dynamic search says (see {@link dynamicLabel}).
47
+ * A list reads `value` as one of its items. Never throws.
48
+ *
49
+ * @param params.scope - who asks and the ports the label reads.
50
+ * @param params.spec - the field's kind and constraints.
51
+ * @param params.value - the stored value.
52
+ * @returns the label, or `undefined` when none is known.
53
+ */
54
+ export declare function suggestionLabel(params: {
55
+ scope: SuggestionScope;
56
+ spec: FieldSpec;
57
+ value: unknown;
58
+ }): Promise<string | undefined>;
59
+ /**
60
+ * What a dynamic search calls `value` (FR-022): its own `label` when it
61
+ * declares one, otherwise the name of the result of `resolve(String(value))`
62
+ * whose value is exactly `value`. `undefined` when the search does not know
63
+ * the value, or runs past the budget or fails (logged). A strict field
64
+ * accepts exactly the values this labels (FR-023).
65
+ *
66
+ * @param params.scope - who asks, and where a slow or failed search is logged.
67
+ * @param params.suggest - the field's search.
68
+ * @param params.value - the value to label.
69
+ * @returns the label, or `undefined`.
70
+ */
71
+ export declare function dynamicLabel(params: {
72
+ scope: SuggestionScope;
73
+ suggest: AnyDynamicSuggestions;
74
+ value: unknown;
75
+ }): Promise<string | undefined>;
76
+ export {};
77
+ //# sourceMappingURL=suggest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.d.ts","sourceRoot":"","sources":["../../src/settings/suggest.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EACN,KAAK,kBAAkB,EAEvB,KAAK,SAAS,EACd,KAAK,iBAAiB,EAGtB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAGvE;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,UAAU,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACxB;AAED,0FAA0F;AAC1F,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACvD,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sCAAsC;IACtC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,GAAG,EAAE,iBAAiB,CAAC;CAChC;AAED,4FAA4F;AAC5F,KAAK,qBAAqB,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAEzD;;;;;;;;;;;;;GAaG;AACH,wBAAsB,cAAc,CAAC,MAAM,EAAE;IAC5C,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,CAAC,CAG7B;AAgED;;;;;;;;;;GAUG;AACH,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC7C,KAAK,EAAE,eAAe,CAAC;IACvB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAgC9B;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE;IACpC,KAAK,EAAE,eAAe,CAAC;IACvB,OAAO,EAAE,qBAAqB,CAAC;IAC/B,KAAK,EAAE,OAAO,CAAC;CACf,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAc9B"}
@@ -0,0 +1,192 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.suggestChoices = suggestChoices;
4
+ exports.suggestionLabel = suggestionLabel;
5
+ exports.dynamicLabel = dynamicLabel;
6
+ const autocomplete_limits_1 = require("../discord/command/autocomplete-limits");
7
+ const locale_1 = require("../i18n/locale");
8
+ const field_1 = require("../settings/fields/field");
9
+ const timed_search_1 = require("../settings/timed-search");
10
+ /**
11
+ * The suggestions of one field for `query` (FR-021, FR-025): a channel, role
12
+ * or member field searches the guild; an enum and static suggestions offer
13
+ * their choices translated to the requester's locale, those whose name or
14
+ * value contains the query (case-insensitive); a dynamic search gets the
15
+ * query and the context as is. A list suggests for its item. At most
16
+ * {@link MAX_AUTOCOMPLETE_CHOICES} results, the first ones kept; a search
17
+ * slower than the budget or failing yields none (logged). Never throws.
18
+ *
19
+ * @param params.scope - who asks and the ports the search reads.
20
+ * @param params.spec - the field's kind and constraints.
21
+ * @param params.query - what was typed so far; empty for a first page.
22
+ * @returns the suggestions, labels already translated.
23
+ */
24
+ async function suggestChoices(params) {
25
+ const choices = await allChoices(params);
26
+ return choices.slice(0, autocomplete_limits_1.MAX_AUTOCOMPLETE_CHOICES);
27
+ }
28
+ async function allChoices(params) {
29
+ const { scope, spec, query } = params;
30
+ const { guilds, ctx } = scope;
31
+ switch (spec.kind) {
32
+ case "channel":
33
+ return timed({
34
+ scope,
35
+ fallback: [],
36
+ search: async () => named(await guilds.searchChannels(ctx.guildId, query, spec.types)),
37
+ });
38
+ case "role":
39
+ return timed({
40
+ scope,
41
+ fallback: [],
42
+ search: async () => named(await guilds.searchRoles(ctx.guildId, query)),
43
+ });
44
+ case "user":
45
+ return timed({
46
+ scope,
47
+ fallback: [],
48
+ search: async () => named(await guilds.searchMembers(ctx.guildId, query)),
49
+ });
50
+ case "enum":
51
+ return matching({ choices: translated({ scope, choices: spec.choices }), query });
52
+ case "integer":
53
+ case "text":
54
+ return declaredChoices({ scope, suggest: spec.suggest, query });
55
+ case "list":
56
+ return allChoices({ scope, spec: spec.item.spec, query });
57
+ case "color":
58
+ case "duration":
59
+ case "number":
60
+ case "boolean":
61
+ case "secret":
62
+ case "toggles":
63
+ return [];
64
+ default:
65
+ return (0, field_1.unhandledFieldKind)(spec);
66
+ }
67
+ }
68
+ /** The suggestions a module declared on an integer or text field, if any. */
69
+ async function declaredChoices(params) {
70
+ const { scope, suggest, query } = params;
71
+ if (suggest === undefined) {
72
+ return [];
73
+ }
74
+ if ("choices" in suggest) {
75
+ return matching({ choices: translated({ scope, choices: suggest.choices }), query });
76
+ }
77
+ const search = suggest;
78
+ return timed({ scope, fallback: [], search: () => search.resolve(query, scope.ctx) });
79
+ }
80
+ /**
81
+ * The readable label of one stored value of a field, in the requester's
82
+ * locale: a channel, role or member's name on the guild, a static choice's
83
+ * translated label, or what a dynamic search says (see {@link dynamicLabel}).
84
+ * A list reads `value` as one of its items. Never throws.
85
+ *
86
+ * @param params.scope - who asks and the ports the label reads.
87
+ * @param params.spec - the field's kind and constraints.
88
+ * @param params.value - the stored value.
89
+ * @returns the label, or `undefined` when none is known.
90
+ */
91
+ async function suggestionLabel(params) {
92
+ const { scope, spec, value } = params;
93
+ const { guilds, ctx } = scope;
94
+ switch (spec.kind) {
95
+ case "channel":
96
+ return entityName({ scope, find: (id) => guilds.channel(ctx.guildId, id), value });
97
+ case "role":
98
+ return entityName({ scope, find: (id) => guilds.role(ctx.guildId, id), value });
99
+ case "user":
100
+ return entityName({ scope, find: (id) => guilds.member(ctx.guildId, id), value });
101
+ case "enum":
102
+ return staticLabel({ scope, choices: spec.choices, value });
103
+ case "integer":
104
+ case "text":
105
+ if (spec.suggest === undefined) {
106
+ return undefined;
107
+ }
108
+ return "choices" in spec.suggest
109
+ ? staticLabel({ scope, choices: spec.suggest.choices, value })
110
+ : dynamicLabel({ scope, suggest: spec.suggest, value });
111
+ case "list":
112
+ return suggestionLabel({ scope, spec: spec.item.spec, value });
113
+ case "color":
114
+ case "duration":
115
+ case "number":
116
+ case "boolean":
117
+ case "secret":
118
+ case "toggles":
119
+ return undefined;
120
+ default:
121
+ return (0, field_1.unhandledFieldKind)(spec);
122
+ }
123
+ }
124
+ /**
125
+ * What a dynamic search calls `value` (FR-022): its own `label` when it
126
+ * declares one, otherwise the name of the result of `resolve(String(value))`
127
+ * whose value is exactly `value`. `undefined` when the search does not know
128
+ * the value, or runs past the budget or fails (logged). A strict field
129
+ * accepts exactly the values this labels (FR-023).
130
+ *
131
+ * @param params.scope - who asks, and where a slow or failed search is logged.
132
+ * @param params.suggest - the field's search.
133
+ * @param params.value - the value to label.
134
+ * @returns the label, or `undefined`.
135
+ */
136
+ function dynamicLabel(params) {
137
+ const { scope, suggest, value } = params;
138
+ const { label } = suggest;
139
+ if (label !== undefined) {
140
+ return timed({ scope, fallback: undefined, search: () => label(value, scope.ctx) });
141
+ }
142
+ return timed({
143
+ scope,
144
+ fallback: undefined,
145
+ search: async () => {
146
+ const results = await suggest.resolve(String(value), scope.ctx);
147
+ return results.find((choice) => choice.value === value)?.name;
148
+ },
149
+ });
150
+ }
151
+ /** A search within the suggestion budget, logged under the scope's module, field and guild. */
152
+ function timed(params) {
153
+ const { scope, fallback, search } = params;
154
+ return (0, timed_search_1.timedSearch)({
155
+ search,
156
+ fallback,
157
+ logger: scope.logger,
158
+ at: { moduleId: scope.moduleId, field: scope.key, guildId: scope.ctx.guildId },
159
+ });
160
+ }
161
+ /** The name of the guild entity a stored id names, if the guild still has it. */
162
+ function entityName(params) {
163
+ const { scope, find, value } = params;
164
+ if (typeof value !== "string") {
165
+ return Promise.resolve(undefined);
166
+ }
167
+ return timed({ scope, fallback: undefined, search: async () => (await find(value))?.name });
168
+ }
169
+ /** Guild entities as choices: their name shown, their id stored. */
170
+ function named(entities) {
171
+ return entities.map((entity) => ({ name: entity.name, value: entity.id }));
172
+ }
173
+ /** Static choices with their labels translated to the requester's locale. */
174
+ function translated(params) {
175
+ const { scope, choices } = params;
176
+ const locale = (0, locale_1.resolveLocale)([scope.ctx.locale], scope.translator.defaultLocale);
177
+ return choices.map((choice) => ({
178
+ name: scope.translator.translate(locale, choice.label),
179
+ value: choice.value,
180
+ }));
181
+ }
182
+ /** The choices whose name or value contains `query`, case-insensitive; all of them for an empty query. */
183
+ function matching(params) {
184
+ const needle = params.query.trim().toLowerCase();
185
+ return params.choices.filter((choice) => choice.name.toLowerCase().includes(needle) ||
186
+ String(choice.value).toLowerCase().includes(needle));
187
+ }
188
+ /** The translated label of the static choice storing `value`. */
189
+ function staticLabel(params) {
190
+ return translated(params).find((choice) => choice.value === params.value)?.name;
191
+ }
192
+ //# sourceMappingURL=suggest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"suggest.js","sourceRoot":"","sources":["../../src/settings/suggest.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,43 @@
1
+ /** Id of the kernel's own settings declaration. */
2
+ export declare const KERNEL_SETTINGS_ID = "kernel";
3
+ /**
4
+ * What the kernel declaration needs to know of a module. A `BotModule`
5
+ * satisfies it as is, so the composition root passes its modules unchanged.
6
+ */
7
+ export interface ModuleEnablement {
8
+ readonly name: string;
9
+ /**
10
+ * Catalog key of the module's name as administrators read it, shown on its
11
+ * toggle. Without one the toggle shows the raw module name, and the translator
12
+ * logs it as an unknown key: give every toggleable module a label.
13
+ */
14
+ readonly label?: string;
15
+ /** Whether the module starts enabled in a guild that never toggled it. Defaults to `true`. */
16
+ readonly defaultEnabled?: boolean;
17
+ }
18
+ /**
19
+ * The kernel's own settings, declared like any module's (FR-039): which
20
+ * modules are enabled on the guild, and the bot's language there.
21
+ *
22
+ * A factory rather than a constant because the module names are only known at
23
+ * composition: `createSettingsRegistry` calls it with the modules it receives.
24
+ *
25
+ * @param modules - the registered modules, in registration order.
26
+ * @returns the declaration of id {@link KERNEL_SETTINGS_ID}.
27
+ * @throws SettingsDeclarationError when two modules share a name.
28
+ */
29
+ export declare function kernelSettings(modules: readonly ModuleEnablement[]): {
30
+ readonly id: "kernel";
31
+ readonly version: 1;
32
+ readonly labels: {
33
+ readonly title: "core.settings.kernel.title";
34
+ readonly description: "core.settings.kernel.description";
35
+ };
36
+ readonly fields: {
37
+ readonly modules: import("..").Field<Readonly<Record<string, boolean>>, "defined">;
38
+ readonly locale: import("..").Field<"en" | "fr", "optional">;
39
+ };
40
+ };
41
+ /** The kernel's settings declaration, as built by {@link kernelSettings}. */
42
+ export type KernelSettings = ReturnType<typeof kernelSettings>;
43
+ //# sourceMappingURL=kernel-settings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel-settings.d.ts","sourceRoot":"","sources":["../../../src/settings/system/kernel-settings.ts"],"names":[],"mappings":"AAKA,mDAAmD;AACnD,eAAO,MAAM,kBAAkB,WAAW,CAAC;AAE3C;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAChC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,8FAA8F;IAC9F,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAC;CAClC;AAOD;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,SAAS,gBAAgB,EAAE;;;;;;;;;;;EA8BlE;AAED,6EAA6E;AAC7E,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.KERNEL_SETTINGS_ID = void 0;
4
+ exports.kernelSettings = kernelSettings;
5
+ const locale_1 = require("../../i18n/locale");
6
+ const define_settings_1 = require("../../settings/define-settings");
7
+ const builders_1 = require("../../settings/fields/builders");
8
+ const messages_1 = require("../../settings/messages");
9
+ /** Id of the kernel's own settings declaration. */
10
+ exports.KERNEL_SETTINGS_ID = "kernel";
11
+ const LOCALE_LABELS = {
12
+ en: messages_1.KERNEL_SETTINGS_MESSAGES.localeEn,
13
+ fr: messages_1.KERNEL_SETTINGS_MESSAGES.localeFr,
14
+ };
15
+ /**
16
+ * The kernel's own settings, declared like any module's (FR-039): which
17
+ * modules are enabled on the guild, and the bot's language there.
18
+ *
19
+ * A factory rather than a constant because the module names are only known at
20
+ * composition: `createSettingsRegistry` calls it with the modules it receives.
21
+ *
22
+ * @param modules - the registered modules, in registration order.
23
+ * @returns the declaration of id {@link KERNEL_SETTINGS_ID}.
24
+ * @throws SettingsDeclarationError when two modules share a name.
25
+ */
26
+ function kernelSettings(modules) {
27
+ return (0, define_settings_1.defineSettings)({
28
+ id: exports.KERNEL_SETTINGS_ID,
29
+ version: 1,
30
+ labels: {
31
+ title: messages_1.KERNEL_SETTINGS_MESSAGES.title,
32
+ description: messages_1.KERNEL_SETTINGS_MESSAGES.description,
33
+ },
34
+ fields: {
35
+ modules: builders_1.field.toggles({
36
+ label: messages_1.KERNEL_SETTINGS_MESSAGES.modules,
37
+ description: messages_1.KERNEL_SETTINGS_MESSAGES.modulesDescription,
38
+ keys: modules.map(({ name }) => name),
39
+ keyLabels: Object.fromEntries(modules.flatMap(({ name, label }) => (label === undefined ? [] : [[name, label]]))),
40
+ default: Object.fromEntries(modules.map(({ name, defaultEnabled }) => [name, defaultEnabled ?? true])),
41
+ }),
42
+ locale: builders_1.field.enum({
43
+ label: messages_1.KERNEL_SETTINGS_MESSAGES.locale,
44
+ description: messages_1.KERNEL_SETTINGS_MESSAGES.localeDescription,
45
+ choices: locale_1.SUPPORTED_LOCALES.map((locale) => ({
46
+ value: locale,
47
+ label: LOCALE_LABELS[locale],
48
+ })),
49
+ }),
50
+ },
51
+ });
52
+ }
53
+ //# sourceMappingURL=kernel-settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kernel-settings.js","sourceRoot":"","sources":["../../../src/settings/system/kernel-settings.ts"],"names":[],"mappings":";;;AAwCA,wCA8BC;AAtED,0CAA+D;AAC/D,gEAA4D;AAC5D,yDAAmD;AACnD,kDAA+D;AAE/D,mDAAmD;AACtC,QAAA,kBAAkB,GAAG,QAAQ,CAAC;AAkB3C,MAAM,aAAa,GAAqC;IACvD,EAAE,EAAE,mCAAwB,CAAC,QAAQ;IACrC,EAAE,EAAE,mCAAwB,CAAC,QAAQ;CACrC,CAAC;AAEF;;;;;;;;;;GAUG;AACH,SAAgB,cAAc,CAAC,OAAoC;IAClE,OAAO,IAAA,gCAAc,EAAC;QACrB,EAAE,EAAE,0BAAkB;QACtB,OAAO,EAAE,CAAC;QACV,MAAM,EAAE;YACP,KAAK,EAAE,mCAAwB,CAAC,KAAK;YACrC,WAAW,EAAE,mCAAwB,CAAC,WAAW;SACjD;QACD,MAAM,EAAE;YACP,OAAO,EAAE,gBAAK,CAAC,OAAO,CAAS;gBAC9B,KAAK,EAAE,mCAAwB,CAAC,OAAO;gBACvC,WAAW,EAAE,mCAAwB,CAAC,kBAAkB;gBACxD,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,CAAC;gBACrC,SAAS,EAAE,MAAM,CAAC,WAAW,CAC5B,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAClF;gBACD,OAAO,EAAE,MAAM,CAAC,WAAW,CAC1B,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,cAAc,IAAI,IAAI,CAAC,CAAC,CACzE;aACD,CAAC;YACF,MAAM,EAAE,gBAAK,CAAC,IAAI,CAAC;gBAClB,KAAK,EAAE,mCAAwB,CAAC,MAAM;gBACtC,WAAW,EAAE,mCAAwB,CAAC,iBAAiB;gBACvD,OAAO,EAAE,0BAAiB,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;oBAC3C,KAAK,EAAE,MAAM;oBACb,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC;iBAC5B,CAAC,CAAC;aACH,CAAC;SACF;KACD,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { Logger } from "../../logger";
2
+ import type { SettingsRegistry } from "../../settings/registry";
3
+ import type { SettingsService } from "../../settings/settings-service";
4
+ /**
5
+ * Whether a module runs on a guild. The command, component and event routers
6
+ * check it before running a module's handler there; scheduled jobs call it
7
+ * themselves (FR-036).
8
+ */
9
+ export interface ModuleGate {
10
+ isEnabled(moduleName: string, guildId: string): Promise<boolean>;
11
+ }
12
+ /**
13
+ * Create the gate over the guild's kernel settings (`registry.kernel`), read
14
+ * through the service's cache, so checking it on every interaction does not
15
+ * hit the store.
16
+ *
17
+ * A module the kernel declaration does not know is never gated. When the
18
+ * settings cannot be read, the module runs and the error is logged: a store
19
+ * outage must not switch every module off.
20
+ *
21
+ * @param deps.service - reads the guild's kernel settings.
22
+ * @param deps.registry - holds the kernel declaration built from the modules.
23
+ * @param deps.logger - where a failed read is reported.
24
+ * @returns the gate shared by the routers and the scheduled jobs.
25
+ */
26
+ export declare function createModuleGate(deps: {
27
+ service: SettingsService;
28
+ registry: SettingsRegistry;
29
+ logger: Logger;
30
+ }): ModuleGate;
31
+ //# sourceMappingURL=module-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-gate.d.ts","sourceRoot":"","sources":["../../../src/settings/system/module-gate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AACvC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;AAEnE;;;;GAIG;AACH,MAAM,WAAW,UAAU;IAC1B,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACjE;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE;IACtC,OAAO,EAAE,eAAe,CAAC;IACzB,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC;CACf,GAAG,UAAU,CAgBb"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createModuleGate = createModuleGate;
4
+ const error_message_1 = require("../../errors/error-message");
5
+ /**
6
+ * Create the gate over the guild's kernel settings (`registry.kernel`), read
7
+ * through the service's cache, so checking it on every interaction does not
8
+ * hit the store.
9
+ *
10
+ * A module the kernel declaration does not know is never gated. When the
11
+ * settings cannot be read, the module runs and the error is logged: a store
12
+ * outage must not switch every module off.
13
+ *
14
+ * @param deps.service - reads the guild's kernel settings.
15
+ * @param deps.registry - holds the kernel declaration built from the modules.
16
+ * @param deps.logger - where a failed read is reported.
17
+ * @returns the gate shared by the routers and the scheduled jobs.
18
+ */
19
+ function createModuleGate(deps) {
20
+ const { service, registry, logger } = deps;
21
+ return {
22
+ async isEnabled(moduleName, guildId) {
23
+ try {
24
+ const { modules } = await service.get(registry.kernel, guildId);
25
+ return modules[moduleName] ?? true;
26
+ }
27
+ catch (error) {
28
+ logger.error({ module: moduleName, guildId, err: (0, error_message_1.errorMessage)(error) }, "Could not read whether the module is enabled; letting it run");
29
+ return true;
30
+ }
31
+ },
32
+ };
33
+ }
34
+ //# sourceMappingURL=module-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"module-gate.js","sourceRoot":"","sources":["../../../src/settings/system/module-gate.ts"],"names":[],"mappings":";;AA4BA,4CAoBC;AAhDD,0DAAsD;AActD;;;;;;;;;;;;;GAaG;AACH,SAAgB,gBAAgB,CAAC,IAIhC;IACA,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAC3C,OAAO;QACN,KAAK,CAAC,SAAS,CAAC,UAAkB,EAAE,OAAe;YAClD,IAAI,CAAC;gBACJ,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;gBAChE,OAAO,OAAO,CAAC,UAAU,CAAC,IAAI,IAAI,CAAC;YACpC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBAChB,MAAM,CAAC,KAAK,CACX,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC,EAAE,EACzD,8DAA8D,CAC9D,CAAC;gBACF,OAAO,IAAI,CAAC;YACb,CAAC;QACF,CAAC;KACD,CAAC;AACH,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { type ContractAssertion, type DescribeFn, type ExpectFn, type ItFn, runSettingsStoreContract, } from "../../settings/testing/settings-store-contract";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/settings/testing/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,iBAAiB,EACtB,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,IAAI,EACT,wBAAwB,GACxB,MAAM,4CAA4C,CAAC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runSettingsStoreContract = void 0;
4
+ var settings_store_contract_1 = require("../../settings/testing/settings-store-contract");
5
+ Object.defineProperty(exports, "runSettingsStoreContract", { enumerable: true, get: function () { return settings_store_contract_1.runSettingsStoreContract; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/settings/testing/index.ts"],"names":[],"mappings":";;;AAAA,sFAMoD;AADnD,mIAAA,wBAAwB,OAAA"}
@@ -0,0 +1,29 @@
1
+ import type { SettingsStore } from "../../settings/ports/settings-store";
2
+ /** Minimal shape of a test runner's `describe`, so this suite imports no framework. */
3
+ export type DescribeFn = (name: string, body: () => void) => void;
4
+ /** Minimal shape of a test runner's `it`. */
5
+ export type ItFn = (name: string, body: () => Promise<void>) => void;
6
+ /** The assertions this suite relies on; Vitest's and Jest's `expect` both satisfy it. */
7
+ export interface ContractAssertion {
8
+ toBe(expected: unknown): void;
9
+ toEqual(expected: unknown): void;
10
+ toBeNull(): void;
11
+ toBeInstanceOf(expected: abstract new (...args: never[]) => unknown): void;
12
+ }
13
+ /** Minimal shape of a test runner's `expect`. */
14
+ export type ExpectFn = (actual: unknown) => ContractAssertion;
15
+ /**
16
+ * Behaviour every {@link SettingsStore} implementation must have: one case per
17
+ * guarantee stated on the port. Run it from the adapter's own test file with
18
+ * the test runner's `describe`, `it` and `expect`:
19
+ * `runSettingsStoreContract(createMyStore, { describe, it, expect })`.
20
+ *
21
+ * @param createStore - returns a store with no record in it; called once per case.
22
+ * @param runner - the test runner's functions, so this suite imports no framework.
23
+ */
24
+ export declare function runSettingsStoreContract(createStore: () => SettingsStore | Promise<SettingsStore>, runner: {
25
+ describe: DescribeFn;
26
+ it: ItFn;
27
+ expect: ExpectFn;
28
+ }): void;
29
+ //# sourceMappingURL=settings-store-contract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"settings-store-contract.d.ts","sourceRoot":"","sources":["../../../src/settings/testing/settings-store-contract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,aAAa,EAAkB,MAAM,iCAAiC,CAAC;AAErF,uFAAuF;AACvF,MAAM,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,IAAI,KAAK,IAAI,CAAC;AAElE,6CAA6C;AAC7C,MAAM,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC;AAErE,yFAAyF;AACzF,MAAM,WAAW,iBAAiB;IACjC,IAAI,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC9B,OAAO,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IACjC,QAAQ,IAAI,IAAI,CAAC;IACjB,cAAc,CAAC,QAAQ,EAAE,QAAQ,MAAM,GAAG,IAAI,EAAE,KAAK,EAAE,KAAK,OAAO,GAAG,IAAI,CAAC;CAC3E;AAED,iDAAiD;AACjD,MAAM,MAAM,QAAQ,GAAG,CAAC,MAAM,EAAE,OAAO,KAAK,iBAAiB,CAAC;AAkC9D;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACvC,WAAW,EAAE,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC,EACzD,MAAM,EAAE;IAAE,QAAQ,EAAE,UAAU,CAAC;IAAC,EAAE,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,QAAQ,CAAA;CAAE,GAC1D,IAAI,CAqNN"}