specli 0.0.5 → 0.0.7

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 (208) hide show
  1. package/cli.ts +13 -4
  2. package/dist/cli.d.ts +3 -0
  3. package/dist/cli.d.ts.map +1 -0
  4. package/dist/cli.js +2331 -0
  5. package/dist/cli.js.map +53 -0
  6. package/dist/index.d.ts +2 -0
  7. package/dist/index.d.ts.map +1 -0
  8. package/dist/index.js +2032 -0
  9. package/dist/index.js.map +48 -0
  10. package/dist/src/ai/tools.d.ts +139 -0
  11. package/dist/src/ai/tools.d.ts.map +1 -0
  12. package/dist/src/ai/tools.js +1656 -0
  13. package/dist/src/ai/tools.js.map +45 -0
  14. package/dist/src/cli/auth-requirements.d.ts +10 -0
  15. package/dist/src/cli/auth-requirements.d.ts.map +1 -0
  16. package/dist/src/cli/auth-requirements.js +66 -0
  17. package/dist/src/cli/auth-requirements.js.map +10 -0
  18. package/dist/src/cli/auth-schemes.d.ts +22 -0
  19. package/dist/src/cli/auth-schemes.d.ts.map +1 -0
  20. package/dist/src/cli/auth-schemes.js +116 -0
  21. package/dist/src/cli/auth-schemes.js.map +11 -0
  22. package/dist/src/cli/capabilities.d.ts +32 -0
  23. package/dist/src/cli/capabilities.d.ts.map +1 -0
  24. package/dist/src/cli/capabilities.js +45 -0
  25. package/dist/src/cli/capabilities.js.map +10 -0
  26. package/dist/src/cli/command-id.d.ts +8 -0
  27. package/dist/src/cli/command-id.d.ts.map +1 -0
  28. package/dist/src/cli/command-id.js +18 -0
  29. package/dist/src/cli/command-id.js.map +11 -0
  30. package/dist/src/cli/command-index.d.ts +6 -0
  31. package/dist/src/cli/command-index.d.ts.map +1 -0
  32. package/dist/src/cli/command-index.js +15 -0
  33. package/dist/src/cli/command-index.js.map +10 -0
  34. package/dist/src/cli/command-model.d.ts +40 -0
  35. package/dist/src/cli/command-model.d.ts.map +1 -0
  36. package/dist/src/cli/command-model.js +274 -0
  37. package/dist/src/cli/command-model.js.map +18 -0
  38. package/dist/src/cli/compile.d.ts +15 -0
  39. package/dist/src/cli/compile.d.ts.map +1 -0
  40. package/dist/src/cli/compile.js +146 -0
  41. package/dist/src/cli/compile.js.map +11 -0
  42. package/dist/src/cli/crypto.d.ts +2 -0
  43. package/dist/src/cli/crypto.d.ts.map +1 -0
  44. package/dist/src/cli/crypto.js +15 -0
  45. package/dist/src/cli/crypto.js.map +10 -0
  46. package/dist/src/cli/derive-name.d.ts +9 -0
  47. package/dist/src/cli/derive-name.d.ts.map +1 -0
  48. package/dist/src/cli/derive-name.js +70 -0
  49. package/dist/src/cli/derive-name.js.map +10 -0
  50. package/dist/src/cli/exec.d.ts +14 -0
  51. package/dist/src/cli/exec.d.ts.map +1 -0
  52. package/dist/src/cli/exec.js +2077 -0
  53. package/dist/src/cli/exec.js.map +49 -0
  54. package/dist/src/cli/main.d.ts +10 -0
  55. package/dist/src/cli/main.d.ts.map +1 -0
  56. package/dist/src/cli/main.js +2032 -0
  57. package/dist/src/cli/main.js.map +48 -0
  58. package/dist/src/cli/naming.d.ts +12 -0
  59. package/dist/src/cli/naming.d.ts.map +1 -0
  60. package/dist/src/cli/naming.js +216 -0
  61. package/dist/src/cli/naming.js.map +12 -0
  62. package/dist/src/cli/operations.d.ts +3 -0
  63. package/dist/src/cli/operations.d.ts.map +1 -0
  64. package/dist/src/cli/operations.js +103 -0
  65. package/dist/src/cli/operations.js.map +10 -0
  66. package/dist/src/cli/params.d.ts +19 -0
  67. package/dist/src/cli/params.d.ts.map +1 -0
  68. package/dist/src/cli/params.js +79 -0
  69. package/dist/src/cli/params.js.map +12 -0
  70. package/dist/src/cli/pluralize.d.ts +2 -0
  71. package/dist/src/cli/pluralize.d.ts.map +1 -0
  72. package/dist/src/cli/pluralize.js +43 -0
  73. package/dist/src/cli/pluralize.js.map +10 -0
  74. package/dist/src/cli/positional.d.ts +19 -0
  75. package/dist/src/cli/positional.d.ts.map +1 -0
  76. package/dist/src/cli/positional.js +39 -0
  77. package/dist/src/cli/positional.js.map +10 -0
  78. package/dist/src/cli/request-body.d.ts +20 -0
  79. package/dist/src/cli/request-body.d.ts.map +1 -0
  80. package/dist/src/cli/request-body.js +82 -0
  81. package/dist/src/cli/request-body.js.map +12 -0
  82. package/dist/src/cli/runtime/argv.d.ts +3 -0
  83. package/dist/src/cli/runtime/argv.d.ts.map +1 -0
  84. package/dist/src/cli/runtime/argv.js +22 -0
  85. package/dist/src/cli/runtime/argv.js.map +10 -0
  86. package/dist/src/cli/runtime/auth/resolve.d.ts +9 -0
  87. package/dist/src/cli/runtime/auth/resolve.d.ts.map +1 -0
  88. package/dist/src/cli/runtime/auth/resolve.js +38 -0
  89. package/dist/src/cli/runtime/auth/resolve.js.map +10 -0
  90. package/dist/src/cli/runtime/body-flags.d.ts +41 -0
  91. package/dist/src/cli/runtime/body-flags.d.ts.map +1 -0
  92. package/dist/src/cli/runtime/body-flags.js +86 -0
  93. package/dist/src/cli/runtime/body-flags.js.map +10 -0
  94. package/dist/src/cli/runtime/body.d.ts +15 -0
  95. package/dist/src/cli/runtime/body.d.ts.map +1 -0
  96. package/dist/src/cli/runtime/body.js +40 -0
  97. package/dist/src/cli/runtime/body.js.map +11 -0
  98. package/dist/src/cli/runtime/collect.d.ts +2 -0
  99. package/dist/src/cli/runtime/collect.d.ts.map +1 -0
  100. package/dist/src/cli/runtime/collect.js +9 -0
  101. package/dist/src/cli/runtime/collect.js.map +10 -0
  102. package/dist/src/cli/runtime/compat.d.ts +35 -0
  103. package/dist/src/cli/runtime/compat.d.ts.map +1 -0
  104. package/dist/src/cli/runtime/compat.js +62 -0
  105. package/dist/src/cli/runtime/compat.js.map +10 -0
  106. package/dist/src/cli/runtime/context.d.ts +16 -0
  107. package/dist/src/cli/runtime/context.d.ts.map +1 -0
  108. package/dist/src/cli/runtime/context.js +936 -0
  109. package/dist/src/cli/runtime/context.js.map +32 -0
  110. package/dist/src/cli/runtime/execute.d.ts +33 -0
  111. package/dist/src/cli/runtime/execute.d.ts.map +1 -0
  112. package/dist/src/cli/runtime/execute.js +670 -0
  113. package/dist/src/cli/runtime/execute.js.map +22 -0
  114. package/dist/src/cli/runtime/generated.d.ts +14 -0
  115. package/dist/src/cli/runtime/generated.d.ts.map +1 -0
  116. package/dist/src/cli/runtime/generated.js +869 -0
  117. package/dist/src/cli/runtime/generated.js.map +23 -0
  118. package/dist/src/cli/runtime/headers.d.ts +9 -0
  119. package/dist/src/cli/runtime/headers.d.ts.map +1 -0
  120. package/dist/src/cli/runtime/headers.js +36 -0
  121. package/dist/src/cli/runtime/headers.js.map +10 -0
  122. package/dist/src/cli/runtime/index.d.ts +4 -0
  123. package/dist/src/cli/runtime/index.d.ts.map +1 -0
  124. package/dist/src/cli/runtime/index.js +1808 -0
  125. package/dist/src/cli/runtime/index.js.map +46 -0
  126. package/dist/src/cli/runtime/profile/secrets.d.ts +25 -0
  127. package/dist/src/cli/runtime/profile/secrets.d.ts.map +1 -0
  128. package/dist/src/cli/runtime/profile/secrets.js +51 -0
  129. package/dist/src/cli/runtime/profile/secrets.js.map +11 -0
  130. package/dist/src/cli/runtime/profile/store.d.ts +15 -0
  131. package/dist/src/cli/runtime/profile/store.d.ts.map +1 -0
  132. package/dist/src/cli/runtime/profile/store.js +102 -0
  133. package/dist/src/cli/runtime/profile/store.js.map +11 -0
  134. package/dist/src/cli/runtime/request.d.ts +36 -0
  135. package/dist/src/cli/runtime/request.d.ts.map +1 -0
  136. package/dist/src/cli/runtime/request.js +571 -0
  137. package/dist/src/cli/runtime/request.js.map +21 -0
  138. package/dist/src/cli/runtime/server-url.d.ts +8 -0
  139. package/dist/src/cli/runtime/server-url.d.ts.map +1 -0
  140. package/dist/src/cli/runtime/server-url.js +55 -0
  141. package/dist/src/cli/runtime/server-url.js.map +11 -0
  142. package/dist/src/cli/runtime/template.d.ts +5 -0
  143. package/dist/src/cli/runtime/template.d.ts.map +1 -0
  144. package/dist/src/cli/runtime/template.js +29 -0
  145. package/dist/src/cli/runtime/template.js.map +10 -0
  146. package/dist/src/cli/runtime/validate/ajv.d.ts +3 -0
  147. package/dist/src/cli/runtime/validate/ajv.d.ts.map +1 -0
  148. package/dist/src/cli/runtime/validate/ajv.js +17 -0
  149. package/dist/src/cli/runtime/validate/ajv.js.map +10 -0
  150. package/dist/src/cli/runtime/validate/coerce.d.ts +4 -0
  151. package/dist/src/cli/runtime/validate/coerce.d.ts.map +1 -0
  152. package/dist/src/cli/runtime/validate/coerce.js +60 -0
  153. package/dist/src/cli/runtime/validate/coerce.js.map +10 -0
  154. package/dist/src/cli/runtime/validate/error.d.ts +3 -0
  155. package/dist/src/cli/runtime/validate/error.d.ts.map +1 -0
  156. package/dist/src/cli/runtime/validate/error.js +21 -0
  157. package/dist/src/cli/runtime/validate/error.js.map +10 -0
  158. package/dist/src/cli/runtime/validate/index.d.ts +5 -0
  159. package/dist/src/cli/runtime/validate/index.d.ts.map +1 -0
  160. package/dist/src/cli/runtime/validate/index.js +122 -0
  161. package/dist/src/cli/runtime/validate/index.js.map +13 -0
  162. package/dist/src/cli/runtime/validate/schema.d.ts +9 -0
  163. package/dist/src/cli/runtime/validate/schema.d.ts.map +1 -0
  164. package/dist/src/cli/runtime/validate/schema.js +36 -0
  165. package/dist/src/cli/runtime/validate/schema.js.map +10 -0
  166. package/dist/src/cli/schema-shape.d.ts +5 -0
  167. package/dist/src/cli/schema-shape.d.ts.map +1 -0
  168. package/dist/src/cli/schema-shape.js +41 -0
  169. package/dist/src/cli/schema-shape.js.map +10 -0
  170. package/dist/src/cli/schema.d.ts +30 -0
  171. package/dist/src/cli/schema.d.ts.map +1 -0
  172. package/dist/src/cli/schema.js +38 -0
  173. package/dist/src/cli/schema.js.map +10 -0
  174. package/dist/src/cli/server.d.ts +16 -0
  175. package/dist/src/cli/server.d.ts.map +1 -0
  176. package/dist/src/cli/server.js +64 -0
  177. package/dist/src/cli/server.js.map +11 -0
  178. package/dist/src/cli/spec-id.d.ts +3 -0
  179. package/dist/src/cli/spec-id.d.ts.map +1 -0
  180. package/dist/src/cli/spec-id.js +21 -0
  181. package/dist/src/cli/spec-id.js.map +11 -0
  182. package/dist/src/cli/spec-loader.d.ts +7 -0
  183. package/dist/src/cli/spec-loader.d.ts.map +1 -0
  184. package/dist/src/cli/spec-loader.js +110 -0
  185. package/dist/src/cli/spec-loader.js.map +15 -0
  186. package/dist/src/cli/stable-json.d.ts +4 -0
  187. package/dist/src/cli/stable-json.d.ts.map +1 -0
  188. package/dist/src/cli/stable-json.js +35 -0
  189. package/dist/src/cli/stable-json.js.map +10 -0
  190. package/dist/src/cli/strings.d.ts +3 -0
  191. package/dist/src/cli/strings.d.ts.map +1 -0
  192. package/dist/src/cli/strings.js +16 -0
  193. package/dist/src/cli/strings.js.map +10 -0
  194. package/dist/src/cli/types.d.ts +53 -0
  195. package/dist/src/cli/types.d.ts.map +1 -0
  196. package/dist/src/cli/types.js +9 -0
  197. package/dist/src/cli/types.js.map +10 -0
  198. package/package.json +31 -4
  199. package/src/ai/tools.ts +211 -0
  200. package/src/cli/main.ts +3 -2
  201. package/src/cli/runtime/body.ts +3 -3
  202. package/src/cli/runtime/compat.ts +89 -0
  203. package/src/cli/runtime/execute.ts +98 -39
  204. package/src/cli/runtime/generated.ts +111 -4
  205. package/src/cli/runtime/profile/secrets.ts +42 -1
  206. package/src/cli/runtime/profile/store.ts +15 -13
  207. package/src/cli/runtime/request.ts +12 -4
  208. package/src/cli/spec-loader.ts +2 -2
