@went.tf/discord-bot-framework 2.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/LICENSE +21 -0
- package/README.md +550 -0
- package/build/.tsbuildinfo +1 -0
- package/build/api-client/api-client.d.ts +13 -0
- package/build/api-client/api-client.d.ts.map +1 -0
- package/build/api-client/api-client.js +147 -0
- package/build/api-client/api-client.js.map +1 -0
- package/build/api-client/api-http-exception.d.ts +7 -0
- package/build/api-client/api-http-exception.d.ts.map +1 -0
- package/build/api-client/api-http-exception.js +12 -0
- package/build/api-client/api-http-exception.js.map +1 -0
- package/build/api-client/index.d.ts +4 -0
- package/build/api-client/index.d.ts.map +1 -0
- package/build/api-client/index.js +4 -0
- package/build/api-client/index.js.map +1 -0
- package/build/api-client/types.d.ts +105 -0
- package/build/api-client/types.d.ts.map +1 -0
- package/build/api-client/types.js +8 -0
- package/build/api-client/types.js.map +1 -0
- package/build/client/create-bot-client.d.ts +14 -0
- package/build/client/create-bot-client.d.ts.map +1 -0
- package/build/client/create-bot-client.js +19 -0
- package/build/client/create-bot-client.js.map +1 -0
- package/build/client/create-shard-manager.d.ts +17 -0
- package/build/client/create-shard-manager.d.ts.map +1 -0
- package/build/client/create-shard-manager.js +26 -0
- package/build/client/create-shard-manager.js.map +1 -0
- package/build/client/index.d.ts +3 -0
- package/build/client/index.d.ts.map +1 -0
- package/build/client/index.js +3 -0
- package/build/client/index.js.map +1 -0
- package/build/commands/build-application-commands-body.d.ts +39 -0
- package/build/commands/build-application-commands-body.d.ts.map +1 -0
- package/build/commands/build-application-commands-body.js +127 -0
- package/build/commands/build-application-commands-body.js.map +1 -0
- package/build/commands/fixed-reply-command-factory.d.ts +10 -0
- package/build/commands/fixed-reply-command-factory.d.ts.map +1 -0
- package/build/commands/fixed-reply-command-factory.js +19 -0
- package/build/commands/fixed-reply-command-factory.js.map +1 -0
- package/build/commands/index.d.ts +4 -0
- package/build/commands/index.d.ts.map +1 -0
- package/build/commands/index.js +4 -0
- package/build/commands/index.js.map +1 -0
- package/build/commands/registration.d.ts +24 -0
- package/build/commands/registration.d.ts.map +1 -0
- package/build/commands/registration.js +69 -0
- package/build/commands/registration.js.map +1 -0
- package/build/commands/schema/application-command-leaf-option.schema.d.ts +230 -0
- package/build/commands/schema/application-command-leaf-option.schema.d.ts.map +1 -0
- package/build/commands/schema/application-command-leaf-option.schema.js +129 -0
- package/build/commands/schema/application-command-leaf-option.schema.js.map +1 -0
- package/build/commands/schema/application-command-leaf-option.schema.json +258 -0
- package/build/commands/schema/application-command-option-choice.schema.d.ts +18 -0
- package/build/commands/schema/application-command-option-choice.schema.d.ts.map +1 -0
- package/build/commands/schema/application-command-option-choice.schema.js +12 -0
- package/build/commands/schema/application-command-option-choice.schema.js.map +1 -0
- package/build/commands/schema/application-command-option-choice.schema.json +23 -0
- package/build/commands/schema/application-command-option.schema.d.ts +12 -0
- package/build/commands/schema/application-command-option.schema.d.ts.map +1 -0
- package/build/commands/schema/application-command-option.schema.js +13 -0
- package/build/commands/schema/application-command-option.schema.js.map +1 -0
- package/build/commands/schema/application-command-option.schema.json +14 -0
- package/build/commands/schema/application-command-subcommand-group.schema.d.ts +28 -0
- package/build/commands/schema/application-command-subcommand-group.schema.d.ts.map +1 -0
- package/build/commands/schema/application-command-subcommand-group.schema.js +22 -0
- package/build/commands/schema/application-command-subcommand-group.schema.js.map +1 -0
- package/build/commands/schema/application-command-subcommand-group.schema.json +26 -0
- package/build/commands/schema/application-command-subcommand.schema.d.ts +29 -0
- package/build/commands/schema/application-command-subcommand.schema.d.ts.map +1 -0
- package/build/commands/schema/application-command-subcommand.schema.js +23 -0
- package/build/commands/schema/application-command-subcommand.schema.js.map +1 -0
- package/build/commands/schema/application-command-subcommand.schema.json +26 -0
- package/build/commands/schema/application-command-type.schema.d.ts +6 -0
- package/build/commands/schema/application-command-type.schema.d.ts.map +1 -0
- package/build/commands/schema/application-command-type.schema.js +6 -0
- package/build/commands/schema/application-command-type.schema.js.map +1 -0
- package/build/commands/schema/application-command-type.schema.json +9 -0
- package/build/commands/schema/application-integration-type.schema.d.ts +6 -0
- package/build/commands/schema/application-integration-type.schema.d.ts.map +1 -0
- package/build/commands/schema/application-integration-type.schema.js +6 -0
- package/build/commands/schema/application-integration-type.schema.js.map +1 -0
- package/build/commands/schema/application-integration-type.schema.json +8 -0
- package/build/commands/schema/channel-type.schema.d.ts +6 -0
- package/build/commands/schema/channel-type.schema.d.ts.map +1 -0
- package/build/commands/schema/channel-type.schema.js +6 -0
- package/build/commands/schema/channel-type.schema.js.map +1 -0
- package/build/commands/schema/channel-type.schema.json +16 -0
- package/build/commands/schema/chat-input-command.schema.d.ts +45 -0
- package/build/commands/schema/chat-input-command.schema.d.ts.map +1 -0
- package/build/commands/schema/chat-input-command.schema.js +34 -0
- package/build/commands/schema/chat-input-command.schema.js.map +1 -0
- package/build/commands/schema/chat-input-command.schema.json +46 -0
- package/build/commands/schema/commands-file.schema.d.ts +18 -0
- package/build/commands/schema/commands-file.schema.d.ts.map +1 -0
- package/build/commands/schema/commands-file.schema.js +16 -0
- package/build/commands/schema/commands-file.schema.js.map +1 -0
- package/build/commands/schema/commands-file.schema.json +14 -0
- package/build/commands/schema/context-menu-command.schema.d.ts +40 -0
- package/build/commands/schema/context-menu-command.schema.d.ts.map +1 -0
- package/build/commands/schema/context-menu-command.schema.js +32 -0
- package/build/commands/schema/context-menu-command.schema.js.map +1 -0
- package/build/commands/schema/context-menu-command.schema.json +40 -0
- package/build/commands/schema/context-menu-name.schema.d.ts +7 -0
- package/build/commands/schema/context-menu-name.schema.d.ts.map +1 -0
- package/build/commands/schema/context-menu-name.schema.js +7 -0
- package/build/commands/schema/context-menu-name.schema.js.map +1 -0
- package/build/commands/schema/context-menu-name.schema.json +6 -0
- package/build/commands/schema/default-member-permissions.schema.d.ts +7 -0
- package/build/commands/schema/default-member-permissions.schema.d.ts.map +1 -0
- package/build/commands/schema/default-member-permissions.schema.js +7 -0
- package/build/commands/schema/default-member-permissions.schema.js.map +1 -0
- package/build/commands/schema/default-member-permissions.schema.json +6 -0
- package/build/commands/schema/index.d.ts +77 -0
- package/build/commands/schema/index.d.ts.map +1 -0
- package/build/commands/schema/index.js +48 -0
- package/build/commands/schema/index.js.map +1 -0
- package/build/commands/schema/interaction-context-type.schema.d.ts +6 -0
- package/build/commands/schema/interaction-context-type.schema.d.ts.map +1 -0
- package/build/commands/schema/interaction-context-type.schema.js +6 -0
- package/build/commands/schema/interaction-context-type.schema.js.map +1 -0
- package/build/commands/schema/interaction-context-type.schema.json +9 -0
- package/build/commands/schema/option-name.schema.d.ts +7 -0
- package/build/commands/schema/option-name.schema.d.ts.map +1 -0
- package/build/commands/schema/option-name.schema.js +7 -0
- package/build/commands/schema/option-name.schema.js.map +1 -0
- package/build/commands/schema/option-name.schema.json +6 -0
- package/build/commands/schema/parse-commands-file.d.ts +19 -0
- package/build/commands/schema/parse-commands-file.d.ts.map +1 -0
- package/build/commands/schema/parse-commands-file.js +19 -0
- package/build/commands/schema/parse-commands-file.js.map +1 -0
- package/build/db/create-postgres-prisma-db.d.ts +20 -0
- package/build/db/create-postgres-prisma-db.d.ts.map +1 -0
- package/build/db/create-postgres-prisma-db.js +17 -0
- package/build/db/create-postgres-prisma-db.js.map +1 -0
- package/build/db/index.d.ts +2 -0
- package/build/db/index.d.ts.map +1 -0
- package/build/db/index.js +2 -0
- package/build/db/index.js.map +1 -0
- package/build/dev/create-handler-watcher.d.ts +23 -0
- package/build/dev/create-handler-watcher.d.ts.map +1 -0
- package/build/dev/create-handler-watcher.js +55 -0
- package/build/dev/create-handler-watcher.js.map +1 -0
- package/build/dev/create-source-reloader.d.ts +37 -0
- package/build/dev/create-source-reloader.d.ts.map +1 -0
- package/build/dev/create-source-reloader.js +42 -0
- package/build/dev/create-source-reloader.js.map +1 -0
- package/build/dev/index.d.ts +3 -0
- package/build/dev/index.d.ts.map +1 -0
- package/build/dev/index.js +3 -0
- package/build/dev/index.js.map +1 -0
- package/build/dev/reload-loader.d.ts +11 -0
- package/build/dev/reload-loader.d.ts.map +1 -0
- package/build/dev/reload-loader.js +28 -0
- package/build/dev/reload-loader.js.map +1 -0
- package/build/env/define-env.d.ts +25 -0
- package/build/env/define-env.d.ts.map +1 -0
- package/build/env/define-env.js +24 -0
- package/build/env/define-env.js.map +1 -0
- package/build/env/helpers.d.ts +9 -0
- package/build/env/helpers.d.ts.map +1 -0
- package/build/env/helpers.js +9 -0
- package/build/env/helpers.js.map +1 -0
- package/build/env/index.d.ts +3 -0
- package/build/env/index.d.ts.map +1 -0
- package/build/env/index.js +3 -0
- package/build/env/index.js.map +1 -0
- package/build/i18n/create-command-localizer.d.ts +27 -0
- package/build/i18n/create-command-localizer.d.ts.map +1 -0
- package/build/i18n/create-command-localizer.js +40 -0
- package/build/i18n/create-command-localizer.js.map +1 -0
- package/build/i18n/create-i18n-initializer.d.ts +18 -0
- package/build/i18n/create-i18n-initializer.d.ts.map +1 -0
- package/build/i18n/create-i18n-initializer.js +34 -0
- package/build/i18n/create-i18n-initializer.js.map +1 -0
- package/build/i18n/index.d.ts +3 -0
- package/build/i18n/index.d.ts.map +1 -0
- package/build/i18n/index.js +3 -0
- package/build/i18n/index.js.map +1 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +12 -0
- package/build/index.js.map +1 -0
- package/build/interactions/custom-id.d.ts +9 -0
- package/build/interactions/custom-id.d.ts.map +1 -0
- package/build/interactions/custom-id.js +15 -0
- package/build/interactions/custom-id.js.map +1 -0
- package/build/interactions/dispatch.d.ts +35 -0
- package/build/interactions/dispatch.d.ts.map +1 -0
- package/build/interactions/dispatch.js +87 -0
- package/build/interactions/dispatch.js.map +1 -0
- package/build/interactions/handle-interaction-error.d.ts +22 -0
- package/build/interactions/handle-interaction-error.d.ts.map +1 -0
- package/build/interactions/handle-interaction-error.js +65 -0
- package/build/interactions/handle-interaction-error.js.map +1 -0
- package/build/interactions/index.d.ts +7 -0
- package/build/interactions/index.d.ts.map +1 -0
- package/build/interactions/index.js +7 -0
- package/build/interactions/index.js.map +1 -0
- package/build/interactions/registry.d.ts +32 -0
- package/build/interactions/registry.d.ts.map +1 -0
- package/build/interactions/registry.js +49 -0
- package/build/interactions/registry.js.map +1 -0
- package/build/interactions/router.d.ts +28 -0
- package/build/interactions/router.d.ts.map +1 -0
- package/build/interactions/router.js +48 -0
- package/build/interactions/router.js.map +1 -0
- package/build/interactions/types.d.ts +37 -0
- package/build/interactions/types.d.ts.map +1 -0
- package/build/interactions/types.js +2 -0
- package/build/interactions/types.js.map +1 -0
- package/build/logger/create-logger.d.ts +27 -0
- package/build/logger/create-logger.d.ts.map +1 -0
- package/build/logger/create-logger.js +36 -0
- package/build/logger/create-logger.js.map +1 -0
- package/build/logger/dev-null-logger.d.ts +11 -0
- package/build/logger/dev-null-logger.d.ts.map +1 -0
- package/build/logger/dev-null-logger.js +19 -0
- package/build/logger/dev-null-logger.js.map +1 -0
- package/build/logger/discord-webhook-batcher.d.ts +38 -0
- package/build/logger/discord-webhook-batcher.d.ts.map +1 -0
- package/build/logger/discord-webhook-batcher.js +87 -0
- package/build/logger/discord-webhook-batcher.js.map +1 -0
- package/build/logger/discord-webhook-transport.d.ts +9 -0
- package/build/logger/discord-webhook-transport.d.ts.map +1 -0
- package/build/logger/discord-webhook-transport.js +20 -0
- package/build/logger/discord-webhook-transport.js.map +1 -0
- package/build/logger/index.d.ts +5 -0
- package/build/logger/index.d.ts.map +1 -0
- package/build/logger/index.js +5 -0
- package/build/logger/index.js.map +1 -0
- package/build/logger/logger.d.ts +30 -0
- package/build/logger/logger.d.ts.map +1 -0
- package/build/logger/logger.js +84 -0
- package/build/logger/logger.js.map +1 -0
- package/build/logger/pino-pretty-options.d.ts +12 -0
- package/build/logger/pino-pretty-options.d.ts.map +1 -0
- package/build/logger/pino-pretty-options.js +17 -0
- package/build/logger/pino-pretty-options.js.map +1 -0
- package/build/logger/types.d.ts +6 -0
- package/build/logger/types.d.ts.map +1 -0
- package/build/logger/types.js +2 -0
- package/build/logger/types.js.map +1 -0
- package/build/utils/discord-lookups.d.ts +16 -0
- package/build/utils/discord-lookups.d.ts.map +1 -0
- package/build/utils/discord-lookups.js +39 -0
- package/build/utils/discord-lookups.js.map +1 -0
- package/build/utils/get-git-data.d.ts +8 -0
- package/build/utils/get-git-data.d.ts.map +1 -0
- package/build/utils/get-git-data.js +18 -0
- package/build/utils/get-git-data.js.map +1 -0
- package/build/utils/index.d.ts +7 -0
- package/build/utils/index.d.ts.map +1 -0
- package/build/utils/index.js +7 -0
- package/build/utils/index.js.map +1 -0
- package/build/utils/messaging.d.ts +15 -0
- package/build/utils/messaging.d.ts.map +1 -0
- package/build/utils/messaging.js +71 -0
- package/build/utils/messaging.js.map +1 -0
- package/build/utils/promises.d.ts +6 -0
- package/build/utils/promises.d.ts.map +1 -0
- package/build/utils/promises.js +13 -0
- package/build/utils/promises.js.map +1 -0
- package/build/utils/run-attempts.d.ts +6 -0
- package/build/utils/run-attempts.d.ts.map +1 -0
- package/build/utils/run-attempts.js +16 -0
- package/build/utils/run-attempts.js.map +1 -0
- package/build/utils/strings.d.ts +7 -0
- package/build/utils/strings.d.ts.map +1 -0
- package/build/utils/strings.js +39 -0
- package/build/utils/strings.js.map +1 -0
- package/package.json +146 -0
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { existsSync } from 'node:fs';
|
|
2
|
+
import { register } from 'node:module';
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
4
|
+
/**
|
|
5
|
+
* Sets up cache-busted re-importing of a local module subtree for development hot
|
|
6
|
+
* reload, via a `module.register()` hook that tags every module resolved under
|
|
7
|
+
* `rootDir` with a shared, incrementing epoch — forcing Node to treat it as a new
|
|
8
|
+
* module instance on each `reimport()` call, without needing to restart the process
|
|
9
|
+
* (and, for a Discord bot, without reconnecting the gateway).
|
|
10
|
+
*
|
|
11
|
+
* Pair with `createHandlerWatcher` to trigger `reimport()` on file changes, then merge
|
|
12
|
+
* the returned module's exports into whatever long-lived registries/objects your
|
|
13
|
+
* running process already holds live references to (mutate them in place — replacing
|
|
14
|
+
* the binding itself isn't possible from outside the module that declared it).
|
|
15
|
+
*/
|
|
16
|
+
export function createSourceReloader({ rootDir, logger }) {
|
|
17
|
+
const sab = new SharedArrayBuffer(4);
|
|
18
|
+
const epoch = new Int32Array(sab);
|
|
19
|
+
const rootUrl = pathToFileURL(rootDir.endsWith('/') ? rootDir : `${rootDir}/`).href;
|
|
20
|
+
// Only `build/` (compiled .js) is published; running this package's own tests/dev
|
|
21
|
+
// straight against `src/` (no build step yet) leaves just the .ts sibling on disk —
|
|
22
|
+
// Node 24's native type-stripping loads that directly since it's plain erasable syntax
|
|
23
|
+
const compiledHookUrl = new URL('./reload-loader.js', import.meta.url);
|
|
24
|
+
const hookUrl = existsSync(fileURLToPath(compiledHookUrl))
|
|
25
|
+
? compiledHookUrl
|
|
26
|
+
: new URL('./reload-loader.ts', import.meta.url);
|
|
27
|
+
register(hookUrl, {
|
|
28
|
+
parentURL: import.meta.url,
|
|
29
|
+
data: { rootUrl, sab },
|
|
30
|
+
});
|
|
31
|
+
logger?.log(`Source reloader active (root=${rootDir})`);
|
|
32
|
+
return {
|
|
33
|
+
reimport: async (specifier) => {
|
|
34
|
+
Atomics.add(epoch, 0, 1);
|
|
35
|
+
const url = typeof specifier === 'string' && !specifier.startsWith('file://')
|
|
36
|
+
? pathToFileURL(specifier).href
|
|
37
|
+
: specifier.toString();
|
|
38
|
+
return import(url);
|
|
39
|
+
},
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=create-source-reloader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-source-reloader.js","sourceRoot":"","sources":["../../src/dev/create-source-reloader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AA2BxD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,oBAAoB,CAAC,EAAE,OAAO,EAAE,MAAM,EAAyB;IAC7E,MAAM,GAAG,GAAG,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,aAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,CAAC,CAAC,IAAI,CAAC;IACpF,kFAAkF;IAClF,oFAAoF;IACpF,uFAAuF;IACvF,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACvE,MAAM,OAAO,GAAG,UAAU,CAAC,aAAa,CAAC,eAAe,CAAC,CAAC;QACxD,CAAC,CAAC,eAAe;QACjB,CAAC,CAAC,IAAI,GAAG,CAAC,oBAAoB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEnD,QAAQ,CAAC,OAAO,EAAE;QAChB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG;QAC1B,IAAI,EAAE,EAAE,OAAO,EAAE,GAAG,EAAE;KACvB,CAAC,CAAC;IACH,MAAM,EAAE,GAAG,CAAC,gCAAgC,OAAO,GAAG,CAAC,CAAC;IAExD,OAAO;QACL,QAAQ,EAAE,KAAK,EAAK,SAAuB,EAAc,EAAE;YACzD,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzB,MAAM,GAAG,GAAG,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC3E,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,IAAI;gBAC/B,CAAC,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;YACzB,OAAO,MAAM,CAAC,GAAG,CAAe,CAAC;QACnC,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/dev/index.ts"],"names":[],"mappings":"AAAA,cAAc,6BAA6B,CAAC;AAC5C,cAAc,6BAA6B,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { InitializeHook, LoadHook, ResolveHook } from 'node:module';
|
|
2
|
+
export interface ReloadLoaderData {
|
|
3
|
+
/** file:// URL prefix (with trailing slash) of the directory whose modules should be cache-busted on reload. Everything outside it (node_modules, this framework) is left untouched. */
|
|
4
|
+
rootUrl: string;
|
|
5
|
+
/** Shared 4-byte counter bumped on the main thread before each reload; read here to tag freshly-resolved local modules. */
|
|
6
|
+
sab: SharedArrayBuffer;
|
|
7
|
+
}
|
|
8
|
+
export declare const initialize: InitializeHook<ReloadLoaderData>;
|
|
9
|
+
export declare const resolve: ResolveHook;
|
|
10
|
+
export declare const load: LoadHook;
|
|
11
|
+
//# sourceMappingURL=reload-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reload-loader.d.ts","sourceRoot":"","sources":["../../src/dev/reload-loader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAEd,QAAQ,EAER,WAAW,EACZ,MAAM,aAAa,CAAC;AAUrB,MAAM,WAAW,gBAAgB;IAC/B,wLAAwL;IACxL,OAAO,EAAE,MAAM,CAAC;IAChB,2HAA2H;IAC3H,GAAG,EAAE,iBAAiB,CAAC;CACxB;AAED,eAAO,MAAM,UAAU,EAAE,cAAc,CAAC,gBAAgB,CAGvD,CAAC;AAEF,eAAO,MAAM,OAAO,EAAE,WASrB,CAAC;AAEF,eAAO,MAAM,IAAI,EAAE,QAQlB,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// Runs in Node's dedicated loader thread (see `module.register()`), separate from the
|
|
2
|
+
// main thread — state here can only be shared back via the SharedArrayBuffer passed
|
|
3
|
+
// through `initialize`'s `data`, never via plain module-level variables on the main side.
|
|
4
|
+
const EPOCH_PARAM = 'reloadEpoch';
|
|
5
|
+
let rootUrl;
|
|
6
|
+
let epochView;
|
|
7
|
+
export const initialize = (data) => {
|
|
8
|
+
rootUrl = data.rootUrl;
|
|
9
|
+
epochView = new Int32Array(data.sab);
|
|
10
|
+
};
|
|
11
|
+
export const resolve = async (specifier, context, nextResolve) => {
|
|
12
|
+
const result = await nextResolve(specifier, context);
|
|
13
|
+
if (!rootUrl || !epochView || !result.url.startsWith(rootUrl)) {
|
|
14
|
+
return result;
|
|
15
|
+
}
|
|
16
|
+
const url = new URL(result.url);
|
|
17
|
+
url.searchParams.set(EPOCH_PARAM, String(Atomics.load(epochView, 0)));
|
|
18
|
+
return { ...result, url: url.href };
|
|
19
|
+
};
|
|
20
|
+
export const load = async (url, context, nextLoad) => {
|
|
21
|
+
if (!url.includes(EPOCH_PARAM)) {
|
|
22
|
+
return nextLoad(url, context);
|
|
23
|
+
}
|
|
24
|
+
const parsed = new URL(url);
|
|
25
|
+
parsed.searchParams.delete(EPOCH_PARAM);
|
|
26
|
+
return nextLoad(parsed.href, context);
|
|
27
|
+
};
|
|
28
|
+
//# sourceMappingURL=reload-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reload-loader.js","sourceRoot":"","sources":["../../src/dev/reload-loader.ts"],"names":[],"mappings":"AAQA,sFAAsF;AACtF,oFAAoF;AACpF,0FAA0F;AAC1F,MAAM,WAAW,GAAG,aAAa,CAAC;AAElC,IAAI,OAA2B,CAAC;AAChC,IAAI,SAAiC,CAAC;AAStC,MAAM,CAAC,MAAM,UAAU,GAAqC,CAAC,IAAI,EAAE,EAAE;IACnE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;IACvB,SAAS,GAAG,IAAI,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACvC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAgB,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE;IAC5E,MAAM,MAAM,GAAoB,MAAM,WAAW,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IACtE,IAAI,CAAC,OAAO,IAAI,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9D,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;IAChC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtE,OAAO,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;AACtC,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAa,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE;IAC7D,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;QAC/B,OAAO,QAAQ,CAAC,GAAG,EAAE,OAAO,CAA0B,CAAC;IACzD,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxC,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAA0B,CAAC;AACjE,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { DotenvConfigOptions } from 'dotenv';
|
|
2
|
+
import { z, ZodRawShape } from 'zod';
|
|
3
|
+
export interface DefineEnvOptions {
|
|
4
|
+
/**
|
|
5
|
+
* Passed through to dotenv's `config()`. Defaults to `{ quiet: true }`.
|
|
6
|
+
* Pass `false` to skip loading a `.env` file entirely (e.g. a queue-worker
|
|
7
|
+
* process that inherits its environment from pm2).
|
|
8
|
+
*/
|
|
9
|
+
dotenv?: DotenvConfigOptions | false;
|
|
10
|
+
/**
|
|
11
|
+
* Source object to validate. Defaults to `process.env`. Overriding this is
|
|
12
|
+
* primarily useful in tests, to validate a fixture object instead of the
|
|
13
|
+
* real environment.
|
|
14
|
+
*/
|
|
15
|
+
source?: NodeJS.ProcessEnv;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Loads `.env` (via dotenv) and validates `process.env` against a zod shape,
|
|
19
|
+
* throwing a single formatted error listing every failing key. Required vs.
|
|
20
|
+
* optional vs. defaulted fields are expressed directly in the schema (e.g.
|
|
21
|
+
* `z.string().min(1)` vs `z.string().optional()` vs `.default(...)`) rather
|
|
22
|
+
* than via a separate required-keys list.
|
|
23
|
+
*/
|
|
24
|
+
export declare function defineEnv<Schema extends ZodRawShape>(schema: Schema, options?: DefineEnvOptions): Readonly<z.infer<z.ZodObject<Schema>>>;
|
|
25
|
+
//# sourceMappingURL=define-env.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-env.d.ts","sourceRoot":"","sources":["../../src/env/define-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,mBAAmB,EAAE,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,CAAC,EAAY,WAAW,EAAE,MAAM,KAAK,CAAC;AAE/C,MAAM,WAAW,gBAAgB;IAC/B;;;;OAIG;IACH,MAAM,CAAC,EAAE,mBAAmB,GAAG,KAAK,CAAC;IACrC;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CAC5B;AAOD;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,MAAM,SAAS,WAAW,EAClD,MAAM,EAAE,MAAM,EACd,OAAO,GAAE,gBAAqB,GAC7B,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAWxC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { config as loadDotenv } from 'dotenv';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
const formatZodError = (error) => {
|
|
4
|
+
const lines = error.issues.map((issue) => ` - ${issue.path.join('.')}: ${issue.message}`);
|
|
5
|
+
return `Environment validation failed:\n${lines.join('\n')}`;
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Loads `.env` (via dotenv) and validates `process.env` against a zod shape,
|
|
9
|
+
* throwing a single formatted error listing every failing key. Required vs.
|
|
10
|
+
* optional vs. defaulted fields are expressed directly in the schema (e.g.
|
|
11
|
+
* `z.string().min(1)` vs `z.string().optional()` vs `.default(...)`) rather
|
|
12
|
+
* than via a separate required-keys list.
|
|
13
|
+
*/
|
|
14
|
+
export function defineEnv(schema, options = {}) {
|
|
15
|
+
if (options.dotenv !== false) {
|
|
16
|
+
loadDotenv(options.dotenv ?? { quiet: true });
|
|
17
|
+
}
|
|
18
|
+
const result = z.object(schema).safeParse(options.source ?? process.env);
|
|
19
|
+
if (!result.success) {
|
|
20
|
+
throw new Error(formatZodError(result.error));
|
|
21
|
+
}
|
|
22
|
+
return Object.freeze(result.data);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=define-env.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"define-env.js","sourceRoot":"","sources":["../../src/env/define-env.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,UAAU,EAAuB,MAAM,QAAQ,CAAC;AACnE,OAAO,EAAE,CAAC,EAAyB,MAAM,KAAK,CAAC;AAiB/C,MAAM,cAAc,GAAG,CAAC,KAAe,EAAU,EAAE;IACjD,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;IAC3F,OAAO,mCAAmC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;AAC/D,CAAC,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CACvB,MAAc,EACd,UAA4B,EAAE;IAE9B,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;QAC7B,UAAU,CAAC,OAAO,CAAC,MAAM,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAChD,CAAC;IAED,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC;IACzE,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Reproduces the `VAR === 'true'` string-boolean convention used across the
|
|
4
|
+
* legacy bots' env files (e.g. `LOCAL`, `DEBUG_I18N`, `DISABLE_SETTINGS`).
|
|
5
|
+
* Any value other than the literal string `"true"` (including undefined/empty)
|
|
6
|
+
* resolves to `false`, matching the previous behavior exactly.
|
|
7
|
+
*/
|
|
8
|
+
export declare const boolFromString: () => z.ZodPreprocess<z.ZodBoolean>;
|
|
9
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/env/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,eAAO,MAAM,cAAc,qCAG1B,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
/**
|
|
3
|
+
* Reproduces the `VAR === 'true'` string-boolean convention used across the
|
|
4
|
+
* legacy bots' env files (e.g. `LOCAL`, `DEBUG_I18N`, `DISABLE_SETTINGS`).
|
|
5
|
+
* Any value other than the literal string `"true"` (including undefined/empty)
|
|
6
|
+
* resolves to `false`, matching the previous behavior exactly.
|
|
7
|
+
*/
|
|
8
|
+
export const boolFromString = () => z.preprocess((value) => value === 'true', z.boolean());
|
|
9
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/env/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;;;GAKG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,UAAU,CAC9C,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,EAC3B,CAAC,CAAC,OAAO,EAAE,CACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/env/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/env/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { TFunction } from 'i18next';
|
|
2
|
+
export interface CreateCommandLocalizerOptions {
|
|
3
|
+
/** All locale codes to attempt name_localizations/description_localizations for. */
|
|
4
|
+
locales: readonly string[];
|
|
5
|
+
/** The base/default locale whose translation (if present) also becomes the plain `description` fallback value. */
|
|
6
|
+
baseLocale: string;
|
|
7
|
+
t: TFunction;
|
|
8
|
+
}
|
|
9
|
+
export interface CommandLocalizer {
|
|
10
|
+
/** Matches `DescriptionResolver`'s shape - pass directly as `buildApplicationCommandsBody`'s `resolveDescription`. */
|
|
11
|
+
resolveDescription: (path: readonly string[]) => string | undefined;
|
|
12
|
+
/** Matches `LocalizationResolver`'s shape - pass directly as `buildApplicationCommandsBody`'s `localizeNames`. */
|
|
13
|
+
localizeName: (path: readonly string[]) => Record<string, string> | undefined;
|
|
14
|
+
/** Matches `LocalizationResolver`'s shape - pass directly as `buildApplicationCommandsBody`'s `localizeDescriptions`. */
|
|
15
|
+
localizeDescription: (path: readonly string[]) => Record<string, string> | undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Generic i18next-backed localizer for commands.json entries, replacing a
|
|
19
|
+
* bot's own bespoke `getLocalizedObject`/`getCommonOptionMeta`-style helpers.
|
|
20
|
+
* Every method takes the same dot-path-shaped key array
|
|
21
|
+
* `buildApplicationCommandsBody` builds internally (e.g.
|
|
22
|
+
* `['commands', 'search', 'description']`), so its three hook slots
|
|
23
|
+
* (`resolveDescription`, `localizeNames`, `localizeDescriptions`) can be
|
|
24
|
+
* wired straight to this object's methods with no glue code.
|
|
25
|
+
*/
|
|
26
|
+
export declare function createCommandLocalizer(options: CreateCommandLocalizerOptions): CommandLocalizer;
|
|
27
|
+
//# sourceMappingURL=create-command-localizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-command-localizer.d.ts","sourceRoot":"","sources":["../../src/i18n/create-command-localizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,MAAM,WAAW,6BAA6B;IAC5C,oFAAoF;IACpF,OAAO,EAAE,SAAS,MAAM,EAAE,CAAC;IAC3B,kHAAkH;IAClH,UAAU,EAAE,MAAM,CAAC;IACnB,CAAC,EAAE,SAAS,CAAC;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,sHAAsH;IACtH,kBAAkB,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,GAAG,SAAS,CAAC;IACpE,kHAAkH;IAClH,YAAY,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;IAC9E,yHAAyH;IACzH,mBAAmB,EAAE,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,SAAS,CAAC;CACtF;AAED;;;;;;;;GAQG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,6BAA6B,GAAG,gBAAgB,CAgC/F"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic i18next-backed localizer for commands.json entries, replacing a
|
|
3
|
+
* bot's own bespoke `getLocalizedObject`/`getCommonOptionMeta`-style helpers.
|
|
4
|
+
* Every method takes the same dot-path-shaped key array
|
|
5
|
+
* `buildApplicationCommandsBody` builds internally (e.g.
|
|
6
|
+
* `['commands', 'search', 'description']`), so its three hook slots
|
|
7
|
+
* (`resolveDescription`, `localizeNames`, `localizeDescriptions`) can be
|
|
8
|
+
* wired straight to this object's methods with no glue code.
|
|
9
|
+
*/
|
|
10
|
+
export function createCommandLocalizer(options) {
|
|
11
|
+
const { locales, baseLocale, t } = options;
|
|
12
|
+
function translate(path, lng) {
|
|
13
|
+
const key = path.join('.');
|
|
14
|
+
// fallbackLng disabled so each locale's own coverage is checked
|
|
15
|
+
// independently - otherwise a configured fallback chain would silently
|
|
16
|
+
// fill in every locale from the fallback language, and localizeName/
|
|
17
|
+
// localizeDescription could never produce a sparse per-locale dictionary.
|
|
18
|
+
// i18next echoes the key back unchanged when no translation exists (no
|
|
19
|
+
// returnNull/parseMissingKeyHandler configured) - that echo is the only
|
|
20
|
+
// signal available to detect "not found" with a plain TFunction.
|
|
21
|
+
const value = t(key, { lng, fallbackLng: false });
|
|
22
|
+
return value === key ? undefined : value;
|
|
23
|
+
}
|
|
24
|
+
function localizeAll(path) {
|
|
25
|
+
const result = {};
|
|
26
|
+
for (const locale of locales) {
|
|
27
|
+
const value = translate(path, locale);
|
|
28
|
+
if (value !== undefined) {
|
|
29
|
+
result[locale] = value;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return Object.keys(result).length > 0 ? result : undefined;
|
|
33
|
+
}
|
|
34
|
+
return {
|
|
35
|
+
resolveDescription: (path) => translate(path, baseLocale),
|
|
36
|
+
localizeName: (path) => localizeAll(path),
|
|
37
|
+
localizeDescription: (path) => localizeAll(path),
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=create-command-localizer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-command-localizer.js","sourceRoot":"","sources":["../../src/i18n/create-command-localizer.ts"],"names":[],"mappings":"AAmBA;;;;;;;;GAQG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAsC;IAC3E,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC;IAE3C,SAAS,SAAS,CAAC,IAAuB,EAAE,GAAW;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3B,gEAAgE;QAChE,uEAAuE;QACvE,qEAAqE;QACrE,0EAA0E;QAC1E,uEAAuE;QACvE,wEAAwE;QACxE,iEAAiE;QACjE,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;QAClD,OAAO,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC;IAC3C,CAAC;IAED,SAAS,WAAW,CAAC,IAAuB;QAC1C,MAAM,MAAM,GAA2B,EAAE,CAAC;QAC1C,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;YACtC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;YACzB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7D,CAAC;IAED,OAAO;QACL,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,UAAU,CAAC;QACzD,YAAY,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;QACzC,mBAAmB,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC;KACjD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { i18n } from 'i18next';
|
|
2
|
+
import { NestableLogger } from '../logger/types.js';
|
|
3
|
+
export interface CreateI18nInitializerOptions {
|
|
4
|
+
/** Directory containing `{{lng}}/{{ns}}.json` locale files. */
|
|
5
|
+
localesDir: string;
|
|
6
|
+
supportedLngs: string[];
|
|
7
|
+
fallbackLng: string;
|
|
8
|
+
debug?: boolean;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Wraps the i18next + i18next-fs-backend bootstrap shared by bots that use
|
|
12
|
+
* localized commands. Returns an initializer function that lazily
|
|
13
|
+
* initializes i18next on first call and reuses the same instance on
|
|
14
|
+
* subsequent calls (matching the singleton-init-promise pattern the source
|
|
15
|
+
* bots already use).
|
|
16
|
+
*/
|
|
17
|
+
export declare function createI18nInitializer(options: CreateI18nInitializerOptions): (logger: NestableLogger) => Promise<i18n>;
|
|
18
|
+
//# sourceMappingURL=create-i18n-initializer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-i18n-initializer.d.ts","sourceRoot":"","sources":["../../src/i18n/create-i18n-initializer.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAExC,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEpD,MAAM,WAAW,4BAA4B;IAC3C,+DAA+D;IAC/D,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;;GAMG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,4BAA4B,GAAG,CAAC,MAAM,EAAE,cAAc,KAAK,OAAO,CAAC,IAAI,CAAC,CA2BtH"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import i18next from 'i18next';
|
|
2
|
+
import Backend from 'i18next-fs-backend';
|
|
3
|
+
/**
|
|
4
|
+
* Wraps the i18next + i18next-fs-backend bootstrap shared by bots that use
|
|
5
|
+
* localized commands. Returns an initializer function that lazily
|
|
6
|
+
* initializes i18next on first call and reuses the same instance on
|
|
7
|
+
* subsequent calls (matching the singleton-init-promise pattern the source
|
|
8
|
+
* bots already use).
|
|
9
|
+
*/
|
|
10
|
+
export function createI18nInitializer(options) {
|
|
11
|
+
let initPromise = null;
|
|
12
|
+
return (logger) => {
|
|
13
|
+
if (initPromise !== null) {
|
|
14
|
+
return initPromise;
|
|
15
|
+
}
|
|
16
|
+
logger.log('Initializing i18n');
|
|
17
|
+
initPromise = i18next.use(Backend).init({
|
|
18
|
+
lng: options.fallbackLng,
|
|
19
|
+
fallbackLng: options.fallbackLng,
|
|
20
|
+
debug: options.debug ?? false,
|
|
21
|
+
preload: options.supportedLngs,
|
|
22
|
+
backend: {
|
|
23
|
+
loadPath: `${options.localesDir}/{{lng}}/{{ns}}.json`,
|
|
24
|
+
},
|
|
25
|
+
interpolation: {
|
|
26
|
+
escapeValue: false,
|
|
27
|
+
},
|
|
28
|
+
overloadTranslationOptionHandler: () => ({}),
|
|
29
|
+
showSupportNotice: false,
|
|
30
|
+
}).then(() => i18next);
|
|
31
|
+
return initPromise;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=create-i18n-initializer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create-i18n-initializer.js","sourceRoot":"","sources":["../../src/i18n/create-i18n-initializer.ts"],"names":[],"mappings":"AAAA,OAAO,OAAiB,MAAM,SAAS,CAAC;AACxC,OAAO,OAAO,MAAM,oBAAoB,CAAC;AAWzC;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAAqC;IACzE,IAAI,WAAW,GAAyB,IAAI,CAAC;IAE7C,OAAO,CAAC,MAAsB,EAAiB,EAAE;QAC/C,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,WAAW,CAAC;QACrB,CAAC;QAED,MAAM,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;QAEhC,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC;YACtC,GAAG,EAAE,OAAO,CAAC,WAAW;YACxB,WAAW,EAAE,OAAO,CAAC,WAAW;YAChC,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,KAAK;YAC7B,OAAO,EAAE,OAAO,CAAC,aAAa;YAC9B,OAAO,EAAE;gBACP,QAAQ,EAAE,GAAG,OAAO,CAAC,UAAU,sBAAsB;aACtD;YACD,aAAa,EAAE;gBACb,WAAW,EAAE,KAAK;aACnB;YACD,gCAAgC,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC;YAC5C,iBAAiB,EAAE,KAAK;SACzB,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC;QAEvB,OAAO,WAAW,CAAC;IACrB,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/i18n/index.ts"],"names":[],"mappings":"AAAA,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC"}
|
package/build/index.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './logger/index.js';
|
|
2
|
+
export * from './env/index.js';
|
|
3
|
+
export * from './api-client/index.js';
|
|
4
|
+
export * from './interactions/index.js';
|
|
5
|
+
export * from './commands/index.js';
|
|
6
|
+
export * from './client/index.js';
|
|
7
|
+
export * from './utils/index.js';
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
package/build/index.js
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
// Core (non-optional) modules. Optional pieces (Postgres/Prisma, i18next)
|
|
2
|
+
// are only available via their own subpaths:
|
|
3
|
+
// @went.tf/discord-bot-framework/db
|
|
4
|
+
// @went.tf/discord-bot-framework/i18n
|
|
5
|
+
export * from './logger/index.js';
|
|
6
|
+
export * from './env/index.js';
|
|
7
|
+
export * from './api-client/index.js';
|
|
8
|
+
export * from './interactions/index.js';
|
|
9
|
+
export * from './commands/index.js';
|
|
10
|
+
export * from './client/index.js';
|
|
11
|
+
export * from './utils/index.js';
|
|
12
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,6CAA6C;AAC7C,sCAAsC;AACtC,wCAAwC;AACxC,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits a component/modal customId of the form `id:resourceId` into its
|
|
3
|
+
* parts. `resourceId` is undefined when no separator is present.
|
|
4
|
+
*/
|
|
5
|
+
export declare function parseCustomIdSegments(customId: string, separator?: string): {
|
|
6
|
+
id: string;
|
|
7
|
+
resourceId?: string;
|
|
8
|
+
};
|
|
9
|
+
//# sourceMappingURL=custom-id.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-id.d.ts","sourceRoot":"","sources":["../../src/interactions/custom-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,SAAM,GAAG;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAS5G"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Splits a component/modal customId of the form `id:resourceId` into its
|
|
3
|
+
* parts. `resourceId` is undefined when no separator is present.
|
|
4
|
+
*/
|
|
5
|
+
export function parseCustomIdSegments(customId, separator = ':') {
|
|
6
|
+
const separatorIndex = customId.indexOf(separator);
|
|
7
|
+
if (separatorIndex === -1) {
|
|
8
|
+
return { id: customId };
|
|
9
|
+
}
|
|
10
|
+
return {
|
|
11
|
+
id: customId.substring(0, separatorIndex),
|
|
12
|
+
resourceId: customId.substring(separatorIndex + separator.length),
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=custom-id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"custom-id.js","sourceRoot":"","sources":["../../src/interactions/custom-id.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,QAAgB,EAAE,SAAS,GAAG,GAAG;IACrE,MAAM,cAAc,GAAG,QAAQ,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACnD,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO;QACL,EAAE,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC,EAAE,cAAc,CAAC;QACzC,UAAU,EAAE,QAAQ,CAAC,SAAS,CAAC,cAAc,GAAG,SAAS,CAAC,MAAM,CAAC;KAClE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { AutocompleteInteraction, ChatInputCommandInteraction, MessageComponentInteraction, ModalSubmitInteraction, UserContextMenuCommandInteraction, MessageContextMenuCommandInteraction } from 'discord.js';
|
|
2
|
+
import { BaseInteractionContext, BotChatInputCommand, BotContextMenuCommand, BotMessageComponent, BotModal } from './types.js';
|
|
3
|
+
export type OnDispatchError<Ctx> = (interaction: unknown, context: Ctx, error: unknown) => void | Promise<void>;
|
|
4
|
+
export interface DispatchChatInputCommandOptions<Ctx extends BaseInteractionContext> {
|
|
5
|
+
commands: Record<string, BotChatInputCommand<Ctx>>;
|
|
6
|
+
onUnknownCommand?: (interaction: ChatInputCommandInteraction, context: Ctx) => void | Promise<void>;
|
|
7
|
+
onError: OnDispatchError<Ctx>;
|
|
8
|
+
}
|
|
9
|
+
export declare function dispatchChatInputCommand<Ctx extends BaseInteractionContext>(interaction: ChatInputCommandInteraction, context: Ctx, options: DispatchChatInputCommandOptions<Ctx>): Promise<void>;
|
|
10
|
+
export interface DispatchAutocompleteOptions<Ctx extends BaseInteractionContext> {
|
|
11
|
+
commands: Record<string, BotChatInputCommand<Ctx>>;
|
|
12
|
+
onError: OnDispatchError<Ctx>;
|
|
13
|
+
}
|
|
14
|
+
export declare function dispatchAutocomplete<Ctx extends BaseInteractionContext>(interaction: AutocompleteInteraction, context: Ctx, options: DispatchAutocompleteOptions<Ctx>): Promise<void>;
|
|
15
|
+
export interface DispatchComponentOptions<Ctx extends BaseInteractionContext> {
|
|
16
|
+
components: Record<string, BotMessageComponent<Ctx>>;
|
|
17
|
+
customIdSeparator?: string;
|
|
18
|
+
onUnknownComponent?: (interaction: MessageComponentInteraction, context: Ctx) => void | Promise<void>;
|
|
19
|
+
onError: OnDispatchError<Ctx>;
|
|
20
|
+
}
|
|
21
|
+
export declare function dispatchComponent<Ctx extends BaseInteractionContext>(interaction: MessageComponentInteraction, context: Ctx, options: DispatchComponentOptions<Ctx>): Promise<void>;
|
|
22
|
+
export interface DispatchModalOptions<Ctx extends BaseInteractionContext> {
|
|
23
|
+
modals: Record<string, BotModal<Ctx>>;
|
|
24
|
+
customIdSeparator?: string;
|
|
25
|
+
onUnknownModal?: (interaction: ModalSubmitInteraction, context: Ctx) => void | Promise<void>;
|
|
26
|
+
onError: OnDispatchError<Ctx>;
|
|
27
|
+
}
|
|
28
|
+
export declare function dispatchModal<Ctx extends BaseInteractionContext>(interaction: ModalSubmitInteraction, context: Ctx, options: DispatchModalOptions<Ctx>): Promise<void>;
|
|
29
|
+
export interface DispatchContextMenuOptions<Ctx extends BaseInteractionContext> {
|
|
30
|
+
contextMenuCommands: Record<string, BotContextMenuCommand<Ctx>>;
|
|
31
|
+
onUnknownCommand?: (interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction, context: Ctx) => void | Promise<void>;
|
|
32
|
+
onError: OnDispatchError<Ctx>;
|
|
33
|
+
}
|
|
34
|
+
export declare function dispatchContextMenu<Ctx extends BaseInteractionContext>(interaction: UserContextMenuCommandInteraction | MessageContextMenuCommandInteraction, context: Ctx, options: DispatchContextMenuOptions<Ctx>): Promise<void>;
|
|
35
|
+
//# sourceMappingURL=dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.d.ts","sourceRoot":"","sources":["../../src/interactions/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { parseCustomIdSegments } from './custom-id.js';
|
|
2
|
+
export async function dispatchChatInputCommand(interaction, context, options) {
|
|
3
|
+
const command = options.commands[interaction.commandName];
|
|
4
|
+
if (!command) {
|
|
5
|
+
if (options.onUnknownCommand) {
|
|
6
|
+
await options.onUnknownCommand(interaction, context);
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
throw new Error(`Unknown command ${interaction.commandName}`);
|
|
10
|
+
}
|
|
11
|
+
try {
|
|
12
|
+
await command.handle(interaction, context);
|
|
13
|
+
}
|
|
14
|
+
catch (e) {
|
|
15
|
+
context.logger.error(`Error while responding to command interaction (commandName=${interaction.commandName})`, e);
|
|
16
|
+
await options.onError(interaction, context, e);
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function dispatchAutocomplete(interaction, context, options) {
|
|
20
|
+
const command = options.commands[interaction.commandName];
|
|
21
|
+
try {
|
|
22
|
+
const focusedOption = interaction.options.getFocused(true);
|
|
23
|
+
const handler = command?.autocomplete?.[focusedOption.name];
|
|
24
|
+
if (!handler) {
|
|
25
|
+
throw new Error(`Unknown autocomplete option ${focusedOption.name} for command ${interaction.commandName}`);
|
|
26
|
+
}
|
|
27
|
+
await handler(interaction, context, focusedOption.name);
|
|
28
|
+
}
|
|
29
|
+
catch (e) {
|
|
30
|
+
context.logger.error(`Error while responding to command autocomplete (commandName=${interaction.commandName})`, e);
|
|
31
|
+
await options.onError(interaction, context, e);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
export async function dispatchComponent(interaction, context, options) {
|
|
35
|
+
const { id, resourceId } = parseCustomIdSegments(interaction.customId, options.customIdSeparator);
|
|
36
|
+
const component = options.components[id];
|
|
37
|
+
if (!component) {
|
|
38
|
+
if (options.onUnknownComponent) {
|
|
39
|
+
await options.onUnknownComponent(interaction, context);
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
throw new Error(`Unknown component customId ${id}`);
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
await component.handle(interaction, context, resourceId);
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
context.logger.error(`Error while responding to component interaction (customId=${id},resourceId=${resourceId})`, e);
|
|
49
|
+
await options.onError(interaction, context, e);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
export async function dispatchModal(interaction, context, options) {
|
|
53
|
+
const { id, resourceId } = parseCustomIdSegments(interaction.customId, options.customIdSeparator);
|
|
54
|
+
const modal = options.modals[id];
|
|
55
|
+
if (!modal) {
|
|
56
|
+
if (options.onUnknownModal) {
|
|
57
|
+
await options.onUnknownModal(interaction, context);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
throw new Error(`Unknown modal customId ${id}`);
|
|
61
|
+
}
|
|
62
|
+
try {
|
|
63
|
+
await modal.handle(interaction, context, resourceId);
|
|
64
|
+
}
|
|
65
|
+
catch (e) {
|
|
66
|
+
context.logger.error(`Error while responding to modal submit interaction (customId=${id},resourceId=${resourceId})`, e);
|
|
67
|
+
await options.onError(interaction, context, e);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
export async function dispatchContextMenu(interaction, context, options) {
|
|
71
|
+
const command = options.contextMenuCommands[interaction.commandName];
|
|
72
|
+
if (!command) {
|
|
73
|
+
if (options.onUnknownCommand) {
|
|
74
|
+
await options.onUnknownCommand(interaction, context);
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
throw new Error(`Unknown context menu command ${interaction.commandName}`);
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
await command.handle(interaction, context);
|
|
81
|
+
}
|
|
82
|
+
catch (e) {
|
|
83
|
+
context.logger.error(`Error while responding to context menu interaction (commandName=${interaction.commandName})`, e);
|
|
84
|
+
await options.onError(interaction, context, e);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dispatch.js","sourceRoot":"","sources":["../../src/interactions/dispatch.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { AutocompleteInteraction, InteractionReplyOptions, RepliableInteraction } from 'discord.js';
|
|
2
|
+
import { NestableLogger } from '../logger/types.js';
|
|
3
|
+
export interface HandleInteractionErrorOptions {
|
|
4
|
+
/** Builds the (already-localized, if applicable) error message text shown to the user. */
|
|
5
|
+
buildMessage: () => string;
|
|
6
|
+
/**
|
|
7
|
+
* Sends the initial ephemeral error reply. Defaults to a plain
|
|
8
|
+
* `interaction.reply(options)`. Override to plug in bot-specific reply
|
|
9
|
+
* wrapping (e.g. ComponentsV2 upgrades, translation footers).
|
|
10
|
+
*/
|
|
11
|
+
reply?: (interaction: RepliableInteraction, options: InteractionReplyOptions) => Promise<unknown>;
|
|
12
|
+
/**
|
|
13
|
+
* Called once, only on the "first reply" path (not the edit-existing-reply
|
|
14
|
+
* fallback), when an error is about to be shown to the user for the first
|
|
15
|
+
* time. Useful for e.g. @mentioning a bot owner.
|
|
16
|
+
*/
|
|
17
|
+
onUnexpectedError?: () => void | Promise<void>;
|
|
18
|
+
}
|
|
19
|
+
export declare const handleInteractionError: (interaction: RepliableInteraction | AutocompleteInteraction, context: {
|
|
20
|
+
logger: NestableLogger;
|
|
21
|
+
}, options: HandleInteractionErrorOptions) => Promise<void>;
|
|
22
|
+
//# sourceMappingURL=handle-interaction-error.d.ts.map
|