@wuapidev/cli 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 (95) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +84 -0
  3. package/dist/args.d.ts +17 -0
  4. package/dist/args.d.ts.map +1 -0
  5. package/dist/args.js +96 -0
  6. package/dist/args.js.map +1 -0
  7. package/dist/cli.d.ts +3 -0
  8. package/dist/cli.d.ts.map +1 -0
  9. package/dist/cli.js +7 -0
  10. package/dist/cli.js.map +1 -0
  11. package/dist/context.d.ts +45 -0
  12. package/dist/context.d.ts.map +1 -0
  13. package/dist/context.js +120 -0
  14. package/dist/context.js.map +1 -0
  15. package/dist/credentials.d.ts +31 -0
  16. package/dist/credentials.d.ts.map +1 -0
  17. package/dist/credentials.js +90 -0
  18. package/dist/credentials.js.map +1 -0
  19. package/dist/dialcodes.d.ts +5 -0
  20. package/dist/dialcodes.d.ts.map +1 -0
  21. package/dist/dialcodes.js +51 -0
  22. package/dist/dialcodes.js.map +1 -0
  23. package/dist/dispatch.d.ts +37 -0
  24. package/dist/dispatch.d.ts.map +1 -0
  25. package/dist/dispatch.js +225 -0
  26. package/dist/dispatch.js.map +1 -0
  27. package/dist/dotenv.d.ts +7 -0
  28. package/dist/dotenv.d.ts.map +1 -0
  29. package/dist/dotenv.js +67 -0
  30. package/dist/dotenv.js.map +1 -0
  31. package/dist/errors.d.ts +24 -0
  32. package/dist/errors.d.ts.map +1 -0
  33. package/dist/errors.js +41 -0
  34. package/dist/errors.js.map +1 -0
  35. package/dist/files.d.ts +4 -0
  36. package/dist/files.d.ts.map +1 -0
  37. package/dist/files.js +35 -0
  38. package/dist/files.js.map +1 -0
  39. package/dist/generated/operations.d.ts +3 -0
  40. package/dist/generated/operations.d.ts.map +1 -0
  41. package/dist/generated/operations.js +4462 -0
  42. package/dist/generated/operations.js.map +1 -0
  43. package/dist/help.d.ts +13 -0
  44. package/dist/help.d.ts.map +1 -0
  45. package/dist/help.js +176 -0
  46. package/dist/help.js.map +1 -0
  47. package/dist/index.d.ts +8 -0
  48. package/dist/index.d.ts.map +1 -0
  49. package/dist/index.js +8 -0
  50. package/dist/index.js.map +1 -0
  51. package/dist/io.d.ts +35 -0
  52. package/dist/io.d.ts.map +1 -0
  53. package/dist/io.js +103 -0
  54. package/dist/io.js.map +1 -0
  55. package/dist/link.d.ts +26 -0
  56. package/dist/link.d.ts.map +1 -0
  57. package/dist/link.js +226 -0
  58. package/dist/link.js.map +1 -0
  59. package/dist/login.d.ts +30 -0
  60. package/dist/login.d.ts.map +1 -0
  61. package/dist/login.js +224 -0
  62. package/dist/login.js.map +1 -0
  63. package/dist/main.d.ts +3 -0
  64. package/dist/main.d.ts.map +1 -0
  65. package/dist/main.js +88 -0
  66. package/dist/main.js.map +1 -0
  67. package/dist/mcp.d.ts +3 -0
  68. package/dist/mcp.d.ts.map +1 -0
  69. package/dist/mcp.js +127 -0
  70. package/dist/mcp.js.map +1 -0
  71. package/dist/operation.d.ts +32 -0
  72. package/dist/operation.d.ts.map +1 -0
  73. package/dist/operation.js +3 -0
  74. package/dist/operation.js.map +1 -0
  75. package/dist/paths.d.ts +12 -0
  76. package/dist/paths.d.ts.map +1 -0
  77. package/dist/paths.js +27 -0
  78. package/dist/paths.js.map +1 -0
  79. package/dist/profiles.d.ts +6 -0
  80. package/dist/profiles.d.ts.map +1 -0
  81. package/dist/profiles.js +119 -0
  82. package/dist/profiles.js.map +1 -0
  83. package/dist/qr.d.ts +19 -0
  84. package/dist/qr.d.ts.map +1 -0
  85. package/dist/qr.js +198 -0
  86. package/dist/qr.js.map +1 -0
  87. package/dist/send.d.ts +3 -0
  88. package/dist/send.d.ts.map +1 -0
  89. package/dist/send.js +73 -0
  90. package/dist/send.js.map +1 -0
  91. package/dist/version.d.ts +3 -0
  92. package/dist/version.d.ts.map +1 -0
  93. package/dist/version.js +3 -0
  94. package/dist/version.js.map +1 -0
  95. package/package.json +61 -0
