@nocobase/cli 2.1.0-beta.9 → 2.2.0-alpha.1

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 (263) hide show
  1. package/assets/env-proxy/nginx/app.conf.tpl +23 -0
  2. package/assets/env-proxy/nginx/nocobase.conf.tpl +5 -0
  3. package/assets/env-proxy/nginx/snippets/dist-location.conf +5 -0
  4. package/assets/env-proxy/nginx/snippets/gzip.conf +17 -0
  5. package/assets/env-proxy/nginx/snippets/log-format-http.conf +13 -0
  6. package/assets/env-proxy/nginx/snippets/maps-http.conf +14 -0
  7. package/assets/env-proxy/nginx/snippets/mime-types.conf +98 -0
  8. package/assets/env-proxy/nginx/snippets/proxy-location.conf +17 -0
  9. package/assets/env-proxy/nginx/snippets/spa-location.conf +6 -0
  10. package/assets/env-proxy/nginx/snippets/uploads-location.conf +21 -0
  11. package/bin/run.cmd +3 -0
  12. package/bin/run.js +145 -0
  13. package/bin/session-env.js +39 -0
  14. package/dist/commands/api/resource/create.js +15 -0
  15. package/dist/commands/api/resource/destroy.js +15 -0
  16. package/dist/commands/api/resource/get.js +15 -0
  17. package/dist/commands/api/resource/index.js +20 -0
  18. package/dist/commands/api/resource/list.js +16 -0
  19. package/dist/commands/api/resource/query.js +15 -0
  20. package/dist/commands/api/resource/update.js +15 -0
  21. package/dist/commands/app/autostart/disable.js +55 -0
  22. package/dist/commands/app/autostart/enable.js +55 -0
  23. package/dist/commands/app/autostart/list.js +37 -0
  24. package/dist/commands/app/autostart/run.js +84 -0
  25. package/dist/commands/app/autostart/shared.js +49 -0
  26. package/dist/commands/app/destroy.js +234 -0
  27. package/dist/commands/app/down.js +71 -0
  28. package/dist/commands/app/logs.js +115 -0
  29. package/dist/commands/app/restart.js +229 -0
  30. package/dist/commands/app/shared.js +123 -0
  31. package/dist/commands/app/start.js +416 -0
  32. package/dist/commands/app/stop.js +183 -0
  33. package/dist/commands/app/upgrade.js +523 -0
  34. package/dist/commands/backup/create.js +147 -0
  35. package/dist/commands/backup/index.js +20 -0
  36. package/dist/commands/backup/restore.js +105 -0
  37. package/{src/cli.js → dist/commands/build.js} +4 -11
  38. package/dist/commands/config/delete.js +42 -0
  39. package/dist/commands/config/get.js +39 -0
  40. package/dist/commands/config/index.js +20 -0
  41. package/dist/commands/config/list.js +29 -0
  42. package/dist/commands/config/set.js +49 -0
  43. package/dist/commands/db/check.js +240 -0
  44. package/dist/commands/db/logs.js +85 -0
  45. package/dist/commands/db/ps.js +47 -0
  46. package/dist/commands/db/shared.js +96 -0
  47. package/dist/commands/db/start.js +86 -0
  48. package/dist/commands/db/stop.js +71 -0
  49. package/{templates/plugin/src/client/models/index.ts → dist/commands/dev.js} +4 -4
  50. package/{src/commands/locale/react-js-cron/index.js → dist/commands/down.js} +3 -8
  51. package/dist/commands/download.js +13 -0
  52. package/dist/commands/env/add.js +406 -0
  53. package/dist/commands/env/auth.js +189 -0
  54. package/dist/commands/env/current.js +21 -0
  55. package/dist/commands/env/info.js +202 -0
  56. package/dist/commands/env/list.js +43 -0
  57. package/dist/commands/env/remove.js +174 -0
  58. package/dist/commands/env/shared.js +204 -0
  59. package/dist/commands/env/status.js +93 -0
  60. package/dist/commands/env/update.js +448 -0
  61. package/dist/commands/env/use.js +38 -0
  62. package/dist/commands/examples/prompts-stages.js +150 -0
  63. package/dist/commands/examples/prompts-test.js +181 -0
  64. package/dist/commands/init.js +1390 -0
  65. package/dist/commands/install.js +2609 -0
  66. package/dist/commands/license/activate.js +179 -0
  67. package/dist/commands/license/env.js +94 -0
  68. package/dist/commands/license/generate-id.js +108 -0
  69. package/dist/commands/license/id.js +70 -0
  70. package/dist/commands/license/index.js +20 -0
  71. package/dist/commands/license/plugins/clean.js +115 -0
  72. package/dist/commands/license/plugins/index.js +20 -0
  73. package/dist/commands/license/plugins/list.js +64 -0
  74. package/dist/commands/license/plugins/shared.js +382 -0
  75. package/dist/commands/license/plugins/sync.js +314 -0
  76. package/dist/commands/license/shared.js +423 -0
  77. package/dist/commands/license/status.js +64 -0
  78. package/dist/commands/logs.js +12 -0
  79. package/dist/commands/plugin/disable.js +86 -0
  80. package/dist/commands/plugin/enable.js +86 -0
  81. package/dist/commands/plugin/import.js +108 -0
  82. package/dist/commands/plugin/list.js +82 -0
  83. package/dist/commands/pm/disable.js +12 -0
  84. package/dist/commands/pm/enable.js +12 -0
  85. package/dist/commands/pm/list.js +12 -0
  86. package/dist/commands/proxy/caddy/current.js +17 -0
  87. package/dist/commands/proxy/caddy/generate.js +69 -0
  88. package/dist/commands/proxy/caddy/index.js +28 -0
  89. package/dist/commands/proxy/caddy/info.js +31 -0
  90. package/dist/commands/proxy/caddy/reload.js +30 -0
  91. package/dist/commands/proxy/caddy/restart.js +28 -0
  92. package/dist/commands/proxy/caddy/start.js +30 -0
  93. package/dist/commands/proxy/caddy/status.js +19 -0
  94. package/dist/commands/proxy/caddy/stop.js +30 -0
  95. package/dist/commands/proxy/caddy/use.js +26 -0
  96. package/dist/commands/proxy/index.js +28 -0
  97. package/dist/commands/proxy/nginx/current.js +18 -0
  98. package/dist/commands/proxy/nginx/generate.js +68 -0
  99. package/dist/commands/proxy/nginx/index.js +28 -0
  100. package/dist/commands/proxy/nginx/info.js +34 -0
  101. package/dist/commands/proxy/nginx/reload.js +30 -0
  102. package/dist/commands/proxy/nginx/restart.js +28 -0
  103. package/dist/commands/proxy/nginx/start.js +30 -0
  104. package/dist/commands/proxy/nginx/status.js +19 -0
  105. package/dist/commands/proxy/nginx/stop.js +30 -0
  106. package/dist/commands/proxy/nginx/use.js +31 -0
  107. package/dist/commands/restart.js +12 -0
  108. package/dist/commands/revision/create.js +118 -0
  109. package/dist/commands/scaffold/migration.js +38 -0
  110. package/dist/commands/scaffold/plugin.js +37 -0
  111. package/dist/commands/self/check.js +71 -0
  112. package/dist/commands/self/index.js +20 -0
  113. package/dist/commands/self/update.js +152 -0
  114. package/dist/commands/session/id.js +24 -0
  115. package/dist/commands/session/remove.js +57 -0
  116. package/dist/commands/session/setup.js +62 -0
  117. package/dist/commands/skills/check.js +69 -0
  118. package/dist/commands/skills/index.js +20 -0
  119. package/dist/commands/skills/install.js +80 -0
  120. package/dist/commands/skills/remove.js +80 -0
  121. package/dist/commands/skills/update.js +87 -0
  122. package/dist/commands/source/build.js +58 -0
  123. package/dist/commands/source/dev.js +182 -0
  124. package/dist/commands/source/download.js +884 -0
  125. package/dist/commands/source/publish.js +109 -0
  126. package/dist/commands/source/registry/logs.js +70 -0
  127. package/dist/commands/source/registry/start.js +57 -0
  128. package/dist/commands/source/registry/status.js +33 -0
  129. package/dist/commands/source/registry/stop.js +48 -0
  130. package/dist/commands/source/test.js +476 -0
  131. package/dist/commands/start.js +12 -0
  132. package/dist/commands/stop.js +12 -0
  133. package/dist/commands/test.js +12 -0
  134. package/dist/commands/upgrade.js +12 -0
  135. package/dist/commands/v1.js +210 -0
  136. package/dist/generated/command-registry.js +134 -0
  137. package/dist/help/runtime-help.js +23 -0
  138. package/dist/lib/api-client.js +335 -0
  139. package/dist/lib/api-command-compat.js +641 -0
  140. package/dist/lib/app-health.js +139 -0
  141. package/dist/lib/app-managed-resources.js +337 -0
  142. package/dist/lib/app-public-path.js +80 -0
  143. package/dist/lib/app-runtime.js +189 -0
  144. package/dist/lib/auth-store.js +528 -0
  145. package/dist/lib/backup.js +171 -0
  146. package/dist/lib/bootstrap.js +409 -0
  147. package/dist/lib/build-config.js +18 -0
  148. package/dist/lib/builtin-db.js +86 -0
  149. package/dist/lib/cli-config.js +569 -0
  150. package/dist/lib/cli-entry-error.js +52 -0
  151. package/dist/lib/cli-home.js +47 -0
  152. package/dist/lib/cli-locale.js +141 -0
  153. package/dist/lib/command-discovery.js +39 -0
  154. package/dist/lib/command-log.js +284 -0
  155. package/dist/lib/db-connection-check.js +219 -0
  156. package/dist/lib/docker-env-file.js +60 -0
  157. package/dist/lib/docker-image.js +37 -0
  158. package/dist/lib/docker-log-stream.js +45 -0
  159. package/dist/lib/env-auth.js +963 -0
  160. package/dist/lib/env-command-config.js +45 -0
  161. package/dist/lib/env-config.js +108 -0
  162. package/dist/lib/env-guard.js +61 -0
  163. package/dist/lib/env-paths.js +101 -0
  164. package/dist/lib/env-proxy.js +1325 -0
  165. package/dist/lib/generated-command.js +203 -0
  166. package/dist/lib/http-request.js +49 -0
  167. package/dist/lib/inquirer-theme.js +17 -0
  168. package/dist/lib/inquirer.js +243 -0
  169. package/dist/lib/managed-env-file.js +101 -0
  170. package/dist/lib/managed-init-env.js +32 -0
  171. package/dist/lib/naming.js +70 -0
  172. package/dist/lib/object-utils.js +76 -0
  173. package/dist/lib/openapi.js +62 -0
  174. package/dist/lib/plugin-import.js +279 -0
  175. package/dist/lib/plugin-storage.js +64 -0
  176. package/dist/lib/post-processors.js +23 -0
  177. package/dist/lib/prompt-catalog-core.js +186 -0
  178. package/dist/lib/prompt-catalog-terminal.js +374 -0
  179. package/{src/index.js → dist/lib/prompt-catalog.js} +2 -6
  180. package/dist/lib/prompt-validators.js +278 -0
  181. package/dist/lib/prompt-web-ui.js +2234 -0
  182. package/dist/lib/proxy-caddy.js +274 -0
  183. package/dist/lib/proxy-nginx.js +330 -0
  184. package/dist/lib/resource-command.js +357 -0
  185. package/dist/lib/resource-request.js +104 -0
  186. package/dist/lib/run-npm.js +429 -0
  187. package/dist/lib/runtime-env-vars.js +32 -0
  188. package/dist/lib/runtime-generator.js +498 -0
  189. package/dist/lib/runtime-store.js +56 -0
  190. package/dist/lib/self-manager.js +301 -0
  191. package/dist/lib/session-id.js +17 -0
  192. package/dist/lib/session-integration.js +703 -0
  193. package/dist/lib/session-store.js +118 -0
  194. package/dist/lib/skills-manager.js +438 -0
  195. package/dist/lib/source-publish.js +326 -0
  196. package/dist/lib/source-registry.js +188 -0
  197. package/dist/lib/startup-update.js +309 -0
  198. package/dist/lib/ui.js +159 -0
  199. package/dist/locale/en-US.json +526 -0
  200. package/dist/locale/zh-CN.json +526 -0
  201. package/dist/post-processors/data-modeling.js +84 -0
  202. package/dist/post-processors/data-source-manager.js +138 -0
  203. package/dist/post-processors/index.js +19 -0
  204. package/nocobase-ctl.config.json +388 -0
  205. package/package.json +128 -24
  206. package/scripts/build.mjs +34 -0
  207. package/scripts/clean.mjs +9 -0
  208. package/tsconfig.json +19 -0
  209. package/bin/index.js +0 -39
  210. package/nocobase.conf.tpl +0 -95
  211. package/src/commands/benchmark.js +0 -73
  212. package/src/commands/build.js +0 -49
  213. package/src/commands/clean.js +0 -30
  214. package/src/commands/client.js +0 -166
  215. package/src/commands/create-nginx-conf.js +0 -37
  216. package/src/commands/create-plugin.js +0 -33
  217. package/src/commands/dev.js +0 -200
  218. package/src/commands/doc.js +0 -76
  219. package/src/commands/e2e.js +0 -265
  220. package/src/commands/global.js +0 -43
  221. package/src/commands/index.js +0 -45
  222. package/src/commands/instance-id.js +0 -47
  223. package/src/commands/locale/cronstrue.js +0 -122
  224. package/src/commands/locale/react-js-cron/en-US.json +0 -75
  225. package/src/commands/locale/react-js-cron/zh-CN.json +0 -33
  226. package/src/commands/locale/react-js-cron/zh-TW.json +0 -33
  227. package/src/commands/locale.js +0 -81
  228. package/src/commands/p-test.js +0 -88
  229. package/src/commands/perf.js +0 -63
  230. package/src/commands/pkg.js +0 -321
  231. package/src/commands/pm2.js +0 -37
  232. package/src/commands/postinstall.js +0 -88
  233. package/src/commands/start.js +0 -148
  234. package/src/commands/tar.js +0 -36
  235. package/src/commands/test-coverage.js +0 -55
  236. package/src/commands/test.js +0 -107
  237. package/src/commands/umi.js +0 -33
  238. package/src/commands/update-deps.js +0 -72
  239. package/src/commands/upgrade.js +0 -47
  240. package/src/commands/view-license-key.js +0 -44
  241. package/src/license.js +0 -76
  242. package/src/logger.js +0 -75
  243. package/src/plugin-generator.js +0 -80
  244. package/src/util.js +0 -517
  245. package/templates/bundle-status.html +0 -338
  246. package/templates/create-app-package.json +0 -39
  247. package/templates/plugin/.npmignore.tpl +0 -2
  248. package/templates/plugin/README.md.tpl +0 -1
  249. package/templates/plugin/client.d.ts +0 -2
  250. package/templates/plugin/client.js +0 -1
  251. package/templates/plugin/package.json.tpl +0 -11
  252. package/templates/plugin/server.d.ts +0 -2
  253. package/templates/plugin/server.js +0 -1
  254. package/templates/plugin/src/client/client.d.ts +0 -249
  255. package/templates/plugin/src/client/index.tsx.tpl +0 -1
  256. package/templates/plugin/src/client/locale.ts +0 -21
  257. package/templates/plugin/src/client/plugin.tsx.tpl +0 -10
  258. package/templates/plugin/src/index.ts +0 -2
  259. package/templates/plugin/src/locale/en-US.json +0 -1
  260. package/templates/plugin/src/locale/zh-CN.json +0 -1
  261. package/templates/plugin/src/server/collections/.gitkeep +0 -0
  262. package/templates/plugin/src/server/index.ts.tpl +0 -1
  263. package/templates/plugin/src/server/plugin.ts.tpl +0 -19