@@ -0,0 +1,146 @@
1
+ // src/cli/derive-name.ts
2
+ var RESERVED_NAMES = [
3
+ "exec",
4
+ "compile",
5
+ "profile",
6
+ "auth",
7
+ "help",
8
+ "version"
9
+ ];
10
+ async function deriveBinaryName(spec) {
11
+ try {
12
+ const text = await loadSpecText(spec);
13
+ const doc = parseSpec(text);
14
+ const title = doc?.info?.title;
15
+ if (title && typeof title === "string") {
16
+ const name = sanitizeName(title);
17
+ if (name)
18
+ return name;
19
+ }
20
+ } catch {}
21
+ if (/^https?:\/\//i.test(spec)) {
22
+ try {
23
+ const url = new URL(spec);
24
+ const hostParts = url.hostname.split(".");
25
+ const meaningful = hostParts.find((p) => p !== "www" && p !== "api" && p.length > 2);
26
+ if (meaningful) {
27
+ const name = sanitizeName(meaningful);
28
+ if (name)
29
+ return name;
30
+ }
31
+ } catch {}
32
+ }
33
+ return "specli";
34
+ }
35
+ async function loadSpecText(spec) {
36
+ if (/^https?:\/\//i.test(spec)) {
37
+ const res = await fetch(spec);
38
+ if (!res.ok)
39
+ throw new Error(`Failed to fetch: ${res.status}`);
40
+ return res.text();
41
+ }
42
+ return Bun.file(spec).text();
43
+ }
44
+ function parseSpec(text) {
45
+ try {
46
+ const trimmed = text.trimStart();
47
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
48
+ return JSON.parse(text);
49
+ }
50
+ const { YAML } = globalThis.Bun ?? {};
51
+ if (YAML?.parse) {
52
+ return YAML.parse(text);
53
+ }
54
+ return null;
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+ function sanitizeName(input) {
60
+ let name = input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32);
61
+ if (RESERVED_NAMES.includes(name)) {
62
+ name = `${name}-cli`;
63
+ }
64
+ return name;
65
+ }
66
+
67
+ // src/cli/compile.ts
68
+ function parseKeyValue(input) {
69
+ const idx = input.indexOf("=");
70
+ if (idx === -1)
71
+ throw new Error(`Invalid --define '${input}', expected key=value`);
72
+ const key = input.slice(0, idx).trim();
73
+ const value = input.slice(idx + 1).trim();
74
+ if (!key)
75
+ throw new Error(`Invalid --define '${input}', missing key`);
76
+ return { key, value };
77
+ }
78
+ async function compileCommand(spec, options) {
79
+ const name = options.name ?? await deriveBinaryName(spec);
80
+ const outfile = options.outfile ?? `./dist/${name}`;
81
+ const target = options.target ? options.target : `bun-${process.platform}-${process.arch}`;
82
+ const define = {};
83
+ if (options.define) {
84
+ for (const pair of options.define) {
85
+ const { key, value } = parseKeyValue(pair);
86
+ define[key] = JSON.stringify(value);
87
+ }
88
+ }
89
+ const buildArgs = [
90
+ "build",
91
+ "--compile",
92
+ `--outfile=${outfile}`,
93
+ `--target=${target}`
94
+ ];
95
+ if (options.minify)
96
+ buildArgs.push("--minify");
97
+ if (options.bytecode)
98
+ buildArgs.push("--bytecode");
99
+ for (const [k, v] of Object.entries(define)) {
100
+ buildArgs.push("--define", `${k}=${v}`);
101
+ }
102
+ if (options.dotenv === false)
103
+ buildArgs.push("--no-compile-autoload-dotenv");
104
+ if (options.bunfig === false)
105
+ buildArgs.push("--no-compile-autoload-bunfig");
106
+ buildArgs.push("./src/compiled.ts");
107
+ const buildEnv = {
108
+ ...process.env,
109
+ SPECLI_SPEC: spec,
110
+ SPECLI_NAME: name
111
+ };
112
+ if (options.server)
113
+ buildEnv.SPECLI_SERVER = options.server;
114
+ if (options.serverVar?.length)
115
+ buildEnv.SPECLI_SERVER_VARS = options.serverVar.join(",");
116
+ if (options.auth)
117
+ buildEnv.SPECLI_AUTH = options.auth;
118
+ const proc = Bun.spawn({
119
+ cmd: ["bun", ...buildArgs],
120
+ stdout: "pipe",
121
+ stderr: "pipe",
122
+ env: buildEnv
123
+ });
124
+ const output = await new Response(proc.stdout).text();
125
+ const error = await new Response(proc.stderr).text();
126
+ const code = await proc.exited;
127
+ if (output)
128
+ process.stdout.write(output);
129
+ if (error)
130
+ process.stderr.write(error);
131
+ if (code !== 0) {
132
+ process.exitCode = code;
133
+ return;
134
+ }
135
+ process.stdout.write(`ok: built ${outfile}
136
+ `);
137
+ process.stdout.write(`target: ${target}
138
+ `);
139
+ process.stdout.write(`name: ${name}
140
+ `);
141
+ }
142
+ export {
143
+ compileCommand
144
+ };
145
+
146
+ //# debugId=5EE8B1A40E17B63264756E2164756E21
@@ -0,0 +1,11 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/derive-name.ts", "../../../src/cli/compile.ts"],
4
+ "sourcesContent": [
5
+ "const RESERVED_NAMES = [\n\t\"exec\",\n\t\"compile\",\n\t\"profile\",\n\t\"auth\",\n\t\"help\",\n\t\"version\",\n];\n\n/**\n * Derives a clean binary name from an OpenAPI spec.\n * Priority:\n * 1. info.title (kebab-cased, sanitized)\n * 2. Host from spec URL (if URL provided)\n * 3. Fallback to \"specli\"\n */\nexport async function deriveBinaryName(spec: string): Promise<string> {\n\ttry {\n\t\t// Load spec to extract title\n\t\tconst text = await loadSpecText(spec);\n\t\tconst doc = parseSpec(text);\n\n\t\tconst title = doc?.info?.title;\n\t\tif (title && typeof title === \"string\") {\n\t\t\tconst name = sanitizeName(title);\n\t\t\tif (name) return name;\n\t\t}\n\t} catch {\n\t\t// Fall through to URL-based derivation\n\t}\n\n\t// Try to derive from URL host\n\tif (/^https?:\\/\\//i.test(spec)) {\n\t\ttry {\n\t\t\tconst url = new URL(spec);\n\t\t\tconst hostParts = url.hostname.split(\".\");\n\t\t\t// Use first meaningful segment (skip www, api prefixes)\n\t\t\tconst meaningful = hostParts.find(\n\t\t\t\t(p) => p !== \"www\" && p !== \"api\" && p.length > 2,\n\t\t\t);\n\t\t\tif (meaningful) {\n\t\t\t\tconst name = sanitizeName(meaningful);\n\t\t\t\tif (name) return name;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid URL, fall through\n\t\t}\n\t}\n\n\t// Fallback\n\treturn \"specli\";\n}\n\nasync function loadSpecText(spec: string): Promise<string> {\n\tif (/^https?:\\/\\//i.test(spec)) {\n\t\tconst res = await fetch(spec);\n\t\tif (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);\n\t\treturn res.text();\n\t}\n\treturn Bun.file(spec).text();\n}\n\nfunction parseSpec(text: string): { info?: { title?: string } } | null {\n\ttry {\n\t\tconst trimmed = text.trimStart();\n\t\tif (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n\t\t\treturn JSON.parse(text);\n\t\t}\n\t\t// Use Bun's YAML parser\n\t\tconst { YAML } = globalThis.Bun ?? {};\n\t\tif (YAML?.parse) {\n\t\t\treturn YAML.parse(text) as { info?: { title?: string } };\n\t\t}\n\t\t// Fallback: only JSON supported\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Convert title to valid binary name:\n * - kebab-case\n * - lowercase\n * - remove invalid chars\n * - max 32 chars\n * - avoid reserved names\n */\nfunction sanitizeName(input: string): string {\n\tlet name = input\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\") // Replace non-alphanumeric with dash\n\t\t.replace(/^-+|-+$/g, \"\") // Trim leading/trailing dashes\n\t\t.slice(0, 32); // Limit length\n\n\tif (RESERVED_NAMES.includes(name)) {\n\t\tname = `${name}-cli`;\n\t}\n\n\treturn name;\n}\n",
6
+ "import { deriveBinaryName } from \"./derive-name.ts\";\n\nexport type CompileOptions = {\n\tname?: string;\n\toutfile?: string;\n\ttarget?: string;\n\tminify?: boolean;\n\tbytecode?: boolean;\n\tdotenv?: boolean; // --no-dotenv sets this to false\n\tbunfig?: boolean; // --no-bunfig sets this to false\n\tdefine?: string[];\n\tserver?: string;\n\tserverVar?: string[];\n\tauth?: string;\n};\n\nfunction parseKeyValue(input: string): { key: string; value: string } {\n\tconst idx = input.indexOf(\"=\");\n\tif (idx === -1)\n\t\tthrow new Error(`Invalid --define '${input}', expected key=value`);\n\tconst key = input.slice(0, idx).trim();\n\tconst value = input.slice(idx + 1).trim();\n\tif (!key) throw new Error(`Invalid --define '${input}', missing key`);\n\treturn { key, value };\n}\n\nexport async function compileCommand(\n\tspec: string,\n\toptions: CompileOptions,\n): Promise<void> {\n\t// Derive name from spec if not provided\n\tconst name = options.name ?? (await deriveBinaryName(spec));\n\tconst outfile = options.outfile ?? `./dist/${name}`;\n\n\tconst target = options.target\n\t\t? (options.target as Bun.Build.Target)\n\t\t: (`bun-${process.platform}-${process.arch}` as Bun.Build.Target);\n\n\t// Parse --define pairs\n\tconst define: Record<string, string> = {};\n\tif (options.define) {\n\t\tfor (const pair of options.define) {\n\t\t\tconst { key, value } = parseKeyValue(pair);\n\t\t\tdefine[key] = JSON.stringify(value);\n\t\t}\n\t}\n\n\t// Build command args\n\tconst buildArgs = [\n\t\t\"build\",\n\t\t\"--compile\",\n\t\t`--outfile=${outfile}`,\n\t\t`--target=${target}`,\n\t];\n\n\tif (options.minify) buildArgs.push(\"--minify\");\n\tif (options.bytecode) buildArgs.push(\"--bytecode\");\n\n\tfor (const [k, v] of Object.entries(define)) {\n\t\tbuildArgs.push(\"--define\", `${k}=${v}`);\n\t}\n\n\tif (options.dotenv === false) buildArgs.push(\"--no-compile-autoload-dotenv\");\n\tif (options.bunfig === false) buildArgs.push(\"--no-compile-autoload-bunfig\");\n\n\tbuildArgs.push(\"./src/compiled.ts\");\n\n\t// Only set env vars that have actual values - avoid empty strings\n\t// because the macros will embed them and they will override defaults.\n\tconst buildEnv: Record<string, string> = {\n\t\t...process.env,\n\t\tSPECLI_SPEC: spec,\n\t\tSPECLI_NAME: name,\n\t};\n\tif (options.server) buildEnv.SPECLI_SERVER = options.server;\n\tif (options.serverVar?.length)\n\t\tbuildEnv.SPECLI_SERVER_VARS = options.serverVar.join(\",\");\n\tif (options.auth) buildEnv.SPECLI_AUTH = options.auth;\n\n\tconst proc = Bun.spawn({\n\t\tcmd: [\"bun\", ...buildArgs],\n\t\tstdout: \"pipe\",\n\t\tstderr: \"pipe\",\n\t\tenv: buildEnv,\n\t});\n\n\tconst output = await new Response(proc.stdout).text();\n\tconst error = await new Response(proc.stderr).text();\n\tconst code = await proc.exited;\n\n\tif (output) process.stdout.write(output);\n\tif (error) process.stderr.write(error);\n\tif (code !== 0) {\n\t\tprocess.exitCode = code;\n\t\treturn;\n\t}\n\n\tprocess.stdout.write(`ok: built ${outfile}\\n`);\n\tprocess.stdout.write(`target: ${target}\\n`);\n\tprocess.stdout.write(`name: ${name}\\n`);\n}\n"
7
+ ],
8
+ "mappings": "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",
9
+ "debugId": "5EE8B1A40E17B63264756E2164756E21",
10
+ "names": []
11
+ }
@@ -0,0 +1,2 @@
1
+ export declare function sha256Hex(text: string): Promise<string>;
2
+ //# sourceMappingURL=crypto.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../../src/cli/crypto.ts"],"names":[],"mappings":"AAAA,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAQ7D"}
@@ -0,0 +1,15 @@
1
+ // src/cli/crypto.ts
2
+ async function sha256Hex(text) {
3
+ const data = new TextEncoder().encode(text);
4
+ const hash = await crypto.subtle.digest("SHA-256", data);
5
+ const bytes = new Uint8Array(hash);
6
+ let out = "";
7
+ for (const b of bytes)
8
+ out += b.toString(16).padStart(2, "0");
9
+ return out;
10
+ }
11
+ export {
12
+ sha256Hex
13
+ };
14
+
15
+ //# debugId=6F90DD47CAD845AA64756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/crypto.ts"],
4
+ "sourcesContent": [
5
+ "export async function sha256Hex(text: string): Promise<string> {\n\tconst data = new TextEncoder().encode(text);\n\tconst hash = await crypto.subtle.digest(\"SHA-256\", data);\n\tconst bytes = new Uint8Array(hash);\n\n\tlet out = \"\";\n\tfor (const b of bytes) out += b.toString(16).padStart(2, \"0\");\n\treturn out;\n}\n"
6
+ ],
7
+ "mappings": ";AAAA,eAAsB,SAAS,CAAC,MAA+B;AAAA,EAC9D,MAAM,OAAO,IAAI,YAAY,EAAE,OAAO,IAAI;AAAA,EAC1C,MAAM,OAAO,MAAM,OAAO,OAAO,OAAO,WAAW,IAAI;AAAA,EACvD,MAAM,QAAQ,IAAI,WAAW,IAAI;AAAA,EAEjC,IAAI,MAAM;AAAA,EACV,WAAW,KAAK;AAAA,IAAO,OAAO,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAC5D,OAAO;AAAA;",
8
+ "debugId": "6F90DD47CAD845AA64756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Derives a clean binary name from an OpenAPI spec.
3
+ * Priority:
4
+ * 1. info.title (kebab-cased, sanitized)
5
+ * 2. Host from spec URL (if URL provided)
6
+ * 3. Fallback to "specli"
7
+ */
8
+ export declare function deriveBinaryName(spec: string): Promise<string>;
9
+ //# sourceMappingURL=derive-name.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"derive-name.d.ts","sourceRoot":"","sources":["../../../src/cli/derive-name.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAmCpE"}
@@ -0,0 +1,70 @@
1
+ // src/cli/derive-name.ts
2
+ var RESERVED_NAMES = [
3
+ "exec",
4
+ "compile",
5
+ "profile",
6
+ "auth",
7
+ "help",
8
+ "version"
9
+ ];
10
+ async function deriveBinaryName(spec) {
11
+ try {
12
+ const text = await loadSpecText(spec);
13
+ const doc = parseSpec(text);
14
+ const title = doc?.info?.title;
15
+ if (title && typeof title === "string") {
16
+ const name = sanitizeName(title);
17
+ if (name)
18
+ return name;
19
+ }
20
+ } catch {}
21
+ if (/^https?:\/\//i.test(spec)) {
22
+ try {
23
+ const url = new URL(spec);
24
+ const hostParts = url.hostname.split(".");
25
+ const meaningful = hostParts.find((p) => p !== "www" && p !== "api" && p.length > 2);
26
+ if (meaningful) {
27
+ const name = sanitizeName(meaningful);
28
+ if (name)
29
+ return name;
30
+ }
31
+ } catch {}
32
+ }
33
+ return "specli";
34
+ }
35
+ async function loadSpecText(spec) {
36
+ if (/^https?:\/\//i.test(spec)) {
37
+ const res = await fetch(spec);
38
+ if (!res.ok)
39
+ throw new Error(`Failed to fetch: ${res.status}`);
40
+ return res.text();
41
+ }
42
+ return Bun.file(spec).text();
43
+ }
44
+ function parseSpec(text) {
45
+ try {
46
+ const trimmed = text.trimStart();
47
+ if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
48
+ return JSON.parse(text);
49
+ }
50
+ const { YAML } = globalThis.Bun ?? {};
51
+ if (YAML?.parse) {
52
+ return YAML.parse(text);
53
+ }
54
+ return null;
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+ function sanitizeName(input) {
60
+ let name = input.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "").slice(0, 32);
61
+ if (RESERVED_NAMES.includes(name)) {
62
+ name = `${name}-cli`;
63
+ }
64
+ return name;
65
+ }
66
+ export {
67
+ deriveBinaryName
68
+ };
69
+
70
+ //# debugId=F4781C13C9B8E3C664756E2164756E21
@@ -0,0 +1,10 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../src/cli/derive-name.ts"],
4
+ "sourcesContent": [
5
+ "const RESERVED_NAMES = [\n\t\"exec\",\n\t\"compile\",\n\t\"profile\",\n\t\"auth\",\n\t\"help\",\n\t\"version\",\n];\n\n/**\n * Derives a clean binary name from an OpenAPI spec.\n * Priority:\n * 1. info.title (kebab-cased, sanitized)\n * 2. Host from spec URL (if URL provided)\n * 3. Fallback to \"specli\"\n */\nexport async function deriveBinaryName(spec: string): Promise<string> {\n\ttry {\n\t\t// Load spec to extract title\n\t\tconst text = await loadSpecText(spec);\n\t\tconst doc = parseSpec(text);\n\n\t\tconst title = doc?.info?.title;\n\t\tif (title && typeof title === \"string\") {\n\t\t\tconst name = sanitizeName(title);\n\t\t\tif (name) return name;\n\t\t}\n\t} catch {\n\t\t// Fall through to URL-based derivation\n\t}\n\n\t// Try to derive from URL host\n\tif (/^https?:\\/\\//i.test(spec)) {\n\t\ttry {\n\t\t\tconst url = new URL(spec);\n\t\t\tconst hostParts = url.hostname.split(\".\");\n\t\t\t// Use first meaningful segment (skip www, api prefixes)\n\t\t\tconst meaningful = hostParts.find(\n\t\t\t\t(p) => p !== \"www\" && p !== \"api\" && p.length > 2,\n\t\t\t);\n\t\t\tif (meaningful) {\n\t\t\t\tconst name = sanitizeName(meaningful);\n\t\t\t\tif (name) return name;\n\t\t\t}\n\t\t} catch {\n\t\t\t// Invalid URL, fall through\n\t\t}\n\t}\n\n\t// Fallback\n\treturn \"specli\";\n}\n\nasync function loadSpecText(spec: string): Promise<string> {\n\tif (/^https?:\\/\\//i.test(spec)) {\n\t\tconst res = await fetch(spec);\n\t\tif (!res.ok) throw new Error(`Failed to fetch: ${res.status}`);\n\t\treturn res.text();\n\t}\n\treturn Bun.file(spec).text();\n}\n\nfunction parseSpec(text: string): { info?: { title?: string } } | null {\n\ttry {\n\t\tconst trimmed = text.trimStart();\n\t\tif (trimmed.startsWith(\"{\") || trimmed.startsWith(\"[\")) {\n\t\t\treturn JSON.parse(text);\n\t\t}\n\t\t// Use Bun's YAML parser\n\t\tconst { YAML } = globalThis.Bun ?? {};\n\t\tif (YAML?.parse) {\n\t\t\treturn YAML.parse(text) as { info?: { title?: string } };\n\t\t}\n\t\t// Fallback: only JSON supported\n\t\treturn null;\n\t} catch {\n\t\treturn null;\n\t}\n}\n\n/**\n * Convert title to valid binary name:\n * - kebab-case\n * - lowercase\n * - remove invalid chars\n * - max 32 chars\n * - avoid reserved names\n */\nfunction sanitizeName(input: string): string {\n\tlet name = input\n\t\t.toLowerCase()\n\t\t.replace(/[^a-z0-9]+/g, \"-\") // Replace non-alphanumeric with dash\n\t\t.replace(/^-+|-+$/g, \"\") // Trim leading/trailing dashes\n\t\t.slice(0, 32); // Limit length\n\n\tif (RESERVED_NAMES.includes(name)) {\n\t\tname = `${name}-cli`;\n\t}\n\n\treturn name;\n}\n"
6
+ ],
7
+ "mappings": ";AAAA,IAAM,iBAAiB;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACD;AASA,eAAsB,gBAAgB,CAAC,MAA+B;AAAA,EACrE,IAAI;AAAA,IAEH,MAAM,OAAO,MAAM,aAAa,IAAI;AAAA,IACpC,MAAM,MAAM,UAAU,IAAI;AAAA,IAE1B,MAAM,QAAQ,KAAK,MAAM;AAAA,IACzB,IAAI,SAAS,OAAO,UAAU,UAAU;AAAA,MACvC,MAAM,OAAO,aAAa,KAAK;AAAA,MAC/B,IAAI;AAAA,QAAM,OAAO;AAAA,IAClB;AAAA,IACC,MAAM;AAAA,EAKR,IAAI,gBAAgB,KAAK,IAAI,GAAG;AAAA,IAC/B,IAAI;AAAA,MACH,MAAM,MAAM,IAAI,IAAI,IAAI;AAAA,MACxB,MAAM,YAAY,IAAI,SAAS,MAAM,GAAG;AAAA,MAExC,MAAM,aAAa,UAAU,KAC5B,CAAC,MAAM,MAAM,SAAS,MAAM,SAAS,EAAE,SAAS,CACjD;AAAA,MACA,IAAI,YAAY;AAAA,QACf,MAAM,OAAO,aAAa,UAAU;AAAA,QACpC,IAAI;AAAA,UAAM,OAAO;AAAA,MAClB;AAAA,MACC,MAAM;AAAA,EAGT;AAAA,EAGA,OAAO;AAAA;AAGR,eAAe,YAAY,CAAC,MAA+B;AAAA,EAC1D,IAAI,gBAAgB,KAAK,IAAI,GAAG;AAAA,IAC/B,MAAM,MAAM,MAAM,MAAM,IAAI;AAAA,IAC5B,IAAI,CAAC,IAAI;AAAA,MAAI,MAAM,IAAI,MAAM,oBAAoB,IAAI,QAAQ;AAAA,IAC7D,OAAO,IAAI,KAAK;AAAA,EACjB;AAAA,EACA,OAAO,IAAI,KAAK,IAAI,EAAE,KAAK;AAAA;AAG5B,SAAS,SAAS,CAAC,MAAoD;AAAA,EACtE,IAAI;AAAA,IACH,MAAM,UAAU,KAAK,UAAU;AAAA,IAC/B,IAAI,QAAQ,WAAW,GAAG,KAAK,QAAQ,WAAW,GAAG,GAAG;AAAA,MACvD,OAAO,KAAK,MAAM,IAAI;AAAA,IACvB;AAAA,IAEA,QAAQ,SAAS,WAAW,OAAO,CAAC;AAAA,IACpC,IAAI,MAAM,OAAO;AAAA,MAChB,OAAO,KAAK,MAAM,IAAI;AAAA,IACvB;AAAA,IAEA,OAAO;AAAA,IACN,MAAM;AAAA,IACP,OAAO;AAAA;AAAA;AAYT,SAAS,YAAY,CAAC,OAAuB;AAAA,EAC5C,IAAI,OAAO,MACT,YAAY,EACZ,QAAQ,eAAe,GAAG,EAC1B,QAAQ,YAAY,EAAE,EACtB,MAAM,GAAG,EAAE;AAAA,EAEb,IAAI,eAAe,SAAS,IAAI,GAAG;AAAA,IAClC,OAAO,GAAG;AAAA,EACX;AAAA,EAEA,OAAO;AAAA;",
8
+ "debugId": "F4781C13C9B8E3C664756E2164756E21",
9
+ "names": []
10
+ }
@@ -0,0 +1,14 @@
1
+ export type ExecOptions = {
2
+ server?: string;
3
+ serverVar?: string[];
4
+ auth?: string;
5
+ bearerToken?: string;
6
+ oauthToken?: string;
7
+ username?: string;
8
+ password?: string;
9
+ apiKey?: string;
10
+ profile?: string;
11
+ json?: boolean;
12
+ };
13
+ export declare function execCommand(spec: string, options: ExecOptions, commandArgs: string[]): Promise<void>;
14
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../../src/cli/exec.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,WAAW,GAAG;IACzB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,OAAO,CAAC;CACf,CAAC;AAEF,wBAAsB,WAAW,CAChC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,WAAW,EACpB,WAAW,EAAE,MAAM,EAAE,GACnB,OAAO,CAAC,IAAI,CAAC,CAoDf"}