package/dist/mcp.js ADDED
@@ -0,0 +1,127 @@
1
+ // `wuapi mcp add`: registers the local MCP server (`npx -y @wuapidev/mcp`)
2
+ // with an MCP client. The config holds no key: the server reads the login
3
+ // `wuapi login` stored (or WUAPI_API_KEY when the client sets one).
4
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
5
+ import { dirname, join } from "node:path";
6
+ import { allowOnly, stringFlag } from "./args.js";
7
+ import { emit, log, readCreds } from "./context.js";
8
+ import { CliError, usage } from "./errors.js";
9
+ const COMMAND = "npx";
10
+ const ARGS = ["-y", "@wuapidev/mcp"];
11
+ const CLIENTS = ["claude", "cursor", "vscode"];
12
+ function claudeArgs(scope) {
13
+ return ["mcp", "add", "wuapi", "--scope", scope, "--", COMMAND, ...ARGS];
14
+ }
15
+ function mergeJson(path, key, entry) {
16
+ let config = {};
17
+ if (existsSync(path)) {
18
+ const text = readFileSync(path, "utf8");
19
+ try {
20
+ config = text.trim() ? JSON.parse(text) : {};
21
+ }
22
+ catch {
23
+ throw new CliError("invalid_config", `${path} is not plain JSON (comments?). Add this under "${key}" by hand: "wuapi": ${JSON.stringify(entry)}`);
24
+ }
25
+ if (typeof config !== "object" || config === null || Array.isArray(config))
26
+ throw new CliError("invalid_config", `${path} is not a JSON object.`);
27
+ }
28
+ const servers = (config[key] ?? {});
29
+ const before = servers.wuapi;
30
+ if (JSON.stringify(before) === JSON.stringify(entry))
31
+ return "unchanged";
32
+ config[key] = { ...servers, wuapi: entry };
33
+ mkdirSync(dirname(path), { recursive: true });
34
+ writeFileSync(path, `${JSON.stringify(config, null, 2)}\n`);
35
+ return before === undefined ? "added" : "updated";
36
+ }
37
+ function instructions() {
38
+ return [
39
+ "Add the wuapi MCP server to your client (no key in the config: it uses your `wuapi login`):",
40
+ "",
41
+ " Claude Code: claude mcp add wuapi --scope user -- npx -y @wuapidev/mcp",
42
+ " (or: wuapi mcp add --client claude)",
43
+ ' Cursor: .cursor/mcp.json {"mcpServers": {"wuapi": {"command": "npx", "args": ["-y", "@wuapidev/mcp"]}}}',
44
+ " (or: wuapi mcp add --client cursor)",
45
+ ' VS Code: .vscode/mcp.json {"servers": {"wuapi": {"type": "stdio", "command": "npx", "args": ["-y", "@wuapidev/mcp"]}}}',
46
+ " (or: wuapi mcp add --client vscode)",
47
+ "",
48
+ "Any other client: run `npx -y @wuapidev/mcp` as a stdio server. Docs: https://wuapi.dev/docs/mcp",
49
+ ].join("\n");
50
+ }
51
+ export function mcp(ctx) {
52
+ const sub = ctx.args.positionals[1];
53
+ if (sub !== "add" || ctx.args.positionals.length > 2)
54
+ throw usage("Usage: wuapi mcp add [--client claude|cursor|vscode] [--scope project|user]");
55
+ allowOnly(ctx.args, ["client", "scope"]);
56
+ const clientFlag = stringFlag(ctx.args, "client");
57
+ if (clientFlag !== undefined && !CLIENTS.includes(clientFlag))
58
+ throw usage(`--client must be one of ${CLIENTS.join(", ")}.`);
59
+ const scope = stringFlag(ctx.args, "scope") ?? "project";
60
+ if (scope !== "project" && scope !== "user")
61
+ throw usage("--scope must be project or user.");
62
+ const client = clientFlag ?? (ctx.io.env.CLAUDECODE || ctx.io.which("claude") ? "claude" : undefined);
63
+ const loggedIn = (() => {
64
+ try {
65
+ return Object.keys(readCreds(ctx).profiles).length > 0;
66
+ }
67
+ catch {
68
+ return false;
69
+ }
70
+ })();
71
+ const loginHint = loggedIn ? undefined : "Not logged in yet: run `wuapi login` so the server has a key.";
72
+ if (!client) {
73
+ emit(ctx, { client: null, configured: false, instructions: instructions() }, () => instructions());
74
+ if (loginHint)
75
+ log(ctx, loginHint);
76
+ return;
77
+ }
78
+ if (client === "claude") {
79
+ const args = claudeArgs(scope);
80
+ const command = `claude ${args.join(" ")}`;
81
+ if (!ctx.io.which("claude")) {
82
+ emit(ctx, { client, scope, configured: false, command }, () => `Run:\n\n ${command}`);
83
+ if (loginHint)
84
+ log(ctx, loginHint);
85
+ return;
86
+ }
87
+ const r = ctx.io.run("claude", args);
88
+ if (r.status !== 0) {
89
+ const output = `${r.stdout}${r.stderr}`.trim();
90
+ if (/already exists/i.test(output)) {
91
+ emit(ctx, { client, scope, configured: true, command, status: "unchanged" }, () => `wuapi is already set up in Claude Code (${scope} scope).`);
92
+ return;
93
+ }
94
+ throw new CliError("mcp_add_failed", `\`${command}\` failed${output ? `: ${output}` : "."}`);
95
+ }
96
+ emit(ctx, { client, scope, configured: true, command, status: "added" }, () => `Added the wuapi MCP server to Claude Code (${scope} scope). Restart Claude Code to load it.`);
97
+ if (loginHint)
98
+ log(ctx, loginHint);
99
+ return;
100
+ }
101
+ if (client === "vscode" && scope === "user") {
102
+ const payload = JSON.stringify({ name: "wuapi", command: COMMAND, args: ARGS });
103
+ const command = `code --add-mcp '${payload}'`;
104
+ if (ctx.io.which("code")) {
105
+ const r = ctx.io.run("code", ["--add-mcp", payload]);
106
+ if (r.status !== 0)
107
+ throw new CliError("mcp_add_failed", `\`${command}\` failed: ${`${r.stdout}${r.stderr}`.trim()}`);
108
+ emit(ctx, { client, scope, configured: true, command, status: "added" }, () => "Added the wuapi MCP server to your VS Code user profile.");
109
+ }
110
+ else {
111
+ emit(ctx, { client, scope, configured: false, command }, () => `Run:\n\n ${command}`);
112
+ }
113
+ if (loginHint)
114
+ log(ctx, loginHint);
115
+ return;
116
+ }
117
+ const base = scope === "user" ? ctx.io.home : ctx.io.cwd;
118
+ const [path, key, entry] = client === "cursor"
119
+ ? [join(base, ".cursor", "mcp.json"), "mcpServers", { command: COMMAND, args: ARGS }]
120
+ : [join(base, ".vscode", "mcp.json"), "servers", { type: "stdio", command: COMMAND, args: ARGS }];
121
+ const status = mergeJson(path, key, { ...entry, args: [...entry.args] });
122
+ const name = client === "cursor" ? "Cursor" : "VS Code";
123
+ emit(ctx, { client, scope, configured: true, path, status }, () => status === "unchanged" ? `wuapi is already in ${path}.` : `${status === "added" ? "Added" : "Updated"} wuapi in ${path}. Reload ${name} to load it.`);
124
+ if (loginHint)
125
+ log(ctx, loginHint);
126
+ }
127
+ //# sourceMappingURL=mcp.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp.js","sourceRoot":"","sources":["../src/mcp.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface OperationField {
2
+ name: string;
3
+ /** A readable type: `string`, `integer`, `"a" | "b"`, `string[]`, `object`. */
4
+ type: string;
5
+ required: boolean;
6
+ description: string;
7
+ }
8
+ export interface Operation {
9
+ operationId: string;
10
+ /** The SDK resource path: `["messages"]`, `["projects", "apiKeys"]`, `[]` for `me`. */
11
+ resource: string[];
12
+ /** The SDK method name. */
13
+ method: string;
14
+ httpMethod: string;
15
+ path: string;
16
+ /** Path parameters, in the order the SDK method takes them. */
17
+ pathParams: string[];
18
+ query: OperationField[];
19
+ hasBody: boolean;
20
+ bodyRequired: boolean;
21
+ /** Body fields; several entries when the body is one of several shapes (`type`). */
22
+ body: {
23
+ name: string;
24
+ fields: OperationField[];
25
+ }[];
26
+ /** The SDK method returns a Paginator. */
27
+ paginated: boolean;
28
+ summary: string;
29
+ description: string;
30
+ deprecated: boolean;
31
+ }
32
+ //# sourceMappingURL=operation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.d.ts","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,+EAA+E;IAC/E,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,SAAS;IACxB,WAAW,EAAE,MAAM,CAAC;IACpB,uFAAuF;IACvF,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,+DAA+D;IAC/D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,cAAc,EAAE,CAAC;IACxB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,OAAO,CAAC;IACtB,oFAAoF;IACpF,IAAI,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,cAAc,EAAE,CAAA;KAAE,EAAE,CAAC;IACnD,0CAA0C;IAC1C,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;CACrB"}
@@ -0,0 +1,3 @@
1
+ // The shape of one entry of src/generated/operations.ts.
2
+ export {};
3
+ //# sourceMappingURL=operation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operation.js","sourceRoot":"","sources":["../src/operation.ts"],"names":[],"mappings":"AAAA,yDAAyD"}
@@ -0,0 +1,12 @@
1
+ type Env = Record<string, string | undefined>;
2
+ /**
3
+ * The CLI's config directory: `%APPDATA%\wuapi` on Windows,
4
+ * `$XDG_CONFIG_HOME/wuapi` when set (an absolute path), else `~/.config/wuapi`.
5
+ */
6
+ export declare function configDir(env?: Env, platform?: NodeJS.Platform, home?: string): string;
7
+ /** The stored logins: `<configDir>/credentials.json`. */
8
+ export declare function credentialsPath(env?: Env, platform?: NodeJS.Platform, home?: string): string;
9
+ /** A device code waiting for `wuapi login --finish`. */
10
+ export declare function pendingLoginPath(env?: Env, platform?: NodeJS.Platform, home?: string): string;
11
+ export {};
12
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAMA,KAAK,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAE9C;;;GAGG;AACH,wBAAgB,SAAS,CAAC,GAAG,GAAE,GAAiB,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAOhI;AAED,yDAAyD;AACzD,wBAAgB,eAAe,CAAC,GAAG,GAAE,GAAiB,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAGtI;AAED,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,GAAG,GAAE,GAAiB,EAAE,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAAE,IAAI,GAAE,MAAkB,GAAG,MAAM,CAGvI"}
package/dist/paths.js ADDED
@@ -0,0 +1,27 @@
1
+ // Where the CLI keeps its files. packages/wuapi-mcp has a copy of
2
+ // `configDir` and `credentialsPath` (src/login.ts there): keep both the same.
3
+ import { homedir } from "node:os";
4
+ import { isAbsolute, join, posix, win32 } from "node:path";
5
+ /**
6
+ * The CLI's config directory: `%APPDATA%\wuapi` on Windows,
7
+ * `$XDG_CONFIG_HOME/wuapi` when set (an absolute path), else `~/.config/wuapi`.
8
+ */
9
+ export function configDir(env = process.env, platform = process.platform, home = homedir()) {
10
+ if (platform === "win32") {
11
+ const appData = env.APPDATA?.trim();
12
+ return win32.join(appData || win32.join(home, "AppData", "Roaming"), "wuapi");
13
+ }
14
+ const xdg = env.XDG_CONFIG_HOME?.trim();
15
+ return posix.join(xdg && isAbsolute(xdg) ? xdg : posix.join(home, ".config"), "wuapi");
16
+ }
17
+ /** The stored logins: `<configDir>/credentials.json`. */
18
+ export function credentialsPath(env = process.env, platform = process.platform, home = homedir()) {
19
+ const dir = configDir(env, platform, home);
20
+ return platform === "win32" ? win32.join(dir, "credentials.json") : join(dir, "credentials.json");
21
+ }
22
+ /** A device code waiting for `wuapi login --finish`. */
23
+ export function pendingLoginPath(env = process.env, platform = process.platform, home = homedir()) {
24
+ const dir = configDir(env, platform, home);
25
+ return platform === "win32" ? win32.join(dir, "login-pending.json") : join(dir, "login-pending.json");
26
+ }
27
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,kEAAkE;AAClE,8EAA8E;AAE9E,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAI3D;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,MAAW,OAAO,CAAC,GAAG,EAAE,WAA4B,OAAO,CAAC,QAAQ,EAAE,OAAe,OAAO,EAAE;IACtH,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;QACpC,OAAO,KAAK,CAAC,IAAI,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC;IACxC,OAAO,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,EAAE,OAAO,CAAC,CAAC;AACzF,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,eAAe,CAAC,MAAW,OAAO,CAAC,GAAG,EAAE,WAA4B,OAAO,CAAC,QAAQ,EAAE,OAAe,OAAO,EAAE;IAC5H,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC;AACpG,CAAC;AAED,wDAAwD;AACxD,MAAM,UAAU,gBAAgB,CAAC,MAAW,OAAO,CAAC,GAAG,EAAE,WAA4B,OAAO,CAAC,QAAQ,EAAE,OAAe,OAAO,EAAE;IAC7H,MAAM,GAAG,GAAG,SAAS,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;IAC3C,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,oBAAoB,CAAC,CAAC;AACxG,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Ctx } from "./context.js";
2
+ export declare function listProfiles(ctx: Ctx): void;
3
+ export declare function switchProfile(ctx: Ctx): Promise<void>;
4
+ export declare function logout(ctx: Ctx): void;
5
+ export declare function whoami(ctx: Ctx): Promise<void>;
6
+ //# sourceMappingURL=profiles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.d.ts","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"AAGA,OAAO,EAAuD,KAAK,GAAG,EAAE,MAAM,cAAc,CAAC;AAwB7F,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CAa3C;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAsB3D;AAMD,wBAAgB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,CA6BrC;AAED,wBAAsB,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAuBpD"}
@@ -0,0 +1,119 @@
1
+ // Stored logins: `wuapi profiles`, `wuapi switch`, `wuapi logout`, `wuapi whoami`.
2
+ import { allowOnly, boolFlag } from "./args.js";
3
+ import { credsPath, emit, makeClient, readCreds, resolveAuth } from "./context.js";
4
+ import { saveCredentials } from "./credentials.js";
5
+ import { CliError, usage } from "./errors.js";
6
+ import { removeFile } from "./files.js";
7
+ const describe = (p) => (p.project ? `${p.organization.name} / ${p.project.name}` : p.organization.name);
8
+ function summary(name, p, current) {
9
+ return {
10
+ name,
11
+ current: name === current,
12
+ organization: p.organization,
13
+ project: p.project,
14
+ keyPrefix: p.keyPrefix ?? null,
15
+ ...(p.baseUrl ? { baseUrl: p.baseUrl } : {}),
16
+ createdAt: p.createdAt,
17
+ };
18
+ }
19
+ function table(rows) {
20
+ const widths = rows[0].map((_, i) => Math.max(...rows.map((r) => r[i].length)));
21
+ return rows.map((r) => r.map((c, i) => (i === r.length - 1 ? c : c.padEnd(widths[i]))).join(" ").trimEnd()).join("\n");
22
+ }
23
+ export function listProfiles(ctx) {
24
+ allowOnly(ctx.args, []);
25
+ const creds = readCreds(ctx);
26
+ const names = Object.keys(creds.profiles);
27
+ emit(ctx, { current: creds.current, profiles: names.map((n) => summary(n, creds.profiles[n], creds.current)) }, () => {
28
+ if (names.length === 0)
29
+ return "No profiles. Run `wuapi login`.";
30
+ const rows = [["", "PROFILE", "ORGANIZATION", "PROJECT", "KEY"]];
31
+ for (const n of names) {
32
+ const p = creds.profiles[n];
33
+ rows.push([n === creds.current ? "*" : "", n, p.organization.name, p.project?.name ?? "-", p.keyPrefix ? `${p.keyPrefix}...` : "-"]);
34
+ }
35
+ return table(rows);
36
+ });
37
+ }
38
+ export async function switchProfile(ctx) {
39
+ allowOnly(ctx.args, []);
40
+ const creds = readCreds(ctx);
41
+ const names = Object.keys(creds.profiles);
42
+ if (names.length === 0)
43
+ throw new CliError("not_logged_in", "No profiles. Run `wuapi login`.");
44
+ let name = ctx.args.positionals[1];
45
+ if (ctx.args.positionals.length > 2)
46
+ throw usage("Usage: wuapi switch [<profile>]");
47
+ if (name === undefined) {
48
+ if (!ctx.interactive) {
49
+ throw new CliError("profile_required", `Name the profile: wuapi switch <profile>. Profiles: ${names.join(", ")}.`, { exitCode: 2, details: { profiles: names } });
50
+ }
51
+ const labels = names.map((n) => `${n} (${describe(creds.profiles[n])})${n === creds.current ? " *" : ""}`);
52
+ const i = await ctx.io.pick("Switch to which profile? (arrows or a number, Enter)", labels, Math.max(0, names.indexOf(creds.current ?? "")));
53
+ if (i === null)
54
+ throw new CliError("cancelled", "Nothing changed.");
55
+ name = names[i];
56
+ }
57
+ if (!creds.profiles[name]) {
58
+ throw new CliError("profile_not_found", `No profile named "${name}". Profiles: ${names.join(", ")}.`, { details: { profiles: names } });
59
+ }
60
+ creds.current = name;
61
+ saveCredentials(creds, credsPath(ctx));
62
+ emit(ctx, { current: name, profile: summary(name, creds.profiles[name], name) }, () => `Now using ${name} (${describe(creds.profiles[name])}).`);
63
+ }
64
+ function nextCurrent(creds) {
65
+ return Object.keys(creds.profiles)[0] ?? null;
66
+ }
67
+ export function logout(ctx) {
68
+ allowOnly(ctx.args, ["all"]);
69
+ if (ctx.args.positionals.length > 2)
70
+ throw usage("Usage: wuapi logout [<profile>] [--all]");
71
+ const creds = readCreds(ctx);
72
+ const revoke = "The key still exists: revoke it at https://wuapi.dev/app/api-keys if nobody else uses it.";
73
+ if (boolFlag(ctx.args, "all")) {
74
+ const removed = Object.keys(creds.profiles);
75
+ removeFile(credsPath(ctx));
76
+ emit(ctx, { removed, current: null }, () => (removed.length ? `Logged out of ${removed.join(", ")}.\n${revoke}` : "No profiles to remove."));
77
+ return;
78
+ }
79
+ const name = ctx.args.positionals[1] ?? creds.current;
80
+ if (!name || !creds.profiles[name]) {
81
+ if (ctx.args.positionals[1])
82
+ throw new CliError("profile_not_found", `No profile named "${name}".`, { details: { profiles: Object.keys(creds.profiles) } });
83
+ emit(ctx, { removed: [], current: null }, () => "Not logged in.");
84
+ return;
85
+ }
86
+ delete creds.profiles[name];
87
+ const wasCurrent = creds.current === name;
88
+ if (wasCurrent)
89
+ creds.current = nextCurrent(creds);
90
+ if (Object.keys(creds.profiles).length === 0)
91
+ removeFile(credsPath(ctx));
92
+ else
93
+ saveCredentials(creds, credsPath(ctx));
94
+ emit(ctx, { removed: [name], current: creds.current }, () => [
95
+ `Logged out of ${name}.`,
96
+ ...(wasCurrent && creds.current ? [`Now using ${creds.current} (${describe(creds.profiles[creds.current])}).`] : []),
97
+ revoke,
98
+ ].join("\n"));
99
+ }
100
+ export async function whoami(ctx) {
101
+ allowOnly(ctx.args, []);
102
+ const auth = resolveAuth(ctx);
103
+ const me = await makeClient(ctx, auth).me();
104
+ const source = auth.source === "profile" ? `profile ${auth.profileName}` : auth.source === "flag" ? "--api-key" : auth.source === "env" ? "WUAPI_API_KEY" : "./.env";
105
+ emit(ctx, {
106
+ profile: auth.profileName ?? null,
107
+ keySource: auth.source,
108
+ organization: { id: me.organization.id, name: me.organization.name },
109
+ project: me.project ? { id: me.project.id, name: me.project.name } : null,
110
+ apiKey: { id: me.apiKey.id, name: me.apiKey.name, keyPrefix: me.apiKey.keyPrefix, last4: me.apiKey.last4 },
111
+ baseUrl: auth.baseUrl,
112
+ }, () => [
113
+ `Organization: ${me.organization.name} (${me.organization.id})`,
114
+ `Project: ${me.project ? `${me.project.name} (${me.project.id})` : "none (whole organization)"}`,
115
+ `Key: ${me.apiKey.name} ${me.apiKey.keyPrefix}...${me.apiKey.last4}`,
116
+ `From: ${source}`,
117
+ ].join("\n"));
118
+ }
119
+ //# sourceMappingURL=profiles.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profiles.js","sourceRoot":"","sources":["../src/profiles.ts"],"names":[],"mappings":"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"}
package/dist/qr.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ export interface Bitmap {
2
+ width: number;
3
+ height: number;
4
+ /** true = dark, row-major. */
5
+ dark: Uint8Array;
6
+ }
7
+ export declare function pngFromDataUrl(dataUrl: string): Buffer;
8
+ export declare function decodePng(png: Buffer): Bitmap;
9
+ /** The QR module grid (true = dark) read from a rendered QR code. */
10
+ export declare function qrMatrix(img: Bitmap): boolean[][];
11
+ /**
12
+ * Renders the grid with a quiet zone, two rows per line. With color, dark and
13
+ * light are painted explicitly (works on light and dark terminals); without,
14
+ * light modules are drawn as blocks, which reads right on a dark background.
15
+ */
16
+ export declare function renderMatrix(matrix: boolean[][], color: boolean, quiet?: number): string;
17
+ /** The QR code of a PNG data URL as terminal text, or null when it cannot be read. */
18
+ export declare function qrToTerminal(dataUrl: string, color: boolean): string | null;
19
+ //# sourceMappingURL=qr.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.d.ts","sourceRoot":"","sources":["../src/qr.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,MAAM;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,8BAA8B;IAC9B,IAAI,EAAE,UAAU,CAAC;CAClB;AAID,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAItD;AAED,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAwF7C;AAED,qEAAqE;AACrE,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,EAAE,EAAE,CAiCjD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,MAAM,CAmBnF;AAED,sFAAsF;AACtF,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAM3E"}
package/dist/qr.js ADDED
@@ -0,0 +1,198 @@
1
+ // Shows an account's QR code in the terminal. The API gives it as a PNG data
2
+ // URL (`qrCodeUrl`), so there is no text to re-encode: the PNG is decoded
3
+ // (node:zlib; non-interlaced, any bit depth and color type), the module grid
4
+ // is read back from the finder pattern, and each pair of rows becomes one line
5
+ // of half blocks.
6
+ import { inflateSync } from "node:zlib";
7
+ const SIGNATURE = Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]);
8
+ export function pngFromDataUrl(dataUrl) {
9
+ const m = /^data:image\/png;base64,(.+)$/s.exec(dataUrl.trim());
10
+ if (!m)
11
+ throw new Error("not a PNG data URL");
12
+ return Buffer.from(m[1], "base64");
13
+ }
14
+ export function decodePng(png) {
15
+ if (png.length < 8 || !png.subarray(0, 8).equals(SIGNATURE))
16
+ throw new Error("not a PNG");
17
+ let pos = 8;
18
+ let width = 0;
19
+ let height = 0;
20
+ let bitDepth = 0;
21
+ let colorType = 0;
22
+ let palette;
23
+ const idat = [];
24
+ while (pos + 8 <= png.length) {
25
+ const len = png.readUInt32BE(pos);
26
+ const type = png.toString("latin1", pos + 4, pos + 8);
27
+ const data = png.subarray(pos + 8, pos + 8 + len);
28
+ pos += 12 + len;
29
+ if (type === "IHDR") {
30
+ width = data.readUInt32BE(0);
31
+ height = data.readUInt32BE(4);
32
+ bitDepth = data[8];
33
+ colorType = data[9];
34
+ if (data[12] !== 0)
35
+ throw new Error("interlaced PNG");
36
+ }
37
+ else if (type === "PLTE")
38
+ palette = data;
39
+ else if (type === "IDAT")
40
+ idat.push(data);
41
+ else if (type === "IEND")
42
+ break;
43
+ }
44
+ const channels = { 0: 1, 2: 3, 3: 1, 4: 2, 6: 4 }[colorType];
45
+ if (!channels || !width || !height)
46
+ throw new Error("unsupported PNG");
47
+ const bitsPerPixel = channels * bitDepth;
48
+ const bpp = Math.max(1, bitsPerPixel >> 3);
49
+ const stride = Math.ceil((width * bitsPerPixel) / 8);
50
+ const raw = inflateSync(Buffer.concat(idat));
51
+ const rows = Buffer.alloc(stride * height);
52
+ let prev = Buffer.alloc(stride);
53
+ for (let y = 0; y < height; y++) {
54
+ const filter = raw[y * (stride + 1)];
55
+ const line = raw.subarray(y * (stride + 1) + 1, (y + 1) * (stride + 1));
56
+ const out = rows.subarray(y * stride, (y + 1) * stride);
57
+ for (let x = 0; x < stride; x++) {
58
+ const a = x >= bpp ? out[x - bpp] : 0;
59
+ const b = prev[x];
60
+ const c = x >= bpp ? prev[x - bpp] : 0;
61
+ let v = line[x];
62
+ if (filter === 1)
63
+ v += a;
64
+ else if (filter === 2)
65
+ v += b;
66
+ else if (filter === 3)
67
+ v += (a + b) >> 1;
68
+ else if (filter === 4) {
69
+ const p = a + b - c;
70
+ const pa = Math.abs(p - a);
71
+ const pb = Math.abs(p - b);
72
+ const pc = Math.abs(p - c);
73
+ v += pa <= pb && pa <= pc ? a : pb <= pc ? b : c;
74
+ }
75
+ out[x] = v & 0xff;
76
+ }
77
+ prev = out;
78
+ }
79
+ const sample = (y, i) => {
80
+ // The i-th sample of row y, scaled to 0..255.
81
+ if (bitDepth === 8)
82
+ return rows[y * stride + i];
83
+ if (bitDepth === 16)
84
+ return rows[y * stride + i * 2];
85
+ const bit = i * bitDepth;
86
+ const byte = rows[y * stride + (bit >> 3)];
87
+ const v = (byte >> (8 - bitDepth - (bit & 7))) & ((1 << bitDepth) - 1);
88
+ return colorType === 3 ? v : Math.round((v * 255) / ((1 << bitDepth) - 1));
89
+ };
90
+ const dark = new Uint8Array(width * height);
91
+ for (let y = 0; y < height; y++) {
92
+ for (let x = 0; x < width; x++) {
93
+ let r, g, b;
94
+ let alpha = 255;
95
+ if (colorType === 3) {
96
+ const idx = sample(y, x);
97
+ r = palette?.[idx * 3] ?? 0;
98
+ g = palette?.[idx * 3 + 1] ?? 0;
99
+ b = palette?.[idx * 3 + 2] ?? 0;
100
+ }
101
+ else if (colorType === 0 || colorType === 4) {
102
+ r = g = b = sample(y, x * channels);
103
+ if (colorType === 4)
104
+ alpha = sample(y, x * channels + 1);
105
+ }
106
+ else {
107
+ r = sample(y, x * channels);
108
+ g = sample(y, x * channels + 1);
109
+ b = sample(y, x * channels + 2);
110
+ if (colorType === 6)
111
+ alpha = sample(y, x * channels + 3);
112
+ }
113
+ const lum = (0.299 * r + 0.587 * g + 0.114 * b) * (alpha / 255) + 255 * (1 - alpha / 255);
114
+ dark[y * width + x] = lum < 128 ? 1 : 0;
115
+ }
116
+ }
117
+ return { width, height, dark };
118
+ }
119
+ /** The QR module grid (true = dark) read from a rendered QR code. */
120
+ export function qrMatrix(img) {
121
+ const at = (x, y) => img.dark[y * img.width + x] === 1;
122
+ let minX = img.width;
123
+ let minY = img.height;
124
+ let maxX = -1;
125
+ let maxY = -1;
126
+ for (let y = 0; y < img.height; y++) {
127
+ for (let x = 0; x < img.width; x++) {
128
+ if (!at(x, y))
129
+ continue;
130
+ if (x < minX)
131
+ minX = x;
132
+ if (x > maxX)
133
+ maxX = x;
134
+ if (y < minY)
135
+ minY = y;
136
+ if (y > maxY)
137
+ maxY = y;
138
+ }
139
+ }
140
+ if (maxX < 0)
141
+ throw new Error("blank image");
142
+ // The top-left finder pattern starts at (minX, minY) with a 7-module dark run.
143
+ let run = 0;
144
+ while (minX + run <= maxX && at(minX + run, minY))
145
+ run++;
146
+ const module = run / 7;
147
+ const size = Math.round((maxX - minX + 1) / module);
148
+ if (module < 1 || size < 21 || size > 177 || (size - 17) % 4 !== 0)
149
+ throw new Error("no QR code found");
150
+ const matrix = [];
151
+ for (let r = 0; r < size; r++) {
152
+ const row = [];
153
+ for (let c = 0; c < size; c++) {
154
+ const x = Math.min(maxX, Math.floor(minX + (c + 0.5) * module));
155
+ const y = Math.min(maxY, Math.floor(minY + (r + 0.5) * module));
156
+ row.push(at(x, y));
157
+ }
158
+ matrix.push(row);
159
+ }
160
+ return matrix;
161
+ }
162
+ /**
163
+ * Renders the grid with a quiet zone, two rows per line. With color, dark and
164
+ * light are painted explicitly (works on light and dark terminals); without,
165
+ * light modules are drawn as blocks, which reads right on a dark background.
166
+ */
167
+ export function renderMatrix(matrix, color, quiet = 2) {
168
+ const n = matrix.length + quiet * 2;
169
+ const get = (r, c) => {
170
+ const rr = r - quiet;
171
+ const cc = c - quiet;
172
+ return rr >= 0 && cc >= 0 && rr < matrix.length && cc < matrix.length ? matrix[rr][cc] : false;
173
+ };
174
+ const lines = [];
175
+ for (let r = 0; r < n; r += 2) {
176
+ let line = "";
177
+ for (let c = 0; c < n; c++) {
178
+ const top = get(r, c);
179
+ const bottom = r + 1 < n ? get(r + 1, c) : false;
180
+ if (color)
181
+ line += `\x1b[${top ? 30 : 97};${bottom ? 40 : 107}m▀`;
182
+ else
183
+ line += !top && !bottom ? "█" : !top ? "▀" : !bottom ? "▄" : " ";
184
+ }
185
+ lines.push(color ? `${line}\x1b[0m` : line);
186
+ }
187
+ return lines.join("\n");
188
+ }
189
+ /** The QR code of a PNG data URL as terminal text, or null when it cannot be read. */
190
+ export function qrToTerminal(dataUrl, color) {
191
+ try {
192
+ return renderMatrix(qrMatrix(decodePng(pngFromDataUrl(dataUrl))), color);
193
+ }
194
+ catch {
195
+ return null;
196
+ }
197
+ }
198
+ //# sourceMappingURL=qr.js.map
package/dist/qr.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qr.js","sourceRoot":"","sources":["../src/qr.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,0EAA0E;AAC1E,6EAA6E;AAC7E,+EAA+E;AAC/E,kBAAkB;AAElB,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AASxC,MAAM,SAAS,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;AAEjE,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,CAAC,GAAG,gCAAgC,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;IAChE,IAAI,CAAC,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,oBAAoB,CAAC,CAAC;IAC9C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAE,EAAE,QAAQ,CAAC,CAAC;AACtC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;IAC1F,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,IAAI,QAAQ,GAAG,CAAC,CAAC;IACjB,IAAI,SAAS,GAAG,CAAC,CAAC;IAClB,IAAI,OAA2B,CAAC;IAChC,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,OAAO,GAAG,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,GAAG,GAAG,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,GAAG,CAAC,EAAE,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC;QAClD,GAAG,IAAI,EAAE,GAAG,GAAG,CAAC;QAChB,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7B,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9B,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YACpB,SAAS,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YACrB,IAAI,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;gBAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACxD,CAAC;aAAM,IAAI,IAAI,KAAK,MAAM;YAAE,OAAO,GAAG,IAAI,CAAC;aACtC,IAAI,IAAI,KAAK,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACrC,IAAI,IAAI,KAAK,MAAM;YAAE,MAAM;IAClC,CAAC;IACD,MAAM,QAAQ,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC;IAC7D,IAAI,CAAC,QAAQ,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,CAAC;IACvE,MAAM,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;IACzC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;IACrD,MAAM,GAAG,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC7C,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,CAAC;IAC3C,IAAI,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACxE,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;QACxD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACvC,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YACnB,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC;YACxC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;YACjB,IAAI,MAAM,KAAK,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;iBACpB,IAAI,MAAM,KAAK,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC;iBACzB,IAAI,MAAM,KAAK,CAAC;gBAAE,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;iBACpC,IAAI,MAAM,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;gBACpB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAC3B,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACnD,CAAC;YACD,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,GAAG,GAAG,CAAC;IACb,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,CAAS,EAAU,EAAE;QAC9C,8CAA8C;QAC9C,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,CAAE,CAAC;QACjD,IAAI,QAAQ,KAAK,EAAE;YAAE,OAAO,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,CAAC,CAAE,CAAC;QACtD,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,GAAG,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QAC5C,MAAM,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;QACvE,OAAO,SAAS,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,CAAC;IACF,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAChC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,IAAI,CAAS,EAAE,CAAS,EAAE,CAAS,CAAC;YACpC,IAAI,KAAK,GAAG,GAAG,CAAC;YAChB,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBACpB,MAAM,GAAG,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;gBACzB,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAC5B,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;gBAChC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;iBAAM,IAAI,SAAS,KAAK,CAAC,IAAI,SAAS,KAAK,CAAC,EAAE,CAAC;gBAC9C,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;gBACpC,IAAI,SAAS,KAAK,CAAC;oBAAE,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;iBAAM,CAAC;gBACN,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC;gBAC5B,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAChC,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;gBAChC,IAAI,SAAS,KAAK,CAAC;oBAAE,KAAK,GAAG,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,QAAQ,GAAG,CAAC,CAAC,CAAC;YAC3D,CAAC;YACD,MAAM,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,GAAG,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC;YAC1F,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACjC,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,EAAE,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvE,IAAI,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC;IACrB,IAAI,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;IACtB,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC;gBAAE,SAAS;YACxB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;YACvB,IAAI,CAAC,GAAG,IAAI;gBAAE,IAAI,GAAG,CAAC,CAAC;QACzB,CAAC;IACH,CAAC;IACD,IAAI,IAAI,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,aAAa,CAAC,CAAC;IAC7C,+EAA+E;IAC/E,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,OAAO,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,EAAE,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;QAAE,GAAG,EAAE,CAAC;IACzD,MAAM,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC;IACvB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC;IACpD,IAAI,MAAM,GAAG,CAAC,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,kBAAkB,CAAC,CAAC;IACxG,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC9B,MAAM,GAAG,GAAc,EAAE,CAAC;QAC1B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YAChE,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC;YAChE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAmB,EAAE,KAAc,EAAE,KAAK,GAAG,CAAC;IACzE,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,CAAS,EAAE,EAAE;QACnC,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,MAAM,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,IAAI,EAAE,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAE,CAAC,EAAE,CAAE,CAAC,CAAC,CAAC,KAAK,CAAC;IACnG,CAAC,CAAC;IACF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3B,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACtB,MAAM,MAAM,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YACjD,IAAI,KAAK;gBAAE,IAAI,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;;gBAC7D,IAAI,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACxE,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC9C,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,sFAAsF;AACtF,MAAM,UAAU,YAAY,CAAC,OAAe,EAAE,KAAc;IAC1D,IAAI,CAAC;QACH,OAAO,YAAY,CAAC,QAAQ,CAAC,SAAS,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
package/dist/send.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ import { type Ctx } from "./context.js";
2
+ export declare function send(ctx: Ctx): Promise<void>;
3
+ //# sourceMappingURL=send.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"send.d.ts","sourceRoot":"","sources":["../src/send.ts"],"names":[],"mappings":"AAOA,OAAO,EAAyB,KAAK,GAAG,EAAE,MAAM,cAAc,CAAC;AAwB/D,wBAAsB,IAAI,CAAC,GAAG,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CA0ClD"}