@kubb/cli 5.14.6 → 5.15.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 (186) hide show
  1. package/bin/kubb.js +2 -1
  2. package/dist/{Telemetry-B5V_ufmv.cjs → Telemetry-B52pKz9i.cjs} +14 -118
  3. package/dist/Telemetry-B52pKz9i.cjs.map +1 -0
  4. package/dist/{Telemetry-DrnGartf.js → Telemetry-C7Qwy2s7.js} +12 -86
  5. package/dist/Telemetry-C7Qwy2s7.js.map +1 -0
  6. package/dist/{background-DlK0by5c.js → background-BJCuXYuB.js} +5 -6
  7. package/dist/{background-DlK0by5c.js.map → background-BJCuXYuB.js.map} +1 -1
  8. package/dist/{background-CdPT1eaq.cjs → background-CK2gQtTU.cjs} +5 -6
  9. package/dist/{background-CdPT1eaq.cjs.map → background-CK2gQtTU.cjs.map} +1 -1
  10. package/dist/{background-C6XHpEo7.js → background-D4mZCg-4.js} +1 -1
  11. package/dist/banner-BdTTDFkG.js +140 -0
  12. package/dist/banner-BdTTDFkG.js.map +1 -0
  13. package/dist/banner-wJFk-L-c.cjs +163 -0
  14. package/dist/banner-wJFk-L-c.cjs.map +1 -0
  15. package/dist/config-BL3HnFhb.js +1 -0
  16. package/dist/config-BWj9jBVj.cjs +62 -0
  17. package/dist/config-BWj9jBVj.cjs.map +1 -0
  18. package/dist/{config-CNqgDSu3.js → config-CQTxXvIG.js} +6 -52
  19. package/dist/config-CQTxXvIG.js.map +1 -0
  20. package/dist/{config-BG_Nr2CZ.cjs → config-CRrmj88c.cjs} +15 -62
  21. package/dist/config-CRrmj88c.cjs.map +1 -0
  22. package/dist/config-Uk3rbZfb.js +49 -0
  23. package/dist/config-Uk3rbZfb.js.map +1 -0
  24. package/dist/configFile-C0DIXNMD.js +993 -0
  25. package/dist/configFile-C0DIXNMD.js.map +1 -0
  26. package/dist/configFile-CoEpHdXG.cjs +1028 -0
  27. package/dist/configFile-CoEpHdXG.cjs.map +1 -0
  28. package/dist/{credentials-C8tjAhTo.js → credentials-B77iJx9H.js} +1 -1
  29. package/dist/{credentials-DDaKqtJn.cjs → credentials-DEsGwcGD.cjs} +3 -4
  30. package/dist/{credentials-DDaKqtJn.cjs.map → credentials-DEsGwcGD.cjs.map} +1 -1
  31. package/dist/{credentials-CZK6zPLv.js → credentials-osgjujE_.js} +3 -4
  32. package/dist/{credentials-CZK6zPLv.js.map → credentials-osgjujE_.js.map} +1 -1
  33. package/dist/env-C3xHRMez.js +1 -0
  34. package/dist/env-eu3XyKqJ.cjs +55 -0
  35. package/dist/env-eu3XyKqJ.cjs.map +1 -0
  36. package/dist/env-rv-VgSGN.js +34 -0
  37. package/dist/env-rv-VgSGN.js.map +1 -0
  38. package/dist/{errors-Cl69p_vI.cjs → errors-BponpdjN.cjs} +3 -4
  39. package/dist/{errors-Cl69p_vI.cjs.map → errors-BponpdjN.cjs.map} +1 -1
  40. package/dist/{errors-DmC83ALX.js → errors-wzqmMpMo.js} +3 -4
  41. package/dist/{errors-DmC83ALX.js.map → errors-wzqmMpMo.js.map} +1 -1
  42. package/dist/index.cjs +37 -2719
  43. package/dist/index.cjs.map +1 -1
  44. package/dist/index.d.cts +0 -2
  45. package/dist/index.d.ts +0 -2
  46. package/dist/index.js +35 -2713
  47. package/dist/index.js.map +1 -1
  48. package/dist/installWithSpinner-DpnpxHq5.js +49 -0
  49. package/dist/installWithSpinner-DpnpxHq5.js.map +1 -0
  50. package/dist/installWithSpinner-ONGfIVUJ.cjs +56 -0
  51. package/dist/installWithSpinner-ONGfIVUJ.cjs.map +1 -0
  52. package/dist/{text-CL6N6yPS.js → intro-9PB8sE8z.js} +8 -52
  53. package/dist/intro-9PB8sE8z.js.map +1 -0
  54. package/dist/{text-DrsG1EDN.cjs → intro-YPaf1Imr.cjs} +12 -80
  55. package/dist/intro-YPaf1Imr.cjs.map +1 -0
  56. package/dist/isCIEnvironment-D6xtAAZ2.js +14 -0
  57. package/dist/isCIEnvironment-D6xtAAZ2.js.map +1 -0
  58. package/dist/isCIEnvironment-DiVOMI5Q.cjs +20 -0
  59. package/dist/isCIEnvironment-DiVOMI5Q.cjs.map +1 -0
  60. package/dist/mascot--q1xjKw1.js +63 -0
  61. package/dist/mascot--q1xjKw1.js.map +1 -0
  62. package/dist/mascot-JSA0j3Q_.cjs +80 -0
  63. package/dist/mascot-JSA0j3Q_.cjs.map +1 -0
  64. package/dist/mcp-CcseJJwh.cjs +20 -0
  65. package/dist/mcp-CcseJJwh.cjs.map +1 -0
  66. package/dist/mcp-DUTsS8tR.js +21 -0
  67. package/dist/mcp-DUTsS8tR.js.map +1 -0
  68. package/dist/package-B1hUUjio.cjs +10 -0
  69. package/dist/package-B1hUUjio.cjs.map +1 -0
  70. package/dist/package-MYPMnnTX.js +5 -0
  71. package/dist/package-MYPMnnTX.js.map +1 -0
  72. package/dist/{registry-DOGpflct.js → registry-B3eYk4LN.js} +7 -67
  73. package/dist/registry-B3eYk4LN.js.map +1 -0
  74. package/dist/{registry-BzBp6aZI.cjs → registry-YE1pFWL-.cjs} +4 -82
  75. package/dist/registry-YE1pFWL-.cjs.map +1 -0
  76. package/dist/{reporters-GzXlc4CK.cjs → reporters-2cgjvXwR.cjs} +32 -40
  77. package/dist/{reporters-GzXlc4CK.cjs.map → reporters-2cgjvXwR.cjs.map} +1 -1
  78. package/dist/{reporters-mYHIUZSx.js → reporters-BM430HdQ.js} +19 -27
  79. package/dist/{reporters-mYHIUZSx.js.map → reporters-BM430HdQ.js.map} +1 -1
  80. package/dist/{rolldown-runtime-CPE0t6oh.cjs → rolldown-runtime-C3-Zg-KD.cjs} +1 -2
  81. package/dist/{rolldown-runtime-CRm0XQPb.js → rolldown-runtime-xo6NMXYd.js} +1 -2
  82. package/dist/run-1H9TGT8v.js +77 -0
  83. package/dist/run-1H9TGT8v.js.map +1 -0
  84. package/dist/run-BYP_t9dR.cjs +324 -0
  85. package/dist/run-BYP_t9dR.cjs.map +1 -0
  86. package/dist/run-Bq6gcfkS.js +1 -0
  87. package/dist/run-BrM7-NSV.js +181 -0
  88. package/dist/run-BrM7-NSV.js.map +1 -0
  89. package/dist/run-BsrNfFIl.js +228 -0
  90. package/dist/run-BsrNfFIl.js.map +1 -0
  91. package/dist/{run-l8IiOR_c.js → run-CLiHI99L.js} +9 -9
  92. package/dist/{run-l8IiOR_c.js.map → run-CLiHI99L.js.map} +1 -1
  93. package/dist/{run-C8Prej7s.cjs → run-CQORv7Gq.cjs} +44 -37
  94. package/dist/run-CQORv7Gq.cjs.map +1 -0
  95. package/dist/{run-EJtgdIin.js → run-CXVhxFfC.js} +31 -23
  96. package/dist/run-CXVhxFfC.js.map +1 -0
  97. package/dist/run-CrM4jsix.cjs +80 -0
  98. package/dist/run-CrM4jsix.cjs.map +1 -0
  99. package/dist/run-CvFakE3B.cjs +185 -0
  100. package/dist/run-CvFakE3B.cjs.map +1 -0
  101. package/dist/{run-DC_xH5H3.cjs → run-CyzKy-0p.cjs} +49 -41
  102. package/dist/run-CyzKy-0p.cjs.map +1 -0
  103. package/dist/run-D-nn9-Wq.js +319 -0
  104. package/dist/run-D-nn9-Wq.js.map +1 -0
  105. package/dist/run-DBnSbwtU.cjs +389 -0
  106. package/dist/run-DBnSbwtU.cjs.map +1 -0
  107. package/dist/{run-j1g5si5R.js → run-DTqMrPS9.js} +5 -6
  108. package/dist/{run-j1g5si5R.js.map → run-DTqMrPS9.js.map} +1 -1
  109. package/dist/{run-9fs2T2Je.js → run-DUwX6Icx.js} +26 -20
  110. package/dist/run-DUwX6Icx.js.map +1 -0
  111. package/dist/run-FEiyv6_U.js +385 -0
  112. package/dist/run-FEiyv6_U.js.map +1 -0
  113. package/dist/run-LY_UAYyM.cjs +233 -0
  114. package/dist/run-LY_UAYyM.cjs.map +1 -0
  115. package/dist/{run-sjzj0ir-.cjs → run-dMTJfs4_.cjs} +10 -10
  116. package/dist/{run-sjzj0ir-.cjs.map → run-dMTJfs4_.cjs.map} +1 -1
  117. package/dist/{run-CypFtkVE.cjs → run-uPA5s3rI.cjs} +5 -6
  118. package/dist/{run-CypFtkVE.cjs.map → run-uPA5s3rI.cjs.map} +1 -1
  119. package/dist/shared-C0EtrdUm.cjs +123 -0
  120. package/dist/shared-C0EtrdUm.cjs.map +1 -0
  121. package/dist/shared-Ct9stKpp.js +94 -0
  122. package/dist/shared-Ct9stKpp.js.map +1 -0
  123. package/dist/{snapshot-laSRD0z1.cjs → snapshot-CPF9zyZj.cjs} +13 -14
  124. package/dist/{snapshot-laSRD0z1.cjs.map → snapshot-CPF9zyZj.cjs.map} +1 -1
  125. package/dist/{snapshot-BJWnL6hE.js → snapshot-CiV08NJr.js} +10 -11
  126. package/dist/{snapshot-BJWnL6hE.js.map → snapshot-CiV08NJr.js.map} +1 -1
  127. package/dist/spinner-BZaln7O8.js +160 -0
  128. package/dist/spinner-BZaln7O8.js.map +1 -0
  129. package/dist/spinner-CfB0sIPy.cjs +208 -0
  130. package/dist/spinner-CfB0sIPy.cjs.map +1 -0
  131. package/dist/{status-DFEdbBPu.cjs → status-C066YA-4.cjs} +7 -8
  132. package/dist/{status-DFEdbBPu.cjs.map → status-C066YA-4.cjs.map} +1 -1
  133. package/dist/{status-BjmXLRm2.js → status-Dj8tivag.js} +6 -7
  134. package/dist/{status-BjmXLRm2.js.map → status-Dj8tivag.js.map} +1 -1
  135. package/dist/studio-B4XsXgKj.js +215 -0
  136. package/dist/studio-B4XsXgKj.js.map +1 -0
  137. package/dist/studio-D9_-mKee.cjs +218 -0
  138. package/dist/studio-D9_-mKee.cjs.map +1 -0
  139. package/dist/studioWorker.js +4 -5
  140. package/dist/{summary-DDnI70tn.js → summary-CbmQKA8l.js} +5 -6
  141. package/dist/{summary-DDnI70tn.js.map → summary-CbmQKA8l.js.map} +1 -1
  142. package/dist/{summary-1DCwzWEU.cjs → summary-Clvl5Hxs.cjs} +7 -8
  143. package/dist/{summary-1DCwzWEU.cjs.map → summary-Clvl5Hxs.cjs.map} +1 -1
  144. package/dist/table-BlRe9YTZ.cjs +15 -0
  145. package/dist/table-BlRe9YTZ.cjs.map +1 -0
  146. package/dist/table-CR7iZJGo.js +10 -0
  147. package/dist/table-CR7iZJGo.js.map +1 -0
  148. package/dist/text-BmiI4s6N.js +13 -0
  149. package/dist/text-BmiI4s6N.js.map +1 -0
  150. package/dist/text-Ep3AulAS.cjs +24 -0
  151. package/dist/text-Ep3AulAS.cjs.map +1 -0
  152. package/dist/time-3BKoci3G.cjs +82 -0
  153. package/dist/time-3BKoci3G.cjs.map +1 -0
  154. package/dist/time-C-wU7VhC.js +65 -0
  155. package/dist/time-C-wU7VhC.js.map +1 -0
  156. package/dist/utils-BdibacYq.js +244 -0
  157. package/dist/utils-BdibacYq.js.map +1 -0
  158. package/dist/utils-CO89mxRU.cjs +290 -0
  159. package/dist/utils-CO89mxRU.cjs.map +1 -0
  160. package/dist/utils-CbJ6hS_t.js +222 -0
  161. package/dist/utils-CbJ6hS_t.js.map +1 -0
  162. package/dist/utils-CcARPB45.cjs +286 -0
  163. package/dist/utils-CcARPB45.cjs.map +1 -0
  164. package/dist/validate-B3tLWYJU.cjs +27 -0
  165. package/dist/validate-B3tLWYJU.cjs.map +1 -0
  166. package/dist/validate-C5fyNF4v.js +28 -0
  167. package/dist/validate-C5fyNF4v.js.map +1 -0
  168. package/package.json +7 -7
  169. package/dist/Telemetry-B5V_ufmv.cjs.map +0 -1
  170. package/dist/Telemetry-DrnGartf.js.map +0 -1
  171. package/dist/config-BG_Nr2CZ.cjs.map +0 -1
  172. package/dist/config-CNqgDSu3.js.map +0 -1
  173. package/dist/config-DWDpFSn1.js +0 -1
  174. package/dist/registry-BzBp6aZI.cjs.map +0 -1
  175. package/dist/registry-DOGpflct.js.map +0 -1
  176. package/dist/run-9fs2T2Je.js.map +0 -1
  177. package/dist/run-C8Prej7s.cjs.map +0 -1
  178. package/dist/run-CXVme-aS.js +0 -1
  179. package/dist/run-DC_xH5H3.cjs.map +0 -1
  180. package/dist/run-EJtgdIin.js.map +0 -1
  181. package/dist/text-CL6N6yPS.js.map +0 -1
  182. package/dist/text-DrsG1EDN.cjs.map +0 -1
  183. package/dist/utils-C3vTpUje.cjs +0 -645
  184. package/dist/utils-C3vTpUje.cjs.map +0 -1
  185. package/dist/utils-CIc8YFtr.js +0 -536
  186. package/dist/utils-CIc8YFtr.js.map +0 -1
