@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.
- package/README.md +318 -1
- package/dist/authz/require-level-guard.d.ts +1 -1
- package/dist/authz/require-level-guard.d.ts.map +1 -1
- package/dist/color.d.ts +42 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +130 -0
- package/dist/color.js.map +1 -0
- package/dist/discord/command/all-required.d.ts +8 -0
- package/dist/discord/command/all-required.d.ts.map +1 -0
- package/dist/discord/command/all-required.js +12 -0
- package/dist/discord/command/all-required.js.map +1 -0
- package/dist/discord/command/autocomplete-dispatcher.d.ts.map +1 -1
- package/dist/discord/command/autocomplete-dispatcher.js +2 -1
- package/dist/discord/command/autocomplete-dispatcher.js.map +1 -1
- package/dist/discord/command/autocomplete-limits.d.ts +3 -0
- package/dist/discord/command/autocomplete-limits.d.ts.map +1 -0
- package/dist/discord/command/autocomplete-limits.js +6 -0
- package/dist/discord/command/autocomplete-limits.js.map +1 -0
- package/dist/discord/command/autocomplete.d.ts +6 -1
- package/dist/discord/command/autocomplete.d.ts.map +1 -1
- package/dist/discord/command/autocomplete.js +6 -6
- package/dist/discord/command/autocomplete.js.map +1 -1
- package/dist/discord/command/command-responders.d.ts +26 -0
- package/dist/discord/command/command-responders.d.ts.map +1 -0
- package/dist/discord/command/command-responders.js +16 -0
- package/dist/discord/command/command-responders.js.map +1 -0
- package/dist/discord/command/context.d.ts +8 -17
- package/dist/discord/command/context.d.ts.map +1 -1
- package/dist/discord/command/context.js +8 -37
- package/dist/discord/command/context.js.map +1 -1
- package/dist/discord/command/cooldown-guard.d.ts +1 -1
- package/dist/discord/command/cooldown-guard.d.ts.map +1 -1
- package/dist/discord/command/create-command.d.ts +1 -8
- package/dist/discord/command/create-command.d.ts.map +1 -1
- package/dist/discord/command/create-command.js +17 -65
- package/dist/discord/command/create-command.js.map +1 -1
- package/dist/discord/command/create-context-menu-command.d.ts +3 -9
- package/dist/discord/command/create-context-menu-command.d.ts.map +1 -1
- package/dist/discord/command/create-context-menu-command.js +14 -65
- package/dist/discord/command/create-context-menu-command.js.map +1 -1
- package/dist/discord/command/errors.d.ts +1 -1
- package/dist/discord/command/errors.d.ts.map +1 -1
- package/dist/discord/command/errors.js +2 -2
- package/dist/discord/command/errors.js.map +1 -1
- package/dist/discord/command/guard.d.ts +15 -8
- package/dist/discord/command/guard.d.ts.map +1 -1
- package/dist/discord/command/guard.js +4 -4
- package/dist/discord/command/guard.js.map +1 -1
- package/dist/discord/command/options.d.ts +1 -10
- package/dist/discord/command/options.d.ts.map +1 -1
- package/dist/discord/command/options.js +127 -320
- package/dist/discord/command/options.js.map +1 -1
- package/dist/discord/command/passes-guard.d.ts +14 -0
- package/dist/discord/command/passes-guard.d.ts.map +1 -0
- package/dist/discord/command/passes-guard.js +27 -0
- package/dist/discord/command/passes-guard.js.map +1 -0
- package/dist/discord/command/permission-guard.d.ts +1 -1
- package/dist/discord/command/permission-guard.d.ts.map +1 -1
- package/dist/discord/command/render-command-failure.d.ts +23 -0
- package/dist/discord/command/render-command-failure.d.ts.map +1 -0
- package/dist/discord/command/render-command-failure.js +40 -0
- package/dist/discord/command/render-command-failure.js.map +1 -0
- package/dist/discord/command/route-key.d.ts +8 -0
- package/dist/discord/command/route-key.d.ts.map +1 -0
- package/dist/discord/command/route-key.js +13 -0
- package/dist/discord/command/route-key.js.map +1 -0
- package/dist/discord/command/router.d.ts +32 -7
- package/dist/discord/command/router.d.ts.map +1 -1
- package/dist/discord/command/router.js +48 -10
- package/dist/discord/command/router.js.map +1 -1
- package/dist/discord/command/send-embed.d.ts +14 -0
- package/dist/discord/command/send-embed.d.ts.map +1 -0
- package/dist/discord/command/send-embed.js +37 -0
- package/dist/discord/command/send-embed.js.map +1 -0
- package/dist/discord/command/types.d.ts +7 -1
- package/dist/discord/command/types.d.ts.map +1 -1
- package/dist/discord/components/component-access.d.ts +12 -0
- package/dist/discord/components/component-access.d.ts.map +1 -0
- package/dist/discord/components/component-access.js +21 -0
- package/dist/discord/components/component-access.js.map +1 -0
- package/dist/discord/components/component-router.d.ts +37 -15
- package/dist/discord/components/component-router.d.ts.map +1 -1
- package/dist/discord/components/component-router.js +44 -32
- package/dist/discord/components/component-router.js.map +1 -1
- package/dist/discord/components/interactive-message/index.d.ts +3 -1
- package/dist/discord/components/interactive-message/index.d.ts.map +1 -1
- package/dist/discord/components/interactive-message/index.js +5 -3
- package/dist/discord/components/interactive-message/index.js.map +1 -1
- package/dist/discord/components/interactive-message/interactive-message-collector.d.ts +3 -28
- package/dist/discord/components/interactive-message/interactive-message-collector.d.ts.map +1 -1
- package/dist/discord/components/interactive-message/interactive-message-collector.js +6 -53
- package/dist/discord/components/interactive-message/interactive-message-collector.js.map +1 -1
- package/dist/discord/components/interactive-message/message-edit-options.d.ts +18 -0
- package/dist/discord/components/interactive-message/message-edit-options.d.ts.map +1 -0
- package/dist/discord/components/interactive-message/message-edit-options.js +40 -0
- package/dist/discord/components/interactive-message/message-edit-options.js.map +1 -0
- package/dist/discord/components/interactive-message/mount-interactive-message.d.ts +2 -1
- package/dist/discord/components/interactive-message/mount-interactive-message.d.ts.map +1 -1
- package/dist/discord/components/interactive-message/mount-interactive-message.js +4 -2
- package/dist/discord/components/interactive-message/mount-interactive-message.js.map +1 -1
- package/dist/discord/components/interactive-message/state-store.d.ts +12 -0
- package/dist/discord/components/interactive-message/state-store.d.ts.map +1 -0
- package/dist/discord/components/interactive-message/state-store.js +14 -0
- package/dist/discord/components/interactive-message/state-store.js.map +1 -0
- package/dist/discord/components/paginator/mount-paginator.js +7 -5
- package/dist/discord/components/paginator/mount-paginator.js.map +1 -1
- package/dist/discord/components/paginator/paginator-view.d.ts +1 -1
- package/dist/discord/components/paginator/paginator-view.d.ts.map +1 -1
- package/dist/discord/components/persistent-paginator.d.ts +1 -1
- package/dist/discord/components/persistent-paginator.d.ts.map +1 -1
- package/dist/discord/components/persistent-paginator.js +6 -6
- package/dist/discord/components/persistent-paginator.js.map +1 -1
- package/dist/discord/components/settings-editor/from-declaration-controls.d.ts +67 -0
- package/dist/discord/components/settings-editor/from-declaration-controls.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-controls.js +245 -0
- package/dist/discord/components/settings-editor/from-declaration-controls.js.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-display.d.ts +23 -0
- package/dist/discord/components/settings-editor/from-declaration-display.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-display.js +114 -0
- package/dist/discord/components/settings-editor/from-declaration-display.js.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-layout.d.ts +33 -0
- package/dist/discord/components/settings-editor/from-declaration-layout.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-layout.js +178 -0
- package/dist/discord/components/settings-editor/from-declaration-layout.js.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-search.d.ts +27 -0
- package/dist/discord/components/settings-editor/from-declaration-search.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-search.js +58 -0
- package/dist/discord/components/settings-editor/from-declaration-search.js.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-stored.d.ts +21 -0
- package/dist/discord/components/settings-editor/from-declaration-stored.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-stored.js +37 -0
- package/dist/discord/components/settings-editor/from-declaration-stored.js.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-subject.d.ts +32 -0
- package/dist/discord/components/settings-editor/from-declaration-subject.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-subject.js +65 -0
- package/dist/discord/components/settings-editor/from-declaration-subject.js.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-values.d.ts +57 -0
- package/dist/discord/components/settings-editor/from-declaration-values.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration-values.js +187 -0
- package/dist/discord/components/settings-editor/from-declaration-values.js.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration.d.ts +39 -0
- package/dist/discord/components/settings-editor/from-declaration.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/from-declaration.js +132 -0
- package/dist/discord/components/settings-editor/from-declaration.js.map +1 -0
- package/dist/discord/components/settings-editor/index.d.ts +3 -1
- package/dist/discord/components/settings-editor/index.d.ts.map +1 -1
- package/dist/discord/components/settings-editor/index.js +6 -3
- package/dist/discord/components/settings-editor/index.js.map +1 -1
- package/dist/discord/components/settings-editor/mount-settings-editor.d.ts +16 -2
- package/dist/discord/components/settings-editor/mount-settings-editor.d.ts.map +1 -1
- package/dist/discord/components/settings-editor/mount-settings-editor.js +14 -10
- package/dist/discord/components/settings-editor/mount-settings-editor.js.map +1 -1
- package/dist/discord/components/settings-editor/navigation.d.ts +20 -0
- package/dist/discord/components/settings-editor/navigation.d.ts.map +1 -1
- package/dist/discord/components/settings-editor/navigation.js +22 -0
- package/dist/discord/components/settings-editor/navigation.js.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor-card.view.d.ts +4 -3
- package/dist/discord/components/settings-editor/settings-editor-card.view.d.ts.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor-card.view.js +60 -34
- package/dist/discord/components/settings-editor/settings-editor-card.view.js.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor-field-modal.d.ts +2 -1
- package/dist/discord/components/settings-editor/settings-editor-field-modal.d.ts.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor-field-modal.js +48 -72
- package/dist/discord/components/settings-editor/settings-editor-field-modal.js.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor-field-values.d.ts +6 -0
- package/dist/discord/components/settings-editor/settings-editor-field-values.d.ts.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-field-values.js +13 -0
- package/dist/discord/components/settings-editor/settings-editor-field-values.js.map +1 -0
- package/dist/discord/components/settings-editor/settings-editor-fields.d.ts +6 -5
- package/dist/discord/components/settings-editor/settings-editor-fields.d.ts.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor-fields.js +0 -10
- package/dist/discord/components/settings-editor/settings-editor-fields.js.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor.view.d.ts +3 -2
- package/dist/discord/components/settings-editor/settings-editor.view.d.ts.map +1 -1
- package/dist/discord/components/settings-editor/settings-editor.view.js +4 -21
- package/dist/discord/components/settings-editor/settings-editor.view.js.map +1 -1
- package/dist/discord/events/event-guild-id.d.ts +10 -0
- package/dist/discord/events/event-guild-id.d.ts.map +1 -0
- package/dist/discord/events/event-guild-id.js +37 -0
- package/dist/discord/events/event-guild-id.js.map +1 -0
- package/dist/discord/events/event-router.d.ts +17 -3
- package/dist/discord/events/event-router.d.ts.map +1 -1
- package/dist/discord/events/event-router.js +33 -9
- package/dist/discord/events/event-router.js.map +1 -1
- package/dist/discord/i18n.d.ts +17 -2
- package/dist/discord/i18n.d.ts.map +1 -1
- package/dist/discord/i18n.js +43 -6
- package/dist/discord/i18n.js.map +1 -1
- package/dist/discord/interaction/interaction-locale.d.ts +14 -0
- package/dist/discord/interaction/interaction-locale.d.ts.map +1 -0
- package/dist/discord/interaction/interaction-locale.js +12 -0
- package/dist/discord/interaction/interaction-locale.js.map +1 -0
- package/dist/discord/interaction/locale-resolver.d.ts +27 -0
- package/dist/discord/interaction/locale-resolver.d.ts.map +1 -0
- package/dist/discord/interaction/locale-resolver.js +3 -0
- package/dist/discord/interaction/locale-resolver.js.map +1 -0
- package/dist/discord/interaction/modal.d.ts.map +1 -1
- package/dist/discord/interaction/modal.js +5 -40
- package/dist/discord/interaction/modal.js.map +1 -1
- package/dist/discord/interaction/reply-locale.d.ts +18 -0
- package/dist/discord/interaction/reply-locale.d.ts.map +1 -0
- package/dist/discord/interaction/reply-locale.js +25 -0
- package/dist/discord/interaction/reply-locale.js.map +1 -0
- package/dist/discord/interaction/select-bounds.d.ts +19 -0
- package/dist/discord/interaction/select-bounds.d.ts.map +1 -0
- package/dist/discord/interaction/select-bounds.js +17 -0
- package/dist/discord/interaction/select-bounds.js.map +1 -0
- package/dist/discord/interaction/select-menu.d.ts.map +1 -1
- package/dist/discord/interaction/select-menu.js +2 -9
- package/dist/discord/interaction/select-menu.js.map +1 -1
- package/dist/discord/placeholder-registry.d.ts +1 -1
- package/dist/discord/placeholder-registry.d.ts.map +1 -1
- package/dist/discord/presenter.d.ts +1 -1
- package/dist/discord/presenter.d.ts.map +1 -1
- package/dist/discord/settings/discord-guild-directory.d.ts +28 -0
- package/dist/discord/settings/discord-guild-directory.d.ts.map +1 -0
- package/dist/discord/settings/discord-guild-directory.js +171 -0
- package/dist/discord/settings/discord-guild-directory.js.map +1 -0
- package/dist/discord/settings/guild-locale-resolver.d.ts +25 -0
- package/dist/discord/settings/guild-locale-resolver.d.ts.map +1 -0
- package/dist/discord/settings/guild-locale-resolver.js +33 -0
- package/dist/discord/settings/guild-locale-resolver.js.map +1 -0
- package/dist/discord/settings/is-module-disabled.d.ts +16 -0
- package/dist/discord/settings/is-module-disabled.d.ts.map +1 -0
- package/dist/discord/settings/is-module-disabled.js +20 -0
- package/dist/discord/settings/is-module-disabled.js.map +1 -0
- package/dist/discord/settings/module-disabled-embed.d.ts +13 -0
- package/dist/discord/settings/module-disabled-embed.d.ts.map +1 -0
- package/dist/discord/settings/module-disabled-embed.js +16 -0
- package/dist/discord/settings/module-disabled-embed.js.map +1 -0
- package/dist/discord/settings/require-configured.d.ts +26 -0
- package/dist/discord/settings/require-configured.d.ts.map +1 -0
- package/dist/discord/settings/require-configured.js +62 -0
- package/dist/discord/settings/require-configured.js.map +1 -0
- package/dist/discord/ui/color-aliases.d.ts +31 -0
- package/dist/discord/ui/color-aliases.d.ts.map +1 -0
- package/dist/discord/ui/color-aliases.js +66 -0
- package/dist/discord/ui/color-aliases.js.map +1 -0
- package/dist/discord/ui/color-input.d.ts +5 -32
- package/dist/discord/ui/color-input.d.ts.map +1 -1
- package/dist/discord/ui/color-input.js +8 -157
- package/dist/discord/ui/color-input.js.map +1 -1
- package/dist/discord/ui/colors.d.ts +0 -2
- package/dist/discord/ui/colors.d.ts.map +1 -1
- package/dist/discord/ui/colors.js +4 -5
- package/dist/discord/ui/colors.js.map +1 -1
- package/dist/discord/ui/embed.d.ts.map +1 -1
- package/dist/discord/ui/embed.js +3 -8
- package/dist/discord/ui/embed.js.map +1 -1
- package/dist/discord/ui/truncate-text.d.ts +11 -0
- package/dist/discord/ui/truncate-text.d.ts.map +1 -0
- package/dist/discord/ui/truncate-text.js +19 -0
- package/dist/discord/ui/truncate-text.js.map +1 -0
- package/dist/errors/error-message.d.ts +9 -0
- package/dist/errors/error-message.d.ts.map +1 -0
- package/dist/errors/error-message.js +14 -0
- package/dist/errors/error-message.js.map +1 -0
- package/dist/i18n/business-message.d.ts +1 -1
- package/dist/i18n/business-message.d.ts.map +1 -1
- package/dist/i18n/catalog.d.ts +9 -0
- package/dist/i18n/catalog.d.ts.map +1 -1
- package/dist/i18n/catalog.js +4 -0
- package/dist/i18n/catalog.js.map +1 -1
- package/dist/i18n/locale.d.ts +2 -0
- package/dist/i18n/locale.d.ts.map +1 -1
- package/dist/i18n/locale.js +3 -1
- package/dist/i18n/locale.js.map +1 -1
- package/dist/i18n/translator.d.ts +2 -0
- package/dist/i18n/translator.d.ts.map +1 -1
- package/dist/i18n/translator.js.map +1 -1
- package/dist/module/module.d.ts +15 -1
- package/dist/module/module.d.ts.map +1 -1
- package/dist/resilience/retry.js +2 -2
- package/dist/resilience/retry.js.map +1 -1
- package/dist/scheduler/scheduler.d.ts.map +1 -1
- package/dist/scheduler/scheduler.js +2 -4
- package/dist/scheduler/scheduler.js.map +1 -1
- package/dist/settings/cache.d.ts +29 -0
- package/dist/settings/cache.d.ts.map +1 -0
- package/dist/settings/cache.js +47 -0
- package/dist/settings/cache.js.map +1 -0
- package/dist/settings/choice.d.ts +10 -0
- package/dist/settings/choice.d.ts.map +1 -0
- package/dist/settings/choice.js +3 -0
- package/dist/settings/choice.js.map +1 -0
- package/dist/settings/decode-stored.d.ts +20 -0
- package/dist/settings/decode-stored.d.ts.map +1 -0
- package/dist/settings/decode-stored.js +35 -0
- package/dist/settings/decode-stored.js.map +1 -0
- package/dist/settings/define-settings.d.ts +52 -0
- package/dist/settings/define-settings.d.ts.map +1 -0
- package/dist/settings/define-settings.js +141 -0
- package/dist/settings/define-settings.js.map +1 -0
- package/dist/settings/describe-field.d.ts +19 -0
- package/dist/settings/describe-field.d.ts.map +1 -0
- package/dist/settings/describe-field.js +131 -0
- package/dist/settings/describe-field.js.map +1 -0
- package/dist/settings/describe.d.ts +27 -0
- package/dist/settings/describe.d.ts.map +1 -0
- package/dist/settings/describe.js +62 -0
- package/dist/settings/describe.js.map +1 -0
- package/dist/settings/duration.d.ts +16 -0
- package/dist/settings/duration.d.ts.map +1 -0
- package/dist/settings/duration.js +56 -0
- package/dist/settings/duration.js.map +1 -0
- package/dist/settings/field-order.d.ts +37 -0
- package/dist/settings/field-order.d.ts.map +1 -0
- package/dist/settings/field-order.js +100 -0
- package/dist/settings/field-order.js.map +1 -0
- package/dist/settings/field-search.d.ts +10 -0
- package/dist/settings/field-search.d.ts.map +1 -0
- package/dist/settings/field-search.js +18 -0
- package/dist/settings/field-search.js.map +1 -0
- package/dist/settings/fields/builders.d.ts +41 -0
- package/dist/settings/fields/builders.d.ts.map +1 -0
- package/dist/settings/fields/builders.js +83 -0
- package/dist/settings/fields/builders.js.map +1 -0
- package/dist/settings/fields/field.d.ts +199 -0
- package/dist/settings/fields/field.d.ts.map +1 -0
- package/dist/settings/fields/field.js +33 -0
- package/dist/settings/fields/field.js.map +1 -0
- package/dist/settings/fields/zod-schema.d.ts +67 -0
- package/dist/settings/fields/zod-schema.d.ts.map +1 -0
- package/dist/settings/fields/zod-schema.js +281 -0
- package/dist/settings/fields/zod-schema.js.map +1 -0
- package/dist/settings/in-memory/in-memory-guild-directory.d.ts +24 -0
- package/dist/settings/in-memory/in-memory-guild-directory.d.ts.map +1 -0
- package/dist/settings/in-memory/in-memory-guild-directory.js +42 -0
- package/dist/settings/in-memory/in-memory-guild-directory.js.map +1 -0
- package/dist/settings/in-memory/in-memory-settings-store.d.ts +8 -0
- package/dist/settings/in-memory/in-memory-settings-store.d.ts.map +1 -0
- package/dist/settings/in-memory/in-memory-settings-store.js +43 -0
- package/dist/settings/in-memory/in-memory-settings-store.js.map +1 -0
- package/dist/settings/in-memory/in-process-notifier.d.ts +9 -0
- package/dist/settings/in-memory/in-process-notifier.d.ts.map +1 -0
- package/dist/settings/in-memory/in-process-notifier.js +32 -0
- package/dist/settings/in-memory/in-process-notifier.js.map +1 -0
- package/dist/settings/index.d.ts +22 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +31 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/is-plain-object.d.ts +6 -0
- package/dist/settings/is-plain-object.d.ts.map +1 -0
- package/dist/settings/is-plain-object.js +15 -0
- package/dist/settings/is-plain-object.js.map +1 -0
- package/dist/settings/messages.d.ts +61 -0
- package/dist/settings/messages.d.ts.map +1 -0
- package/dist/settings/messages.js +155 -0
- package/dist/settings/messages.js.map +1 -0
- package/dist/settings/migrate.d.ts +35 -0
- package/dist/settings/migrate.d.ts.map +1 -0
- package/dist/settings/migrate.js +42 -0
- package/dist/settings/migrate.js.map +1 -0
- package/dist/settings/ports/guild-directory.d.ts +61 -0
- package/dist/settings/ports/guild-directory.d.ts.map +1 -0
- package/dist/settings/ports/guild-directory.js +3 -0
- package/dist/settings/ports/guild-directory.js.map +1 -0
- package/dist/settings/ports/settings-changed-notifier.d.ts +20 -0
- package/dist/settings/ports/settings-changed-notifier.d.ts.map +1 -0
- package/dist/settings/ports/settings-changed-notifier.js +3 -0
- package/dist/settings/ports/settings-changed-notifier.js.map +1 -0
- package/dist/settings/ports/settings-store.d.ts +76 -0
- package/dist/settings/ports/settings-store.d.ts.map +1 -0
- package/dist/settings/ports/settings-store.js +3 -0
- package/dist/settings/ports/settings-store.js.map +1 -0
- package/dist/settings/registry.d.ts +31 -0
- package/dist/settings/registry.d.ts.map +1 -0
- package/dist/settings/registry.js +102 -0
- package/dist/settings/registry.js.map +1 -0
- package/dist/settings/settings-declaration-error.d.ts +13 -0
- package/dist/settings/settings-declaration-error.d.ts.map +1 -0
- package/dist/settings/settings-declaration-error.js +22 -0
- package/dist/settings/settings-declaration-error.js.map +1 -0
- package/dist/settings/settings-service.d.ts +148 -0
- package/dist/settings/settings-service.d.ts.map +1 -0
- package/dist/settings/settings-service.js +279 -0
- package/dist/settings/settings-service.js.map +1 -0
- package/dist/settings/settings-validation-error.d.ts +23 -0
- package/dist/settings/settings-validation-error.d.ts.map +1 -0
- package/dist/settings/settings-validation-error.js +17 -0
- package/dist/settings/settings-validation-error.js.map +1 -0
- package/dist/settings/status.d.ts +16 -0
- package/dist/settings/status.d.ts.map +1 -0
- package/dist/settings/status.js +18 -0
- package/dist/settings/status.js.map +1 -0
- package/dist/settings/suggest.d.ts +77 -0
- package/dist/settings/suggest.d.ts.map +1 -0
- package/dist/settings/suggest.js +192 -0
- package/dist/settings/suggest.js.map +1 -0
- package/dist/settings/system/kernel-settings.d.ts +43 -0
- package/dist/settings/system/kernel-settings.d.ts.map +1 -0
- package/dist/settings/system/kernel-settings.js +53 -0
- package/dist/settings/system/kernel-settings.js.map +1 -0
- package/dist/settings/system/module-gate.d.ts +31 -0
- package/dist/settings/system/module-gate.d.ts.map +1 -0
- package/dist/settings/system/module-gate.js +34 -0
- package/dist/settings/system/module-gate.js.map +1 -0
- package/dist/settings/testing/index.d.ts +2 -0
- package/dist/settings/testing/index.d.ts.map +1 -0
- package/dist/settings/testing/index.js +6 -0
- package/dist/settings/testing/index.js.map +1 -0
- package/dist/settings/testing/settings-store-contract.d.ts +29 -0
- package/dist/settings/testing/settings-store-contract.d.ts.map +1 -0
- package/dist/settings/testing/settings-store-contract.js +192 -0
- package/dist/settings/testing/settings-store-contract.js.map +1 -0
- package/dist/settings/timed-search.d.ts +26 -0
- package/dist/settings/timed-search.d.ts.map +1 -0
- package/dist/settings/timed-search.js +48 -0
- package/dist/settings/timed-search.js.map +1 -0
- package/dist/settings/types.d.ts +37 -0
- package/dist/settings/types.d.ts.map +1 -0
- package/dist/settings/types.js +3 -0
- package/dist/settings/types.js.map +1 -0
- package/dist/settings/validate.d.ts +55 -0
- package/dist/settings/validate.d.ts.map +1 -0
- package/dist/settings/validate.js +196 -0
- package/dist/settings/validate.js.map +1 -0
- package/package.json +463 -88
- package/src/authz/require-level-guard.ts +1 -1
- package/src/color.ts +134 -0
- package/src/discord/command/all-required.ts +12 -0
- package/src/discord/command/autocomplete-dispatcher.ts +2 -1
- package/src/discord/command/autocomplete-limits.ts +2 -0
- package/src/discord/command/autocomplete.ts +8 -7
- package/src/discord/command/command-responders.ts +39 -0
- package/src/discord/command/context.ts +14 -54
- package/src/discord/command/cooldown-guard.ts +1 -1
- package/src/discord/command/create-command.ts +19 -94
- package/src/discord/command/create-context-menu-command.ts +19 -97
- package/src/discord/command/errors.ts +1 -1
- package/src/discord/command/guard.ts +24 -12
- package/src/discord/command/options.ts +202 -412
- package/src/discord/command/passes-guard.ts +37 -0
- package/src/discord/command/permission-guard.ts +1 -1
- package/src/discord/command/render-command-failure.ts +71 -0
- package/src/discord/command/route-key.ts +9 -0
- package/src/discord/command/router.ts +73 -12
- package/src/discord/command/send-embed.ts +42 -0
- package/src/discord/command/types.ts +7 -1
- package/src/discord/components/component-access.ts +20 -0
- package/src/discord/components/component-router.ts +73 -36
- package/src/discord/components/interactive-message/index.ts +5 -3
- package/src/discord/components/interactive-message/interactive-message-collector.ts +4 -68
- package/src/discord/components/interactive-message/message-edit-options.ts +47 -0
- package/src/discord/components/interactive-message/mount-interactive-message.ts +5 -3
- package/src/discord/components/interactive-message/state-store.ts +20 -0
- package/src/discord/components/paginator/mount-paginator.ts +3 -3
- package/src/discord/components/paginator/paginator-view.ts +1 -1
- package/src/discord/components/persistent-paginator.ts +8 -9
- package/src/discord/components/settings-editor/from-declaration-controls.ts +371 -0
- package/src/discord/components/settings-editor/from-declaration-display.ts +155 -0
- package/src/discord/components/settings-editor/from-declaration-layout.ts +247 -0
- package/src/discord/components/settings-editor/from-declaration-search.ts +77 -0
- package/src/discord/components/settings-editor/from-declaration-stored.ts +39 -0
- package/src/discord/components/settings-editor/from-declaration-subject.ts +110 -0
- package/src/discord/components/settings-editor/from-declaration-values.ts +240 -0
- package/src/discord/components/settings-editor/from-declaration.ts +218 -0
- package/src/discord/components/settings-editor/index.ts +5 -2
- package/src/discord/components/settings-editor/mount-settings-editor.ts +28 -10
- package/src/discord/components/settings-editor/navigation.ts +41 -0
- package/src/discord/components/settings-editor/settings-editor-card.view.ts +79 -36
- package/src/discord/components/settings-editor/settings-editor-field-modal.ts +76 -68
- package/src/discord/components/settings-editor/settings-editor-field-values.ts +11 -0
- package/src/discord/components/settings-editor/settings-editor-fields.ts +6 -11
- package/src/discord/components/settings-editor/settings-editor.view.ts +11 -24
- package/src/discord/events/event-guild-id.ts +35 -0
- package/src/discord/events/event-router.ts +46 -13
- package/src/discord/i18n.ts +47 -8
- package/src/discord/interaction/interaction-locale.ts +19 -0
- package/src/discord/interaction/locale-resolver.ts +28 -0
- package/src/discord/interaction/modal.ts +5 -40
- package/src/discord/interaction/reply-locale.ts +35 -0
- package/src/discord/interaction/select-bounds.ts +33 -0
- package/src/discord/interaction/select-menu.ts +2 -9
- package/src/discord/placeholder-registry.ts +1 -1
- package/src/discord/presenter.ts +1 -1
- package/src/discord/settings/discord-guild-directory.ts +214 -0
- package/src/discord/settings/guild-locale-resolver.ts +38 -0
- package/src/discord/settings/is-module-disabled.ts +22 -0
- package/src/discord/settings/module-disabled-embed.ts +19 -0
- package/src/discord/settings/require-configured.ts +68 -0
- package/src/discord/ui/color-aliases.ts +70 -0
- package/src/discord/ui/color-input.ts +8 -173
- package/src/discord/ui/colors.ts +2 -3
- package/src/discord/ui/embed.ts +3 -9
- package/src/discord/ui/truncate-text.ts +15 -0
- package/src/errors/error-message.ts +10 -0
- package/src/i18n/business-message.ts +1 -1
- package/src/i18n/catalog.ts +14 -0
- package/src/i18n/locale.ts +3 -0
- package/src/i18n/translator.ts +3 -0
- package/src/module/module.ts +15 -1
- package/src/resilience/retry.ts +1 -1
- package/src/scheduler/scheduler.ts +2 -5
- package/src/settings/cache.ts +70 -0
- package/src/settings/choice.ts +9 -0
- package/src/settings/decode-stored.ts +40 -0
- package/src/settings/define-settings.ts +214 -0
- package/src/settings/describe-field.ts +155 -0
- package/src/settings/describe.ts +90 -0
- package/src/settings/duration.ts +54 -0
- package/src/settings/field-order.ts +128 -0
- package/src/settings/field-search.ts +16 -0
- package/src/settings/fields/builders.ts +161 -0
- package/src/settings/fields/field.ts +205 -0
- package/src/settings/fields/zod-schema.ts +300 -0
- package/src/settings/in-memory/in-memory-guild-directory.ts +69 -0
- package/src/settings/in-memory/in-memory-settings-store.ts +46 -0
- package/src/settings/in-memory/in-process-notifier.ts +40 -0
- package/src/settings/index.ts +72 -0
- package/src/settings/is-plain-object.ts +11 -0
- package/src/settings/messages.ts +161 -0
- package/src/settings/migrate.ts +58 -0
- package/src/settings/ports/guild-directory.ts +48 -0
- package/src/settings/ports/settings-changed-notifier.ts +20 -0
- package/src/settings/ports/settings-store.ts +74 -0
- package/src/settings/registry.ts +137 -0
- package/src/settings/settings-declaration-error.ts +16 -0
- package/src/settings/settings-service.ts +535 -0
- package/src/settings/settings-validation-error.ts +41 -0
- package/src/settings/status.ts +25 -0
- package/src/settings/suggest.ts +267 -0
- package/src/settings/system/kernel-settings.ts +74 -0
- package/src/settings/system/module-gate.ts +49 -0
- package/src/settings/testing/index.ts +7 -0
- package/src/settings/testing/settings-store-contract.ts +278 -0
- package/src/settings/timed-search.ts +56 -0
- package/src/settings/types.ts +42 -0
- package/src/settings/validate.ts +298 -0
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runSettingsStoreContract = runSettingsStoreContract;
|
|
4
|
+
const business_error_1 = require("../../errors/business-error");
|
|
5
|
+
const GUILD_A = "100000000000000001";
|
|
6
|
+
const GUILD_B = "100000000000000002";
|
|
7
|
+
const MODULE_A = "tickets";
|
|
8
|
+
const MODULE_B = "welcome";
|
|
9
|
+
function record(overrides = {}) {
|
|
10
|
+
return {
|
|
11
|
+
guildId: GUILD_A,
|
|
12
|
+
moduleId: MODULE_A,
|
|
13
|
+
version: 1,
|
|
14
|
+
revision: 1,
|
|
15
|
+
values: { maxOpen: 2 },
|
|
16
|
+
updatedAt: "2026-01-01T00:00:00.000Z",
|
|
17
|
+
updatedBy: "200000000000000001",
|
|
18
|
+
...overrides,
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
async function captureError(action) {
|
|
22
|
+
try {
|
|
23
|
+
await action();
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
return error;
|
|
27
|
+
}
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
/** The caller's view of a record it may scribble on, to prove the store kept its own copy. */
|
|
31
|
+
function mutableValues(stored) {
|
|
32
|
+
return (stored?.values ?? {});
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Behaviour every {@link SettingsStore} implementation must have: one case per
|
|
36
|
+
* guarantee stated on the port. Run it from the adapter's own test file with
|
|
37
|
+
* the test runner's `describe`, `it` and `expect`:
|
|
38
|
+
* `runSettingsStoreContract(createMyStore, { describe, it, expect })`.
|
|
39
|
+
*
|
|
40
|
+
* @param createStore - returns a store with no record in it; called once per case.
|
|
41
|
+
* @param runner - the test runner's functions, so this suite imports no framework.
|
|
42
|
+
*/
|
|
43
|
+
function runSettingsStoreContract(createStore, runner) {
|
|
44
|
+
const { describe, it, expect } = runner;
|
|
45
|
+
/**
|
|
46
|
+
* Deleting the default record must leave `other` — the same record moved to
|
|
47
|
+
* another guild or another module — exactly as it was written.
|
|
48
|
+
*/
|
|
49
|
+
async function expectDeleteLeavesAlone(other) {
|
|
50
|
+
const store = await createStore();
|
|
51
|
+
await store.write(record(), { expectedRevision: null });
|
|
52
|
+
await store.write(other, { expectedRevision: null });
|
|
53
|
+
await store.delete(GUILD_A, MODULE_A);
|
|
54
|
+
expect(await store.read(GUILD_A, MODULE_A)).toBeNull();
|
|
55
|
+
expect(await store.read(other.guildId, other.moduleId)).toEqual(other);
|
|
56
|
+
}
|
|
57
|
+
describe("SettingsStore contract", () => {
|
|
58
|
+
it("reads null when no record exists", async () => {
|
|
59
|
+
const store = await createStore();
|
|
60
|
+
expect(await store.read(GUILD_A, MODULE_A)).toBeNull();
|
|
61
|
+
});
|
|
62
|
+
it("creates a record when the expected revision is null", async () => {
|
|
63
|
+
const store = await createStore();
|
|
64
|
+
const created = record();
|
|
65
|
+
await store.write(created, { expectedRevision: null });
|
|
66
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(created);
|
|
67
|
+
});
|
|
68
|
+
it("rejects a create when a record already exists", async () => {
|
|
69
|
+
const store = await createStore();
|
|
70
|
+
await store.write(record(), { expectedRevision: null });
|
|
71
|
+
const error = await captureError(() => store.write(record({ values: { maxOpen: 3 } }), { expectedRevision: null }));
|
|
72
|
+
expect(error).toBeInstanceOf(business_error_1.ConflictError);
|
|
73
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(record());
|
|
74
|
+
});
|
|
75
|
+
it("rejects an update when no record exists", async () => {
|
|
76
|
+
const store = await createStore();
|
|
77
|
+
const error = await captureError(() => store.write(record({ revision: 2 }), { expectedRevision: 1 }));
|
|
78
|
+
expect(error).toBeInstanceOf(business_error_1.ConflictError);
|
|
79
|
+
expect(await store.read(GUILD_A, MODULE_A)).toBeNull();
|
|
80
|
+
});
|
|
81
|
+
it("rejects a write with a stale revision and keeps the stored record", async () => {
|
|
82
|
+
const store = await createStore();
|
|
83
|
+
await store.write(record(), { expectedRevision: null });
|
|
84
|
+
const second = record({ revision: 2, values: { maxOpen: 3 } });
|
|
85
|
+
await store.write(second, { expectedRevision: 1 });
|
|
86
|
+
const error = await captureError(() => store.write(record({ revision: 2, values: { maxOpen: 4 } }), { expectedRevision: 1 }));
|
|
87
|
+
expect(error).toBeInstanceOf(business_error_1.ConflictError);
|
|
88
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(second);
|
|
89
|
+
});
|
|
90
|
+
it("increments the revision by one on each write", async () => {
|
|
91
|
+
const store = await createStore();
|
|
92
|
+
await store.write(record(), { expectedRevision: null });
|
|
93
|
+
await store.write(record({ revision: 2 }), { expectedRevision: 1 });
|
|
94
|
+
await store.write(record({ revision: 3 }), { expectedRevision: 2 });
|
|
95
|
+
const stored = await store.read(GUILD_A, MODULE_A);
|
|
96
|
+
expect(stored?.revision).toBe(3);
|
|
97
|
+
});
|
|
98
|
+
it("deletes a record", async () => {
|
|
99
|
+
const store = await createStore();
|
|
100
|
+
await store.write(record(), { expectedRevision: null });
|
|
101
|
+
await store.delete(GUILD_A, MODULE_A);
|
|
102
|
+
expect(await store.read(GUILD_A, MODULE_A)).toBeNull();
|
|
103
|
+
});
|
|
104
|
+
it("deletes a missing record without error", async () => {
|
|
105
|
+
const store = await createStore();
|
|
106
|
+
const error = await captureError(() => store.delete(GUILD_A, MODULE_A));
|
|
107
|
+
expect(error).toBe(undefined);
|
|
108
|
+
expect(await store.read(GUILD_A, MODULE_A)).toBeNull();
|
|
109
|
+
});
|
|
110
|
+
it("accepts a create again after a delete", async () => {
|
|
111
|
+
const store = await createStore();
|
|
112
|
+
await store.write(record(), { expectedRevision: null });
|
|
113
|
+
await store.delete(GUILD_A, MODULE_A);
|
|
114
|
+
await store.write(record(), { expectedRevision: null });
|
|
115
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(record());
|
|
116
|
+
});
|
|
117
|
+
it("keeps guilds isolated", async () => {
|
|
118
|
+
await expectDeleteLeavesAlone(record({ guildId: GUILD_B, values: { maxOpen: 5 } }));
|
|
119
|
+
});
|
|
120
|
+
it("keeps modules isolated", async () => {
|
|
121
|
+
await expectDeleteLeavesAlone(record({ moduleId: MODULE_B, values: { greeting: "hi" } }));
|
|
122
|
+
});
|
|
123
|
+
it("round-trips every JSON value shape", async () => {
|
|
124
|
+
const store = await createStore();
|
|
125
|
+
const created = record({
|
|
126
|
+
values: {
|
|
127
|
+
text: "Salut « à vous » 👋",
|
|
128
|
+
count: -1.5,
|
|
129
|
+
enabled: false,
|
|
130
|
+
cleared: null,
|
|
131
|
+
roles: ["300000000000000001", "300000000000000002"],
|
|
132
|
+
nested: { toggles: { a: true }, list: [] },
|
|
133
|
+
},
|
|
134
|
+
});
|
|
135
|
+
await store.write(created, { expectedRevision: null });
|
|
136
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(created);
|
|
137
|
+
});
|
|
138
|
+
it("keeps an absent updatedBy absent", async () => {
|
|
139
|
+
const store = await createStore();
|
|
140
|
+
const { updatedBy: _omitted, ...anonymous } = record();
|
|
141
|
+
await store.write(anonymous, { expectedRevision: null });
|
|
142
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(anonymous);
|
|
143
|
+
});
|
|
144
|
+
it("keeps a written record independent of the caller's object", async () => {
|
|
145
|
+
const store = await createStore();
|
|
146
|
+
const written = record();
|
|
147
|
+
await store.write(written, { expectedRevision: null });
|
|
148
|
+
mutableValues(written).maxOpen = 99;
|
|
149
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(record());
|
|
150
|
+
});
|
|
151
|
+
it("returns a record the caller can change without changing the store", async () => {
|
|
152
|
+
const store = await createStore();
|
|
153
|
+
await store.write(record(), { expectedRevision: null });
|
|
154
|
+
mutableValues(await store.read(GUILD_A, MODULE_A)).maxOpen = 99;
|
|
155
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(record());
|
|
156
|
+
});
|
|
157
|
+
it("lets exactly one of two concurrent creates win", async () => {
|
|
158
|
+
const store = await createStore();
|
|
159
|
+
const first = record({ values: { maxOpen: 3 } });
|
|
160
|
+
const second = record({ values: { maxOpen: 4 } });
|
|
161
|
+
const outcomes = await Promise.allSettled([
|
|
162
|
+
store.write(first, { expectedRevision: null }),
|
|
163
|
+
store.write(second, { expectedRevision: null }),
|
|
164
|
+
]);
|
|
165
|
+
await expectOneWinner(store, outcomes, [first, second]);
|
|
166
|
+
});
|
|
167
|
+
it("lets exactly one of two concurrent updates of the same revision win", async () => {
|
|
168
|
+
const store = await createStore();
|
|
169
|
+
await store.write(record(), { expectedRevision: null });
|
|
170
|
+
const first = record({ revision: 2, values: { maxOpen: 3 } });
|
|
171
|
+
const second = record({ revision: 2, values: { maxOpen: 4 } });
|
|
172
|
+
const outcomes = await Promise.allSettled([
|
|
173
|
+
store.write(first, { expectedRevision: 1 }),
|
|
174
|
+
store.write(second, { expectedRevision: 1 }),
|
|
175
|
+
]);
|
|
176
|
+
await expectOneWinner(store, outcomes, [first, second]);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
/**
|
|
180
|
+
* Of two racing writes, exactly one lands, the other fails with a
|
|
181
|
+
* `ConflictError`, and the stored record is the winner's.
|
|
182
|
+
*/
|
|
183
|
+
async function expectOneWinner(store, outcomes, written) {
|
|
184
|
+
const winners = outcomes.flatMap((outcome, index) => outcome.status === "fulfilled" ? [written[index]] : []);
|
|
185
|
+
const losers = outcomes.flatMap((outcome) => outcome.status === "rejected" ? [outcome.reason] : []);
|
|
186
|
+
expect(winners.length).toBe(1);
|
|
187
|
+
expect(losers.length).toBe(1);
|
|
188
|
+
expect(losers[0]).toBeInstanceOf(business_error_1.ConflictError);
|
|
189
|
+
expect(await store.read(GUILD_A, MODULE_A)).toEqual(winners[0]);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=settings-store-contract.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings-store-contract.js","sourceRoot":"","sources":["../../../src/settings/testing/settings-store-contract.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { Logger } from "../logger";
|
|
2
|
+
/**
|
|
3
|
+
* How long a suggestion search may run (FR-024): past it the search is
|
|
4
|
+
* abandoned, so an autocomplete still answers within Discord's 3 s window.
|
|
5
|
+
*/
|
|
6
|
+
export declare const SUGGESTION_TIMEOUT_MS = 2500;
|
|
7
|
+
/**
|
|
8
|
+
* Run a suggestion search within {@link SUGGESTION_TIMEOUT_MS}. A search that
|
|
9
|
+
* runs longer or fails yields `fallback` and a `warn` log naming `at`; it never
|
|
10
|
+
* throws. The timer is cleared as soon as the race settles, so no timer
|
|
11
|
+
* outlives the call. It runs on the global timers, which a test drives with
|
|
12
|
+
* fake timers.
|
|
13
|
+
*
|
|
14
|
+
* @param params.search - the search; may throw or reject.
|
|
15
|
+
* @param params.fallback - what a slow or failed search yields.
|
|
16
|
+
* @param params.logger - where a slow or failed search is reported.
|
|
17
|
+
* @param params.at - what the log names: module, field, guild.
|
|
18
|
+
* @returns the search's result, or `fallback`.
|
|
19
|
+
*/
|
|
20
|
+
export declare function timedSearch<T>(params: {
|
|
21
|
+
search: () => Promise<T>;
|
|
22
|
+
fallback: T;
|
|
23
|
+
logger: Logger;
|
|
24
|
+
at: Readonly<Record<string, unknown>>;
|
|
25
|
+
}): Promise<T>;
|
|
26
|
+
//# sourceMappingURL=timed-search.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timed-search.d.ts","sourceRoot":"","sources":["../../src/settings/timed-search.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAEvC;;;GAGG;AACH,eAAO,MAAM,qBAAqB,OAAQ,CAAC;AAK3C;;;;;;;;;;;;GAYG;AACH,wBAAsB,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE;IAC5C,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC;IACzB,QAAQ,EAAE,CAAC,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CACtC,GAAG,OAAO,CAAC,CAAC,CAAC,CAyBb"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SUGGESTION_TIMEOUT_MS = void 0;
|
|
4
|
+
exports.timedSearch = timedSearch;
|
|
5
|
+
const error_message_1 = require("../errors/error-message");
|
|
6
|
+
/**
|
|
7
|
+
* How long a suggestion search may run (FR-024): past it the search is
|
|
8
|
+
* abandoned, so an autocomplete still answers within Discord's 3 s window.
|
|
9
|
+
*/
|
|
10
|
+
exports.SUGGESTION_TIMEOUT_MS = 2_500;
|
|
11
|
+
/** Marks the timer winning the race, whatever the search resolves to. */
|
|
12
|
+
const TIMED_OUT = Symbol("timed out");
|
|
13
|
+
/**
|
|
14
|
+
* Run a suggestion search within {@link SUGGESTION_TIMEOUT_MS}. A search that
|
|
15
|
+
* runs longer or fails yields `fallback` and a `warn` log naming `at`; it never
|
|
16
|
+
* throws. The timer is cleared as soon as the race settles, so no timer
|
|
17
|
+
* outlives the call. It runs on the global timers, which a test drives with
|
|
18
|
+
* fake timers.
|
|
19
|
+
*
|
|
20
|
+
* @param params.search - the search; may throw or reject.
|
|
21
|
+
* @param params.fallback - what a slow or failed search yields.
|
|
22
|
+
* @param params.logger - where a slow or failed search is reported.
|
|
23
|
+
* @param params.at - what the log names: module, field, guild.
|
|
24
|
+
* @returns the search's result, or `fallback`.
|
|
25
|
+
*/
|
|
26
|
+
async function timedSearch(params) {
|
|
27
|
+
const { search, fallback, logger, at } = params;
|
|
28
|
+
let timer;
|
|
29
|
+
const timeout = new Promise((resolve) => {
|
|
30
|
+
timer = setTimeout(() => resolve(TIMED_OUT), exports.SUGGESTION_TIMEOUT_MS);
|
|
31
|
+
});
|
|
32
|
+
try {
|
|
33
|
+
const result = await Promise.race([(async () => search())(), timeout]);
|
|
34
|
+
if (result === TIMED_OUT) {
|
|
35
|
+
logger.warn({ ...at, timeoutMs: exports.SUGGESTION_TIMEOUT_MS }, "Settings suggestion search timed out; offering nothing");
|
|
36
|
+
return fallback;
|
|
37
|
+
}
|
|
38
|
+
return result;
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
logger.warn({ ...at, err: (0, error_message_1.errorMessage)(error) }, "Settings suggestion search failed; offering nothing");
|
|
42
|
+
return fallback;
|
|
43
|
+
}
|
|
44
|
+
finally {
|
|
45
|
+
clearTimeout(timer);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=timed-search.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timed-search.js","sourceRoot":"","sources":["../../src/settings/timed-search.ts"],"names":[],"mappings":";;;AAyBA,kCA8BC;AAvDD,0DAAsD;AAGtD;;;GAGG;AACU,QAAA,qBAAqB,GAAG,KAAK,CAAC;AAE3C,yEAAyE;AACzE,MAAM,SAAS,GAAkB,MAAM,CAAC,WAAW,CAAC,CAAC;AAErD;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,WAAW,CAAI,MAKpC;IACA,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,MAAM,CAAC;IAChD,IAAI,KAAgD,CAAC;IACrD,MAAM,OAAO,GAAG,IAAI,OAAO,CAAmB,CAAC,OAAO,EAAE,EAAE;QACzD,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,6BAAqB,CAAC,CAAC;IACrE,CAAC,CAAC,CAAC;IACH,IAAI,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,OAAO,CAAC,CAAC,CAAC;QACvE,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,CACV,EAAE,GAAG,EAAE,EAAE,SAAS,EAAE,6BAAqB,EAAE,EAC3C,wDAAwD,CACxD,CAAC;YACF,OAAO,QAAQ,CAAC;QACjB,CAAC;QACD,OAAO,MAAM,CAAC;IACf,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,MAAM,CAAC,IAAI,CACV,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,IAAA,4BAAY,EAAC,KAAK,CAAC,EAAE,EACnC,qDAAqD,CACrD,CAAC;QACF,OAAO,QAAQ,CAAC;IACjB,CAAC;YAAS,CAAC;QACV,YAAY,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Field, FieldPresence } from "../settings/fields/field";
|
|
2
|
+
/** The fields of a declaration, by key. */
|
|
3
|
+
type FieldsOf<D> = D extends {
|
|
4
|
+
readonly fields: infer F;
|
|
5
|
+
} ? F : never;
|
|
6
|
+
/**
|
|
7
|
+
* The value type module logic reads for one field: `T` when the field has a
|
|
8
|
+
* default (a toggles field always has one), `T | undefined` otherwise, even
|
|
9
|
+
* when required: a guild may not have configured it yet.
|
|
10
|
+
*/
|
|
11
|
+
export type FieldValue<F> = F extends Field<infer T, "defined"> ? T : F extends Field<infer T, FieldPresence> ? T | undefined : never;
|
|
12
|
+
/** What a surface shows for a secret: whether it is set, never its value. */
|
|
13
|
+
export interface SecretState {
|
|
14
|
+
readonly isSet: boolean;
|
|
15
|
+
}
|
|
16
|
+
/** The value type a surface reads for one field: secrets become {@link SecretState}. */
|
|
17
|
+
export type SurfaceFieldValue<F> = F extends {
|
|
18
|
+
readonly spec: {
|
|
19
|
+
readonly kind: "secret";
|
|
20
|
+
};
|
|
21
|
+
} ? SecretState : FieldValue<F>;
|
|
22
|
+
/**
|
|
23
|
+
* The values module logic reads from a declaration, typed from it: one entry
|
|
24
|
+
* per declared field, secrets included.
|
|
25
|
+
*/
|
|
26
|
+
export type SettingsValues<D> = {
|
|
27
|
+
readonly [K in keyof FieldsOf<D>]: FieldValue<FieldsOf<D>[K]>;
|
|
28
|
+
};
|
|
29
|
+
/**
|
|
30
|
+
* The values a configuration surface reads from a declaration: like
|
|
31
|
+
* {@link SettingsValues}, with each secret replaced by {@link SecretState}.
|
|
32
|
+
*/
|
|
33
|
+
export type SurfaceValues<D> = {
|
|
34
|
+
readonly [K in keyof FieldsOf<D>]: SurfaceFieldValue<FieldsOf<D>[K]>;
|
|
35
|
+
};
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/settings/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAEpE,2CAA2C;AAC3C,KAAK,QAAQ,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtE;;;;GAIG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,IACvB,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,GAChC,CAAC,GACD,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,GACtC,CAAC,GAAG,SAAS,GACb,KAAK,CAAC;AAEX,6EAA6E;AAC7E,MAAM,WAAW,WAAW;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;CACxB;AAED,wFAAwF;AACxF,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAA;KAAE,CAAA;CAAE,GACxF,WAAW,GACX,UAAU,CAAC,CAAC,CAAC,CAAC;AAEjB;;;GAGG;AACH,MAAM,MAAM,cAAc,CAAC,CAAC,IAAI;IAC/B,QAAQ,EAAE,CAAC,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAC7D,CAAC;AAEF;;;GAGG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,IAAI;IAC9B,QAAQ,EAAE,CAAC,IAAI,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/settings/types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import type { SettingsDeclaration } from "../settings/define-settings";
|
|
2
|
+
import type { SettingsIssue } from "../settings/settings-validation-error";
|
|
3
|
+
import { type SuggestionPorts } from "../settings/suggest";
|
|
4
|
+
/**
|
|
5
|
+
* Outcome of {@link validateSettings}: the submitted fields in their stored
|
|
6
|
+
* form, or every issue found. A field submitted as `null` or `undefined` is
|
|
7
|
+
* unset: it appears in `values` with the value `undefined`.
|
|
8
|
+
*/
|
|
9
|
+
export type SettingsValidation = {
|
|
10
|
+
readonly ok: true;
|
|
11
|
+
readonly values: Readonly<Record<string, unknown>>;
|
|
12
|
+
} | {
|
|
13
|
+
readonly ok: false;
|
|
14
|
+
readonly issues: readonly SettingsIssue[];
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Who submits and what stage 2 reads: the guild's directory, the ports a
|
|
18
|
+
* strict field's search runs with, the requester, and the guild's current
|
|
19
|
+
* values, read only when a strict search needs them.
|
|
20
|
+
*/
|
|
21
|
+
export interface ValidationScope {
|
|
22
|
+
readonly ports: SuggestionPorts;
|
|
23
|
+
readonly guildId: string;
|
|
24
|
+
readonly userId: string;
|
|
25
|
+
readonly locale: string;
|
|
26
|
+
/** The guild's current values as a surface reads them (secrets as whether they are set). */
|
|
27
|
+
readonly currentValues: () => Promise<Readonly<Record<string, unknown>>>;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Validate a settings submission against its declaration, in two stages.
|
|
31
|
+
* Stage 1 checks each submitted field on its own (kind, bounds, lengths, list
|
|
32
|
+
* size, duplicates, enum membership, required fields being unset). Stage 2 runs
|
|
33
|
+
* only on the fields that passed stage 1: it asks the guild directory whether
|
|
34
|
+
* each referenced channel, role and member exists, and whether a channel is of
|
|
35
|
+
* an allowed type; and it asks a strict field's search whether it knows the
|
|
36
|
+
* value (FR-023): `label(value)` must name it, or, without `label`, a result
|
|
37
|
+
* of `resolve(String(value))` must hold exactly that value. A strict search
|
|
38
|
+
* that runs past its budget or fails knows nothing (logged): the value is
|
|
39
|
+
* refused as `unknownChoice` rather than stored unchecked. Keys the
|
|
40
|
+
* declaration lacks are rejected.
|
|
41
|
+
*
|
|
42
|
+
* @param params.declaration - the module's settings declaration.
|
|
43
|
+
* @param params.patch - the submitted fields, keyed by field key; any value.
|
|
44
|
+
* @param params.scope - the guild, the requester and the ports stage 2 reads.
|
|
45
|
+
* @returns the stored form of every submitted field, or every issue found, in
|
|
46
|
+
* submission order, with catalog keys from {@link SETTINGS_ISSUE_MESSAGES}.
|
|
47
|
+
* @throws ValidationError when the patch is not a plain object (a malformed
|
|
48
|
+
* request, not an invalid value).
|
|
49
|
+
*/
|
|
50
|
+
export declare function validateSettings(params: {
|
|
51
|
+
declaration: SettingsDeclaration;
|
|
52
|
+
patch: unknown;
|
|
53
|
+
scope: ValidationScope;
|
|
54
|
+
}): Promise<SettingsValidation>;
|
|
55
|
+
//# sourceMappingURL=validate.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../../src/settings/validate.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAOtE,OAAO,KAAK,EAAE,aAAa,EAAqB,MAAM,sCAAsC,CAAC;AAC7F,OAAO,EAAgB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAExE;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAC3B;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;CAAE,GACzE;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,aAAa,EAAE,CAAA;CAAE,CAAC;AAiBrE;;;;GAIG;AACH,MAAM,WAAW,eAAe;IAC/B,QAAQ,CAAC,KAAK,EAAE,eAAe,CAAC;IAChC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,4FAA4F;IAC5F,QAAQ,CAAC,aAAa,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;CACzE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE;IAC9C,WAAW,EAAE,mBAAmB,CAAC;IACjC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,eAAe,CAAC;CACvB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA6B9B"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.validateSettings = validateSettings;
|
|
4
|
+
const business_error_1 = require("../errors/business-error");
|
|
5
|
+
const field_search_1 = require("../settings/field-search");
|
|
6
|
+
const field_1 = require("../settings/fields/field");
|
|
7
|
+
const zod_schema_1 = require("../settings/fields/zod-schema");
|
|
8
|
+
const is_plain_object_1 = require("../settings/is-plain-object");
|
|
9
|
+
const messages_1 = require("../settings/messages");
|
|
10
|
+
const suggest_1 = require("../settings/suggest");
|
|
11
|
+
/**
|
|
12
|
+
* Validate a settings submission against its declaration, in two stages.
|
|
13
|
+
* Stage 1 checks each submitted field on its own (kind, bounds, lengths, list
|
|
14
|
+
* size, duplicates, enum membership, required fields being unset). Stage 2 runs
|
|
15
|
+
* only on the fields that passed stage 1: it asks the guild directory whether
|
|
16
|
+
* each referenced channel, role and member exists, and whether a channel is of
|
|
17
|
+
* an allowed type; and it asks a strict field's search whether it knows the
|
|
18
|
+
* value (FR-023): `label(value)` must name it, or, without `label`, a result
|
|
19
|
+
* of `resolve(String(value))` must hold exactly that value. A strict search
|
|
20
|
+
* that runs past its budget or fails knows nothing (logged): the value is
|
|
21
|
+
* refused as `unknownChoice` rather than stored unchecked. Keys the
|
|
22
|
+
* declaration lacks are rejected.
|
|
23
|
+
*
|
|
24
|
+
* @param params.declaration - the module's settings declaration.
|
|
25
|
+
* @param params.patch - the submitted fields, keyed by field key; any value.
|
|
26
|
+
* @param params.scope - the guild, the requester and the ports stage 2 reads.
|
|
27
|
+
* @returns the stored form of every submitted field, or every issue found, in
|
|
28
|
+
* submission order, with catalog keys from {@link SETTINGS_ISSUE_MESSAGES}.
|
|
29
|
+
* @throws ValidationError when the patch is not a plain object (a malformed
|
|
30
|
+
* request, not an invalid value).
|
|
31
|
+
*/
|
|
32
|
+
async function validateSettings(params) {
|
|
33
|
+
const { declaration, patch, scope } = params;
|
|
34
|
+
if (!(0, is_plain_object_1.isPlainObject)(patch)) {
|
|
35
|
+
throw new business_error_1.ValidationError(`Settings patch for module "${declaration.id}" must be an object keyed by field`);
|
|
36
|
+
}
|
|
37
|
+
const entries = Object.entries(patch);
|
|
38
|
+
const parsed = entries.map(([key, value]) => parseEntry({ declaration, key, value }));
|
|
39
|
+
// A secret stays out of what a search sees, as it stays out of every surface read.
|
|
40
|
+
const submitted = Object.fromEntries(parsed.flatMap((entry) => entry.ok && entry.declared.spec.kind !== "secret" ? [[entry.key, entry.value]] : []));
|
|
41
|
+
const values = lazyValues({ scope, submitted });
|
|
42
|
+
const outcomes = await Promise.all(parsed.map((entry) => entry.ok ? checkEntry({ scope, declaration, entry, values }) : entry.outcome));
|
|
43
|
+
const issues = outcomes.flatMap((entry) => entry.issues);
|
|
44
|
+
if (issues.length > 0) {
|
|
45
|
+
return { ok: false, issues };
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
ok: true,
|
|
49
|
+
values: Object.fromEntries(entries.map(([key], index) => [key, outcomes[index]?.value])),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The values a strict search sees as "currently entered": the guild's current
|
|
54
|
+
* values with the submitted ones over them. Read once, and only when a strict
|
|
55
|
+
* search asks.
|
|
56
|
+
*/
|
|
57
|
+
function lazyValues(params) {
|
|
58
|
+
let values;
|
|
59
|
+
return () => {
|
|
60
|
+
values ??= params.scope
|
|
61
|
+
.currentValues()
|
|
62
|
+
.then((current) => ({ ...current, ...params.submitted }));
|
|
63
|
+
return values;
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** Stage 1: one submitted field checked on its own. */
|
|
67
|
+
function parseEntry(params) {
|
|
68
|
+
const { declaration, key, value } = params;
|
|
69
|
+
const declared = Object.hasOwn(declaration.fields, key) ? declaration.fields[key] : undefined;
|
|
70
|
+
if (declared === undefined) {
|
|
71
|
+
return failed({ key, issues: [{ path: [], code: "unknownField", params: {} }] });
|
|
72
|
+
}
|
|
73
|
+
if (value === null || value === undefined) {
|
|
74
|
+
if (declared.required && declared.default === undefined) {
|
|
75
|
+
return failed({ key, issues: [{ path: [], code: "required", params: {} }] });
|
|
76
|
+
}
|
|
77
|
+
return { ok: true, key, declared, value: undefined };
|
|
78
|
+
}
|
|
79
|
+
const parsed = (0, zod_schema_1.parseFieldValue)({ field: declared, value });
|
|
80
|
+
if (!parsed.ok) {
|
|
81
|
+
return failed({ key, issues: parsed.issues });
|
|
82
|
+
}
|
|
83
|
+
return { ok: true, key, declared, value: parsed.value };
|
|
84
|
+
}
|
|
85
|
+
function failed(params) {
|
|
86
|
+
return { ok: false, outcome: outcome(params) };
|
|
87
|
+
}
|
|
88
|
+
/** Stage 2 on a field that passed stage 1; an unset field has nothing to check. */
|
|
89
|
+
async function checkEntry(params) {
|
|
90
|
+
const { entry } = params;
|
|
91
|
+
if (entry.value === undefined) {
|
|
92
|
+
return { value: undefined, issues: [] };
|
|
93
|
+
}
|
|
94
|
+
const issues = await checkReferences({
|
|
95
|
+
...params,
|
|
96
|
+
spec: entry.declared.spec,
|
|
97
|
+
value: entry.value,
|
|
98
|
+
});
|
|
99
|
+
return outcome({ key: entry.key, issues, value: entry.value });
|
|
100
|
+
}
|
|
101
|
+
function outcome(params) {
|
|
102
|
+
const { key, issues, value } = params;
|
|
103
|
+
return { value, issues: issues.map((issue) => toSettingsIssue(key, issue)) };
|
|
104
|
+
}
|
|
105
|
+
/** Stage 2 on a value, item by item for a list. */
|
|
106
|
+
async function checkReferences(params) {
|
|
107
|
+
const { spec, value } = params;
|
|
108
|
+
if (spec.kind === "list" && Array.isArray(value)) {
|
|
109
|
+
const codes = await Promise.all(value.map((item) => checkValue({ ...params, spec: spec.item.spec, value: item })));
|
|
110
|
+
return codes.flatMap((code, index) => code === undefined ? [] : [{ path: [index], code, params: {} }]);
|
|
111
|
+
}
|
|
112
|
+
const code = await checkValue(params);
|
|
113
|
+
return code === undefined ? [] : [{ path: [], code, params: {} }];
|
|
114
|
+
}
|
|
115
|
+
/** The guild check, or the strict check, one value needs; `undefined` when it passes. */
|
|
116
|
+
async function checkValue(params) {
|
|
117
|
+
const { scope, declaration, entry, values, spec, value } = params;
|
|
118
|
+
const search = (0, field_search_1.fieldSearch)(spec);
|
|
119
|
+
if (search?.strict === true) {
|
|
120
|
+
const label = await (0, suggest_1.dynamicLabel)({
|
|
121
|
+
scope: {
|
|
122
|
+
...scope.ports,
|
|
123
|
+
moduleId: declaration.id,
|
|
124
|
+
key: entry.key,
|
|
125
|
+
ctx: {
|
|
126
|
+
guildId: scope.guildId,
|
|
127
|
+
userId: scope.userId,
|
|
128
|
+
locale: scope.locale,
|
|
129
|
+
values: withoutKey(await values(), entry.key),
|
|
130
|
+
},
|
|
131
|
+
},
|
|
132
|
+
suggest: search,
|
|
133
|
+
value,
|
|
134
|
+
});
|
|
135
|
+
return label === undefined ? "unknownChoice" : undefined;
|
|
136
|
+
}
|
|
137
|
+
return checkEntity({ guilds: scope.ports.guilds, guildId: scope.guildId, spec, value });
|
|
138
|
+
}
|
|
139
|
+
/** The other values: a search is told what else is entered, not its own field's value. */
|
|
140
|
+
function withoutKey(values, key) {
|
|
141
|
+
const { [key]: _own, ...others } = values;
|
|
142
|
+
return others;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Whether the channel, role or member a value references is usable on the
|
|
146
|
+
* guild. Stage 1 makes such a value a snowflake string; any other value
|
|
147
|
+
* references no guild entity and needs no check.
|
|
148
|
+
*/
|
|
149
|
+
async function checkEntity(params) {
|
|
150
|
+
const { guilds, guildId, spec, value } = params;
|
|
151
|
+
if (typeof value !== "string") {
|
|
152
|
+
return undefined;
|
|
153
|
+
}
|
|
154
|
+
switch (spec.kind) {
|
|
155
|
+
case "channel": {
|
|
156
|
+
const channel = await guilds.channel(guildId, value);
|
|
157
|
+
if (channel === null) {
|
|
158
|
+
return "notFound";
|
|
159
|
+
}
|
|
160
|
+
if (spec.types !== undefined && !spec.types.includes(channel.kind)) {
|
|
161
|
+
return "channelType";
|
|
162
|
+
}
|
|
163
|
+
return undefined;
|
|
164
|
+
}
|
|
165
|
+
case "role":
|
|
166
|
+
return (await guilds.role(guildId, value)) === null ? "notFound" : undefined;
|
|
167
|
+
case "user":
|
|
168
|
+
return (await guilds.member(guildId, value)) === null ? "notFound" : undefined;
|
|
169
|
+
case "color":
|
|
170
|
+
case "duration":
|
|
171
|
+
case "enum":
|
|
172
|
+
case "integer":
|
|
173
|
+
case "number":
|
|
174
|
+
case "text":
|
|
175
|
+
case "boolean":
|
|
176
|
+
case "secret":
|
|
177
|
+
case "list":
|
|
178
|
+
case "toggles":
|
|
179
|
+
return undefined;
|
|
180
|
+
default:
|
|
181
|
+
return (0, field_1.unhandledFieldKind)(spec);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/** `[i]` for a list index, `.name` for a toggle key. */
|
|
185
|
+
function pathSuffix(segment) {
|
|
186
|
+
return typeof segment === "number" ? `[${segment}]` : `.${segment}`;
|
|
187
|
+
}
|
|
188
|
+
function toSettingsIssue(key, issue) {
|
|
189
|
+
const translationKey = messages_1.SETTINGS_ISSUE_MESSAGES[issue.code];
|
|
190
|
+
const field = `${key}${issue.path.map(pathSuffix).join("")}`;
|
|
191
|
+
const translation = Object.keys(issue.params).length === 0
|
|
192
|
+
? { key: translationKey }
|
|
193
|
+
: { key: translationKey, params: issue.params };
|
|
194
|
+
return { field, code: issue.code, translation };
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/settings/validate.ts"],"names":[],"mappings":"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"}
|