@@ -0,0 +1,335 @@
1
+ /**
2
+ * This file is part of the NocoBase (R) project.
3
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
4
+ * Authors: NocoBase Team.
5
+ *
6
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
7
+ * For more information, please refer to: https://www.nocobase.com/agreement.
8
+ */
9
+ /**
10
+ * This file is part of the NocoBase (R) project.
11
+ * Copyright (c) 2020-2024 NocoBase Co., Ltd.
12
+ * Authors: NocoBase Team.
13
+ *
14
+ * This project is dual-licensed under AGPL-3.0 and NocoBase Commercial License.
15
+ * For more information, please refer to: https://www.nocobase.com/agreement.
16
+ */
17
+ import { createWriteStream } from 'node:fs';
18
+ import { promises as fs } from 'node:fs';
19
+ import { basename, dirname } from 'node:path';
20
+ import { Readable } from 'node:stream';
21
+ import { pipeline } from 'node:stream/promises';
22
+ import { resolveServerRequestTarget } from './env-auth.js';
23
+ import { fetchWithPreservedAuthRedirect } from './http-request.js';
24
+ const CLI_REQUEST_SOURCE_HEADER = 'x-request-source';
25
+ const CLI_REQUEST_SOURCE_VALUE = 'cli';
26
+ const CLI_VERSION_HEADER = 'x-nb-cli-version';
27
+ const SKILLS_VERSION_HEADER = 'x-nb-skills-version';
28
+ function stripUtf8Bom(text) {
29
+ return text.charCodeAt(0) === 0xfeff ? text.slice(1) : text;
30
+ }
31
+ function parseJsonInput(raw, flagName) {
32
+ const content = stripUtf8Bom(raw);
33
+ try {
34
+ return JSON.parse(content);
35
+ }
36
+ catch (error) {
37
+ throw new Error(`Invalid JSON for --${flagName}: ${error?.message ?? 'parse failed'}`);
38
+ }
39
+ }
40
+ function normalizeBaseUrl(baseUrl) {
41
+ return baseUrl.replace(/\/+$/, '');
42
+ }
43
+ async function parseResponse(response) {
44
+ const text = await response.text();
45
+ let data = text;
46
+ if (text) {
47
+ try {
48
+ data = JSON.parse(text);
49
+ }
50
+ catch (error) {
51
+ data = text;
52
+ }
53
+ }
54
+ return {
55
+ ok: response.ok,
56
+ status: response.status,
57
+ data,
58
+ };
59
+ }
60
+ async function parseBinaryResponse(response, outputPath) {
61
+ if (response.ok && response.body) {
62
+ await fs.mkdir(dirname(outputPath), { recursive: true }).catch(() => undefined);
63
+ await pipeline(Readable.fromWeb(response.body), createWriteStream(outputPath));
64
+ return {
65
+ ok: response.ok,
66
+ status: response.status,
67
+ data: {
68
+ output: outputPath,
69
+ },
70
+ };
71
+ }
72
+ return parseResponse(response);
73
+ }
74
+ function parseScalarValue(value, type) {
75
+ if (value === undefined) {
76
+ return undefined;
77
+ }
78
+ if (type === 'boolean') {
79
+ return value;
80
+ }
81
+ if (type === 'integer' || type === 'number') {
82
+ return Number(value);
83
+ }
84
+ if (typeof value !== 'string') {
85
+ return value;
86
+ }
87
+ const trimmed = value.trim();
88
+ if ((trimmed.startsWith('{') && trimmed.endsWith('}')) || (trimmed.startsWith('[') && trimmed.endsWith(']'))) {
89
+ try {
90
+ return JSON.parse(trimmed);
91
+ }
92
+ catch (error) {
93
+ return value;
94
+ }
95
+ }
96
+ return value;
97
+ }
98
+ function hasParameterValue(flags, parameter) {
99
+ const value = flags[parameter.flagName];
100
+ if (parameter.type === 'boolean') {
101
+ return value !== undefined;
102
+ }
103
+ if (Array.isArray(value)) {
104
+ return value.length > 0;
105
+ }
106
+ return value !== undefined && value !== '';
107
+ }
108
+ function listProvidedBodyFlags(flags, parameters) {
109
+ return parameters
110
+ .filter((parameter) => hasParameterValue(flags, parameter))
111
+ .map((parameter) => `--${parameter.flagName}`);
112
+ }
113
+ function parseBodyFieldValue(rawValue, parameter) {
114
+ if (rawValue === undefined) {
115
+ return undefined;
116
+ }
117
+ if (parameter.isArray && !parameter.jsonEncoded) {
118
+ return Array.isArray(rawValue) ? rawValue : rawValue ? [rawValue] : undefined;
119
+ }
120
+ if (parameter.jsonEncoded || parameter.type === 'object' || parameter.type === 'array') {
121
+ if (typeof rawValue !== 'string') {
122
+ return rawValue;
123
+ }
124
+ const parsed = parseJsonInput(rawValue, parameter.flagName);
125
+ if (parameter.type === 'array' && !Array.isArray(parsed)) {
126
+ throw new Error(`--${parameter.flagName} must be a JSON array`);
127
+ }
128
+ if (parameter.type === 'object' && (parsed === null || Array.isArray(parsed) || typeof parsed !== 'object')) {
129
+ throw new Error(`--${parameter.flagName} must be a JSON object`);
130
+ }
131
+ return parsed;
132
+ }
133
+ return parseScalarValue(rawValue, parameter.type);
134
+ }
135
+ export async function parseBody(flags, operation) {
136
+ if (operation.requestContentType === 'multipart/form-data') {
137
+ return undefined;
138
+ }
139
+ const inlineBody = flags.body;
140
+ const bodyFile = flags['body-file'];
141
+ const bodyParameters = operation.parameters.filter((parameter) => parameter.in === 'body');
142
+ const hasBodyFlags = bodyParameters.some((parameter) => hasParameterValue(flags, parameter));
143
+ if ((inlineBody || bodyFile) && hasBodyFlags) {
144
+ const providedBodyFlags = listProvidedBodyFlags(flags, bodyParameters);
145
+ const rawBodyInput = inlineBody ? '--body' : '--body-file';
146
+ throw new Error(`Conflicting request body inputs: received ${rawBodyInput} together with body field flags (${providedBodyFlags.join(', ')}). Use either body field flags or --body/--body-file.`);
147
+ }
148
+ if (inlineBody) {
149
+ return parseJsonInput(inlineBody, 'body');
150
+ }
151
+ if (bodyFile) {
152
+ return fs.readFile(bodyFile, 'utf8').then((content) => parseJsonInput(content, 'body-file'));
153
+ }
154
+ if (!bodyParameters.length) {
155
+ return undefined;
156
+ }
157
+ const body = {};
158
+ for (const parameter of bodyParameters) {
159
+ const rawValue = flags[parameter.flagName];
160
+ const value = parseBodyFieldValue(rawValue, parameter);
161
+ if (parameter.required && (value === undefined || value === '')) {
162
+ throw new Error(`Missing required body field --${parameter.flagName}`);
163
+ }
164
+ if (value === undefined) {
165
+ continue;
166
+ }
167
+ body[parameter.name] = value;
168
+ }
169
+ if (Object.keys(body).length > 0) {
170
+ return body;
171
+ }
172
+ if (operation.hasBody && operation.bodyRequired) {
173
+ throw new Error('Missing request body. Use body field flags or --body/--body-file.');
174
+ }
175
+ return undefined;
176
+ }
177
+ async function createMultipartBody(flags, operation) {
178
+ const bodyParameters = operation.parameters.filter((parameter) => parameter.in === 'body');
179
+ const formData = new FormData();
180
+ let hasValues = false;
181
+ for (const parameter of bodyParameters) {
182
+ const rawValue = flags[parameter.flagName];
183
+ const hasValue = hasParameterValue(flags, parameter);
184
+ if (parameter.required && !hasValue) {
185
+ throw new Error(`Missing required body field --${parameter.flagName}`);
186
+ }
187
+ if (!hasValue) {
188
+ continue;
189
+ }
190
+ if (parameter.isFile) {
191
+ const filePath = String(rawValue);
192
+ const content = await fs.readFile(filePath);
193
+ const arrayBuffer = content.buffer.slice(content.byteOffset, content.byteOffset + content.byteLength);
194
+ formData.append(parameter.name, new Blob([arrayBuffer]), basename(filePath));
195
+ hasValues = true;
196
+ continue;
197
+ }
198
+ const value = parseBodyFieldValue(rawValue, parameter);
199
+ if (value === undefined) {
200
+ continue;
201
+ }
202
+ formData.append(parameter.name, typeof value === 'object' ? JSON.stringify(value) : String(value));
203
+ hasValues = true;
204
+ }
205
+ if (!hasValues && operation.bodyRequired) {
206
+ throw new Error('Missing multipart request body.');
207
+ }
208
+ return hasValues ? formData : undefined;
209
+ }
210
+ export async function executeApiRequest(options) {
211
+ const { baseUrl, token } = await resolveServerRequestTarget(options);
212
+ const headers = new Headers();
213
+ headers.set(CLI_REQUEST_SOURCE_HEADER, CLI_REQUEST_SOURCE_VALUE);
214
+ headers.set(CLI_VERSION_HEADER, options.cliVersion);
215
+ if (options.skillsVersion) {
216
+ headers.set(SKILLS_VERSION_HEADER, options.skillsVersion);
217
+ }
218
+ if (token) {
219
+ headers.set('authorization', `Bearer ${token}`);
220
+ }
221
+ if (options.role) {
222
+ headers.set('x-role', options.role);
223
+ }
224
+ const query = new URLSearchParams();
225
+ let requestPath = options.operation.pathTemplate;
226
+ for (const parameter of options.operation.parameters) {
227
+ if (parameter.in === 'body') {
228
+ continue;
229
+ }
230
+ const rawValue = options.flags[parameter.flagName];
231
+ const value = parameter.isArray
232
+ ? (Array.isArray(rawValue) ? rawValue : rawValue ? [rawValue] : undefined)
233
+ : parseScalarValue(rawValue, parameter.type);
234
+ if (parameter.required && (value === undefined || value === '')) {
235
+ throw new Error(`Missing required parameter --${parameter.flagName}`);
236
+ }
237
+ if (value === undefined) {
238
+ continue;
239
+ }
240
+ if (parameter.in === 'path') {
241
+ requestPath = requestPath.replace(`{${parameter.name}}`, encodeURIComponent(String(value)));
242
+ continue;
243
+ }
244
+ if (parameter.in === 'query') {
245
+ if (Array.isArray(value)) {
246
+ value.forEach((item) => query.append(parameter.name, String(parseScalarValue(item, parameter.type))));
247
+ }
248
+ else if (typeof value === 'object') {
249
+ query.set(parameter.name, JSON.stringify(value));
250
+ }
251
+ else {
252
+ query.set(parameter.name, String(value));
253
+ }
254
+ continue;
255
+ }
256
+ if (parameter.in === 'header') {
257
+ headers.set(parameter.name, typeof value === 'object' ? JSON.stringify(value) : String(value));
258
+ continue;
259
+ }
260
+ }
261
+ const body = options.operation.requestContentType === 'multipart/form-data'
262
+ ? await createMultipartBody(options.flags, options.operation)
263
+ : await parseBody(options.flags, options.operation);
264
+ if (body !== undefined && options.operation.requestContentType !== 'multipart/form-data') {
265
+ headers.set('content-type', 'application/json');
266
+ }
267
+ const url = new URL(`${normalizeBaseUrl(baseUrl)}${requestPath}`);
268
+ query.forEach((value, key) => url.searchParams.append(key, value));
269
+ const response = await fetchWithPreservedAuthRedirect(url.toString(), {
270
+ method: options.operation.method.toUpperCase(),
271
+ headers,
272
+ body: body === undefined ? undefined : body instanceof FormData ? body : JSON.stringify(body),
273
+ });
274
+ if (options.operation.responseType === 'binary') {
275
+ const outputPath = options.flags.output;
276
+ if (!outputPath) {
277
+ throw new Error('Missing required output path --output');
278
+ }
279
+ return parseBinaryResponse(response, outputPath);
280
+ }
281
+ return parseResponse(response);
282
+ }
283
+ export async function executeRawApiRequest(options) {
284
+ const { baseUrl, token } = await resolveServerRequestTarget(options);
285
+ const headers = new Headers();
286
+ headers.set(CLI_REQUEST_SOURCE_HEADER, CLI_REQUEST_SOURCE_VALUE);
287
+ if (token) {
288
+ headers.set('authorization', `Bearer ${token}`);
289
+ }
290
+ if (options.role) {
291
+ headers.set('x-role', options.role);
292
+ }
293
+ for (const [name, value] of Object.entries(options.headers ?? {})) {
294
+ if (value === undefined || value === null || value === '') {
295
+ continue;
296
+ }
297
+ headers.set(name, typeof value === 'object' ? JSON.stringify(value) : String(value));
298
+ }
299
+ if (options.body !== undefined) {
300
+ headers.set('content-type', 'application/json');
301
+ }
302
+ const url = new URL(`${normalizeBaseUrl(baseUrl)}${options.path}`);
303
+ for (const [key, value] of Object.entries(options.query ?? {})) {
304
+ if (value === undefined) {
305
+ continue;
306
+ }
307
+ if (Array.isArray(value)) {
308
+ for (const item of value) {
309
+ url.searchParams.append(key, typeof item === 'object' ? JSON.stringify(item) : String(item));
310
+ }
311
+ continue;
312
+ }
313
+ url.searchParams.set(key, typeof value === 'object' ? JSON.stringify(value) : String(value));
314
+ }
315
+ const controller = options.timeoutMs && options.timeoutMs > 0 ? new AbortController() : undefined;
316
+ const timeout = controller
317
+ ? setTimeout(() => {
318
+ controller.abort();
319
+ }, options.timeoutMs)
320
+ : undefined;
321
+ try {
322
+ const response = await fetchWithPreservedAuthRedirect(url.toString(), {
323
+ method: options.method.toUpperCase(),
324
+ headers,
325
+ body: options.body === undefined ? undefined : JSON.stringify(options.body),
326
+ signal: controller?.signal,
327
+ });
328
+ return parseResponse(response);
329
+ }
330
+ finally {
331
+ if (timeout) {
332
+ clearTimeout(timeout);
333
+ }
334
+ }
335
+ }