@@ -0,0 +1,228 @@
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { t as getErrorMessage } from "./errors-wzqmMpMo.js";
3
+ import { n as withSpinner, t as createSpinner } from "./spinner-BZaln7O8.js";
4
+ import { a as readOutputFiles, n as diffFiles } from "./utils-BdibacYq.js";
5
+ import { l as logStep, n as logIntro, o as logBlock, s as logError, t as isInteractiveRun, u as logWarn } from "./intro-9PB8sE8z.js";
6
+ import { n as dryRunId, o as yesArg } from "./shared-Ct9stKpp.js";
7
+ import { t as pluralize } from "./text-BmiI4s6N.js";
8
+ import { t as findConfigFile } from "./config-CQTxXvIG.js";
9
+ import { t as logCommandSummary } from "./summary-CbmQKA8l.js";
10
+ import { a as installSpec, c as toRegistryId, i as incompatibility, l as toShortId, o as isOutdated, r as fetchRegistryIndex, s as registryUrl, t as bumpOf } from "./registry-B3eYk4LN.js";
11
+ import { n as detectPackageManager } from "./utils-CbJ6hS_t.js";
12
+ import { t as installWithSpinner } from "./installWithSpinner-DpnpxHq5.js";
13
+ import { t as formatTable } from "./table-CR7iZJGo.js";
14
+ import { styleText } from "node:util";
15
+ import { defineWithTypes } from "gunshi";
16
+ import process from "node:process";
17
+ import path from "node:path";
18
+ import * as clack from "@clack/prompts";
19
+ import { Hookable, readInstalledPackages } from "@kubb/core";
20
+ // src/runners/update/run.ts
21
+ /**
22
+ * Generates every config in this process, the way `kubb generate` does, and returns the output files
23
+ * it changed. Runs after the install, so the config loads the new versions. `undefined` when the
24
+ * config fails to load or a build fails.
25
+ */
26
+ async function regenerate({ cwd, configPath }) {
27
+ const spinner = createSpinner();
28
+ spinner.start("Generating with the new versions");
29
+ try {
30
+ const [{ getConfigs }, { generate }] = await Promise.all([import("./config-BL3HnFhb.js"), import("./run-CXVhxFfC.js")]);
31
+ const { configs } = await getConfigs({ configPath });
32
+ const dirs = configs.map((config) => path.resolve(config.root ?? cwd, config.output.path));
33
+ const before = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]));
34
+ const hooks = new Hookable();
35
+ for (const config of configs) if (!await generate({
36
+ config,
37
+ hooks
38
+ })) throw new Error("Generation failed");
39
+ const after = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]));
40
+ const diff = diffFiles(before, after);
41
+ spinner.stop(diff.files.length ? `Generated: ${pluralize(diff.files.length, "file")} changed` : "Generated: no files changed");
42
+ return {
43
+ ...diff,
44
+ output: dirs.map((dir) => path.relative(cwd, dir) || ".").join(", ")
45
+ };
46
+ } catch (error) {
47
+ spinner.error(`Generation failed: ${getErrorMessage(error)}`);
48
+ return;
49
+ }
50
+ }
51
+ /**
52
+ * Moves installed extensions to the version the registry pins. Shows each version change with its
53
+ * bump, asks which to install with majors left out, installs them, and regenerates to show which
54
+ * files changed. With `dryRun`, only lists the updates and installs nothing.
55
+ */
56
+ async function run({ ids, dryRun, yes }) {
57
+ const cwd = process.cwd();
58
+ const hrStart = process.hrtime();
59
+ const installedPackages = [];
60
+ const summary = (title, status, lines) => logCommandSummary({
61
+ title,
62
+ status,
63
+ hrStart,
64
+ block: true,
65
+ lines
66
+ });
67
+ logIntro({ title: isInteractiveRun({
68
+ yes,
69
+ dryRun
70
+ }) ? void 0 : styleText("bgCyan", styleText("black", " Kubb Update ")) });
71
+ try {
72
+ const wanted = new Set(ids.map(toRegistryId));
73
+ const [entries, installed] = await withSpinner({
74
+ message: "Checking the registry",
75
+ promise: Promise.all([fetchRegistryIndex({ registry: registryUrl() }), readInstalledPackages({ root: cwd })])
76
+ });
77
+ const versions = new Map(installed.map((item) => [item.package, item.version]));
78
+ const tracked = entries.filter((entry) => versions.has(entry.artifact.package) && (!wanted.size || wanted.has(entry.id)));
79
+ for (const id of wanted) {
80
+ if (tracked.some((entry) => entry.id === id)) continue;
81
+ logWarn(`${id} is not installed, or not in the registry.`);
82
+ process.exitCode = 1;
83
+ }
84
+ const current = ({ artifact }) => versions.get(artifact.package);
85
+ const isMajor = (entry) => bumpOf({
86
+ installed: current(entry),
87
+ latest: entry.artifact.version
88
+ }) === "major";
89
+ const outdated = tracked.filter((entry) => isOutdated({
90
+ installed: current(entry),
91
+ latest: entry.artifact.version
92
+ }));
93
+ const proposals = outdated.filter((entry) => {
94
+ const problem = incompatibility(entry.manifest);
95
+ if (problem) {
96
+ logWarn(`Skipped ${entry.id}: ${problem}`);
97
+ if (wanted.has(entry.id)) process.exitCode = 1;
98
+ }
99
+ return !problem;
100
+ });
101
+ if (!proposals.length) {
102
+ const title = outdated.length ? "No compatible updates available" : "Already up to date";
103
+ summary(tracked.length ? title : "No installed extensions to update", outdated.length ? "warning" : "success", [` ${tracked.length - outdated.length} of ${tracked.length} up to date`, ...ids.length ? ["", `No updates for ${ids.join(", ")}.`] : []]);
104
+ return;
105
+ }
106
+ if (tracked.length) {
107
+ const header = [
108
+ "Extension",
109
+ "Current",
110
+ "Latest",
111
+ ""
112
+ ];
113
+ const rows = tracked.map((entry) => {
114
+ if (!outdated.includes(entry)) return [
115
+ entry.artifact.package,
116
+ current(entry) ?? "-",
117
+ "up to date",
118
+ ""
119
+ ];
120
+ const bump = bumpOf({
121
+ installed: current(entry),
122
+ latest: entry.artifact.version
123
+ }) ?? "";
124
+ return [
125
+ entry.artifact.package,
126
+ current(entry) ?? "not installed",
127
+ entry.artifact.version,
128
+ bump === "major" ? "major · breaking" : bump
129
+ ];
130
+ });
131
+ const lines = formatTable([header, ...rows]);
132
+ logStep(`Checked ${pluralize(tracked.length, "extension")} against the registry`);
133
+ logBlock([styleText("dim", lines[0]), ...lines.slice(1).map((line, index) => {
134
+ if (!outdated.includes(tracked[index])) return styleText("dim", line);
135
+ return line.endsWith("major · breaking") ? styleText("yellow", line) : line;
136
+ })]);
137
+ }
138
+ if (dryRun) {
139
+ summary("Updates available", "planned", [`Dry run: nothing was installed. Run kubb update to install ${proposals.length === 1 ? "it" : "them"}.`]);
140
+ return;
141
+ }
142
+ const defaults = proposals.filter((entry) => wanted.has(entry.id) || !isMajor(entry));
143
+ const chosen = yes ? defaults.map((entry) => entry.id) : await clack.multiselect({
144
+ message: "Select the updates to install",
145
+ options: proposals.map((entry) => ({
146
+ value: entry.id,
147
+ label: entry.artifact.package,
148
+ hint: `${current(entry) ?? "not installed"} → ${entry.artifact.version}`
149
+ })),
150
+ initialValues: defaults.map((entry) => entry.id),
151
+ required: false
152
+ });
153
+ if (clack.isCancel(chosen)) {
154
+ summary("Update canceled", "canceled", [" No changes made"]);
155
+ return;
156
+ }
157
+ const selected = proposals.filter((entry) => chosen.includes(entry.id));
158
+ const skipped = proposals.filter((entry) => !selected.includes(entry)).map((entry) => {
159
+ const kind = entry.manifest.kind.charAt(0).toUpperCase() + entry.manifest.kind.slice(1);
160
+ return ` ${styleText("dim", "Skipped")} ${kind} ${entry.artifact.package} ${entry.artifact.version} ${styleText("dim", `run kubb update ${toShortId(entry.id)} later`)}`;
161
+ });
162
+ if (!selected.length) {
163
+ summary("No updates installed", "canceled", [" No updates selected.", ...skipped]);
164
+ return;
165
+ }
166
+ const packageManager = detectPackageManager(cwd);
167
+ const names = selected.map(({ artifact }) => artifact.package).join(", ");
168
+ await installWithSpinner({
169
+ packages: selected.map(({ artifact }) => installSpec(artifact)),
170
+ names,
171
+ packageManager,
172
+ cwd
173
+ });
174
+ installedPackages.push(...selected.map((entry) => entry.artifact.package));
175
+ const foundConfig = findConfigFile(cwd);
176
+ const configPath = foundConfig && !yes && await clack.confirm({
177
+ message: "Regenerate now? This rewrites the generated files.",
178
+ initialValue: true
179
+ }) === true ? foundConfig : void 0;
180
+ const changed = configPath ? await regenerate({
181
+ cwd,
182
+ configPath
183
+ }) : void 0;
184
+ const generationFailed = Boolean(configPath && !changed);
185
+ const fileCounts = {
186
+ A: 0,
187
+ M: 0,
188
+ D: 0
189
+ };
190
+ for (const file of changed?.files ?? []) fileCounts[file.status]++;
191
+ summary(generationFailed ? "Extensions updated; generation failed" : "Update complete", generationFailed ? "warning" : "success", [
192
+ ` Packages ${selected.length} installed with ${packageManager.name}${skipped.length ? ` · ${skipped.length} skipped` : ""}`,
193
+ ...skipped,
194
+ ...changed ? [` Files ${fileCounts.A} added · ${fileCounts.M} modified · ${fileCounts.D} deleted`] : [],
195
+ ...!configPath ? [" Regeneration not run"] : [],
196
+ ...generationFailed ? ["", "Fix the generation error, then run kubb generate."] : []
197
+ ]);
198
+ } catch (error) {
199
+ logError(getErrorMessage(error));
200
+ summary("Update failed", "failed", installedPackages.length ? [` Packages ${installedPackages.join(", ")} installed`] : [" No changes made"]);
201
+ process.exitCode = 1;
202
+ }
203
+ }
204
+ const command = defineWithTypes()({
205
+ name: "update",
206
+ description: "Update installed extensions, regenerate, and summarize file changes.",
207
+ examples: [
208
+ "kubb update",
209
+ "kubb update --dry-run",
210
+ "kubb update plugin-zod plugin-ts --yes"
211
+ ].join("\n"),
212
+ args: {
213
+ ids: {
214
+ type: "positional",
215
+ description: "Registry ids to update, all installed extensions when omitted",
216
+ multiple: true
217
+ },
218
+ ...yesArg
219
+ },
220
+ run: ({ values, extensions }) => run({
221
+ ids: values.ids ?? [],
222
+ dryRun: extensions[dryRunId].enabled,
223
+ yes: values.yes
224
+ })
225
+ });
226
+ export { command, run };
227
+
228
+ //# sourceMappingURL=run-BsrNfFIl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-BsrNfFIl.js","names":[],"sources":["../src/runners/update/run.ts"],"sourcesContent":["import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as clack from '@clack/prompts'\nimport { defineWithTypes } from 'gunshi'\nimport { findConfigFile } from '@internals/shared'\nimport { getErrorMessage } from '@internals/utils'\nimport { Hookable, type KubbHooks, readInstalledPackages, type RegistryEntry } from '@kubb/core'\nimport { pluralize } from '../../ui/text.ts'\nimport { dryRunId, type DryRunExtensions, yesArg } from '../../commands/shared.ts'\nimport { isInteractiveRun, logIntro } from '../../ui/intro.ts'\nimport { logBlock, logError, logStep, logWarn } from '../../ui/log.ts'\nimport { createSpinner, withSpinner } from '../../ui/spinner.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\nimport { formatTable } from '../../ui/table.ts'\nimport { bumpOf, fetchRegistryIndex, incompatibility, installSpec, isOutdated, registryUrl, toRegistryId, toShortId } from '../../utils/registry.ts'\nimport { detectPackageManager } from '../init/utils.ts'\nimport { installWithSpinner } from '../installWithSpinner.ts'\nimport { diffFiles, type FileChange, readOutputFiles } from '../generate/utils.ts'\n\nexport type UpdateOptions = {\n /**\n * Registry ids to update. Empty updates every installed extension the registry lists.\n */\n ids: Array<string>\n /**\n * List the updates without installing anything.\n */\n dryRun: boolean\n yes: boolean\n}\n\n/**\n * Generates every config in this process, the way `kubb generate` does, and returns the output files\n * it changed. Runs after the install, so the config loads the new versions. `undefined` when the\n * config fails to load or a build fails.\n */\nasync function regenerate({\n cwd,\n configPath,\n}: {\n cwd: string\n configPath: string\n}): Promise<{ files: Array<FileChange>; unchanged: number; output: string } | undefined> {\n const spinner = createSpinner()\n spinner.start('Generating with the new versions')\n try {\n // Imported here, so the config loader and the generate path never slow down `kubb --help`.\n const [{ getConfigs }, { generate }] = await Promise.all([import('../../config.ts'), import('../generate/run.ts')])\n const { configs } = await getConfigs({ configPath })\n const dirs = configs.map((config) => path.resolve(config.root ?? cwd, config.output.path))\n const before = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const hooks = new Hookable<KubbHooks>()\n for (const config of configs) {\n if (!(await generate({ config, hooks }))) throw new Error('Generation failed')\n }\n const after = new Map((await Promise.all(dirs.map(readOutputFiles))).flatMap((files) => [...files]))\n const diff = diffFiles(before, after)\n spinner.stop(diff.files.length ? `Generated: ${pluralize(diff.files.length, 'file')} changed` : 'Generated: no files changed')\n return { ...diff, output: dirs.map((dir) => path.relative(cwd, dir) || '.').join(', ') }\n } catch (error) {\n spinner.error(`Generation failed: ${getErrorMessage(error)}`)\n return undefined\n }\n}\n\n/**\n * Moves installed extensions to the version the registry pins. Shows each version change with its\n * bump, asks which to install with majors left out, installs them, and regenerates to show which\n * files changed. With `dryRun`, only lists the updates and installs nothing.\n */\nexport async function run({ ids, dryRun, yes }: UpdateOptions): Promise<void> {\n const cwd = process.cwd()\n const hrStart = process.hrtime()\n const installedPackages: Array<string> = []\n const summary = (title: string, status: Parameters<typeof logCommandSummary>[0]['status'], lines: ReadonlyArray<string>) =>\n logCommandSummary({ title, status, hrStart, block: true, lines })\n logIntro({ title: isInteractiveRun({ yes, dryRun }) ? undefined : styleText('bgCyan', styleText('black', ' Kubb Update ')) })\n\n try {\n const wanted = new Set(ids.map(toRegistryId))\n const [entries, installed] = await withSpinner({\n message: 'Checking the registry',\n promise: Promise.all([fetchRegistryIndex({ registry: registryUrl() }), readInstalledPackages({ root: cwd })]),\n })\n const versions = new Map(installed.map((item) => [item.package, item.version]))\n\n const tracked = entries.filter((entry) => versions.has(entry.artifact.package) && (!wanted.size || wanted.has(entry.id)))\n for (const id of wanted) {\n if (tracked.some((entry) => entry.id === id)) continue\n logWarn(`${id} is not installed, or not in the registry.`)\n // A caller that named it, such as Studio, must not read the run as a successful update.\n process.exitCode = 1\n }\n\n const current = ({ artifact }: RegistryEntry) => versions.get(artifact.package)\n const isMajor = (entry: RegistryEntry) => bumpOf({ installed: current(entry), latest: entry.artifact.version }) === 'major'\n const outdated = tracked.filter((entry) => isOutdated({ installed: current(entry), latest: entry.artifact.version }))\n const proposals = outdated.filter((entry) => {\n const problem = incompatibility(entry.manifest)\n if (problem) {\n logWarn(`Skipped ${entry.id}: ${problem}`)\n // Same as a missing id: Studio would report an update that installed nothing.\n if (wanted.has(entry.id)) process.exitCode = 1\n }\n return !problem\n })\n\n if (!proposals.length) {\n const title = outdated.length ? 'No compatible updates available' : 'Already up to date'\n summary(tracked.length ? title : 'No installed extensions to update', outdated.length ? 'warning' : 'success', [\n ` ${tracked.length - outdated.length} of ${tracked.length} up to date`,\n ...(ids.length ? ['', `No updates for ${ids.join(', ')}.`] : []),\n ])\n return\n }\n\n if (tracked.length) {\n const header = ['Extension', 'Current', 'Latest', '']\n const rows = tracked.map((entry) => {\n if (!outdated.includes(entry)) return [entry.artifact.package, current(entry) ?? '-', 'up to date', '']\n const bump = bumpOf({ installed: current(entry), latest: entry.artifact.version }) ?? ''\n return [entry.artifact.package, current(entry) ?? 'not installed', entry.artifact.version, bump === 'major' ? 'major · breaking' : bump]\n })\n const lines = formatTable([header, ...rows])\n logStep(`Checked ${pluralize(tracked.length, 'extension')} against the registry`)\n logBlock([\n styleText('dim', lines[0]!),\n ...lines.slice(1).map((line, index) => {\n if (!outdated.includes(tracked[index]!)) return styleText('dim', line)\n return line.endsWith('major · breaking') ? styleText('yellow', line) : line\n }),\n ])\n }\n\n if (dryRun) {\n summary('Updates available', 'planned', [`Dry run: nothing was installed. Run kubb update to install ${proposals.length === 1 ? 'it' : 'them'}.`])\n return\n }\n\n // A major can break the generated code, so it is only picked for you when you named it.\n const defaults = proposals.filter((entry) => wanted.has(entry.id) || !isMajor(entry))\n const chosen = yes\n ? defaults.map((entry) => entry.id)\n : await clack.multiselect({\n message: 'Select the updates to install',\n options: proposals.map((entry) => ({\n value: entry.id,\n label: entry.artifact.package,\n hint: `${current(entry) ?? 'not installed'} → ${entry.artifact.version}`,\n })),\n initialValues: defaults.map((entry) => entry.id),\n required: false,\n })\n if (clack.isCancel(chosen)) {\n summary('Update canceled', 'canceled', [' No changes made'])\n return\n }\n const selected = proposals.filter((entry) => chosen.includes(entry.id))\n\n const skipped = proposals\n .filter((entry) => !selected.includes(entry))\n .map((entry) => {\n const kind = entry.manifest.kind.charAt(0).toUpperCase() + entry.manifest.kind.slice(1)\n return ` ${styleText('dim', 'Skipped')} ${kind} ${entry.artifact.package} ${entry.artifact.version} ${styleText('dim', `run kubb update ${toShortId(entry.id)} later`)}`\n })\n if (!selected.length) {\n summary('No updates installed', 'canceled', [' No updates selected.', ...skipped])\n return\n }\n\n const packageManager = detectPackageManager(cwd)\n const names = selected.map(({ artifact }) => artifact.package).join(', ')\n await installWithSpinner({\n packages: selected.map(({ artifact }) => installSpec(artifact)),\n names,\n packageManager,\n cwd,\n })\n installedPackages.push(...selected.map((entry) => entry.artifact.package))\n\n // Regenerating rewrites output files, so it is asked for. `--yes` only accepts the install.\n const foundConfig = findConfigFile(cwd)\n const regenerateNow =\n foundConfig && !yes && (await clack.confirm({ message: 'Regenerate now? This rewrites the generated files.', initialValue: true })) === true\n const configPath = regenerateNow ? foundConfig : undefined\n const changed = configPath ? await regenerate({ cwd, configPath }) : undefined\n\n const generationFailed = Boolean(configPath && !changed)\n const fileCounts = { A: 0, M: 0, D: 0 }\n for (const file of changed?.files ?? []) fileCounts[file.status]++\n summary(generationFailed ? 'Extensions updated; generation failed' : 'Update complete', generationFailed ? 'warning' : 'success', [\n ` Packages ${selected.length} installed with ${packageManager.name}${skipped.length ? ` · ${skipped.length} skipped` : ''}`,\n ...skipped,\n ...(changed ? [` Files ${fileCounts.A} added · ${fileCounts.M} modified · ${fileCounts.D} deleted`] : []),\n ...(!configPath ? [' Regeneration not run'] : []),\n ...(generationFailed ? ['', 'Fix the generation error, then run kubb generate.'] : []),\n ])\n } catch (error) {\n logError(getErrorMessage(error))\n summary('Update failed', 'failed', installedPackages.length ? [` Packages ${installedPackages.join(', ')} installed`] : [' No changes made'])\n process.exitCode = 1\n }\n}\n\nexport const command = defineWithTypes<{ extensions: DryRunExtensions }>()({\n name: 'update',\n description: 'Update installed extensions, regenerate, and summarize file changes.',\n examples: ['kubb update', 'kubb update --dry-run', 'kubb update plugin-zod plugin-ts --yes'].join('\\n'),\n args: {\n ids: {\n type: 'positional',\n description: 'Registry ids to update, all installed extensions when omitted',\n multiple: true,\n },\n ...yesArg,\n },\n run: ({ values, extensions }) => run({ ids: values.ids ?? [], dryRun: extensions[dryRunId].enabled, yes: values.yes }),\n})\n"],"mappings":"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"}
@@ -1,14 +1,15 @@
1
- import "./rolldown-runtime-CRm0XQPb.js";
2
- import { n as toError } from "./errors-DmC83ALX.js";
3
- import { n as trackRun } from "./Telemetry-DrnGartf.js";
4
- import { t as pluralize } from "./text-CL6N6yPS.js";
5
- import { n as findConfigFile, t as getConfigs } from "./config-CNqgDSu3.js";
6
- import { t as logCommandSummary } from "./summary-DDnI70tn.js";
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { n as toError } from "./errors-wzqmMpMo.js";
3
+ import { n as trackRun } from "./Telemetry-C7Qwy2s7.js";
4
+ import { t as pluralize } from "./text-BmiI4s6N.js";
5
+ import { t as findConfigFile } from "./config-CQTxXvIG.js";
6
+ import { t as getConfigs } from "./config-Uk3rbZfb.js";
7
+ import { t as logCommandSummary } from "./summary-CbmQKA8l.js";
7
8
  import { styleText } from "node:util";
