meocord 4.1.2 → 4.2.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 (95) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/cjs/_shared/{controller.decorator-BywwkU9O.cjs → controller.decorator-CRn9kWob.cjs} +295 -87
  3. package/dist/cjs/_shared/{providers-BMMLp2SN.cjs → providers-ChvMqnLd.cjs} +74 -40
  4. package/dist/cjs/_shared/{sharded-cooldown-store-B65iaiAy.cjs → sharded-cooldown-store-BdAUTdYs.cjs} +1 -1
  5. package/dist/cjs/_shared/{startup-roots-lFc69AxC.cjs → startup-roots-CQo8mSP8.cjs} +158 -72
  6. package/dist/cjs/_shared/{translate-error-BnM8FbSH.cjs → translate-error-DhDVbT5M.cjs} +12 -3
  7. package/dist/cjs/common/index.cjs +4 -4
  8. package/dist/cjs/core/index.cjs +195 -157
  9. package/dist/cjs/decorator/index.cjs +66 -57
  10. package/dist/cjs/testing/index.cjs +733 -301
  11. package/dist/cli.json +1 -1
  12. package/dist/esm/bin/app-template/README.md.template +3 -1
  13. package/dist/esm/bin/app-template/src/controllers/button/sample.button.controller.spec.ts.template +8 -4
  14. package/dist/esm/bin/app-template/src/controllers/button/sample.button.controller.ts.template +2 -2
  15. package/dist/esm/bin/app-template/src/guards/owner.guard.spec.ts.template +8 -4
  16. package/dist/esm/bin/app-template/src/guards/owner.guard.ts.template +1 -1
  17. package/dist/esm/bin/app-template/vitest.config.ts.template +1 -1
  18. package/dist/esm/bin/app-template/vitest.setup.ts.template +7 -3
  19. package/dist/esm/build/load-config.pre-entry.js +4 -1
  20. package/dist/esm/common/decorator.js +6 -6
  21. package/dist/esm/common/deprecation.js +2 -2
  22. package/dist/esm/common/errors.js +2 -2
  23. package/dist/esm/common/execution-context.js +1 -1
  24. package/dist/esm/common/metadata.js +1 -1
  25. package/dist/esm/common/route.js +10 -1
  26. package/dist/esm/common/translate-error.js +1 -1
  27. package/dist/esm/core/command-conflicts.js +34 -34
  28. package/dist/esm/core/component-routes.js +74 -31
  29. package/dist/esm/core/dispatcher.js +51 -7
  30. package/dist/esm/core/filter-runner.js +2 -2
  31. package/dist/esm/core/handler-pipeline.js +27 -14
  32. package/dist/esm/core/handler-registry.js +1 -1
  33. package/dist/esm/core/interceptor-runner.js +2 -2
  34. package/dist/esm/core/meocord-factory.js +196 -157
  35. package/dist/esm/core/message-routes.js +4 -3
  36. package/dist/esm/core/observer-runner.js +4 -3
  37. package/dist/esm/core/providers.js +38 -21
  38. package/dist/esm/core/route-specificity.js +4 -4
  39. package/dist/esm/core/scalar-types.js +15 -3
  40. package/dist/esm/core/shard-context.js +1 -1
  41. package/dist/esm/core/startup-roots.js +2 -3
  42. package/dist/esm/core/theme-runtime.js +2 -2
  43. package/dist/esm/decorator/app.decorator.js +12 -7
  44. package/dist/esm/decorator/command-builder.decorator.js +4 -4
  45. package/dist/esm/decorator/controller-class.decorator.js +9 -4
  46. package/dist/esm/decorator/controller.decorator.js +110 -67
  47. package/dist/esm/decorator/cooldown.decorator.js +3 -3
  48. package/dist/esm/decorator/defer.decorator.js +4 -4
  49. package/dist/esm/decorator/event.decorator.js +5 -5
  50. package/dist/esm/decorator/filter.decorator.js +7 -7
  51. package/dist/esm/decorator/guard.decorator.js +8 -8
  52. package/dist/esm/decorator/inject.decorator.js +4 -4
  53. package/dist/esm/decorator/interceptor.decorator.js +7 -7
  54. package/dist/esm/decorator/observer.decorator.js +4 -4
  55. package/dist/esm/decorator/service.decorator.js +4 -4
  56. package/dist/esm/decorator/theme.decorator.js +3 -3
  57. package/dist/esm/decorator/validation.decorator.js +10 -10
  58. package/dist/esm/package.json.js +1 -1
  59. package/dist/esm/testing/catalog.js +1 -1
  60. package/dist/esm/testing/cooldown-store-suite.js +18 -10
  61. package/dist/esm/testing/discord-defaults.js +60 -7
  62. package/dist/esm/testing/index.js +4 -2
  63. package/dist/esm/testing/inspect-handler.js +20 -3
  64. package/dist/esm/testing/meocord-testing-module.js +229 -188
  65. package/dist/esm/testing/mock-fn.js +80 -10
  66. package/dist/esm/testing/mock-interaction.js +223 -72
  67. package/dist/esm/testing/response.js +1 -1
  68. package/dist/esm/testing/routing.js +39 -14
  69. package/dist/esm/testing/startup-errors.js +26 -0
  70. package/dist/esm/testing/strict-mocks.js +45 -0
  71. package/dist/esm/testing/theme.js +1 -1
  72. package/dist/esm/util/bundle-entry.util.js +2 -1
  73. package/dist/esm/util/interaction.util.js +1 -1
  74. package/dist/esm/util/meocord-config-validation.util.js +1 -0
  75. package/dist/esm/util/metadata-keys.js +1 -0
  76. package/dist/esm/util/refusal.util.js +148 -8
  77. package/dist/types/common/index.d.cts +8 -8
  78. package/dist/types/common/index.d.ts +8 -8
  79. package/dist/types/core/index.d.cts +8 -6
  80. package/dist/types/core/index.d.ts +8 -6
  81. package/dist/types/decorator/index.d.cts +30 -29
  82. package/dist/types/decorator/index.d.ts +30 -29
  83. package/dist/types/{index-D7n0FBMm.d.ts → index-CdXsFgjE.d.ts} +62 -15
  84. package/dist/types/{index-DEP0NYrU.d.cts → index-nn5p7OoX.d.cts} +62 -15
  85. package/dist/types/interface/index.d.cts +1 -1
  86. package/dist/types/interface/index.d.ts +1 -1
  87. package/dist/types/{route-C-aMI7Sl.d.cts → route-BZgFoNeB.d.cts} +5 -2
  88. package/dist/types/{route-C-aMI7Sl.d.ts → route-BZgFoNeB.d.ts} +5 -2
  89. package/dist/types/testing/index.d.cts +245 -31
  90. package/dist/types/testing/index.d.ts +245 -31
  91. package/dist/types/{theme-resolvers-DedxyscT.d.ts → theme-resolvers-BcOJVzR9.d.ts} +1 -1
  92. package/dist/types/{theme-resolvers-COHdX5g6.d.cts → theme-resolvers-UKr3-6Ys.d.cts} +1 -1
  93. package/dist/types/{translator-J6tIUfdp.d.ts → translator-BViWKtLJ.d.ts} +1 -1
  94. package/dist/types/{translator-B4mc1lzJ.d.cts → translator-DHMkkCpg.d.cts} +1 -1
  95. package/package.json +3 -2
