@dressed/framework 0.1.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 (41) hide show
  1. package/README.md +35 -0
  2. package/dist/bin/dressed.d.ts +2 -0
  3. package/dist/bin/dressed.js +55 -0
  4. package/dist/bin/dressed.js.map +1 -0
  5. package/dist/build/build.d.ts +17 -0
  6. package/dist/build/build.js +88 -0
  7. package/dist/build/build.js.map +1 -0
  8. package/dist/build/bundle.d.ts +1 -0
  9. package/dist/build/bundle.js +19 -0
  10. package/dist/build/bundle.js.map +1 -0
  11. package/dist/build/index.d.ts +10 -0
  12. package/dist/build/index.js +11 -0
  13. package/dist/build/index.js.map +1 -0
  14. package/dist/build/log-tree.d.ts +7 -0
  15. package/dist/build/log-tree.js +55 -0
  16. package/dist/build/log-tree.js.map +1 -0
  17. package/dist/build/parsers/commands.d.ts +3 -0
  18. package/dist/build/parsers/commands.js +7 -0
  19. package/dist/build/parsers/commands.js.map +1 -0
  20. package/dist/build/parsers/components.d.ts +3 -0
  21. package/dist/build/parsers/components.js +47 -0
  22. package/dist/build/parsers/components.js.map +1 -0
  23. package/dist/build/parsers/events.d.ts +3 -0
  24. package/dist/build/parsers/events.js +8 -0
  25. package/dist/build/parsers/events.js.map +1 -0
  26. package/dist/build/parsers/index.d.ts +19 -0
  27. package/dist/build/parsers/index.js +57 -0
  28. package/dist/build/parsers/index.js.map +1 -0
  29. package/dist/index.d.ts +1 -0
  30. package/dist/index.js +3 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/types/config.d.ts +19 -0
  33. package/dist/types/config.js +2 -0
  34. package/dist/types/config.js.map +1 -0
  35. package/dist/types/walk.d.ts +4 -0
  36. package/dist/types/walk.js +2 -0
  37. package/dist/types/walk.js.map +1 -0
  38. package/dist/utils.d.ts +7 -0
  39. package/dist/utils.js +48 -0
  40. package/dist/utils.js.map +1 -0
  41. package/package.json +42 -0