8
9
  import process from "node:process";
9
10
  import { resolve } from "node:path";
10
11
  import { checkoutGitInput, getInputKind } from "@kubb/core";
11
- //#region src/runners/validate/run.ts
12
+ // src/runners/validate/run.ts
12
13
  /**
13
14
  * Validates `input` with the configured adapters, falling back to OpenAPI when no config exists.
14
15
  * Exits the process with code 1 on validation failure or missing dependency.
@@ -93,7 +94,6 @@ async function run({ input, configPath }) {
93
94
  process.exit(1);
94
95
  }
95
96
  }
96
- //#endregion
97
97
  export { run };
98
98
 
99
- //# sourceMappingURL=run-l8IiOR_c.js.map
99
+ //# sourceMappingURL=run-CLiHI99L.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"run-l8IiOR_c.js","names":[],"sources":["../src/runners/validate/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { resolve } from 'node:path'\nimport { styleText } from 'node:util'\nimport { findConfigFile } from '@internals/shared'\nimport { toError } from '@internals/utils'\nimport { type Config, checkoutGitInput, getInputKind } from '@kubb/core'\nimport { trackRun } from '../../Telemetry.ts'\nimport { getConfigs } from '../../config.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\n\ntype ValidateOptions = {\n /**\n * Path, URL, or git input (`git+<repo>#<ref>:<path>`) of the specification to validate.\n */\n input: string\n configPath?: string\n}\n\n/**\n * Validates `input` with the configured adapters, falling back to OpenAPI when no config exists.\n * Exits the process with code 1 on validation failure or missing dependency.\n */\nexport async function run({ input, configPath }: ValidateOptions): Promise<void> {\n const hrStart = process.hrtime()\n const report = trackRun({ command: 'validate', hrStart })\n let adapterName: string | undefined\n\n try {\n const configFile = configPath ?? findConfigFile()\n // A config found by search that does not load must not block validating a file; an explicit `--config` still fails.\n const loaded = configFile\n ? await getConfigs({ configPath: configFile, input }).catch((error) => {\n if (configPath) throw error\n })\n : undefined\n const fallback = async () => {\n adapterName = '@kubb/adapter-oas'\n const { adapterOas } = await import('@kubb/adapter-oas')\n return [{ adapter: adapterOas(), input }]\n }\n // An array config often repeats one adapter, so each adapter and input pair is validated once.\n const unique = new Map(\n (loaded?.configs ?? []).map((config) => {\n const resolved = getInputKind(input) === 'file' ? resolve(config.root || process.cwd(), input) : input\n return [`${config.adapter?.name}\\0${resolved}`, { adapter: config.adapter, input: resolved }] as const\n }),\n )\n const targets: Array<{ adapter: Config['adapter']; input: string }> = loaded ? [...unique.values()] : await fallback()\n if (!targets.length) throw new Error('The Kubb config contains no configurations to validate.')\n for (const target of targets) {\n adapterName = target.adapter?.name\n if (!target.adapter) throw new Error('No adapter is configured. Set adapter in your Kubb config to validate this specification.')\n const checkout = getInputKind(target.input) === 'git' ? await checkoutGitInput(target.input) : undefined\n try {\n await target.adapter.validate(checkout?.path ?? target.input, { throwOnError: true })\n } finally {\n await checkout?.dispose()\n }\n }\n const specifications = new Set(targets.map((target) => target.input)).size\n const adapterNames = [...new Set(targets.flatMap((target) => target.adapter?.name ?? []))]\n await report({ status: 'success' })\n\n logCommandSummary({\n title: 'Validation passed',\n status: 'success',\n hrStart,\n lines: [\n ` ${styleText('bold', `${pluralize(specifications, 'specification')} validated`)}`,\n ` ${styleText('dim', 'Input')} ${styleText('cyan', input)}`,\n ` ${styleText('dim', adapterNames.length === 1 ? 'Adapter' : 'Adapters')} ${adapterNames.join(', ')}`,\n ],\n })\n } catch (error) {\n await report({ status: 'failed' })\n const message = toError(error).message\n const missingAdapter = adapterName === '@kubb/adapter-oas' && /(?:Cannot find|Cannot resolve|not found)[\\s\\S]*@kubb\\/adapter-oas/.test(message)\n logCommandSummary({\n title: missingAdapter ? 'Could not validate' : 'Validation failed',\n status: 'failed',\n hrStart,\n lines: [\n ` ${styleText('dim', 'Input')} ${styleText('cyan', input)}`,\n ` ${styleText('dim', 'Adapter')} ${adapterName ?? 'not configured'}${missingAdapter ? ' · not installed' : ''}`,\n '',\n styleText('bold', missingAdapter ? 'Required package' : 'Validation error'),\n ` ${styleText('red', message)}`,\n ...(missingAdapter\n ? ['', 'Install it with:', styleText('cyan', ' npm install @kubb/adapter-oas'), styleText('cyan', ' pnpm add @kubb/adapter-oas')]\n : []),\n ],\n })\n\n process.exit(1)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;AAuBA,eAAsB,IAAI,EAAE,OAAO,cAA8C;CAC/E,MAAM,UAAU,QAAQ,OAAO;CAC/B,MAAM,SAAS,SAAS;EAAE,SAAS;EAAY;CAAQ,CAAC;CACxD,IAAI;CAEJ,IAAI;EACF,MAAM,aAAa,cAAc,eAAe;EAEhD,MAAM,SAAS,aACX,MAAM,WAAW;GAAE,YAAY;GAAY;EAAM,CAAC,CAAC,CAAC,OAAO,UAAU;GACnE,IAAI,YAAY,MAAM;EACxB,CAAC,IACD,KAAA;EACJ,MAAM,WAAW,YAAY;GAC3B,cAAc;GACd,MAAM,EAAE,eAAe,MAAM,OAAO;GACpC,OAAO,CAAC;IAAE,SAAS,WAAW;IAAG;GAAM,CAAC;EAC1C;EAEA,MAAM,SAAS,IAAI,KAChB,QAAQ,WAAW,CAAC,EAAA,CAAG,KAAK,WAAW;GACtC,MAAM,WAAW,aAAa,KAAK,MAAM,SAAS,QAAQ,OAAO,QAAQ,QAAQ,IAAI,GAAG,KAAK,IAAI;GACjG,OAAO,CAAC,GAAG,OAAO,SAAS,KAAK,IAAI,YAAY;IAAE,SAAS,OAAO;IAAS,OAAO;GAAS,CAAC;EAC9F,CAAC,CACH;EACA,MAAM,UAAgE,SAAS,CAAC,GAAG,OAAO,OAAO,CAAC,IAAI,MAAM,SAAS;EACrH,IAAI,CAAC,QAAQ,QAAQ,MAAM,IAAI,MAAM,yDAAyD;EAC9F,KAAK,MAAM,UAAU,SAAS;GAC5B,cAAc,OAAO,SAAS;GAC9B,IAAI,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,2FAA2F;GAChI,MAAM,WAAW,aAAa,OAAO,KAAK,MAAM,QAAQ,MAAM,iBAAiB,OAAO,KAAK,IAAI,KAAA;GAC/F,IAAI;IACF,MAAM,OAAO,QAAQ,SAAS,UAAU,QAAQ,OAAO,OAAO,EAAE,cAAc,KAAK,CAAC;GACtF,UAAU;IACR,MAAM,UAAU,QAAQ;GAC1B;EACF;EACA,MAAM,iBAAiB,IAAI,IAAI,QAAQ,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC;EACtE,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAS,WAAW,OAAO,SAAS,QAAQ,CAAC,CAAC,CAAC,CAAC;EACzF,MAAM,OAAO,EAAE,QAAQ,UAAU,CAAC;EAElC,kBAAkB;GAChB,OAAO;GACP,QAAQ;GACR;GACA,OAAO;IACL,KAAK,UAAU,QAAQ,GAAG,UAAU,gBAAgB,eAAe,EAAE,WAAW;IAChF,KAAK,UAAU,OAAO,OAAO,EAAE,MAAM,UAAU,QAAQ,KAAK;IAC5D,KAAK,UAAU,OAAO,aAAa,WAAW,IAAI,YAAY,UAAU,EAAE,IAAI,aAAa,KAAK,IAAI;GACtG;EACF,CAAC;CACH,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,MAAM,UAAU,QAAQ,KAAK,CAAC,CAAC;EAC/B,MAAM,iBAAiB,gBAAgB,uBAAuB,oEAAoE,KAAK,OAAO;EAC9I,kBAAkB;GAChB,OAAO,iBAAiB,uBAAuB;GAC/C,QAAQ;GACR;GACA,OAAO;IACL,KAAK,UAAU,OAAO,OAAO,EAAE,MAAM,UAAU,QAAQ,KAAK;IAC5D,KAAK,UAAU,OAAO,SAAS,EAAE,IAAI,eAAe,mBAAmB,iBAAiB,qBAAqB;IAC7G;IACA,UAAU,QAAQ,iBAAiB,qBAAqB,kBAAkB;IAC1E,KAAK,UAAU,OAAO,OAAO;IAC7B,GAAI,iBACA;KAAC;KAAI;KAAoB,UAAU,QAAQ,iCAAiC;KAAG,UAAU,QAAQ,8BAA8B;IAAC,IAChI,CAAC;GACP;EACF,CAAC;EAED,QAAQ,KAAK,CAAC;CAChB;AACF"}
1
+ {"version":3,"file":"run-CLiHI99L.js","names":[],"sources":["../src/runners/validate/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { resolve } from 'node:path'\nimport { styleText } from 'node:util'\nimport { findConfigFile } from '@internals/shared'\nimport { toError } from '@internals/utils'\nimport { type Config, checkoutGitInput, getInputKind } from '@kubb/core'\nimport { trackRun } from '../../Telemetry.ts'\nimport { getConfigs } from '../../config.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport { logCommandSummary } from '../../ui/summary.ts'\n\ntype ValidateOptions = {\n /**\n * Path, URL, or git input (`git+<repo>#<ref>:<path>`) of the specification to validate.\n */\n input: string\n configPath?: string\n}\n\n/**\n * Validates `input` with the configured adapters, falling back to OpenAPI when no config exists.\n * Exits the process with code 1 on validation failure or missing dependency.\n */\nexport async function run({ input, configPath }: ValidateOptions): Promise<void> {\n const hrStart = process.hrtime()\n const report = trackRun({ command: 'validate', hrStart })\n let adapterName: string | undefined\n\n try {\n const configFile = configPath ?? findConfigFile()\n // A config found by search that does not load must not block validating a file; an explicit `--config` still fails.\n const loaded = configFile\n ? await getConfigs({ configPath: configFile, input }).catch((error) => {\n if (configPath) throw error\n })\n : undefined\n const fallback = async () => {\n adapterName = '@kubb/adapter-oas'\n const { adapterOas } = await import('@kubb/adapter-oas')\n return [{ adapter: adapterOas(), input }]\n }\n // An array config often repeats one adapter, so each adapter and input pair is validated once.\n const unique = new Map(\n (loaded?.configs ?? []).map((config) => {\n const resolved = getInputKind(input) === 'file' ? resolve(config.root || process.cwd(), input) : input\n return [`${config.adapter?.name}\\0${resolved}`, { adapter: config.adapter, input: resolved }] as const\n }),\n )\n const targets: Array<{ adapter: Config['adapter']; input: string }> = loaded ? [...unique.values()] : await fallback()\n if (!targets.length) throw new Error('The Kubb config contains no configurations to validate.')\n for (const target of targets) {\n adapterName = target.adapter?.name\n if (!target.adapter) throw new Error('No adapter is configured. Set adapter in your Kubb config to validate this specification.')\n const checkout = getInputKind(target.input) === 'git' ? await checkoutGitInput(target.input) : undefined\n try {\n await target.adapter.validate(checkout?.path ?? target.input, { throwOnError: true })\n } finally {\n await checkout?.dispose()\n }\n }\n const specifications = new Set(targets.map((target) => target.input)).size\n const adapterNames = [...new Set(targets.flatMap((target) => target.adapter?.name ?? []))]\n await report({ status: 'success' })\n\n logCommandSummary({\n title: 'Validation passed',\n status: 'success',\n hrStart,\n lines: [\n ` ${styleText('bold', `${pluralize(specifications, 'specification')} validated`)}`,\n ` ${styleText('dim', 'Input')} ${styleText('cyan', input)}`,\n ` ${styleText('dim', adapterNames.length === 1 ? 'Adapter' : 'Adapters')} ${adapterNames.join(', ')}`,\n ],\n })\n } catch (error) {\n await report({ status: 'failed' })\n const message = toError(error).message\n const missingAdapter = adapterName === '@kubb/adapter-oas' && /(?:Cannot find|Cannot resolve|not found)[\\s\\S]*@kubb\\/adapter-oas/.test(message)\n logCommandSummary({\n title: missingAdapter ? 'Could not validate' : 'Validation failed',\n status: 'failed',\n hrStart,\n lines: [\n ` ${styleText('dim', 'Input')} ${styleText('cyan', input)}`,\n ` ${styleText('dim', 'Adapter')} ${adapterName ?? 'not configured'}${missingAdapter ? ' · not installed' : ''}`,\n '',\n styleText('bold', missingAdapter ? 'Required package' : 'Validation error'),\n ` ${styleText('red', message)}`,\n ...(missingAdapter\n ? ['', 'Install it with:', styleText('cyan', ' npm install @kubb/adapter-oas'), styleText('cyan', ' pnpm add @kubb/adapter-oas')]\n : []),\n ],\n })\n\n process.exit(1)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuBA,eAAsB,IAAI,EAAE,OAAO,cAA8C;CAC/E,MAAM,UAAU,QAAQ,OAAO;CAC/B,MAAM,SAAS,SAAS;EAAE,SAAS;EAAY;CAAQ,CAAC;CACxD,IAAI;CAEJ,IAAI;EACF,MAAM,aAAa,cAAc,eAAe;EAEhD,MAAM,SAAS,aACX,MAAM,WAAW;GAAE,YAAY;GAAY;EAAM,CAAC,CAAC,CAAC,OAAO,UAAU;GACnE,IAAI,YAAY,MAAM;EACxB,CAAC,IACD,KAAA;EACJ,MAAM,WAAW,YAAY;GAC3B,cAAc;GACd,MAAM,EAAE,eAAe,MAAM,OAAO;GACpC,OAAO,CAAC;IAAE,SAAS,WAAW;IAAG;GAAM,CAAC;EAC1C;EAEA,MAAM,SAAS,IAAI,KAChB,QAAQ,WAAW,CAAC,EAAA,CAAG,KAAK,WAAW;GACtC,MAAM,WAAW,aAAa,KAAK,MAAM,SAAS,QAAQ,OAAO,QAAQ,QAAQ,IAAI,GAAG,KAAK,IAAI;GACjG,OAAO,CAAC,GAAG,OAAO,SAAS,KAAK,IAAI,YAAY;IAAE,SAAS,OAAO;IAAS,OAAO;GAAS,CAAC;EAC9F,CAAC,CACH;EACA,MAAM,UAAgE,SAAS,CAAC,GAAG,OAAO,OAAO,CAAC,IAAI,MAAM,SAAS;EACrH,IAAI,CAAC,QAAQ,QAAQ,MAAM,IAAI,MAAM,yDAAyD;EAC9F,KAAK,MAAM,UAAU,SAAS;GAC5B,cAAc,OAAO,SAAS;GAC9B,IAAI,CAAC,OAAO,SAAS,MAAM,IAAI,MAAM,2FAA2F;GAChI,MAAM,WAAW,aAAa,OAAO,KAAK,MAAM,QAAQ,MAAM,iBAAiB,OAAO,KAAK,IAAI,KAAA;GAC/F,IAAI;IACF,MAAM,OAAO,QAAQ,SAAS,UAAU,QAAQ,OAAO,OAAO,EAAE,cAAc,KAAK,CAAC;GACtF,UAAU;IACR,MAAM,UAAU,QAAQ;GAC1B;EACF;EACA,MAAM,iBAAiB,IAAI,IAAI,QAAQ,KAAK,WAAW,OAAO,KAAK,CAAC,CAAC,CAAC;EACtE,MAAM,eAAe,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAS,WAAW,OAAO,SAAS,QAAQ,CAAC,CAAC,CAAC,CAAC;EACzF,MAAM,OAAO,EAAE,QAAQ,UAAU,CAAC;EAElC,kBAAkB;GAChB,OAAO;GACP,QAAQ;GACR;GACA,OAAO;IACL,KAAK,UAAU,QAAQ,GAAG,UAAU,gBAAgB,eAAe,EAAE,WAAW;IAChF,KAAK,UAAU,OAAO,OAAO,EAAE,MAAM,UAAU,QAAQ,KAAK;IAC5D,KAAK,UAAU,OAAO,aAAa,WAAW,IAAI,YAAY,UAAU,EAAE,IAAI,aAAa,KAAK,IAAI;GACtG;EACF,CAAC;CACH,SAAS,OAAO;EACd,MAAM,OAAO,EAAE,QAAQ,SAAS,CAAC;EACjC,MAAM,UAAU,QAAQ,KAAK,CAAC,CAAC;EAC/B,MAAM,iBAAiB,gBAAgB,uBAAuB,oEAAoE,KAAK,OAAO;EAC9I,kBAAkB;GAChB,OAAO,iBAAiB,uBAAuB;GAC/C,QAAQ;GACR;GACA,OAAO;IACL,KAAK,UAAU,OAAO,OAAO,EAAE,MAAM,UAAU,QAAQ,KAAK;IAC5D,KAAK,UAAU,OAAO,SAAS,EAAE,IAAI,eAAe,mBAAmB,iBAAiB,qBAAqB;IAC7G;IACA,UAAU,QAAQ,iBAAiB,qBAAqB,kBAAkB;IAC1E,KAAK,UAAU,OAAO,OAAO;IAC7B,GAAI,iBACA;KAAC;KAAI;KAAoB,UAAU,QAAQ,iCAAiC;KAAG,UAAU,QAAQ,8BAA8B;IAAC,IAChI,CAAC;GACP;EACF,CAAC;EAED,QAAQ,KAAK,CAAC;CAChB;AACF"}
@@ -1,11 +1,16 @@
1
- const require_rolldown_runtime = require("./rolldown-runtime-CPE0t6oh.cjs");
2
- const require_errors = require("./errors-Cl69p_vI.cjs");
3
- const require_Telemetry = require("./Telemetry-B5V_ufmv.cjs");
4
- const require_utils = require("./utils-C3vTpUje.cjs");
5
- const require_text = require("./text-DrsG1EDN.cjs");
6
- const require_config = require("./config-BG_Nr2CZ.cjs");
7
- const require_reporters = require("./reporters-GzXlc4CK.cjs");
8
- const require_credentials = require("./credentials-DDaKqtJn.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ const require_errors = require("./errors-BponpdjN.cjs");
3
+ const require_isCIEnvironment = require("./isCIEnvironment-DiVOMI5Q.cjs");
4
+ const require_spinner = require("./spinner-CfB0sIPy.cjs");
5
+ const require_package = require("./package-B1hUUjio.cjs");
6
+ const require_Telemetry = require("./Telemetry-B52pKz9i.cjs");
7
+ const require_env = require("./env-eu3XyKqJ.cjs");
8
+ const require_intro = require("./intro-YPaf1Imr.cjs");
9
+ const require_config = require("./config-CRrmj88c.cjs");
10
+ const require_config$1 = require("./config-BWj9jBVj.cjs");
11
+ const require_text = require("./text-Ep3AulAS.cjs");
12
+ const require_reporters = require("./reporters-2cgjvXwR.cjs");
13
+ const require_credentials = require("./credentials-DEsGwcGD.cjs");
9
14
  let node_util = require("node:util");
10
15
  let node_os = require("node:os");
11
16
  let node_process = require("node:process");
@@ -18,7 +23,7 @@ _clack_prompts = require_rolldown_runtime.__toESM(_clack_prompts, 1);
18
23
  let _kubb_core = require("@kubb/core");
19
24
  let _kubb_studio = require("@kubb/studio");
20
25
  let _kubb_studio_protocol = require("@kubb/studio/protocol");
21
- //#region ../../internals/utils/src/copyToClipboard.ts
26
+ // ../../internals/utils/src/copyToClipboard.ts
22
27
  const COMMANDS = {
23
28
  darwin: ["pbcopy"],
24
29
  win32: ["clip.exe"],
@@ -34,7 +39,7 @@ const COMMANDS = {
34
39
  */
35
40
  async function copyToClipboard(text) {
36
41
  const command = node_process.default.platform === "linux" && node_process.default.env.WAYLAND_DISPLAY ? ["wl-copy"] : COMMANDS[node_process.default.platform];
37
- if (!command || require_Telemetry.isCIEnvironment()) return false;
42
+ if (!command || require_isCIEnvironment.isCIEnvironment()) return false;
38
43
  const [name, ...args] = command;
39
44
  const run = (0, tinyexec.x)(name, args, {
40
45
  timeout: 2e3,
@@ -48,14 +53,13 @@ async function copyToClipboard(text) {
48
53
  run.process?.stdin?.end(text);
49
54
  return run.then(({ exitCode }) => exitCode === 0, () => false);
50
55
  }
51
- //#endregion
52
- //#region ../../internals/utils/src/openInBrowser.ts
56
+ // ../../internals/utils/src/openInBrowser.ts
53
57
  const ignore = () => {};
54
58
  /**
55
59
  * Opens a URL or local file in the default browser, unless running in CI.
56
60
  */
57
61
  function openInBrowser(target) {
58
- if (require_Telemetry.isCIEnvironment()) return;
62
+ if (require_isCIEnvironment.isCIEnvironment()) return;
59
63
  if (node_process.default.platform === "win32") {
60
64
  (0, tinyexec.x)("cmd", [
61
65
  "/c",
@@ -67,8 +71,7 @@ function openInBrowser(target) {
67
71
  }
68
72
  (0, tinyexec.x)(node_process.default.platform === "darwin" ? "open" : "xdg-open", [target]).then(ignore, ignore);
69
73
  }
70
- //#endregion
71
- //#region src/runners/studio/run.ts
74
+ // src/runners/studio/run.ts
72
75
  /**
73
76
  * Pairs this machine with Studio and stores the resulting token.
74
77
  *
@@ -77,7 +80,7 @@ function openInBrowser(target) {
77
80
  * server log, or a `Referer` header.
78
81
  */
79
82
  async function login({ studioUrl, autoOpen }, { signal, previousCredentials } = {}) {
80
- const spinner = require_utils.createSpinner();
83
+ const spinner = require_spinner.createSpinner();
81
84
  let retryUntil = 0;
82
85
  let waiting = false;
83
86
  let countdown;
@@ -90,7 +93,7 @@ async function login({ studioUrl, autoOpen }, { signal, previousCredentials } =
90
93
  machineId: await require_credentials.getMachineId(),
91
94
  signal,
92
95
  onCode: (session) => {
93
- require_text.logStep([
96
+ require_intro.logStep([
94
97
  "Pair this machine",
95
98
  `${(0, node_util.styleText)("dim", "Open")} ${(0, node_util.styleText)("cyan", session.verification_uri)}`,
96
99
  `${(0, node_util.styleText)("dim", "Code")} ${(0, node_util.styleText)("bold", session.user_code)}`
@@ -102,7 +105,7 @@ async function login({ studioUrl, autoOpen }, { signal, previousCredentials } =
102
105
  clearInterval(countdown);
103
106
  spinner.start(waitingText());
104
107
  waiting = true;
105
- if (require_text.isRichOutput()) countdown = setInterval(() => Date.now() > retryUntil && spinner.message(waitingText()), 1e3);
108
+ if (require_env.isRichOutput()) countdown = setInterval(() => Date.now() > retryUntil && spinner.message(waitingText()), 1e3);
106
109
  copyToClipboard(session.user_code).then((done) => {
107
110
  copied = done;
108
111
  });
@@ -212,12 +215,12 @@ function formatPermissionRows(granted) {
212
215
  * Flags win, saved answers are reused, and the rest are asked in one list whose answers are stored
213
216
  * in `~/.kubb/credentials.json`.
214
217
  */
215
- async function resolvePermissions(options, credentials, configPath = require_config.KUBB_CONFIG_FILENAME) {
218
+ async function resolvePermissions(options, credentials, configPath = require_config.KUBB_CONFIG_FILENAME, { edit = false } = {}) {
216
219
  const project = node_process.default.cwd();
217
220
  const remembered = credentials.projects?.[project];
218
221
  const granted = Object.fromEntries(PERMISSIONS.map(({ key }) => [key, options.permission[key] || remembered?.[key] === true]));
219
- const pending = PERMISSIONS.filter(({ key }) => !options.permission[key] && typeof remembered?.[key] !== "boolean");
220
- if (!pending.length || require_Telemetry.isCIEnvironment() || !require_text.canUseTTY()) return granted;
222
+ const pending = PERMISSIONS.filter(({ key }) => !options.permission[key] && (edit || typeof remembered?.[key] !== "boolean"));
223
+ if (!pending.length || require_isCIEnvironment.isCIEnvironment() || !require_env.canUseTTY()) return granted;
221
224
  _clack_prompts.updateSettings({ withGuide: true });
222
225
  const selected = await _clack_prompts.multiselect({
223
226
  message: "What may Kubb Studio do in this project?",
@@ -226,9 +229,13 @@ async function resolvePermissions(options, credentials, configPath = require_con
226
229
  label: title(configPath),
227
230
  hint
228
231
  })),
232
+ ...edit ? { initialValues: pending.filter(({ key }) => remembered?.[key] === true).map(({ key }) => key) } : {},
229
233
  required: false
230
234
  });
231
- if (_clack_prompts.isCancel(selected)) return granted;
235
+ if (_clack_prompts.isCancel(selected)) {
236
+ if (edit) throw new Error("Canceled. Permissions are unchanged.");
237
+ return granted;
238
+ }
232
239
  const answers = Object.fromEntries(pending.map(({ key }) => [key, selected.includes(key)]));
233
240
  await require_credentials.writeCredentials({
234
241
  ...credentials,
@@ -249,7 +256,7 @@ async function resolvePermissions(options, credentials, configPath = require_con
249
256
  * Loads the project's Kubb config the same way `kubb generate` does, one entry per `defineConfig(...)` entry.
250
257
  */
251
258
  async function loadConfigs(options) {
252
- const { configPath, configs } = await require_config.getConfigs({
259
+ const { configPath, configs } = await require_config$1.getConfigs({
253
260
  configPath: options.configPath,
254
261
  logLevel: options.logLevel
255
262
  });
@@ -269,7 +276,7 @@ async function prepareConnection(options, signal) {
269
276
  const stored = await require_credentials.readCredentials();
270
277
  const credentials = await (async () => {
271
278
  if (stored?.studioUrl === options.studioUrl) return stored;
272
- if (require_Telemetry.isCIEnvironment()) throw new _kubb_core.Diagnostics.Error({
279
+ if (require_isCIEnvironment.isCIEnvironment()) throw new _kubb_core.Diagnostics.Error({
273
280
  code: _kubb_core.Diagnostics.code.unknown,
274
281
  severity: "error",
275
282
  message: `Not paired with ${options.studioUrl}. In CI, run \`kubb studio snapshot\` instead, or run \`kubb studio login\` on a machine with a browser.`
@@ -295,7 +302,7 @@ async function connect(options, context = {}) {
295
302
  let unwatch;
296
303
  try {
297
304
  if (!context.prepared) {
298
- const { getWorkerStatus } = await Promise.resolve().then(() => require("./background-CdPT1eaq.cjs"));
305
+ const { getWorkerStatus } = await Promise.resolve().then(() => require("./background-CK2gQtTU.cjs"));
299
306
  if ((await getWorkerStatus()).running) throw new _kubb_core.Diagnostics.Error({
300
307
  code: _kubb_core.Diagnostics.code.unknown,
301
308
  severity: "error",
@@ -311,9 +318,9 @@ async function connect(options, context = {}) {
311
318
  require_reporters.setupReporters(hooks, {
312
319
  logLevel: _kubb_core.logLevel[options.logLevel ?? "info"],
313
320
  reporters: [_kubb_core.cliReporter],
314
- ...context.onState ? { writer: require_text.plainWriter } : {}
321
+ ...context.onState ? { writer: require_intro.plainWriter } : {}
315
322
  });
316
- const listens = !context.onState && node_process.default.stdin.isTTY === true && require_text.canUseTTY();
323
+ const listens = !context.onState && node_process.default.stdin.isTTY === true && require_env.canUseTTY();
317
324
  let background = false;
318
325
  hooks.hook("studio:connected", async () => {
319
326
  pairedAgain = false;
@@ -327,8 +334,8 @@ async function connect(options, context = {}) {
327
334
  });
328
335
  if (hinted || context.onState || options.logLevel === "silent") return;
329
336
  hinted = true;
330
- require_text.logBlock([`${(0, node_util.styleText)("dim", "Project")} ${node_path.default.basename(node_process.default.cwd())} ${(0, node_util.styleText)("dim", PERMISSIONS.filter(({ key }) => permissions[key]).map(({ label }) => label).join(" · ") || "no permissions")}`, (0, node_util.styleText)("dim", listens ? "Press b to keep running in the background, Ctrl+C to disconnect" : "Press Ctrl+C to disconnect")]);
331
- require_text.logTip();
337
+ require_intro.logBlock([`${(0, node_util.styleText)("dim", "Project")} ${node_path.default.basename(node_process.default.cwd())} ${(0, node_util.styleText)("dim", PERMISSIONS.filter(({ key }) => permissions[key]).map(({ label }) => label).join(" · ") || "no permissions")}`, (0, node_util.styleText)("dim", listens ? "Press b to keep running in the background, Ctrl+C to disconnect" : "Press Ctrl+C to disconnect")]);
338
+ require_intro.logTip();
332
339
  });
333
340
  hooks.hook("studio:reconnecting", () => context.onState?.("reconnecting"));
334
341
  for (;;) try {
@@ -349,7 +356,7 @@ async function connect(options, context = {}) {
349
356
  await context.onState?.("authentication required");
350
357
  await require_credentials.clearCredentials();
351
358
  if (pairedAgain) throw new Error(`${error.message} Studio rejected the newly approved token too. Run \`kubb studio login\` and try again.`);
352
- if (context.onState || require_Telemetry.isCIEnvironment() || !require_text.canUseTTY()) throw new Error(`${error.message} Run \`kubb studio login\` to pair again.`);
359
+ if (context.onState || require_isCIEnvironment.isCIEnvironment() || !require_env.canUseTTY()) throw new Error(`${error.message} Run \`kubb studio login\` to pair again.`);
353
360
  unwatch?.();
354
361
  unwatch = void 0;
355
362
  console.log((0, node_util.styleText)("yellow", `${error.message} Pairing again...`));
@@ -363,12 +370,12 @@ async function connect(options, context = {}) {
363
370
  await hooks.callHook("kubb:lifecycle:end");
364
371
  unwatch?.();
365
372
  if (background) {
366
- const { startWorker } = await Promise.resolve().then(() => require("./background-CdPT1eaq.cjs"));
373
+ const { startWorker } = await Promise.resolve().then(() => require("./background-CK2gQtTU.cjs"));
367
374
  await startWorker(options);
368
- if (options.logLevel !== "silent") require_text.logOutro("Running in the background · kubb studio stop");
375
+ if (options.logLevel !== "silent") require_intro.logOutro("Running in the background · kubb studio stop");
369
376
  return;
370
377
  }
371
- if (!context.onState && signal.aborted && options.logLevel !== "silent") require_text.logOutro("Disconnected");
378
+ if (!context.onState && signal.aborted && options.logLevel !== "silent") require_intro.logOutro("Disconnected");
372
379
  } catch (error) {
373
380
  if (!(error instanceof _kubb_studio.PairingCanceledError)) throw error;
374
381
  } finally {
@@ -409,7 +416,7 @@ function watchKeys({ onBackground, onStop }) {
409
416
  */
410
417
  async function runStudio(values, action, { block = false, json = false } = {}) {
411
418
  const options = {
412
- version: require_Telemetry.version,
419
+ version: require_package.version,
413
420
  configPath: values.config,
414
421
  studioUrl: values.url ?? _kubb_studio.defaultStudioUrl,
415
422
  permission: Object.fromEntries(Object.values(_kubb_studio_protocol.AgentPermission).map((key) => [key, values[key] ?? false])),
@@ -421,7 +428,7 @@ async function runStudio(values, action, { block = false, json = false } = {}) {
421
428
  hrStart: node_process.default.hrtime()
422
429
  });
423
430
  try {
424
- if (options.logLevel !== "silent" && !json) require_text.logIntro({
431
+ if (options.logLevel !== "silent" && !json) require_intro.logIntro({
425
432
  warning: (0, node_util.styleText)("yellow", "This feature is still under development, use with caution"),
426
433
  block
427
434
  });
@@ -433,12 +440,12 @@ async function runStudio(values, action, { block = false, json = false } = {}) {
433
440
  node_process.default.exitCode = 1;
434
441
  }
435
442
  }
436
- //#endregion
437
443
  exports.connect = connect;
438
444
  exports.formatPermissionRows = formatPermissionRows;
439
445
  exports.loadConfigs = loadConfigs;
440
446
  exports.login = login;
441
447
  exports.prepareConnection = prepareConnection;
448
+ exports.resolvePermissions = resolvePermissions;
442
449
  exports.runStudio = runStudio;
443
450
 
444
- //# sourceMappingURL=run-C8Prej7s.cjs.map
451
+ //# sourceMappingURL=run-CQORv7Gq.cjs.map