@@ -35,7 +35,7 @@ function mockTheme(overrides, where) {
35
35
  * @group Testing
36
36
  * @category Mocks
37
37
  * @see {@link withTheme}
38
- * @see {@link https://meocord.dev/docs/4.1/theming | Theming}
38
+ * @see {@link https://meocord.dev/docs/4.2/theming | Theming}
39
39
  */ function createMockTheme(...[overrides]) {
40
40
  return mockTheme(overrides, 'createMockTheme');
41
41
  }
@@ -2,6 +2,7 @@ import { existsSync, realpathSync } from 'node:fs';
2
2
 
3
3
  /** Where the built bundle's pre-entry records the bundle's own path. */ const BUNDLE_ENTRY_KEY = Symbol.for('meocord.bundleEntry');
4
4
  /** Where the built bundle's pre-entry records the mode the bundle was built in. */ const BUILD_MODE_KEY = Symbol.for('meocord.buildMode');
5
+ /** Where the built bot's pre-entry records `startupErrors` from its config, before the application's modules load. */ const STARTUP_ERRORS_KEY = Symbol.for('meocord.startupErrorsMode');
5
6
  /**
6
7
  * The file a shard process runs: the built bundle, as its pre-entry recorded it, else the script this
7
8
  * process was started with; undefined when there is none, as for code run with `node -e` outside a built bundle.
@@ -19,4 +20,4 @@ import { existsSync, realpathSync } from 'node:fs';
19
20
  return typeof recorded === 'string' ? recorded : undefined;
20
21
  }
21
22
 
22
- export { BUILD_MODE_KEY, BUNDLE_ENTRY_KEY, buildMode, bundleEntry, isBuiltApplication };
23
+ export { BUILD_MODE_KEY, BUNDLE_ENTRY_KEY, STARTUP_ERRORS_KEY, buildMode, bundleEntry, isBuiltApplication };
@@ -1,4 +1,4 @@
1
- import { ApplicationCommandOptionType, ModalSubmitInteraction, ChannelSelectMenuInteraction, MentionableSelectMenuInteraction, RoleSelectMenuInteraction, UserSelectMenuInteraction, StringSelectMenuInteraction, ButtonInteraction, PrimaryEntryPointCommandInteraction, ContextMenuCommandInteraction, ChatInputCommandInteraction, MessageComponentInteraction } from 'discord.js';
1
+ import { ApplicationCommandOptionType, MessageComponentInteraction, ModalSubmitInteraction, ChannelSelectMenuInteraction, MentionableSelectMenuInteraction, RoleSelectMenuInteraction, UserSelectMenuInteraction, StringSelectMenuInteraction, ButtonInteraction, PrimaryEntryPointCommandInteraction, ContextMenuCommandInteraction, ChatInputCommandInteraction } from 'discord.js';
2
2
  import { CommandType } from '../enum/controller.enum.js';
3
3
  import { quoteForLog } from './user-text.util.js';
4
4
  import { withArticle } from './value.util.js';
@@ -46,6 +46,7 @@ const oneOf = (...allowed)=>(value, key)=>allowed.includes(value) ? undefined :
46
46
  optionalExternals: optional(stringList('package names')),
47
47
  rsbuild: optional(func),
48
48
  sourceMappedStacks: optional(boolean),
49
+ startupErrors: optional(oneOf('first', 'all')),
49
50
  shutdownTimeout: optional((value, key)=>{
50
51
  const problem = shutdownTimeoutProblem(value);
51
52
  return problem && `${key} ${problem}`;
@@ -24,6 +24,7 @@ import { MetadataKey } from '../enum/metadata-key.enum.js';
24
24
  /** How many guard wrappers `@UseGuard` and `@Controller` put around one method. */ guardWrappers: 'meocord:guard-wrappers',
25
25
  /** The prototype whose method a class-level `@UseGuard` re-declared on a subclass. */ inheritedFrom: 'meocord:inherited-from',
26
26
  /** `false` when `@Controller({ inheritStages: false })` stops class stages at this class. */ inheritStages: 'meocord:inherit-stages',
27
+ /** `true` when `@Controller({ inheritedRoutes: 'replace' })` drops the routes this class's re-decorated methods inherit. */ replacesInheritedRoutes: 'meocord:replaces-inherited-routes',
27
28
  /** A controller's class-level `@Cooldown`s. */ classCooldowns: 'meocord:class-cooldowns',
28
29
  /** A method's `@Cooldown`s, in declaration order. */ methodCooldowns: 'meocord:method-cooldowns',
29
30
  /** The error types a filter's `@Catch` names; empty to catch everything. */ catchTypes: 'meocord:catch-types',
@@ -2,7 +2,7 @@ import path from 'path';
2
2
  import { warnDeprecatedBehaviour } from '../common/deprecation.js';
3
3
  import { isExplainedError } from '../common/explained-error.js';
4
4
  import { Logger } from '../common/logger.js';
5
- import { isBuiltApplication } from './bundle-entry.util.js';
5
+ import { isBuiltApplication, STARTUP_ERRORS_KEY } from './bundle-entry.util.js';
6
6
  import { comparablePath, framePath } from './source-path.util.js';
7
7
 
8
8
  const REFUSAL = Symbol.for('meocord.refusal');
@@ -51,10 +51,10 @@ const REFUSAL = Symbol.for('meocord.refusal');
51
51
  // A stack frame's function and file: `at fn (file:line:col)` or `at file:line:col`, the file possibly a file:// URL
52
52
  const FRAME = /^\s*at (?:(.*?) \()?(.+?):\d+:\d+\)?$/;
53
53
  /**
54
- * A refusal as the application reports it: the message, and the first file of the application's own source the stack
55
- * passes through, other than its entry, which only loads the rest. The file alone: a line from a development build's
56
- * source map can be off, and a compiler's decorate helper can be placed in any file, so those frames are skipped.
57
- */ function describeRefusal(error, root, windows = process.platform === 'win32') {
54
+ * The first file of the application's own source an error's stack passes through, other than its entry, which only
55
+ * loads the rest, relative to `root`. The file alone: a line from a development build's source map can be off, and a
56
+ * compiler's decorate helper can be placed in any file, so those frames are skipped.
57
+ */ function sourceFileOf(error, root, windows = process.platform === 'win32') {
58
58
  const paths = windows ? path.win32 : path.posix;
59
59
  const source = comparablePath(paths.join(root, 'src') + paths.sep, windows);
60
60
  const entry = comparablePath(paths.join(root, 'src', 'main.ts'), windows);
@@ -65,9 +65,149 @@ const FRAME = /^\s*at (?:(.*?) \()?(.+?):\d+:\d+\)?$/;
65
65
  const file = paths.normalize(framePath(name, windows));
66
66
  const compared = comparablePath(file, windows);
67
67
  if (!compared.startsWith(source) || compared === entry || compared.includes(dependencies)) continue;
68
- return `${error.message}\n in ${paths.relative(root, file).split(paths.sep).join('/')}`;
68
+ return paths.relative(root, file).split(paths.sep).join('/');
69
+ }
70
+ return undefined;
71
+ }
72
+ /**
73
+ * A refusal as the application reports it: the message, led by the declaration it is about where the message does not
74
+ * name it, and the file of the application's source it comes from; see {@link sourceFileOf}.
75
+ */ function describeRefusal(error, root, windows = process.platform === 'win32') {
76
+ const declaration = declarationOf(error);
77
+ const message = declaration && !error.message.startsWith(declaration) ? `${declaration}: ${error.message}` : error.message;
78
+ const file = sourceFileOf(error, root, windows);
79
+ return file ? `${message}\n in ${file}` : message;
80
+ }
81
+ // ---------------------------------------------------------------------------
82
+ // Startup errors: those create() and a testing module's compile() find, and those decorators find at import
83
+ // ---------------------------------------------------------------------------
84
+ const STARTUP_ERRORS = Symbol.for('meocord.startupErrors');
85
+ const DECLARED = Symbol.for('meocord.declaredStartupErrors');
86
+ const ALL_DECLARED = Symbol.for('meocord.allDeclaredStartupErrors');
87
+ // The startup errors kept while checks run under collectStartupErrors; undefined outside them
88
+ let kept;
89
+ /**
90
+ * Reports an error a startup check finds. Outside {@link collectStartupErrors} it is thrown, as a refusal; inside, it
91
+ * is kept, and the check goes on to find the rest.
92
+ */ function startupError(error) {
93
+ refuse(error);
94
+ if (!kept) throw error;
95
+ // Two checks of one mistake, such as a class needing a translator, name it once
96
+ if (!kept.some((other)=>other.message === error.message)) kept.push(error);
97
+ }
98
+ /**
99
+ * Runs startup checks, and once they are done throws the first error they found, unchanged, with every one found on it
100
+ * for {@link startupErrorsOf}. An error that ends the checks after one was found is left out, as one the found error
101
+ * caused; one that ends them before any was found is thrown as it is.
102
+ */ function collectStartupErrors(checks) {
103
+ const outer = kept;
104
+ const found = [];
105
+ kept = found;
106
+ let result;
107
+ try {
108
+ result = checks();
109
+ } catch (error) {
110
+ if (found.length === 0) throw error;
111
+ if (isRefusal(error) && !found.includes(error)) found.push(error);
112
+ throw firstOf(found);
113
+ } finally{
114
+ kept = outer;
115
+ }
116
+ if (found.length > 0) throw firstOf(found);
117
+ return result;
118
+ }
119
+ /**
120
+ * Ends the checks under way with the errors found so far, before a step that is no check, such as binding or a warning:
121
+ * a run with one error stops where it stopped when the first error was thrown, and the errors of one pass of the
122
+ * checks are still reported together.
123
+ */ function stopOnStartupErrors() {
124
+ if (kept && kept.length > 0) throw kept[0];
125
+ }
126
+ function firstOf(errors) {
127
+ const [first] = errors;
128
+ Object.defineProperty(first, STARTUP_ERRORS, {
129
+ value: errors,
130
+ configurable: true
131
+ });
132
+ return first;
133
+ }
134
+ /** Every startup error found together with `error`, the first of them; `error` alone when it was the only one. */ function startupErrorsOf(error) {
135
+ return error[STARTUP_ERRORS] ?? [
136
+ error
137
+ ];
138
+ }
139
+ /**
140
+ * Logs each startup error found with `error` as the application reports a refusal, and how many there were, when there
141
+ * was more than one; a lone error is left to whoever reports it now.
142
+ */ function logStartupErrors(error, log, ending) {
143
+ const errors = startupErrorsOf(error);
144
+ if (errors.length < 2) return false;
145
+ for (const each of errors)log(describeRefusal(each, process.cwd()));
146
+ log(`MeoCord found ${errors.length} startup errors; ${ending}.`);
147
+ return true;
148
+ }
149
+ /** Sets how decorators report startup errors from here on, before the application's modules load. */ function setStartupErrorsMode(mode) {
150
+ globalThis[STARTUP_ERRORS_KEY] = mode;
151
+ }
152
+ /** Whether decorators keep their startup errors for create(), as `startupErrors: 'all'` has them. */ const keepsDeclaredErrors = ()=>globalThis[STARTUP_ERRORS_KEY] === 'all';
153
+ /** The declaration a decorator's startup error is about, `Class.method` or `Class`. */ function declarationOf(error) {
154
+ return error.declaration;
155
+ }
156
+ /**
157
+ * A decorator that names, on each startup error it throws, the declaration it was applied to, `Class.method` or
158
+ * `Class`, as `declaration`, and the source file it is declared in, as `file`: the same error, thrown at the same
159
+ * moment, with its message unchanged. With `startupErrors: 'all'` the error is kept on the class instead, for create()
160
+ * to report with the rest, and the decorator applies nothing more.
161
+ */ function declaring(decorate) {
162
+ return function(target, propertyKey, ...rest) {
163
+ try {
164
+ return decorate.call(this, target, propertyKey, ...rest);
165
+ } catch (error) {
166
+ if (!isRefusal(error)) throw error;
167
+ keepOrThrow(error, target, propertyKey);
168
+ return undefined;
169
+ }
170
+ };
171
+ }
172
+ function keepOrThrow(error, target, propertyKey) {
173
+ var _globalThis, _ALL_DECLARED;
174
+ // A decorator applied through another, such as applyDecorators, names the declaration once, where it was first thrown
175
+ if (declarationOf(error) === undefined) {
176
+ Object.defineProperty(error, 'declaration', {
177
+ value: decoratedName(target, propertyKey),
178
+ configurable: true
179
+ });
180
+ Object.defineProperty(error, 'file', {
181
+ get: ()=>sourceFileOf(error, process.cwd()),
182
+ configurable: true
183
+ });
69
184
  }
70
- return error.message;
185
+ if (!keepsDeclaredErrors()) throw error;
186
+ const owner = typeof target === 'function' ? target : target.constructor;
187
+ if (!Object.prototype.hasOwnProperty.call(owner, DECLARED)) Object.defineProperty(owner, DECLARED, {
188
+ value: []
189
+ });
190
+ const declared = owner[DECLARED];
191
+ if (!declared.includes(error)) declared.push(error);
192
+ const all = (_globalThis = globalThis)[_ALL_DECLARED = ALL_DECLARED] ?? (_globalThis[_ALL_DECLARED] = []);
193
+ if (!all.includes(error)) all.push(error);
194
+ }
195
+ /** The startup errors decorators kept on `classes` and the classes they extend, each once, in the order they were found. */ function declaredErrorsOf(classes) {
196
+ const found = new Set();
197
+ for (const cls of classes){
198
+ for(let current = cls; typeof current === 'function' && current !== Function.prototype; current = Object.getPrototypeOf(current)){
199
+ if (Object.prototype.hasOwnProperty.call(current, DECLARED)) for (const error of current[DECLARED])found.add(error);
200
+ }
201
+ }
202
+ const order = allDeclaredErrors();
203
+ return [
204
+ ...found
205
+ ].sort((a, b)=>order.indexOf(a) - order.indexOf(b));
206
+ }
207
+ /** Every startup error decorators kept in this process, in the order they were found. */ function allDeclaredErrors() {
208
+ return [
209
+ ...globalThis[ALL_DECLARED] ?? []
210
+ ];
71
211
  }
72
212
  /**
73
213
  * Reports a refusal nothing catches as one line, with its source file, and exits 1; other errors keep the runtime's
@@ -95,4 +235,4 @@ const FRAME = /^\s*at (?:(.*?) \()?(.+?):\d+:\d+\)?$/;
95
235
  process.on('unhandledRejection', onRejection);
96
236
  }
97
237
 
98
- export { decoratedName, deprecatedOnMethod, describeRefusal, handOffRefusal, isRefusal, refuse, refuseOnClass, refuseOnMethod, reportRefusals };
238
+ export { allDeclaredErrors, collectStartupErrors, declarationOf, declaredErrorsOf, declaring, decoratedName, deprecatedOnMethod, describeRefusal, handOffRefusal, isRefusal, keepsDeclaredErrors, logStartupErrors, refuse, refuseOnClass, refuseOnMethod, reportRefusals, setStartupErrorsMode, sourceFileOf, startupError, startupErrorsOf, stopOnStartupErrors };
@@ -1,11 +1,11 @@
1
1
  import { ColorResolvable, Interaction, Message, Locale } from 'discord.js';
2
- import { C as CooldownStore, a as CooldownLimit, b as CooldownVerdict, c as CooldownEntry, d as CooldownBatchVerdict } from '../index-DEP0NYrU.cjs';
2
+ import { C as CooldownStore, a as CooldownLimit, b as CooldownVerdict, c as CooldownEntry, d as CooldownBatchVerdict } from '../index-nn5p7OoX.cjs';
3
3
  import { Token, ProviderToken, FactoryProvider, DeepReadonly, MeoCordTheme } from '../interface/index.cjs';
4
- export { e as CommandNotFoundError, f as CooldownError, g as CooldownScope, h as CooldownStoreError, E as ExecutionContext, i as ExecutionContextType, G as GuardDeniedError, I as InstallContext, j as MemoryCooldownStore, k as MessageUsageError, l as MessageUsageIssue, m as MetadataDecorator, R as ResponseCall, n as ResponseEditFlags, o as ResponseEditPayload, p as ResponseErrorOptions, q as ResponseFlags, r as ResponseLockOptions, s as ResponsePayload, t as ResponsePhase, u as ResponseSendOptions, v as ResponseState, U as UserError, w as UserErrorOptions, V as ValidationError, x as ValidationIssue, y as cooldownMessage, z as cooldownStoreMessage, A as createMetadata, B as getInstallContext, H as respond } from '../index-DEP0NYrU.cjs';
5
- export { R as Route, a as RouteParams, b as RouteValue, c as RouteValues, r as route } from '../route-C-aMI7Sl.cjs';
6
- import { T as Translator } from '../translator-B4mc1lzJ.cjs';
7
- export { C as CatalogDefinition, a as CatalogShape, L as LocaleCatalog, b as LocalizationKey, M as MessageKey, c as MessageParams, P as PluralCategory, d as PluralMessage, S as StringMessageKey, e as Translate, f as TranslatorOptions, g as createTranslator, h as defineCatalog } from '../translator-B4mc1lzJ.cjs';
8
- export { T as ThemeCache } from '../theme-resolvers-COHdX5g6.cjs';
4
+ export { e as CommandNotFoundError, f as CooldownError, g as CooldownScope, h as CooldownStoreError, E as ExecutionContext, i as ExecutionContextType, G as GuardDeniedError, I as InstallContext, j as MemoryCooldownStore, k as MessageUsageError, l as MessageUsageIssue, m as MetadataDecorator, R as ResponseCall, n as ResponseEditFlags, o as ResponseEditPayload, p as ResponseErrorOptions, q as ResponseFlags, r as ResponseLockOptions, s as ResponsePayload, t as ResponsePhase, u as ResponseSendOptions, v as ResponseState, U as UserError, w as UserErrorOptions, V as ValidationError, x as ValidationIssue, y as cooldownMessage, z as cooldownStoreMessage, A as createMetadata, B as getInstallContext, H as respond } from '../index-nn5p7OoX.cjs';
5
+ export { R as Route, a as RouteParams, b as RouteValue, c as RouteValues, r as route } from '../route-BZgFoNeB.cjs';
6
+ import { T as Translator } from '../translator-DHMkkCpg.cjs';
7
+ export { C as CatalogDefinition, a as CatalogShape, L as LocaleCatalog, b as LocalizationKey, M as MessageKey, c as MessageParams, P as PluralCategory, d as PluralMessage, S as StringMessageKey, e as Translate, f as TranslatorOptions, g as createTranslator, h as defineCatalog } from '../translator-DHMkkCpg.cjs';
8
+ export { T as ThemeCache } from '../theme-resolvers-UKr3-6Ys.cjs';
9
9
  import '@rsbuild/core';
10
10
  import '../controller.enum-DTDn69N9.cjs';
11
11
 
@@ -169,7 +169,7 @@ declare class Theme {
169
169
  *
170
170
  * @group Utilities
171
171
  * @see {@link createMetadata}
172
- * @see {@link https://meocord.dev/docs/4.1/custom-decorators | Custom decorators}
172
+ * @see {@link https://meocord.dev/docs/4.2/custom-decorators | Custom decorators}
173
173
  */
174
174
  declare function applyDecorators(...decorators: (ClassDecorator | MethodDecorator)[]): ClassDecorator & MethodDecorator;
175
175
  /**
@@ -523,7 +523,7 @@ declare class ShardedCooldownStore extends CooldownStore {
523
523
  * @group Utilities
524
524
  * @category Localisation
525
525
  * @see {@link createTranslator}
526
- * @see {@link https://meocord.dev/docs/4.1/localisation | Localisation}
526
+ * @see {@link https://meocord.dev/docs/4.2/localisation | Localisation}
527
527
  */
528
528
  declare function translateError(error: unknown, t: Translator<any>, target: Interaction | Message | Locale | `${Locale}`): string;
529
529
 
@@ -1,11 +1,11 @@
1
1
  import { ColorResolvable, Interaction, Message, Locale } from 'discord.js';
2
- import { C as CooldownStore, a as CooldownLimit, b as CooldownVerdict, c as CooldownEntry, d as CooldownBatchVerdict } from '../index-D7n0FBMm.js';
2
+ import { C as CooldownStore, a as CooldownLimit, b as CooldownVerdict, c as CooldownEntry, d as CooldownBatchVerdict } from '../index-CdXsFgjE.js';
3
3
  import { Token, ProviderToken, FactoryProvider, DeepReadonly, MeoCordTheme } from '../interface/index.js';
4
- export { e as CommandNotFoundError, f as CooldownError, g as CooldownScope, h as CooldownStoreError, E as ExecutionContext, i as ExecutionContextType, G as GuardDeniedError, I as InstallContext, j as MemoryCooldownStore, k as MessageUsageError, l as MessageUsageIssue, m as MetadataDecorator, R as ResponseCall, n as ResponseEditFlags, o as ResponseEditPayload, p as ResponseErrorOptions, q as ResponseFlags, r as ResponseLockOptions, s as ResponsePayload, t as ResponsePhase, u as ResponseSendOptions, v as ResponseState, U as UserError, w as UserErrorOptions, V as ValidationError, x as ValidationIssue, y as cooldownMessage, z as cooldownStoreMessage, A as createMetadata, B as getInstallContext, H as respond } from '../index-D7n0FBMm.js';
5
- export { R as Route, a as RouteParams, b as RouteValue, c as RouteValues, r as route } from '../route-C-aMI7Sl.js';
6
- import { T as Translator } from '../translator-J6tIUfdp.js';
7
- export { C as CatalogDefinition, a as CatalogShape, L as LocaleCatalog, b as LocalizationKey, M as MessageKey, c as MessageParams, P as PluralCategory, d as PluralMessage, S as StringMessageKey, e as Translate, f as TranslatorOptions, g as createTranslator, h as defineCatalog } from '../translator-J6tIUfdp.js';
8
- export { T as ThemeCache } from '../theme-resolvers-DedxyscT.js';
4
+ export { e as CommandNotFoundError, f as CooldownError, g as CooldownScope, h as CooldownStoreError, E as ExecutionContext, i as ExecutionContextType, G as GuardDeniedError, I as InstallContext, j as MemoryCooldownStore, k as MessageUsageError, l as MessageUsageIssue, m as MetadataDecorator, R as ResponseCall, n as ResponseEditFlags, o as ResponseEditPayload, p as ResponseErrorOptions, q as ResponseFlags, r as ResponseLockOptions, s as ResponsePayload, t as ResponsePhase, u as ResponseSendOptions, v as ResponseState, U as UserError, w as UserErrorOptions, V as ValidationError, x as ValidationIssue, y as cooldownMessage, z as cooldownStoreMessage, A as createMetadata, B as getInstallContext, H as respond } from '../index-CdXsFgjE.js';
5
+ export { R as Route, a as RouteParams, b as RouteValue, c as RouteValues, r as route } from '../route-BZgFoNeB.js';
6
+ import { T as Translator } from '../translator-BViWKtLJ.js';
7
+ export { C as CatalogDefinition, a as CatalogShape, L as LocaleCatalog, b as LocalizationKey, M as MessageKey, c as MessageParams, P as PluralCategory, d as PluralMessage, S as StringMessageKey, e as Translate, f as TranslatorOptions, g as createTranslator, h as defineCatalog } from '../translator-BViWKtLJ.js';
8
+ export { T as ThemeCache } from '../theme-resolvers-BcOJVzR9.js';
9
9
  import '@rsbuild/core';
10
10
  import '../controller.enum-DTDn69N9.js';
11
11
 
@@ -169,7 +169,7 @@ declare class Theme {
169
169
  *
170
170
  * @group Utilities
171
171
  * @see {@link createMetadata}
172
- * @see {@link https://meocord.dev/docs/4.1/custom-decorators | Custom decorators}
172
+ * @see {@link https://meocord.dev/docs/4.2/custom-decorators | Custom decorators}
173
173
  */
174
174
  declare function applyDecorators(...decorators: (ClassDecorator | MethodDecorator)[]): ClassDecorator & MethodDecorator;
175
175
  /**
@@ -523,7 +523,7 @@ declare class ShardedCooldownStore extends CooldownStore {
523
523
  * @group Utilities
524
524
  * @category Localisation
525
525
  * @see {@link createTranslator}
526
- * @see {@link https://meocord.dev/docs/4.1/localisation | Localisation}
526
+ * @see {@link https://meocord.dev/docs/4.2/localisation | Localisation}
527
527
  */
528
528
  declare function translateError(error: unknown, t: Translator<any>, target: Interaction | Message | Locale | `${Locale}`): string;
529
529
 
@@ -1,5 +1,5 @@
1
1
  import { ServiceIdentifier } from 'inversify';
2
- import { J as MeoCordApplication } from '../index-DEP0NYrU.cjs';
2
+ import { J as MeoCordApplication } from '../index-nn5p7OoX.cjs';
3
3
  import { MetadataDecorator } from '../common/index.cjs';
4
4
  import { MessageScope, MessageCommandOptions, MessageHelp } from '../interface/index.cjs';
5
5
  import { RESTPostAPIApplicationCommandsJSONBody, ClientEvents, Message, Client } from 'discord.js';
@@ -46,9 +46,11 @@ declare class MeoCordFactory {
46
46
  * load, naming the file and the reason, with what to do about it, when a provider cannot
47
47
  * be bound, such as one for a token MeoCord binds itself, when two handlers take one command, or two builder
48
48
  * classes build one, naming both, and for any other mistake it refuses as the app loads, such as two component
49
- * patterns that match the same customIds. In a built application it is logged first, with where in the source it
50
- * comes from, so `isExplainedError()` tells a caller not to log it again; in a shard of process sharding, the
51
- * manager logs it.
49
+ * patterns that match the same customIds. Each check reports every error it finds, and the first is thrown,
50
+ * unchanged. When there are several, each is logged first, with where in the source it comes from; a lone one is
51
+ * logged in a built application. Either way `isExplainedError()` then tells a caller not to log it again; in a
52
+ * shard of process sharding, the manager logs it. With `startupErrors: 'all'` in `meocord.config.ts`, the errors
53
+ * decorators kept are among them.
52
54
  */
53
55
  static create(target: ServiceIdentifier): MeoCordApplication;
54
56
  private static createApplication;
@@ -260,7 +262,7 @@ interface HandlerFilter<K extends HandlerKind = HandlerKind> {
260
262
  *
261
263
  * @group Controllers
262
264
  * @see {@link HandlerEntry}
263
- * @see {@link https://meocord.dev/docs/4.1/handler-discovery | Handler discovery}
265
+ * @see {@link https://meocord.dev/docs/4.2/handler-discovery | Handler discovery}
264
266
  */
265
267
  declare class HandlerRegistry {
266
268
  private readonly classes;
@@ -416,7 +418,7 @@ type MethodResult<T, M extends keyof T> = T[M] extends (...args: any[]) => infer
416
418
  *
417
419
  * @group Controllers
418
420
  * @see {@link ShardCallResult}
419
- * @see {@link https://meocord.dev/docs/4.1/sharding | Sharding}
421
+ * @see {@link https://meocord.dev/docs/4.2/sharding | Sharding}
420
422
  */
421
423
  declare class ShardContext {
422
424
  private readonly client;
@@ -1,5 +1,5 @@
1
1
  import { ServiceIdentifier } from 'inversify';
2
- import { J as MeoCordApplication } from '../index-D7n0FBMm.js';
2
+ import { J as MeoCordApplication } from '../index-CdXsFgjE.js';
3
3
  import { MetadataDecorator } from '../common/index.js';
4
4
  import { MessageScope, MessageCommandOptions, MessageHelp } from '../interface/index.js';
5
5
  import { RESTPostAPIApplicationCommandsJSONBody, ClientEvents, Message, Client } from 'discord.js';
@@ -46,9 +46,11 @@ declare class MeoCordFactory {
46
46
  * load, naming the file and the reason, with what to do about it, when a provider cannot
47
47
  * be bound, such as one for a token MeoCord binds itself, when two handlers take one command, or two builder
48
48
  * classes build one, naming both, and for any other mistake it refuses as the app loads, such as two component
49
- * patterns that match the same customIds. In a built application it is logged first, with where in the source it
50
- * comes from, so `isExplainedError()` tells a caller not to log it again; in a shard of process sharding, the
51
- * manager logs it.
49
+ * patterns that match the same customIds. Each check reports every error it finds, and the first is thrown,
50
+ * unchanged. When there are several, each is logged first, with where in the source it comes from; a lone one is
51
+ * logged in a built application. Either way `isExplainedError()` then tells a caller not to log it again; in a
52
+ * shard of process sharding, the manager logs it. With `startupErrors: 'all'` in `meocord.config.ts`, the errors
53
+ * decorators kept are among them.
52
54
  */
53
55
  static create(target: ServiceIdentifier): MeoCordApplication;
54
56
  private static createApplication;
@@ -260,7 +262,7 @@ interface HandlerFilter<K extends HandlerKind = HandlerKind> {
260
262
  *
261
263
  * @group Controllers
262
264
  * @see {@link HandlerEntry}
263
- * @see {@link https://meocord.dev/docs/4.1/handler-discovery | Handler discovery}
265
+ * @see {@link https://meocord.dev/docs/4.2/handler-discovery | Handler discovery}
264
266
  */
265
267
  declare class HandlerRegistry {
266
268
  private readonly classes;
@@ -416,7 +418,7 @@ type MethodResult<T, M extends keyof T> = T[M] extends (...args: any[]) => infer
416
418
  *
417
419
  * @group Controllers
418
420
  * @see {@link ShardCallResult}
419
- * @see {@link https://meocord.dev/docs/4.1/sharding | Sharding}
421
+ * @see {@link https://meocord.dev/docs/4.2/sharding | Sharding}
420
422
  */
421
423
  declare class ShardContext {
422
424
  private readonly client;
@@ -32,7 +32,7 @@ import '@rsbuild/core';
32
32
  * @group Decorators
33
33
  * @category App
34
34
  * @see {@link Inject}
35
- * @see {@link https://meocord.dev/docs/4.1/services | Services}
35
+ * @see {@link https://meocord.dev/docs/4.2/services | Services}
36
36
  */
37
37
  declare function Service<T>(): (target: new (...args: any[]) => T, propertyKey?: string | symbol) => void;
38
38
 
@@ -63,7 +63,7 @@ declare function Service<T>(): (target: new (...args: any[]) => T, propertyKey?:
63
63
  * @group Decorators
64
64
  * @category Handlers
65
65
  * @see {@link Command}
66
- * @see {@link https://meocord.dev/docs/4.1/slash-commands | Slash commands}
66
+ * @see {@link https://meocord.dev/docs/4.2/slash-commands | Slash commands}
67
67
  */
68
68
  declare function CommandBuilder<T extends BuildableCommandType>(commandType: T, options?: CommandBuilderOptions): (target: new () => CommandBuilderBase<T>, propertyKey?: string | symbol) => void;
69
69
 
@@ -141,7 +141,7 @@ type ParamsFit<P, Given> = [Given] extends [Unpiped<P>] ? unknown : [Misfits<P,
141
141
  * @group Decorators
142
142
  * @category Handlers
143
143
  * @see {@link ReactionHandler}
144
- * @see {@link https://meocord.dev/docs/4.1/message-commands | Message commands}
144
+ * @see {@link https://meocord.dev/docs/4.2/message-commands | Message commands}
145
145
  */
146
146
  declare function MessageHandler<T extends OmitPartialGroupDMChannel<Message<boolean>>, R>(): (target: object, propertyKey: string, _descriptor: TypedPropertyDescriptor<(message: T) => R> | TypedPropertyDescriptor<() => R>) => void;
147
147
  /**
@@ -179,7 +179,7 @@ declare function MessageHandler<T extends OmitPartialGroupDMChannel<Message<bool
179
179
  * @group Decorators
180
180
  * @category Handlers
181
181
  * @see {@link ParamsOf}
182
- * @see {@link https://meocord.dev/docs/4.1/message-commands | Message commands}
182
+ * @see {@link https://meocord.dev/docs/4.2/message-commands | Message commands}
183
183
  */
184
184
  declare function MessageHandler<T extends OmitPartialGroupDMChannel<Message<boolean>>, R, const Pattern extends string = string>(pattern: Pattern, options?: MessageHandlerOptions): PatternedMessageHandlerDecorator<T, R, Pattern>;
185
185
  type ReactionHandlerDecorator<T extends MessageReaction | PartialMessageReaction, R> = (target: object, propertyKey: string, descriptor: TypedPropertyDescriptor<(reaction: T, options: ReactionEvent) => R> | TypedPropertyDescriptor<(reaction: T) => R> | TypedPropertyDescriptor<() => R>) => void;
@@ -215,7 +215,7 @@ type ReactionHandlerDecorator<T extends MessageReaction | PartialMessageReaction
215
215
  * @group Decorators
216
216
  * @category Handlers
217
217
  * @see {@link ReactionEvent}
218
- * @see {@link https://meocord.dev/docs/4.1/reactions | Reactions}
218
+ * @see {@link https://meocord.dev/docs/4.2/reactions | Reactions}
219
219
  */
220
220
  declare function ReactionHandler<T extends MessageReaction | PartialMessageReaction, R>(emoji?: string, settings?: ReactionHandlerSettings): ReactionHandlerDecorator<T, R>;
221
221
  /**
@@ -307,10 +307,11 @@ type TypedParamsAccept<N, T, P> = T extends CommandType ? string extends Pattern
307
307
  * the keys the handler's params require are checked against the pattern or route, a typed segment's value against
308
308
  * its type, and a select menu's choices, such as `values: string[]`, against what discord.js gives; a key a pipe
309
309
  * produces is declared `Piped<T>`, and left to the pipe. Two component handlers of one type whose patterns match
310
- * exactly the same ids stop the bot at startup; patterns that only overlap are warned about, naming the one that
311
- * runs: the more specific, or between equally specific ones, the one listed first. In the next major version (5.0),
312
- * the one that spells out the first segment where two equally specific patterns differ runs instead, and the warning
313
- * names the pairs that changes. A context menu handler receives the kind its builder's `setType()` names, and one
310
+ * exactly the same ids stop the bot at startup. Patterns that both match an id rank segment by segment, left to
311
+ * right: at the first segment one spells out as literal text and the other leaves to a param, the literal one runs,
312
+ * so `profile/me/{section}` takes `profile/me/edit` from `profile/{userId}/edit`; between patterns that leaves tied,
313
+ * the narrower type at the first param where they differ. Two still tied are warned about as the bot starts, and the
314
+ * one listed first runs. A context menu handler receives the kind its builder's `setType()` names, and one
314
315
  * declaring the other kind fails to compile; when the compiler cannot tell the kind, `@Command` checks the parameter
315
316
  * type it emits as it applies. A subclass that re-declares an inherited handler on the same name or pattern takes its
316
317
  * own builder and options; on another it still answers the inherited one too, which the bot warns about as it
@@ -343,8 +344,8 @@ type TypedParamsAccept<N, T, P> = T extends CommandType ? string extends Pattern
343
344
  * @category Handlers
344
345
  * @see {@link CommandBuilder}
345
346
  * @see {@link route}
346
- * @see {@link https://meocord.dev/docs/4.1/slash-commands | Slash commands}
347
- * @see {@link https://meocord.dev/docs/4.1/components | Buttons, selects and modals}
347
+ * @see {@link https://meocord.dev/docs/4.2/slash-commands | Slash commands}
348
+ * @see {@link https://meocord.dev/docs/4.2/components | Buttons, selects and modals}
348
349
  */
349
350
  declare function Command<CBC extends BuildableCommandType, T extends CommandBuilderConstructor<CBC> | CommandType, N extends string | Route = string>(name: N, builderOrType: T): <P extends Record<string, any>, R>(target: object, propertyKey: string, _descriptor: (TypedPropertyDescriptor<Handles<CommandInteractionType<CBC, T>, [params: P], R>> | TypedPropertyDescriptor<Handles<CommandInteractionType<CBC, T>, [], R>> | TypedPropertyDescriptor<() => R>) & RouteAccepts<N, T, P> & TypedParamsAccept<N, T, P> & ChoicesAccept<N, T, P>) => void;
350
351
  /**
@@ -383,7 +384,7 @@ declare function Command<CBC extends BuildableCommandType, T extends CommandBuil
383
384
  * @group Decorators
384
385
  * @category Handlers
385
386
  * @see {@link Command}
386
- * @see {@link https://meocord.dev/docs/4.1/autocomplete | Autocomplete}
387
+ * @see {@link https://meocord.dev/docs/4.2/autocomplete | Autocomplete}
387
388
  */
388
389
  declare function Autocomplete<_R = unknown>(commandPath: string, optionName?: string): <P extends Record<string, any>, R>(target: object, propertyKey: string, _descriptor: TypedPropertyDescriptor<(interaction: AutocompleteInteraction, params: P) => R> | TypedPropertyDescriptor<(interaction: AutocompleteInteraction) => R> | TypedPropertyDescriptor<() => R>) => void;
389
390
 
@@ -419,7 +420,7 @@ declare function Autocomplete<_R = unknown>(commandPath: string, optionName?: st
419
420
  * @category Controllers
420
421
  * @see {@link Command}
421
422
  * @see {@link ControllerOptions}
422
- * @see {@link https://meocord.dev/docs/4.1/how-a-call-runs | How a call runs}
423
+ * @see {@link https://meocord.dev/docs/4.2/how-a-call-runs | How a call runs}
423
424
  */
424
425
  declare function Controller(options?: ControllerOptions): (target: abstract new (...args: any[]) => unknown, propertyKey?: string | symbol) => void;
425
426
 
@@ -449,7 +450,7 @@ declare function Controller(options?: ControllerOptions): (target: abstract new
449
450
  * @group Decorators
450
451
  * @category Handlers
451
452
  * @see {@link Once}
452
- * @see {@link https://meocord.dev/docs/4.1/gateway-events | Gateway events}
453
+ * @see {@link https://meocord.dev/docs/4.2/gateway-events | Gateway events}
453
454
  */
454
455
  declare function On<E extends keyof ClientEvents>(event: E): <F extends (...args: ClientEvents[E]) => unknown>(target: object, propertyKey: string, _descriptor: TypedPropertyDescriptor<F>) => void;
455
456
  /**
@@ -475,7 +476,7 @@ declare function On<E extends keyof ClientEvents>(event: E): <F extends (...args
475
476
  * @group Decorators
476
477
  * @category Handlers
477
478
  * @see {@link On}
478
- * @see {@link https://meocord.dev/docs/4.1/gateway-events | Gateway events}
479
+ * @see {@link https://meocord.dev/docs/4.2/gateway-events | Gateway events}
479
480
  */
480
481
  declare function Once<E extends keyof ClientEvents>(event: E): <F extends (...args: ClientEvents[E]) => unknown>(target: object, propertyKey: string, _descriptor: TypedPropertyDescriptor<F>) => void;
481
482
 
@@ -525,7 +526,7 @@ type CheckedEntry<E, Base extends abstract new (...args: any[]) => unknown> = E
525
526
  * @see {@link UseGuard}
526
527
  * @see {@link GuardDeniedError}
527
528
  * @see {@link ExecutionContext}
528
- * @see {@link https://meocord.dev/docs/4.1/guards | Guards}
529
+ * @see {@link https://meocord.dev/docs/4.2/guards | Guards}
529
530
  */
530
531
  declare function Guard(options?: GuardOptions): (target: any, propertyKey?: string | symbol) => void;
531
532
  /**
@@ -557,7 +558,7 @@ declare function Guard(options?: GuardOptions): (target: any, propertyKey?: stri
557
558
  * @see {@link Guard}
558
559
  * @see {@link GuardDeniedError}
559
560
  * @see {@link ExecutionContext}
560
- * @see {@link https://meocord.dev/docs/4.1/guards | Guards}
561
+ * @see {@link https://meocord.dev/docs/4.2/guards | Guards}
561
562
  */
562
563
  declare function UseGuard<const T extends readonly unknown[]>(...entries: {
563
564
  [K in keyof T]: CheckedEntry<T[K], new (...args: any[]) => GuardInterface>;
@@ -595,7 +596,7 @@ declare function UseGuard<const T extends readonly unknown[]>(...entries: {
595
596
  * @group Decorators
596
597
  * @category Pipeline stages
597
598
  * @see {@link UseInterceptor}
598
- * @see {@link https://meocord.dev/docs/4.1/interceptors | Interceptors}
599
+ * @see {@link https://meocord.dev/docs/4.2/interceptors | Interceptors}
599
600
  */
600
601
  declare function Interceptor(options?: InterceptorOptions): (target: new (...args: any[]) => InterceptorInterface, propertyKey?: string | symbol) => void;
601
602
  /**
@@ -627,7 +628,7 @@ declare function Interceptor(options?: InterceptorOptions): (target: new (...arg
627
628
  * @group Decorators
628
629
  * @category Pipeline stages
629
630
  * @see {@link Interceptor}
630
- * @see {@link https://meocord.dev/docs/4.1/interceptors | Interceptors}
631
+ * @see {@link https://meocord.dev/docs/4.2/interceptors | Interceptors}
631
632
  */
632
633
  declare function UseInterceptor<const T extends readonly unknown[]>(...interceptors: {
633
634
  [K in keyof T]: CheckedEntry<T[K], new (...args: any[]) => InterceptorInterface>;
@@ -660,7 +661,7 @@ declare function UseInterceptor<const T extends readonly unknown[]>(...intercept
660
661
  * @group Decorators
661
662
  * @category Pipeline stages
662
663
  * @see {@link UseFilter}
663
- * @see {@link https://meocord.dev/docs/4.1/exception-filters | Exception filters}
664
+ * @see {@link https://meocord.dev/docs/4.2/exception-filters | Exception filters}
664
665
  */
665
666
  declare function Catch(...errorTypes: (abstract new (...args: any[]) => unknown)[]): (target: new (...args: any[]) => ExceptionFilter<any>, propertyKey?: string | symbol) => void;
666
667
  /**
@@ -693,7 +694,7 @@ declare function Catch(...errorTypes: (abstract new (...args: any[]) => unknown)
693
694
  * @group Decorators
694
695
  * @category Pipeline stages
695
696
  * @see {@link Catch}
696
- * @see {@link https://meocord.dev/docs/4.1/exception-filters | Exception filters}
697
+ * @see {@link https://meocord.dev/docs/4.2/exception-filters | Exception filters}
697
698
  */
698
699
  declare function UseFilter<const T extends readonly unknown[]>(...filters: {
699
700
  [K in keyof T]: CheckedEntry<T[K], new (...args: any[]) => ExceptionFilter<any>>;
@@ -888,7 +889,7 @@ interface MeoCordOptions<G extends readonly unknown[] = readonly unknown[], I ex
888
889
  * @see {@link MeoCordOptions}
889
890
  * @see {@link MeoCordFactory}
890
891
  * @see {@link MeoCordConfig}
891
- * @see {@link https://meocord.dev/docs/4.1/configuration | Configuration}
892
+ * @see {@link https://meocord.dev/docs/4.2/configuration | Configuration}
892
893
  */
893
894
  declare function MeoCord<const G extends readonly unknown[] = [], const I extends readonly unknown[] = [], const F extends readonly unknown[] = []>(options: MeoCordOptions<G, I, F>): (target: any, propertyKey?: string | symbol) => void;
894
895
 
@@ -948,7 +949,7 @@ type AcceptsInput<P, Input> = [P] extends [NoInput] ? unknown : [Input] extends
948
949
  * @category Pipeline stages
949
950
  * @see {@link UsePipe}
950
951
  * @see {@link ValidationError}
951
- * @see {@link https://meocord.dev/docs/4.1/validation | Validation and pipes}
952
+ * @see {@link https://meocord.dev/docs/4.2/validation | Validation and pipes}
952
953
  */
953
954
  declare function Validate<S extends StandardSchemaV1, const Pipes extends ValidatePipes<S> = Record<never, never>>(schema: S, options?: ValidateOptions<Pipes>): <M extends Handler>(target: object, propertyKey: string, _descriptor: TypedPropertyDescriptor<M> & AcceptsInput<ParamsOf<M>, ValidatedInput<S, Pipes>>) => void;
954
955
  /** Allows the descriptor when the handler's params take the pipe's output at `key`. */
@@ -983,7 +984,7 @@ type AcceptsPiped<P, K extends string, Out> = [P] extends [NoInput] ? unknown :
983
984
  * @category Pipeline stages
984
985
  * @see {@link Pipe}
985
986
  * @see {@link Validate}
986
- * @see {@link https://meocord.dev/docs/4.1/validation | Validation and pipes}
987
+ * @see {@link https://meocord.dev/docs/4.2/validation | Validation and pipes}
987
988
  */
988
989
  declare function UsePipe<K extends string, const Pipes extends readonly [PipeEntryOf, ...PipeEntryOf[]]>(key: K, ...pipes: Pipes & {
989
990
  [I in keyof Pipes]: CheckedEntry<Pipes[I], new (...args: any[]) => PipeInterface>;
@@ -1012,7 +1013,7 @@ declare function UsePipe<K extends string, const Pipes extends readonly [PipeEnt
1012
1013
  * @group Decorators
1013
1014
  * @category Pipeline stages
1014
1015
  * @see {@link UsePipe}
1015
- * @see {@link https://meocord.dev/docs/4.1/validation | Validation and pipes}
1016
+ * @see {@link https://meocord.dev/docs/4.2/validation | Validation and pipes}
1016
1017
  */
1017
1018
  declare function Pipe(): (target: new (...args: any[]) => PipeInterface, propertyKey?: string | symbol) => void;
1018
1019
 
@@ -1068,7 +1069,7 @@ interface CooldownByDecorator<P> {
1068
1069
  * @see {@link CooldownOptions}
1069
1070
  * @see {@link CooldownError}
1070
1071
  * @see {@link CooldownStore}
1071
- * @see {@link https://meocord.dev/docs/4.1/cooldowns | Cooldowns}
1072
+ * @see {@link https://meocord.dev/docs/4.2/cooldowns | Cooldowns}
1072
1073
  */
1073
1074
  declare function Cooldown(options: CooldownOptions & {
1074
1075
  by?: undefined;
@@ -1162,7 +1163,7 @@ interface DeferOptions {
1162
1163
  * @category Pipeline stages
1163
1164
  * @see {@link DeferOptions}
1164
1165
  * @see {@link respond}
1165
- * @see {@link https://meocord.dev/docs/4.1/defer | Deferring}
1166
+ * @see {@link https://meocord.dev/docs/4.2/defer | Deferring}
1166
1167
  */
1167
1168
  declare function Defer(options?: DeferOptions): MethodDecorator;
1168
1169
 
@@ -1189,7 +1190,7 @@ declare function Defer(options?: DeferOptions): MethodDecorator;
1189
1190
  * @category Params
1190
1191
  * @see {@link Service}
1191
1192
  * @see {@link createToken}
1192
- * @see {@link https://meocord.dev/docs/4.1/services | Services}
1193
+ * @see {@link https://meocord.dev/docs/4.2/services | Services}
1193
1194
  */
1194
1195
  declare function Inject(token: ProviderToken): (target: object, propertyKey: string | symbol | undefined, parameterIndex: number) => void;
1195
1196
 
@@ -1224,7 +1225,7 @@ declare function Inject(token: ProviderToken): (target: object, propertyKey: str
1224
1225
  * @pipeline observers-settled once the call has settled and been answered, however it ended
1225
1226
  * @group Decorators
1226
1227
  * @category Pipeline stages
1227
- * @see {@link https://meocord.dev/docs/4.1/observers | Observers}
1228
+ * @see {@link https://meocord.dev/docs/4.2/observers | Observers}
1228
1229
  */
1229
1230
  declare function Observer(options?: ObserverOptions): (target: new (...args: any[]) => DispatchObserver, propertyKey?: string | symbol) => void;
1230
1231