package/README.md ADDED
@@ -0,0 +1,35 @@
1
+ # @dressed/framework
2
+
3
+ An opinionated framework for creating Discord bots using [Dressed](https://dressed.js.org).
4
+
5
+ Because this library is intended primarily for bundling and organizing your handler files, it can safely be added as a dev dependency.
6
+
7
+ ## 🚀 Usage
8
+
9
+ ```sh
10
+ bun add dressed
11
+ bun add -d @dressed/framework
12
+ ```
13
+
14
+ ```ts
15
+ // src/commands/ping.ts
16
+ import type { CommandConfig, CommandInteraction } from "dressed";
17
+
18
+ export const config = {
19
+ description: "Checks the API latency",
20
+ } satisfies CommandConfig;
21
+
22
+ export default async function (interaction: CommandInteraction<typeof config>) {
23
+ const start = Date.now();
24
+ const res = await interaction.deferReply({ ephemeral: true, with_response: true });
25
+ const delay = Date.parse(res.resource?.message?.timestamp ?? "") - start;
26
+ await interaction.editReply(`🏓 ${delay}ms`);
27
+ }
28
+ ```
29
+
30
+ You can then build and run the bot with:
31
+
32
+ ```sh
33
+ bun dressed build -ir
34
+ bun .dressed
35
+ ```
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env node
2
+ import { rmSync, writeFileSync } from "node:fs";
3
+ import { exit } from "node:process";
4
+ import { Command, InvalidArgumentError } from "commander";
5
+ import { logger } from "dressed/utils";
6
+ import build from "../build/build.js";
7
+ import bundleFiles from "../build/bundle.js";
8
+ import { categoryExports, importFileString, normalizeImportPath } from "../utils.js";
9
+ const program = new Command().name("dressed").description("A sleek, serverless-ready Discord bot framework.");
10
+ program
11
+ .command("build")
12
+ .description("Builds the bot and writes to .dressed")
13
+ .option("-i, --instance", "Include code to start a server instance")
14
+ .option("-r, --register", "Include code to register commands")
15
+ .option("-e, --endpoint <endpoint>", "The endpoint to listen on, defaults to `/`")
16
+ .option("-p, --port <port>", "The port to listen on, defaults to `8000`", (v) => {
17
+ const parsed = Number.parseInt(v, 10);
18
+ if (Number.isNaN(parsed) || parsed < 0 || parsed > 65535) {
19
+ throw new InvalidArgumentError("Port must be a valid TCP/IP network port number (0-65535)");
20
+ }
21
+ return parsed;
22
+ })
23
+ .option("-R, --root <root>", "Source root for the bot, defaults to `src`")
24
+ .option("-E, --extensions <extensions>", "Comma separated list of file extensions to include when bundling handlers, defaults to `js, ts, mjs`")
25
+ .action(async ({ instance, register, endpoint, port, root, extensions, }) => {
26
+ const { commands, components, events, configPath } = await build({
27
+ endpoint,
28
+ port,
29
+ build: { root, extensions: extensions === null || extensions === void 0 ? void 0 : extensions.split(",").map((e) => e.trim()) },
30
+ });
31
+ const categories = [commands, components, events];
32
+ const outputContent = `
33
+ ${instance || register
34
+ ? `import { ${[instance && "createServer", register && "registerCommands"].filter(Boolean)} } from "dressed/server";`
35
+ : ""}
36
+ import { serverConfig } from "dressed/utils";
37
+ import config from "${configPath ? normalizeImportPath(configPath) : "./dressed.config.mjs"}";
38
+ Object.assign(serverConfig, config);
39
+ ${[categories.map((c) => c.map(importFileString)), categoryExports(categories)].flat(2).join("")}
40
+ export { config };
41
+ ${register ? "registerCommands(commands);" : ""}
42
+ ${instance ? "createServer(commands, components, events);" : ""}`.trim();
43
+ const jsContent = 'export * from "./index.mjs";';
44
+ const typeContent = 'import type { ServerConfig } from "@dressed/framework";import type { CommandData, ComponentData, EventData } from "dressed/server";export declare const commands: CommandData[];export declare const components: ComponentData[];export declare const events: EventData[];export declare const config: ServerConfig;';
45
+ writeFileSync(".dressed/tmp/index.ts", outputContent);
46
+ await bundleFiles(".dressed/tmp/index.ts", ".dressed");
47
+ writeFileSync(".dressed/index.js", jsContent);
48
+ writeFileSync(".dressed/index.d.ts", typeContent);
49
+ rmSync(".dressed/tmp", { recursive: true, force: true });
50
+ const instancePrefix = register ? "├" : "└";
51
+ logger.succeed("Assembled generated build", instance ? `\n${instancePrefix} Starts a server instance` : "", register ? "\n└ Registers commands" : "");
52
+ exit();
53
+ });
54
+ program.parse();
55
+ //# sourceMappingURL=dressed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dressed.js","sourceRoot":"","sources":["../../src/bin/dressed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { ServerConfig } from "../types/config.ts";
2
+ import bundleFiles from "./bundle.ts";
3
+ import { parseCommands } from "./parsers/commands.ts";
4
+ import { parseComponents } from "./parsers/components.ts";
5
+ import { parseEvents } from "./parsers/events.ts";
6
+ /**
7
+ * Builds the bot imports and other variables.
8
+ */
9
+ export default function build(config?: ServerConfig, { bundle }?: {
10
+ bundle?: typeof bundleFiles;
11
+ }): Promise<{
12
+ commands: ReturnType<typeof parseCommands>;
13
+ components: ReturnType<typeof parseComponents>;
14
+ events: ReturnType<typeof parseEvents>;
15
+ config: ServerConfig;
16
+ configPath?: string;
17
+ }>;
@@ -0,0 +1,88 @@
1
+ var __rewriteRelativeImportExtension = (this && this.__rewriteRelativeImportExtension) || function (path, preserveJsx) {
2
+ if (typeof path === "string" && /^\.\.?\//.test(path)) {
3
+ return path.replace(/\.(tsx)$|((?:\.d)?)((?:\.[^./]+?)?)\.([cm]?)ts$/i, function (m, tsx, d, ext, cm) {
4
+ return tsx ? preserveJsx ? ".jsx" : ".js" : d && (!ext || !cm) ? m : (d + ext + "." + cm.toLowerCase() + "js");
5
+ });
6
+ }
7
+ return path;
8
+ };
9
+ import { appendFileSync, mkdirSync, readdirSync, writeFileSync } from "node:fs";
10
+ import { basename, extname, resolve } from "node:path";
11
+ import { getApp } from "dressed";
12
+ import { botEnv, logger, serverConfig } from "dressed/utils";
13
+ import { categoryExports, crawlDir, importFileString, override } from "../utils.js";
14
+ import bundleFiles from "./bundle.js";
15
+ import { parseCommands } from "./parsers/commands.js";
16
+ import { parseComponents } from "./parsers/components.js";
17
+ import { parseEvents } from "./parsers/events.js";
18
+ /**
19
+ * Builds the bot imports and other variables.
20
+ */
21
+ export default async function build(config = {}, { bundle = bundleFiles } = {}) {
22
+ var _a, _b;
23
+ mkdirSync(".dressed/tmp", { recursive: true });
24
+ await fetchMissingVars();
25
+ const configPath = readdirSync(".").find((f) => basename(f, extname(f)) === "dressed.config");
26
+ const configOutPath = ".dressed/tmp/dressed.config.mjs";
27
+ if (configPath) {
28
+ await bundle(configPath, ".dressed/tmp");
29
+ const { default: importedConfig } = await import(__rewriteRelativeImportExtension(resolve(configOutPath)));
30
+ config = override(importedConfig, config);
31
+ Object.assign(serverConfig, override(serverConfig, config));
32
+ }
33
+ else {
34
+ writeFileSync(configOutPath, `export default ${JSON.stringify(config)}`);
35
+ }
36
+ const root = (_b = (_a = config.build) === null || _a === void 0 ? void 0 : _a.root) !== null && _b !== void 0 ? _b : "src";
37
+ const categories = ["commands", "components", "events"];
38
+ const files = await Promise.all(categories.map((d) => { var _a; return crawlDir(root, d, (_a = config.build) === null || _a === void 0 ? void 0 : _a.extensions); }));
39
+ const entriesPath = ".dressed/tmp/entries.ts";
40
+ writeFileSync(entriesPath, [files.map((c) => c.map(importFileString)), categoryExports(files)].flat(2).join(""));
41
+ logger.defer("Bundling handlers");
42
+ await bundle(entriesPath, ".dressed/tmp");
43
+ const { commands, components, events } = await import(__rewriteRelativeImportExtension(resolve(entriesPath.replace(".ts", ".mjs"))));
44
+ logger.raw.log(); // This just adds a newline before the logged trees for consistency
45
+ return {
46
+ commands: parseCommands(commands, `${root}/commands`),
47
+ components: parseComponents(components, `${root}/components`),
48
+ events: parseEvents(events, `${root}/events`),
49
+ config,
50
+ configPath,
51
+ };
52
+ }
53
+ async function fetchMissingVars() {
54
+ try {
55
+ void botEnv.DISCORD_TOKEN; // NOSONAR
56
+ const missingVars = [];
57
+ try {
58
+ void botEnv.DISCORD_APP_ID; // NOSONAR
59
+ }
60
+ catch (_a) {
61
+ missingVars.push("DISCORD_APP_ID");
62
+ }
63
+ try {
64
+ void botEnv.DISCORD_PUBLIC_KEY; // NOSONAR
65
+ }
66
+ catch (_b) {
67
+ missingVars.push("DISCORD_PUBLIC_KEY");
68
+ }
69
+ if (missingVars.length) {
70
+ logger.defer(`Fetching missing variables (${missingVars.join(", ")})`);
71
+ const app = await getApp();
72
+ const envLines = [
73
+ "# Some required bot variables were missing, so they've been filled in automatically",
74
+ ];
75
+ if (missingVars.includes("DISCORD_APP_ID")) {
76
+ envLines.push(`DISCORD_APP_ID="${app.id}"`);
77
+ }
78
+ if (missingVars.includes("DISCORD_PUBLIC_KEY")) {
79
+ envLines.push(`DISCORD_PUBLIC_KEY="${app.verify_key}"`);
80
+ }
81
+ appendFileSync(".env", `\n${envLines.join("\n")}`);
82
+ }
83
+ }
84
+ catch (_c) {
85
+ logger.error("Failed to fetch missing variables");
86
+ }
87
+ }
88
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/build/build.ts"],"names":[],"mappings":";;;;;;;;AAAA,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7D,OAAO,EAAE,eAAe,EAAE,QAAQ,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACpF,OAAO,WAAW,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAElD;;GAEG;AACH,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,KAAK,CACjC,SAAuB,EAAE,EACzB,EAAE,MAAM,GAAG,WAAW,KAAsC,EAAE;;IAQ9D,SAAS,CAAC,cAAc,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC/C,MAAM,gBAAgB,EAAE,CAAC;IACzB,MAAM,UAAU,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,gBAAgB,CAAC,CAAC;IAC9F,MAAM,aAAa,GAAG,iCAAiC,CAAC;IAExD,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,MAAM,CAAC,UAAU,EAAE,cAAc,CAAC,CAAC;QACzC,MAAM,EAAE,OAAO,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,kCAAC,OAAO,CAAC,aAAa,CAAC,EAAC,CAAC;QACzE,MAAM,GAAG,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,aAAa,CAAC,aAAa,EAAE,kBAAkB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,IAAI,GAAG,MAAA,MAAA,MAAM,CAAC,KAAK,0CAAE,IAAI,mCAAI,KAAK,CAAC;IACzC,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,YAAY,EAAE,QAAQ,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,WAAC,OAAA,QAAQ,CAAC,IAAI,EAAE,CAAC,EAAE,MAAA,MAAM,CAAC,KAAK,0CAAE,UAAU,CAAC,CAAA,EAAA,CAAC,CAAC,CAAC;IACpG,MAAM,WAAW,GAAG,yBAAyB,CAAC;IAE9C,aAAa,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,EAAE,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACjH,MAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAClC,MAAM,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IAC1C,MAAM,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,kCAAC,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,EAAC,CAAC;IAEnG,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,mEAAmE;IACrF,OAAO;QACL,QAAQ,EAAE,aAAa,CAAC,QAAQ,EAAE,GAAG,IAAI,WAAW,CAAC;QACrD,UAAU,EAAE,eAAe,CAAC,UAAU,EAAE,GAAG,IAAI,aAAa,CAAC;QAC7D,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC;QAC7C,MAAM;QACN,UAAU;KACX,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,gBAAgB;IAC7B,IAAI,CAAC;QACH,KAAK,MAAM,CAAC,aAAa,CAAC,CAAC,UAAU;QACrC,MAAM,WAAW,GAAa,EAAE,CAAC;QAEjC,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,cAAc,CAAC,CAAC,UAAU;QACxC,CAAC;QAAC,WAAM,CAAC;YACP,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrC,CAAC;QACD,IAAI,CAAC;YACH,KAAK,MAAM,CAAC,kBAAkB,CAAC,CAAC,UAAU;QAC5C,CAAC;QAAC,WAAM,CAAC;YACP,WAAW,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;YACvB,MAAM,CAAC,KAAK,CAAC,+BAA+B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAEvE,MAAM,GAAG,GAAG,MAAM,MAAM,EAAE,CAAC;YAE3B,MAAM,QAAQ,GAAa;gBACzB,qFAAqF;aACtF,CAAC;YACF,IAAI,WAAW,CAAC,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;gBAC3C,QAAQ,CAAC,IAAI,CAAC,mBAAmB,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC;YAC9C,CAAC;YACD,IAAI,WAAW,CAAC,QAAQ,CAAC,oBAAoB,CAAC,EAAE,CAAC;gBAC/C,QAAQ,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,UAAU,GAAG,CAAC,CAAC;YAC1D,CAAC;YAED,cAAc,CAAC,MAAM,EAAE,KAAK,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;IAAC,WAAM,CAAC;QACP,MAAM,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACpD,CAAC;AACH,CAAC"}
@@ -0,0 +1 @@
1
+ export default function bundleFiles(entry: string, outdir: string): Promise<void>;
@@ -0,0 +1,19 @@
1
+ import { build } from "esbuild";
2
+ export default async function bundleFiles(entry, outdir) {
3
+ await build({
4
+ entryPoints: [entry],
5
+ outdir,
6
+ outExtension: { ".js": ".mjs" },
7
+ bundle: true,
8
+ minify: true,
9
+ splitting: true,
10
+ platform: "node",
11
+ format: "esm",
12
+ write: true,
13
+ treeShaking: true,
14
+ jsx: "automatic",
15
+ logLevel: "error",
16
+ packages: "external",
17
+ });
18
+ }
19
+ //# sourceMappingURL=bundle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","sourceRoot":"","sources":["../../src/build/bundle.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAEhC,MAAM,CAAC,OAAO,CAAC,KAAK,UAAU,WAAW,CAAC,KAAa,EAAE,MAAc;IACrE,MAAM,KAAK,CAAC;QACV,WAAW,EAAE,CAAC,KAAK,CAAC;QACpB,MAAM;QACN,YAAY,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QAC/B,MAAM,EAAE,IAAI;QACZ,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,IAAI;QACf,QAAQ,EAAE,MAAM;QAChB,MAAM,EAAE,KAAK;QACb,KAAK,EAAE,IAAI;QACX,WAAW,EAAE,IAAI;QACjB,GAAG,EAAE,WAAW;QAChB,QAAQ,EAAE,OAAO;QACjB,QAAQ,EAAE,UAAU;KACrB,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * This separation is intended to shield esbuild from bundling, as Next.js especially seems to freak out when it's referenced
3
+ *
4
+ * @module
5
+ */
6
+ export { default } from "./build.ts";
7
+ export * from "./parsers/commands.ts";
8
+ export * from "./parsers/components.ts";
9
+ export * from "./parsers/events.ts";
10
+ export * from "./parsers/index.ts";
@@ -0,0 +1,11 @@
1
+ /**
2
+ * This separation is intended to shield esbuild from bundling, as Next.js especially seems to freak out when it's referenced
3
+ *
4
+ * @module
5
+ */
6
+ export { default } from "./build.js";
7
+ export * from "./parsers/commands.js";
8
+ export * from "./parsers/components.js";
9
+ export * from "./parsers/events.js";
10
+ export * from "./parsers/index.js";
11
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/build/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AACrC,cAAc,uBAAuB,CAAC;AACtC,cAAc,yBAAyB,CAAC;AACxC,cAAc,qBAAqB,CAAC;AACpC,cAAc,oBAAoB,CAAC"}
@@ -0,0 +1,7 @@
1
+ /** Log a table of values with titles */
2
+ export default function logTree(...titles: string[]): {
3
+ push: (...v: string[]) => void;
4
+ aside: (v: unknown) => void;
5
+ chop: () => void;
6
+ log: () => void;
7
+ };
@@ -0,0 +1,55 @@
1
+ import { logger } from "dressed/utils";
2
+ /** Log a table of values with titles */
3
+ export default function logTree(...titles) {
4
+ const cols = titles.map((t) => [`\x1b[4m${t}\x1b[24m`]);
5
+ const asides = {};
6
+ const chopped = new Set();
7
+ return {
8
+ push(...v) {
9
+ var _a;
10
+ for (let i = 0; i < v.length; ++i) {
11
+ (_a = cols[i]) === null || _a === void 0 ? void 0 : _a.push(v[i]);
12
+ }
13
+ },
14
+ aside(v) {
15
+ var _a;
16
+ const i = cols[0].length - 1;
17
+ (_a = asides[i]) !== null && _a !== void 0 ? _a : (asides[i] = []);
18
+ asides[i].push(v);
19
+ },
20
+ chop: () => chopped.add(cols[0].length - 1),
21
+ log() {
22
+ var _a;
23
+ const widths = cols.map((col) => Math.max(...col.map((s) => removeAnsiLen(s))));
24
+ const rowCount = cols[0].length;
25
+ const lines = [];
26
+ for (let i = 0; i < rowCount; ++i) {
27
+ const row = cols
28
+ .map((col, j) => {
29
+ var _a;
30
+ const s = (_a = col[i]) !== null && _a !== void 0 ? _a : "";
31
+ const w = widths[j];
32
+ if (j === cols.length - 1 && cols.length !== 1) {
33
+ return " ".repeat(pad(s, w)) + s;
34
+ }
35
+ else {
36
+ return s + " ".repeat(pad(s, w));
37
+ }
38
+ })
39
+ .join(" ");
40
+ let prefix = "├";
41
+ if (i === 1)
42
+ prefix = rowCount === 2 ? "-" : "┌";
43
+ else if (i === rowCount - 1)
44
+ prefix = "└";
45
+ lines.push(`${i === 0 ? " " : prefix} ${chopped.has(i) ? "\x1b[9m" : ""}${row}\x1b[0m`, ...((_a = asides[i]) !== null && _a !== void 0 ? _a : []));
46
+ }
47
+ for (const l of lines.concat(""))
48
+ logger.raw.log(l);
49
+ },
50
+ };
51
+ }
52
+ // biome-ignore lint/suspicious/noControlCharactersInRegex: We need a control char
53
+ const removeAnsiLen = (s) => s.replace(/\x1b\[\d{1,2}m/g, "").length; // NOSONAR
54
+ const pad = (s, width) => Math.max(0, width - removeAnsiLen(s));
55
+ //# sourceMappingURL=log-tree.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log-tree.js","sourceRoot":"","sources":["../../src/build/log-tree.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CommandData } from "dressed/server";
2
+ import { createHandlerParser } from "./index.ts";
3
+ export declare const parseCommands: ReturnType<typeof createHandlerParser<CommandData>>;
@@ -0,0 +1,7 @@
1
+ import { createHandlerParser } from "./index.js";
2
+ export const parseCommands = createHandlerParser({
3
+ colNames: ["Command"],
4
+ itemMessages: ({ name }) => ({ confict: `"${name}" conflicts with another command, skipping the duplicate` }),
5
+ createData: () => undefined,
6
+ });
7
+ //# sourceMappingURL=commands.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../../src/build/parsers/commands.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,CAAC,MAAM,aAAa,GAAwD,mBAAmB,CAAC;IACpG,QAAQ,EAAE,CAAC,SAAS,CAAC;IACrB,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,0DAA0D,EAAE,CAAC;IAC7G,UAAU,EAAE,GAAG,EAAE,CAAC,SAAS;CAC5B,CAAC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { ComponentData } from "dressed/server";
2
+ import { createHandlerParser } from "./index.ts";
3
+ export declare const parseComponents: ReturnType<typeof createHandlerParser<ComponentData>>;
@@ -0,0 +1,47 @@
1
+ import { sep } from "node:path";
2
+ import { patternToRegex, scorePattern } from "@dressed/matcher";
3
+ import { logger } from "dressed/utils";
4
+ import { createHandlerParser } from "./index.js";
5
+ const validComponentCategories = new Set(["buttons", "modals", "selects"]);
6
+ export const parseComponents = createHandlerParser({
7
+ colNames: ["Component", "Category"],
8
+ uniqueKeys: ["category", "regex"],
9
+ itemMessages({ name, path }) {
10
+ const category = getCategory(path);
11
+ return {
12
+ confict: `"${name}" conflicts with another ${category === null || category === void 0 ? void 0 : category.slice(0, -1)}, skipping`,
13
+ cols: [category !== null && category !== void 0 ? category : ""],
14
+ };
15
+ },
16
+ createData({ name, path, exports: { pattern = name } = {} }) {
17
+ const category = getCategory(path);
18
+ if (!category)
19
+ throw new Error(`${logger.symbols.warn} Category for "${name}" could not be determined, skipping`, {
20
+ cause: "dressed-parsing",
21
+ });
22
+ return {
23
+ category,
24
+ ...(pattern instanceof RegExp
25
+ ? {
26
+ regex: pattern.source,
27
+ score: scorePattern(pattern.source),
28
+ }
29
+ : {
30
+ regex: patternToRegex(pattern).source,
31
+ score: scorePattern(pattern),
32
+ }),
33
+ };
34
+ },
35
+ postMortem: (c) => c.sort((a, b) => b.data.score - a.data.score),
36
+ });
37
+ function getCategory(path) {
38
+ const parts = path.split(sep);
39
+ const compIndex = parts.lastIndexOf("components");
40
+ if (compIndex === -1)
41
+ return null;
42
+ for (let i = parts.length - 2; i > compIndex; --i)
43
+ if (validComponentCategories.has(parts[i]))
44
+ return parts[i];
45
+ return null;
46
+ }
47
+ //# sourceMappingURL=components.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"components.js","sourceRoot":"","sources":["../../../src/build/parsers/components.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAEhE,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvC,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,wBAAwB,GAAG,IAAI,GAAG,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC;AAE3E,MAAM,CAAC,MAAM,eAAe,GAA0D,mBAAmB,CAAC;IACxG,QAAQ,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;IACnC,UAAU,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC;IACjC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE;QACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QACnC,OAAO;YACL,OAAO,EAAE,IAAI,IAAI,4BAA4B,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,YAAY;YAC/E,IAAI,EAAE,CAAC,QAAQ,aAAR,QAAQ,cAAR,QAAQ,GAAI,EAAE,CAAC;SACvB,CAAC;IACJ,CAAC;IACD,UAAU,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,OAAO,GAAG,IAAI,EAAE,GAAG,EAAE,EAAE;QACzD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,CAAC;QAEnC,IAAI,CAAC,QAAQ;YACX,MAAM,IAAI,KAAK,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,kBAAkB,IAAI,qCAAqC,EAAE;gBACjG,KAAK,EAAE,iBAAiB;aACzB,CAAC,CAAC;QAEL,OAAO;YACL,QAAQ;YACR,GAAG,CAAC,OAAO,YAAY,MAAM;gBAC3B,CAAC,CAAC;oBACE,KAAK,EAAE,OAAO,CAAC,MAAM;oBACrB,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC;iBACpC;gBACH,CAAC,CAAC;oBACE,KAAK,EAAE,cAAc,CAAC,OAAO,CAAC,CAAC,MAAM;oBACrC,KAAK,EAAE,YAAY,CAAC,OAAO,CAAC;iBAC7B,CAAC;SACP,CAAC;IACJ,CAAC;IACD,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;CACjE,CAAC,CAAC;AAEH,SAAS,WAAW,CAAC,IAAY;IAC/B,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE9B,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;IAClD,IAAI,SAAS,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,EAAE,CAAC;QAAE,IAAI,wBAAwB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAE/G,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { EventData } from "dressed/server";
2
+ import { createHandlerParser } from "./index.ts";
3
+ export declare const parseEvents: ReturnType<typeof createHandlerParser<EventData>>;
@@ -0,0 +1,8 @@
1
+ import { createHandlerParser } from "./index.js";
2
+ export const parseEvents = createHandlerParser({
3
+ colNames: ["Event"],
4
+ uniqueKeys: ["type"],
5
+ itemMessages: ({ name }) => ({ confict: `"${name}" conflicts with another event, skipping the duplicate` }),
6
+ createData: ({ name }) => ({ type: name.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toUpperCase() }),
7
+ });
8
+ //# sourceMappingURL=events.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"events.js","sourceRoot":"","sources":["../../../src/build/parsers/events.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,MAAM,CAAC,MAAM,WAAW,GAAsD,mBAAmB,CAAC;IAChG,QAAQ,EAAE,CAAC,OAAO,CAAC;IACnB,UAAU,EAAE,CAAC,MAAM,CAAC;IACpB,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,IAAI,wDAAwD,EAAE,CAAC;IAC3G,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;CAChG,CAAC,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { BaseData } from "dressed/server";
2
+ import type { WalkEntry } from "../../types/walk.ts";
3
+ import logTree from "../log-tree.ts";
4
+ interface ParserItemMessages {
5
+ confict: string;
6
+ cols?: string[];
7
+ }
8
+ type ImportedEntry<T extends BaseData<unknown>> = WalkEntry & {
9
+ exports: T["exports"];
10
+ };
11
+ type EntriesAnd<T> = (WalkEntry & T)[];
12
+ export declare function createHandlerParser<T extends BaseData<Record<keyof T["data"], unknown> | undefined>>(options: {
13
+ colNames: string[];
14
+ uniqueKeys?: (keyof T["data"])[];
15
+ itemMessages: ((file: ImportedEntry<T>) => ParserItemMessages) | ParserItemMessages;
16
+ createData: (file: ImportedEntry<T>, tree: ReturnType<typeof logTree>) => T["data"];
17
+ postMortem?: (items: EntriesAnd<T>) => EntriesAnd<T>;
18
+ }): (files: ImportedEntry<T>[], base?: string) => EntriesAnd<T>;
19
+ export {};
@@ -0,0 +1,57 @@
1
+ import { relative } from "node:path";
2
+ import { logger } from "dressed/utils";
3
+ import logTree from "../log-tree.js";
4
+ export function createHandlerParser(options) {
5
+ return (files, base) => {
6
+ var _a;
7
+ if (files.length === 0)
8
+ return [];
9
+ const tree = logTree(...options.colNames);
10
+ let items = [];
11
+ for (const [i, file] of Object.entries(files)) {
12
+ let data;
13
+ let itemMessages = options.itemMessages;
14
+ if (typeof itemMessages === "function") {
15
+ itemMessages = itemMessages(file);
16
+ }
17
+ try {
18
+ tree.push(files.filter((f) => f.name === file.name).length > 1
19
+ ? `${file.name} \x1b[2m(${relative(base !== null && base !== void 0 ? base : "", file.path)})\x1b[22m`
20
+ : file.name, ...((_a = itemMessages.cols) !== null && _a !== void 0 ? _a : []));
21
+ data = options.createData(file, tree);
22
+ const hasConflict = items.some((item) => { var _a, _b; return (_b = (_a = options.uniqueKeys) === null || _a === void 0 ? void 0 : _a.every((k) => { var _a; return (data === null || data === void 0 ? void 0 : data[k]) === ((_a = item.data) === null || _a === void 0 ? void 0 : _a[k]); })) !== null && _b !== void 0 ? _b : item.name === file.name; });
23
+ if (hasConflict) {
24
+ throw new Error(`${logger.symbols.warn} ${itemMessages.confict}`, { cause: "dressed-parsing" });
25
+ }
26
+ if (typeof file.exports.default !== "function") {
27
+ throw new TypeError(`${logger.symbols.error} Every handler must export a default function, skipping`, {
28
+ cause: "dressed-parsing",
29
+ });
30
+ }
31
+ }
32
+ catch (e) {
33
+ function asideErr() {
34
+ const prefix = Number(i) === files.length - 1 ? " " : "│";
35
+ if (e && e instanceof Error) {
36
+ if (e.cause === "dressed-parsing") {
37
+ tree.aside(`${prefix} ${e.message}`);
38
+ }
39
+ else {
40
+ tree.aside(`${prefix} ${logger.symbols.error} Failed to parse ${file.path}: ${e.message}`);
41
+ tree.aside(e);
42
+ }
43
+ }
44
+ }
45
+ asideErr();
46
+ tree.chop();
47
+ continue;
48
+ }
49
+ items.push({ ...file, data });
50
+ }
51
+ if (options.postMortem)
52
+ items = options.postMortem(items);
53
+ tree.log();
54
+ return items;
55
+ };
56
+ }
57
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/build/parsers/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./types/config.ts";
package/dist/index.js ADDED
@@ -0,0 +1,3 @@
1
+ // Types
2
+ export * from "./types/config.js";
3
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,QAAQ;AACR,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { ServerConfig as CoreServerConfig } from "dressed/server";
2
+ /**
3
+ * The configuration for the server.
4
+ */
5
+ export interface ServerConfig extends CoreServerConfig {
6
+ /** Build configuration */
7
+ build?: {
8
+ /**
9
+ * Source root for the bot
10
+ * @default "src"
11
+ */
12
+ root?: string;
13
+ /**
14
+ * File extensions to include when bundling handlers
15
+ * @default ["js", "ts", "mjs"]
16
+ */
17
+ extensions?: string[];
18
+ };
19
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/types/config.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export interface WalkEntry {
2
+ name: string;
3
+ path: string;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=walk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walk.js","sourceRoot":"","sources":["../../src/types/walk.ts"],"names":[],"mappings":""}
@@ -0,0 +1,7 @@
1
+ import type { WalkEntry } from "./types/walk.ts";
2
+ export declare const normalizeImportPath: (path: string) => string;
3
+ export declare function importFileString(file: WalkEntry): string;
4
+ export declare function categoryExports(categories: WalkEntry[][]): string[];
5
+ /** Deep merges two objects, producing a new object where values from `b` override those from `a`. */
6
+ export declare function override<T>(a: Partial<T>, b: Partial<T>): Partial<T>;
7
+ export declare function crawlDir(root: string, dir: string, extensions?: string[]): Promise<WalkEntry[]>;
package/dist/utils.js ADDED
@@ -0,0 +1,48 @@
1
+ import { createHash } from "node:crypto";
2
+ import { existsSync } from "node:fs";
3
+ import { readdir } from "node:fs/promises";
4
+ import { basename, extname, join, relative, resolve } from "node:path";
5
+ import { cwd } from "node:process";
6
+ import { logger } from "dressed/utils";
7
+ const hash = (v) => createHash("sha1").update(v).digest("hex");
8
+ export const normalizeImportPath = (path) => relative(".dressed/tmp", path).replace(/\\/g, "/");
9
+ export function importFileString(file) {
10
+ return `import * as h${hash(file.path)} from "${normalizeImportPath(file.path)}";`;
11
+ }
12
+ export function categoryExports(categories) {
13
+ return categories.map((c, i) => `export const ${["commands", "components", "events"][i]} = [${c.map((f) => {
14
+ const exportKey = `"exports":h${hash(f.path)}`;
15
+ return JSON.stringify({ ...f, exports: null }).replace('"exports":null', exportKey);
16
+ })}];`);
17
+ }
18
+ /** Deep merges two objects, producing a new object where values from `b` override those from `a`. */
19
+ export function override(a, b) {
20
+ const result = { ...a };
21
+ for (const key in b) {
22
+ const k = key;
23
+ const bv = b[k];
24
+ const av = a[k];
25
+ if (bv !== undefined && typeof bv === "object" && bv !== null && !Array.isArray(bv)) {
26
+ result[k] = override(av !== null && av !== void 0 ? av : {}, bv);
27
+ }
28
+ else if (bv !== undefined) {
29
+ result[k] = bv;
30
+ }
31
+ }
32
+ return result;
33
+ }
34
+ export async function crawlDir(root, dir, extensions = ["js", "ts", "mjs"]) {
35
+ const dirPath = resolve(root, dir);
36
+ if (!existsSync(dirPath)) {
37
+ logger.warn(`${dir.slice(0, 1).toUpperCase() + dir.slice(1)} directory not found`);
38
+ return [];
39
+ }
40
+ const entries = await readdir(dirPath, { recursive: true });
41
+ return entries
42
+ .filter((e) => extensions.includes(extname(e).slice(1)))
43
+ .map((e) => {
44
+ const path = relative(cwd(), join(dirPath, e));
45
+ return { name: basename(path, extname(path)), path };
46
+ });
47
+ }
48
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@dressed/framework",
3
+ "version": "0.1.0",
4
+ "description": "A sleek, serverless-ready Discord bot framework.",
5
+ "scripts": {
6
+ "dist": "rm -fr dist && tsc",
7
+ "check-types": "tsc --noEmit",
8
+ "test": "bun test",
9
+ "dry-publish": "bun publish --dry-run"
10
+ },
11
+ "dependencies": {
12
+ "@dressed/matcher": "^1.4.0",
13
+ "commander": "^14.0.2",
14
+ "dressed": "^2.0.0-canary.1",
15
+ "esbuild": "^0.27.2"
16
+ },
17
+ "exports": {
18
+ ".": "./dist/index.js",
19
+ "./build": "./dist/build/index.js"
20
+ },
21
+ "type": "module",
22
+ "bin": {
23
+ "dressed": "dist/bin/dressed.js"
24
+ },
25
+ "types": "./dist/index.d.ts",
26
+ "files": [
27
+ "dist"
28
+ ],
29
+ "homepage": "https://dressed.js.org",
30
+ "keywords": [
31
+ "framework",
32
+ "serverless",
33
+ "dressed",
34
+ "discord-bot"
35
+ ],
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "git+https://github.com/Inbestigator/dressed.git",
40
+ "directory": "packages/dressed-framework"
41
+ }
42
+ }