@kubb/cli 5.14.5 → 5.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (186) hide show
  1. package/bin/kubb.js +2 -1
  2. package/dist/{Telemetry-Dc79_cIA.js → Telemetry-B3edcFoB.js} +12 -86
  3. package/dist/Telemetry-B3edcFoB.js.map +1 -0
  4. package/dist/{Telemetry-Dc9DVxKQ.cjs → Telemetry-COWGqYmh.cjs} +14 -118
  5. package/dist/Telemetry-COWGqYmh.cjs.map +1 -0
  6. package/dist/{background-v5pDy3IJ.cjs → background-B24lIehn.cjs} +5 -6
  7. package/dist/{background-v5pDy3IJ.cjs.map → background-B24lIehn.cjs.map} +1 -1
  8. package/dist/{background-C877JFxE.js → background-D-7OGjvg.js} +1 -1
  9. package/dist/{background-3_KudPH-.js → background-_dKcGjM7.js} +5 -6
  10. package/dist/{background-3_KudPH-.js.map → background-_dKcGjM7.js.map} +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-CEyJhBnh.js → intro-9PB8sE8z.js} +8 -52
  53. package/dist/intro-9PB8sE8z.js.map +1 -0
  54. package/dist/{text-CC2xdpGL.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-CYPOFKnP.cjs +20 -0
  65. package/dist/mcp-CYPOFKnP.cjs.map +1 -0
  66. package/dist/mcp-CxeZR5vb.js +21 -0
  67. package/dist/mcp-CxeZR5vb.js.map +1 -0
  68. package/dist/package-D3Yss9Bb.js +5 -0
  69. package/dist/package-D3Yss9Bb.js.map +1 -0
  70. package/dist/package-aX0q9SZr.cjs +10 -0
  71. package/dist/package-aX0q9SZr.cjs.map +1 -0
  72. package/dist/{registry-ov1RYcD4.js → registry-B3eYk4LN.js} +7 -67
  73. package/dist/registry-B3eYk4LN.js.map +1 -0
  74. package/dist/{registry-BInbtBm7.cjs → registry-YE1pFWL-.cjs} +4 -82
  75. package/dist/registry-YE1pFWL-.cjs.map +1 -0
  76. package/dist/{reporters-DQz--AdE.cjs → reporters-2cgjvXwR.cjs} +32 -40
  77. package/dist/{reporters-DQz--AdE.cjs.map → reporters-2cgjvXwR.cjs.map} +1 -1
  78. package/dist/{reporters-BtD41K-C.js → reporters-BM430HdQ.js} +19 -27
  79. package/dist/{reporters-BtD41K-C.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-B4zvF9WY.cjs +233 -0
  85. package/dist/run-B4zvF9WY.cjs.map +1 -0
  86. package/dist/run-BYP_t9dR.cjs +324 -0
  87. package/dist/run-BYP_t9dR.cjs.map +1 -0
  88. package/dist/{run-1oXPIkli.cjs → run-Bb19PlwV.cjs} +44 -37
  89. package/dist/run-Bb19PlwV.cjs.map +1 -0
  90. package/dist/{run-B03V0Poj.cjs → run-BoO7H8RA.cjs} +49 -41
  91. package/dist/run-BoO7H8RA.cjs.map +1 -0
  92. package/dist/run-BrM7-NSV.js +181 -0
  93. package/dist/run-BrM7-NSV.js.map +1 -0
  94. package/dist/{run-UsAMlUyy.js → run-C0KI-NE3.js} +9 -9
  95. package/dist/{run-UsAMlUyy.js.map → run-C0KI-NE3.js.map} +1 -1
  96. package/dist/run-CCLPt4hr.js +1 -0
  97. package/dist/run-CCsdLz3X.js +385 -0
  98. package/dist/run-CCsdLz3X.js.map +1 -0
  99. package/dist/{run-YMSJnvYl.js → run-CbX6tpqB.js} +31 -23
  100. package/dist/run-CbX6tpqB.js.map +1 -0
  101. package/dist/run-CrM4jsix.cjs +80 -0
  102. package/dist/run-CrM4jsix.cjs.map +1 -0
  103. package/dist/run-CvFakE3B.cjs +185 -0
  104. package/dist/run-CvFakE3B.cjs.map +1 -0
  105. package/dist/run-D-nn9-Wq.js +319 -0
  106. package/dist/run-D-nn9-Wq.js.map +1 -0
  107. package/dist/{run-cBSr2F1q.cjs → run-D5Z6nfzK.cjs} +5 -6
  108. package/dist/{run-cBSr2F1q.cjs.map → run-D5Z6nfzK.cjs.map} +1 -1
  109. package/dist/{run-BUzdEUaE.cjs → run-DCqmf5W1.cjs} +10 -10
  110. package/dist/{run-BUzdEUaE.cjs.map → run-DCqmf5W1.cjs.map} +1 -1
  111. package/dist/{run-BK-A9JDf.js → run-DFXhBS64.js} +5 -6
  112. package/dist/{run-BK-A9JDf.js.map → run-DFXhBS64.js.map} +1 -1
  113. package/dist/run-DgGZOC_x.cjs +389 -0
  114. package/dist/run-DgGZOC_x.cjs.map +1 -0
  115. package/dist/{run-DDwdeHgU.js → run-KqdudiWQ.js} +26 -20
  116. package/dist/run-KqdudiWQ.js.map +1 -0
  117. package/dist/run-RN_31Q4u.js +228 -0
  118. package/dist/run-RN_31Q4u.js.map +1 -0
  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-BrwynBfC.cjs → snapshot-D7Ytw8S0.cjs} +13 -14
  124. package/dist/{snapshot-BrwynBfC.cjs.map → snapshot-D7Ytw8S0.cjs.map} +1 -1
  125. package/dist/{snapshot-D2E7nhEf.js → snapshot-n7dJGCWv.js} +10 -11
  126. package/dist/{snapshot-D2E7nhEf.js.map → snapshot-n7dJGCWv.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-CxzhvjKs.cjs → status-Bc0_4T41.cjs} +7 -8
  132. package/dist/{status-CxzhvjKs.cjs.map → status-Bc0_4T41.cjs.map} +1 -1
  133. package/dist/{status-BHIOMCM0.js → status-DxSkp1cH.js} +6 -7
  134. package/dist/{status-BHIOMCM0.js.map → status-DxSkp1cH.js.map} +1 -1
  135. package/dist/studio-BpYwgFb0.cjs +218 -0
  136. package/dist/studio-BpYwgFb0.cjs.map +1 -0
  137. package/dist/studio-mw6HaPkr.js +215 -0
  138. package/dist/studio-mw6HaPkr.js.map +1 -0
  139. package/dist/studioWorker.js +4 -5
  140. package/dist/{summary-B219y888.js → summary-CbmQKA8l.js} +5 -6
  141. package/dist/{summary-B219y888.js.map → summary-CbmQKA8l.js.map} +1 -1
  142. package/dist/{summary-BOYsqub3.cjs → summary-Clvl5Hxs.cjs} +7 -8
  143. package/dist/{summary-BOYsqub3.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-8ZcWXfMt.js +28 -0
  165. package/dist/validate-8ZcWXfMt.js.map +1 -0
  166. package/dist/validate-CMSeDpGT.cjs +27 -0
  167. package/dist/validate-CMSeDpGT.cjs.map +1 -0
  168. package/package.json +7 -7
  169. package/dist/Telemetry-Dc79_cIA.js.map +0 -1
  170. package/dist/Telemetry-Dc9DVxKQ.cjs.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-BInbtBm7.cjs.map +0 -1
  175. package/dist/registry-ov1RYcD4.js.map +0 -1
  176. package/dist/run-1oXPIkli.cjs.map +0 -1
  177. package/dist/run-B03V0Poj.cjs.map +0 -1
  178. package/dist/run-DDwdeHgU.js.map +0 -1
  179. package/dist/run-YMSJnvYl.js.map +0 -1
  180. package/dist/run-v5aW1jjQ.js +0 -1
  181. package/dist/text-CC2xdpGL.cjs.map +0 -1
  182. package/dist/text-CEyJhBnh.js.map +0 -1
  183. package/dist/utils-8E1nF4C1.cjs +0 -645
  184. package/dist/utils-8E1nF4C1.cjs.map +0 -1
  185. package/dist/utils-D8VN40bN.js +0 -536
  186. package/dist/utils-D8VN40bN.js.map +0 -1
@@ -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-Dc9DVxKQ.cjs");
4
- const require_utils = require("./utils-8E1nF4C1.cjs");
5
- const require_text = require("./text-CC2xdpGL.cjs");
6
- const require_config = require("./config-BG_Nr2CZ.cjs");
7
- const require_reporters = require("./reporters-DQz--AdE.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-aX0q9SZr.cjs");
6
+ const require_Telemetry = require("./Telemetry-COWGqYmh.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-v5pDy3IJ.cjs"));
305
+ const { getWorkerStatus } = await Promise.resolve().then(() => require("./background-B24lIehn.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-v5pDy3IJ.cjs"));
373
+ const { startWorker } = await Promise.resolve().then(() => require("./background-B24lIehn.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-1oXPIkli.cjs.map
451
+ //# sourceMappingURL=run-Bb19PlwV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-Bb19PlwV.cjs","names":["process","isCIEnvironment","x","isCIEnvironment","process","createSpinner","pairAgent","path","process","hostname","getMachineId","styleText","isRichOutput","writeCredentials","getCredentialsPath","PairingCanceledError","AgentPermission","toPermissionFlag","KUBB_CONFIG_FILENAME","isCIEnvironment","canUseTTY","prompts","getConfigs","Diagnostics","readCredentials","Hookable","logLevelMap","cliReporter","plainWriter","connectAgent","InvalidAgentTokenError","clearCredentials","defaultStudioUrl","trackRun","toError"],"sources":["../../../internals/utils/src/copyToClipboard.ts","../../../internals/utils/src/openInBrowser.ts","../src/runners/studio/run.ts"],"sourcesContent":["import process from 'node:process'\nimport { x } from 'tinyexec'\nimport { isCIEnvironment } from './isCIEnvironment.ts'\n\nconst COMMANDS: Partial<Record<NodeJS.Platform, [string, ...Array<string>]>> = {\n darwin: ['pbcopy'],\n win32: ['clip.exe'],\n linux: ['xclip', '-selection', 'clipboard'],\n}\n\n/**\n * Copies text to the system clipboard with the platform's own tool. Resolves `false` in CI, on a\n * platform without a known tool, or when the tool is missing or fails.\n */\nexport async function copyToClipboard(text: string): Promise<boolean> {\n // Wayland sessions have no X selection for xclip to serve, so they use `wl-copy`.\n const command = process.platform === 'linux' && process.env.WAYLAND_DISPLAY ? (['wl-copy'] as const) : COMMANDS[process.platform]\n if (!command || isCIEnvironment()) return false\n\n const [name, ...args] = command\n // stdout and stderr are ignored: xclip and wl-copy stay alive to serve the selection and would hold open pipes until the timeout.\n const run = x(name, args, { timeout: 2_000, nodeOptions: { stdio: ['pipe', 'ignore', 'ignore'] } })\n // A missing tool closes stdin before the write lands; the rejection below reports it.\n run.process?.stdin?.once('error', () => {})\n run.process?.stdin?.end(text)\n\n return run.then(\n ({ exitCode }) => exitCode === 0,\n () => false,\n )\n}\n","import process from 'node:process'\nimport { x } from 'tinyexec'\nimport { isCIEnvironment } from './isCIEnvironment.ts'\n\nconst ignore = () => {}\n\n/**\n * Opens a URL or local file in the default browser, unless running in CI.\n */\nexport function openInBrowser(target: string): void {\n if (isCIEnvironment()) return\n\n if (process.platform === 'win32') {\n x('cmd', ['/c', 'start', '', target]).then(ignore, ignore)\n return\n }\n x(process.platform === 'darwin' ? 'open' : 'xdg-open', [target]).then(ignore, ignore)\n}\n","import { hostname } from 'node:os'\nimport { toPermissionFlag } from '../../ui/text.ts'\nimport path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport * as prompts from '@clack/prompts'\nimport { KUBB_CONFIG_FILENAME } from '@internals/shared'\nimport { copyToClipboard, isCIEnvironment, openInBrowser, toError } from '@internals/utils'\nimport type { CLIOptions, Config } from '@kubb/core'\nimport { cliReporter, Diagnostics, Hookable, type KubbHooks, logLevel as logLevelMap } from '@kubb/core'\nimport { connectAgent, defaultStudioUrl, InvalidAgentTokenError, pairAgent, PairingCanceledError } from '@kubb/studio'\nimport { AgentPermission } from '@kubb/studio/protocol'\nimport { trackRun } from '../../Telemetry.ts'\nimport { plainWriter } from '../../loggers/plainWriter.ts'\nimport setupReporters from '../../loggers/reporters.ts'\nimport { logIntro, logOutro, logTip } from '../../ui/intro.ts'\nimport { logBlock, logStep } from '../../ui/log.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { canUseTTY, isRichOutput } from '../../utils/env.ts'\nimport { getConfigs } from '../../config.ts'\nimport { clearCredentials, type Credentials, getCredentialsPath, getMachineId, readCredentials, writeCredentials } from './credentials.ts'\nimport { version } from '../../../package.json'\n\nexport type StudioOptions = {\n /**\n * Current `@kubb/cli` version, reported to Studio and used for the telemetry payload.\n */\n version: string\n configPath?: string\n /**\n * Base URL of the Studio instance, for a self-hosted deployment. Resolved before it reaches here,\n * since stored credentials are bound to it.\n */\n studioUrl: string\n /**\n * What Studio may do in this project. Each flag grants outright; the rest are asked once per\n * project through {@link resolvePermissions}.\n */\n permission: Record<AgentPermission, boolean>\n /**\n * Whether to open the approval page in a browser during pairing.\n */\n autoOpen: boolean\n logLevel?: CLIOptions['logLevel']\n}\n\nexport type SnapshotOptions = Pick<StudioOptions, 'configPath' | 'studioUrl' | 'logLevel'> & {\n /**\n * Organization CI API key. Falls back to `KUBB_TOKEN`.\n */\n token?: string\n /**\n * Stable identity for the CI agent. Falls back to CI auto-detection.\n */\n id?: string\n /** Identity of another CI agent to also compare with. Falls back to CI auto-detection. */\n baseId?: string\n /**\n * Package name for the generated tarball. Falls back to the nearest package.json.\n */\n name?: string\n /**\n * Package version for the generated tarball. Falls back to the nearest package.json.\n */\n packageVersion?: string\n /**\n * Print the result as one JSON object instead of a summary.\n */\n json?: boolean\n}\n\n/** The flags a `kubb studio` subcommand parsed; each one is optional since a subcommand declares only the flags it uses. */\nexport type StudioValues = {\n config?: string\n url?: string\n allowRead?: boolean\n allowReadAst?: boolean\n allowWrite?: boolean\n allowConfigEdit?: boolean\n allowInstall?: boolean\n allowUpdate?: boolean\n allowRemove?: boolean\n allowSaveInput?: boolean\n allowExec?: boolean\n open?: boolean\n logLevel?: CLIOptions['logLevel']\n}\n\ntype LoginOptions = {\n /**\n * Aborting this cancels an in-flight pairing request or poll and rejects with\n * {@link PairingCanceledError}. Wired to `kubb studio`'s shutdown signal, so Ctrl+C during\n * pairing cancels it instead of leaving the poll running.\n */\n signal?: AbortSignal\n /**\n * Credentials from before this login. When the fresh pairing resolves to the same agent on the\n * same Studio, its saved project permissions carry forward instead of being asked again.\n * Left out for an explicitly requested `kubb studio login`, which always starts clean.\n */\n previousCredentials?: Credentials | null\n}\n\n/**\n * Pairs this machine with Studio and stores the resulting token.\n *\n * The CLI holds a code and the browser approves it, rather than the user copying a token out of\n * the UI. The token comes back over the CLI's own HTTPS POST, so it never lands in a URL, a\n * server log, or a `Referer` header.\n */\nexport async function login({ studioUrl, autoOpen }: StudioOptions, { signal, previousCredentials }: LoginOptions = {}): Promise<Credentials> {\n const spinner = createSpinner()\n // A retry notice stays on screen a while before the countdown takes the line back.\n let retryUntil = 0\n // The spinner only starts once a code is shown.\n let waiting = false\n let countdown: NodeJS.Timeout | undefined\n\n try {\n const { token, agent } = await pairAgent({\n studioUrl,\n type: 'cli',\n name: path.basename(process.cwd()),\n hostname: hostname(),\n machineId: await getMachineId(),\n signal,\n onCode: (session) => {\n logStep(\n [\n 'Pair this machine',\n `${styleText('dim', 'Open')} ${styleText('cyan', session.verification_uri)}`,\n `${styleText('dim', 'Code')} ${styleText('bold', session.user_code)}`,\n ].join('\\n'),\n )\n\n if (autoOpen) {\n openInBrowser(session.verification_uri_complete)\n }\n\n // Same fallback as the poll in `@kubb/studio`, so the countdown ends when polling does.\n const deadline = Date.now() + (session.expires_in > 0 ? session.expires_in : 600) * 1000\n let copied = false\n const waitingText = () =>\n `Waiting for approval ${styleText('dim', `expires in ${formatCountdown(deadline - Date.now())}${copied ? ' · code copied' : ''} · ctrl+c to cancel`)}`\n clearInterval(countdown)\n spinner.start(waitingText())\n waiting = true\n // Plain output prints every message, so only an animated spinner ticks.\n if (isRichOutput()) countdown = setInterval(() => Date.now() > retryUntil && spinner.message(waitingText()), 1000)\n // Not awaited: the code shows at once, and the spinner picks up the copy when it lands.\n void copyToClipboard(session.user_code).then((done) => {\n copied = done\n })\n },\n onRetry: (error) => {\n retryUntil = Date.now() + 5000\n spinner.message(`Could not reach Kubb Studio, retrying: ${error.message}`)\n },\n })\n clearInterval(countdown)\n spinner.stop(`Paired as ${agent.name}${agent.organizationSlug ? ` · org ${agent.organizationSlug}` : ''}`)\n\n const keepsIdentity = previousCredentials?.studioUrl === studioUrl && previousCredentials.agentId === agent.id\n const credentials: Credentials = {\n studioUrl,\n token,\n agentId: agent.id,\n agentSlug: agent.slug,\n ...(agent.organizationSlug ? { organizationSlug: agent.organizationSlug } : {}),\n ...(keepsIdentity && previousCredentials?.projects ? { projects: previousCredentials.projects } : {}),\n }\n await writeCredentials(credentials)\n\n console.log(`Credentials stored in ${getCredentialsPath()}`)\n\n return credentials\n } catch (error) {\n clearInterval(countdown)\n if (waiting) {\n spinner.stop(error instanceof PairingCanceledError ? 'Pairing canceled' : 'Pairing failed')\n }\n throw error\n }\n}\n\n/** Time left on a pairing code as `m:ss`, never below `0:00`. */\nexport function formatCountdown(ms: number): string {\n const seconds = Math.max(0, Math.ceil(ms / 1000))\n\n return `${Math.floor(seconds / 60)}:${String(seconds % 60).padStart(2, '0')}`\n}\n\n/**\n * What each permission is asked as, in the order the list shows them.\n */\nconst PERMISSIONS: ReadonlyArray<{\n key: AgentPermission\n /**\n * Short label for status output and the connect summary.\n */\n label: string\n title: (configPath: string) => string\n hint: string\n}> = [\n { key: AgentPermission.READ, label: 'read source', title: () => 'Read generated files', hint: 'show code in the browser' },\n { key: AgentPermission.READ_AST, label: 'read spec', title: () => 'Read the parsed spec', hint: 'browse schemas and operations' },\n { key: AgentPermission.WRITE, label: 'write files', title: () => 'Write files to disk', hint: 'generate from the browser' },\n { key: AgentPermission.CONFIG_EDIT, label: 'edit config', title: (configPath) => `Change ${configPath}`, hint: 'edit plugin options' },\n { key: AgentPermission.INSTALL, label: 'add plugins', title: () => 'Install extensions from the registry', hint: 'kubb add from the browser' },\n { key: AgentPermission.UPDATE, label: 'update plugins', title: () => 'Update installed extensions', hint: 'kubb update from the browser' },\n { key: AgentPermission.REMOVE, label: 'remove plugins', title: () => 'Remove extensions', hint: 'kubb remove from the browser' },\n {\n key: AgentPermission.SAVE_INPUT,\n label: 'save input',\n title: (configPath) => `Save the spec from Studio as the input in ${configPath}`,\n hint: 'keep a pasted spec, URL, or git file',\n },\n { key: AgentPermission.EXEC, label: 'run tools', title: () => 'Run the formatter, linter, and postGenerate', hint: 'after each generation' },\n]\n\n/**\n * Two permissions per row, each marked granted or not, with the flags that grant the missing ones\n * after the last row. For `kubb studio status`.\n */\nexport function formatPermissionRows(granted: Partial<Record<AgentPermission, boolean>>): Array<string> {\n const width = Math.max(...PERMISSIONS.map(({ label }) => label.length))\n const cells = PERMISSIONS.map(({ key, label }) => `${granted[key] ? styleText('green', '✓') : styleText('red', '✖')} ${label.padEnd(width)}`)\n const rows = Array.from({ length: Math.ceil(cells.length / 2) }, (_, index) => cells.slice(index * 2, index * 2 + 2).join(' '))\n const flags = PERMISSIONS.filter(({ key }) => !granted[key])\n .map(({ key }) => toPermissionFlag(key))\n .join(' ')\n\n return flags ? [...rows.slice(0, -1), `${rows.at(-1)} ${styleText('dim', flags)}`] : rows\n}\n\n/**\n * Resolves Studio permissions for the current project.\n * Flags win, saved answers are reused, and the rest are asked in one list whose answers are stored\n * in `~/.kubb/credentials.json`.\n */\nexport async function resolvePermissions(\n options: StudioOptions,\n credentials: Credentials,\n configPath: string = KUBB_CONFIG_FILENAME,\n { edit = false }: { edit?: boolean } = {},\n): Promise<Record<AgentPermission, boolean>> {\n const project = process.cwd()\n const remembered = credentials.projects?.[project]\n const granted = Object.fromEntries(PERMISSIONS.map(({ key }) => [key, options.permission[key] || remembered?.[key] === true])) as Record<\n AgentPermission,\n boolean\n >\n // `edit` asks again for every permission no flag grants, with the saved ones checked.\n const pending = PERMISSIONS.filter(({ key }) => !options.permission[key] && (edit || typeof remembered?.[key] !== 'boolean'))\n\n if (!pending.length || isCIEnvironment() || !canUseTTY()) return granted\n\n prompts.updateSettings({ withGuide: true })\n const selected = await prompts.multiselect({\n message: 'What may Kubb Studio do in this project?',\n options: pending.map(({ key, title, hint }) => ({ value: key, label: title(configPath), hint })),\n ...(edit ? { initialValues: pending.filter(({ key }) => remembered?.[key] === true).map(({ key }) => key) } : {}),\n required: false,\n })\n // A canceled list grants nothing and saves nothing, so the next run asks again.\n if (prompts.isCancel(selected)) {\n if (edit) throw new Error('Canceled. Permissions are unchanged.')\n return granted\n }\n\n const answers = Object.fromEntries(pending.map(({ key }) => [key, selected.includes(key)]))\n await writeCredentials({\n ...credentials,\n projects: { ...credentials.projects, [project]: { ...remembered, ...answers } },\n })\n\n return { ...granted, ...answers }\n}\n\n/**\n * Loads the project's Kubb config the same way `kubb generate` does, one entry per `defineConfig(...)` entry.\n */\nexport async function loadConfigs(options: Pick<StudioOptions, 'configPath' | 'logLevel'>): Promise<{ configPath: string; configs: Array<Config> }> {\n const { configPath, configs } = await getConfigs({ configPath: options.configPath, logLevel: options.logLevel })\n\n if (!configs.length) {\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'Config not defined, create a kubb.config.ts or pass it with --config',\n })\n }\n\n // `getConfigs` resolves this to an absolute path. Relativized here, once, so the permission\n // prompt and the path Studio receives over the wire both show the project-relative form instead\n // of leaking the local filesystem layout.\n return { configPath: path.relative(process.cwd(), configPath) || configPath, configs }\n}\n\nexport type PreparedConnection = {\n configPath: string\n credentials: Credentials\n permissions: StudioOptions['permission']\n}\n\n/** Validates the project and resolves pairing and permissions before starting its worker. */\nexport async function prepareConnection(options: StudioOptions, signal?: AbortSignal): Promise<PreparedConnection> {\n const { configPath } = await loadConfigs(options)\n const stored = await readCredentials()\n const credentials = await (async () => {\n if (stored?.studioUrl === options.studioUrl) return stored\n if (isCIEnvironment()) {\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: `Not paired with ${options.studioUrl}. In CI, run \\`kubb studio snapshot\\` instead, or run \\`kubb studio login\\` on a machine with a browser.`,\n })\n }\n return login(options, { signal })\n })()\n const permissions = await resolvePermissions(options, credentials, configPath)\n return { configPath, credentials, permissions }\n}\n\nexport type WorkerState = 'starting' | 'connected' | 'reconnecting' | 'authentication required' | 'stopped'\n\n/** Runs the same project connection in the foreground or in a background worker. */\nexport async function connect(\n options: StudioOptions,\n context: {\n prepared?: PreparedConnection\n signal?: AbortSignal\n onState?: (state: WorkerState) => void | Promise<void>\n } = {},\n): Promise<void> {\n const shutdown = new AbortController()\n const signal = context.signal ?? shutdown.signal\n const stop = () => shutdown.abort()\n const events = process as unknown as NodeJS.EventEmitter\n if (!context.signal) {\n events.once('SIGINT', stop)\n events.once('SIGTERM', stop)\n }\n let unwatch: (() => void) | undefined\n try {\n if (!context.prepared) {\n const { getWorkerStatus } = await import('./background.ts')\n const worker = await getWorkerStatus()\n if (worker.running)\n throw new Diagnostics.Error({\n code: Diagnostics.code.unknown,\n severity: 'error',\n message: 'This project is running in the background. Run `kubb studio stop` first.',\n })\n }\n const prepared = context.prepared ?? (await prepareConnection(options, signal))\n let { credentials, permissions } = prepared\n const { configPath } = prepared\n let hinted = false\n // Set by a fresh pairing until it connects, so a token rejected right after approval fails the run instead of looping.\n let pairedAgain = false\n\n // The background worker writes to a log file, so it gets the plain logger rather than the\n // animated one. The logger also covers the `studio:*` events and each generation run.\n const hooks = new Hookable<KubbHooks>()\n setupReporters(hooks, {\n logLevel: logLevelMap[options.logLevel ?? 'info'],\n reporters: [cliReporter],\n ...(context.onState ? { writer: plainWriter } : {}),\n })\n // `b` hands the session to the background worker; only a foreground run in a terminal listens.\n const listens = !context.onState && process.stdin.isTTY === true && canUseTTY()\n let background = false\n hooks.hook('studio:connected', async () => {\n pairedAgain = false\n await context.onState?.('connected')\n if (listens && !unwatch) {\n unwatch = watchKeys({\n onBackground: () => {\n background = true\n stop()\n },\n onStop: stop,\n })\n }\n if (hinted || context.onState || options.logLevel === 'silent') return\n hinted = true\n logBlock([\n `${styleText('dim', 'Project')} ${path.basename(process.cwd())} ${styleText(\n 'dim',\n PERMISSIONS.filter(({ key }) => permissions[key])\n .map(({ label }) => label)\n .join(' · ') || 'no permissions',\n )}`,\n styleText('dim', listens ? 'Press b to keep running in the background, Ctrl+C to disconnect' : 'Press Ctrl+C to disconnect'),\n ])\n logTip()\n })\n hooks.hook('studio:reconnecting', () => context.onState?.('reconnecting'))\n\n for (;;) {\n try {\n await connectAgent({\n token: credentials.token,\n studioUrl: options.studioUrl,\n configPath,\n version: options.version,\n root: process.cwd(),\n permissions,\n loadConfigs: async () => (await loadConfigs(options)).configs,\n hooks,\n signal,\n })\n break\n } catch (error) {\n if (!(error instanceof InvalidAgentTokenError)) throw error\n await context.onState?.('authentication required')\n await clearCredentials()\n if (pairedAgain) throw new Error(`${error.message} Studio rejected the newly approved token too. Run \\`kubb studio login\\` and try again.`)\n if (context.onState || isCIEnvironment() || !canUseTTY()) throw new Error(`${error.message} Run \\`kubb studio login\\` to pair again.`)\n\n // The pairing prompts need stdin back.\n unwatch?.()\n unwatch = undefined\n console.log(styleText('yellow', `${error.message} Pairing again...`))\n credentials = await login(options, { signal, previousCredentials: credentials })\n pairedAgain = true\n permissions = await resolvePermissions(options, credentials, configPath)\n }\n }\n // Stops the \"Ready for jobs\" spinner, which would otherwise keep drawing under the closing line.\n await hooks.callHook('kubb:lifecycle:end')\n unwatch?.()\n if (background) {\n const { startWorker } = await import('./background.ts')\n await startWorker(options)\n if (options.logLevel !== 'silent') logOutro('Running in the background · kubb studio stop')\n return\n }\n if (!context.onState && signal.aborted && options.logLevel !== 'silent') logOutro('Disconnected')\n } catch (error) {\n if (!(error instanceof PairingCanceledError)) throw error\n } finally {\n unwatch?.()\n events.off('SIGINT', stop)\n events.off('SIGTERM', stop)\n }\n}\n\n/**\n * Listens for single keys on a TTY stdin. Raw mode turns Ctrl+C into a key instead of SIGINT, so it\n * is handled here too. Returns the function that restores the terminal, safe to call twice.\n */\nexport function watchKeys({ onBackground, onStop }: { onBackground: () => void; onStop: () => void }): () => void {\n const stdin = process.stdin\n const onData = (data: Buffer) => {\n const key = data.toString()\n if (key === 'b' || key === 'B') onBackground()\n if (key === '\\u0003') onStop()\n }\n // A clack spinner reads stdin too and exits the process on Ctrl+C, before the session can close\n // its socket, so its Ctrl+C alias is lifted while these keys are read.\n const cancelAlias = prompts.settings.aliases.get('\\u0003')\n prompts.settings.aliases.delete('\\u0003')\n stdin.setRawMode(true)\n stdin.on('data', onData)\n stdin.resume()\n let restored = false\n\n return () => {\n if (restored) return\n restored = true\n if (cancelAlias) prompts.settings.aliases.set('\\u0003', cancelAlias)\n stdin.off('data', onData)\n stdin.setRawMode(false)\n stdin.pause()\n }\n}\n\n/**\n * Runs a Studio command from its parsed flags: builds the {@link StudioOptions}, prints the intro,\n * and reports the run to telemetry. A failure is printed and sets the exit code instead of throwing.\n */\nexport async function runStudio(\n values: StudioValues,\n action: (options: StudioOptions) => Promise<unknown>,\n { block = false, json = false }: { block?: boolean; json?: boolean } = {},\n): Promise<void> {\n const options: StudioOptions = {\n version,\n configPath: values.config,\n studioUrl: values.url ?? defaultStudioUrl,\n permission: Object.fromEntries(Object.values(AgentPermission).map((key) => [key, values[key] ?? false])) as Record<AgentPermission, boolean>,\n autoOpen: values.open ?? true,\n logLevel: values.logLevel,\n }\n const report = trackRun({ command: 'studio', hrStart: process.hrtime() })\n\n try {\n if (options.logLevel !== 'silent' && !json) {\n logIntro({\n warning: styleText('yellow', 'This feature is still under development, use with caution'),\n block,\n })\n }\n\n await action(options)\n\n await report({ status: 'success' })\n } catch (error) {\n await report({ status: 'failed' })\n console.error(toError(error).message)\n process.exitCode = 1\n }\n}\n"],"mappings":"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"}
@@ -1,17 +1,22 @@
1
- const require_rolldown_runtime = require("./rolldown-runtime-CPE0t6oh.cjs");
2
- const require_Telemetry = require("./Telemetry-Dc9DVxKQ.cjs");
3
- const require_utils = require("./utils-8E1nF4C1.cjs");
4
- const require_text = require("./text-CC2xdpGL.cjs");
5
- const require_registry = require("./registry-BInbtBm7.cjs");
6
- const require_config = require("./config-BG_Nr2CZ.cjs");
7
- const require_reporters = require("./reporters-DQz--AdE.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ const require_time = require("./time-3BKoci3G.cjs");
3
+ const require_spinner = require("./spinner-CfB0sIPy.cjs");
4
+ const require_utils = require("./utils-CcARPB45.cjs");
5
+ const require_package = require("./package-aX0q9SZr.cjs");
6
+ const require_Telemetry = require("./Telemetry-COWGqYmh.cjs");
7
+ const require_intro = require("./intro-YPaf1Imr.cjs");
8
+ const require_mascot = require("./mascot-JSA0j3Q_.cjs");
9
+ const require_config = require("./config-BWj9jBVj.cjs");
10
+ const require_registry = require("./registry-YE1pFWL-.cjs");
11
+ const require_text = require("./text-Ep3AulAS.cjs");
12
+ const require_reporters = require("./reporters-2cgjvXwR.cjs");
8
13
  let node_util = require("node:util");
9
14
  let node_process = require("node:process");
10
15
  node_process = require_rolldown_runtime.__toESM(node_process, 1);
11
16
  let node_path = require("node:path");
12
17
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
13
18
  let _kubb_core = require("@kubb/core");
14
- //#region src/runners/generate/run.ts
19
+ // src/runners/generate/run.ts
15
20
  /** NPM registry endpoint used to check for @kubb/cli updates. */
16
21
  const KUBB_NPM_PACKAGE_URL = "https://registry.npmjs.org/@kubb/cli/latest";
17
22
  /** Upper bound in milliseconds for the npm update check, so a slow registry never stalls a run. */
@@ -35,7 +40,7 @@ async function generate(options) {
35
40
  };
36
41
  const kubb = (0, _kubb_core.createKubb)(config, { hooks });
37
42
  const result = await kubb.generate();
38
- await report({
43
+ report({
39
44
  plugins: kubb.config.plugins.flatMap((p) => p && typeof p === "object" ? [{
40
45
  name: p.meta?.name ?? p.name ?? "",
41
46
  options: p.options ?? {}
@@ -45,21 +50,20 @@ async function generate(options) {
45
50
  });
46
51
  return result.success;
47
52
  }
48
- /** The latest published version, `undefined` when the registry does not answer in time. Never rejects. */
49
- async function fetchLatestVersion() {
53
+ /** The latest published version, `undefined` when the registry does not answer in time or `signal` aborts. Never rejects. */
54
+ async function fetchLatestVersion(signal) {
50
55
  try {
51
- return (await (await fetch(KUBB_NPM_PACKAGE_URL, { signal: AbortSignal.timeout(UPDATE_CHECK_TIMEOUT_MS) })).json()).version;
56
+ return (await (await fetch(KUBB_NPM_PACKAGE_URL, { signal: AbortSignal.any([signal, AbortSignal.timeout(UPDATE_CHECK_TIMEOUT_MS)]) })).json()).version;
52
57
  } catch {
53
58
  return;
54
59
  }
55
60
  }
56
- async function checkForUpdate({ hooks, latest }) {
57
- const latestVersion = await latest;
61
+ async function checkForUpdate({ hooks, latestVersion }) {
58
62
  if (latestVersion && require_registry.isOutdated({
59
- installed: require_Telemetry.version,
63
+ installed: require_package.version,
60
64
  latest: latestVersion
61
65
  })) await _kubb_core.Diagnostics.emit(hooks, _kubb_core.Diagnostics.update({
62
- currentVersion: require_Telemetry.version,
66
+ currentVersion: require_package.version,
63
67
  latestVersion
64
68
  }));
65
69
  }
@@ -71,15 +75,19 @@ function logRebuild({ diff: { schemas, operations }, durationMs }) {
71
75
  operations.added && (0, node_util.styleText)("green", `+${require_text.pluralize(operations.added, "operation")}`),
72
76
  operations.removed && (0, node_util.styleText)("red", `-${require_text.pluralize(operations.removed, "operation")}`)
73
77
  ].filter(Boolean).join(" ");
74
- require_text.logStep([`Rebuilt in ${require_Telemetry.formatMs(durationMs)}`, specChange].filter(Boolean).join((0, node_util.styleText)("dim", " · ")));
78
+ require_intro.logStep([`Rebuilt in ${require_time.formatMs(durationMs)}`, specChange].filter(Boolean).join((0, node_util.styleText)("dim", " · ")));
75
79
  }
76
80
  /**
77
81
  * Runs the full Kubb generation lifecycle for the given CLI options.
78
82
  * Loads configs, sets up the reporters (CLI `--reporter` picks which of `config.reporters` to trigger),
79
- * checks for a newer version, and calls `generate` for each config entry.
83
+ * calls `generate` for each config entry, and prints an update notice when the registry answered in time.
80
84
  */
81
85
  async function run({ input, configPath, logLevel: logLevelKey, watch, reporters: cliReporters, dryRun }) {
82
- const latest = fetchLatestVersion();
86
+ const updateCheck = new AbortController();
87
+ let latestVersion;
88
+ fetchLatestVersion(updateCheck.signal).then((value) => {
89
+ latestVersion = value;
90
+ });
83
91
  const logLevel = _kubb_core.logLevel[logLevelKey] ?? _kubb_core.logLevel.info;
84
92
  const hooks = new _kubb_core.Hookable();
85
93
  const requestedNames = cliReporters?.length ? cliReporters : ["cli"];
@@ -89,9 +97,9 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
89
97
  if (json) require_reporters.setupReporters(errorHooks, {
90
98
  logLevel,
91
99
  reporters: [_kubb_core.cliReporter],
92
- writer: require_text.createPlainWriter(console.error)
100
+ writer: require_intro.createPlainWriter(console.error)
93
101
  });
94
- const banner = quiet ? void 0 : require_registry.logBanner(require_Telemetry.version);
102
+ const banner = quiet ? void 0 : require_mascot.logBanner(require_package.version);
95
103
  const loading = require_config.getConfigs({
96
104
  configPath,
97
105
  input,
@@ -100,8 +108,8 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
100
108
  });
101
109
  loading.catch(() => void 0);
102
110
  await banner;
103
- if (!quiet) require_text.logIntro({ title: "Configuration" });
104
- const configSpinner = require_utils.createSpinner();
111
+ if (!quiet) require_intro.logIntro({ title: "Configuration" });
112
+ const configSpinner = require_spinner.createSpinner();
105
113
  let configs;
106
114
  let resolvedConfigPath;
107
115
  try {
@@ -117,7 +125,7 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
117
125
  reporters: [_kubb_core.cliReporter]
118
126
  });
119
127
  await _kubb_core.Diagnostics.emit(errorHooks, error);
120
- if (!quiet) require_text.logOutro((0, node_util.styleText)("red", "✗ Configuration failed"));
128
+ if (!quiet) require_intro.logOutro((0, node_util.styleText)("red", "✗ Configuration failed"));
121
129
  node_process.default.exit(1);
122
130
  }
123
131
  const available = configs[0]?.reporters?.length ? configs[0].reporters : [
@@ -132,12 +140,8 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
132
140
  reporters,
133
141
  dryRun
134
142
  });
135
- await hooks.callHook("kubb:lifecycle:start", { version: require_Telemetry.version });
136
- await checkForUpdate({
137
- hooks,
138
- latest
139
- });
140
- if (!quiet) require_text.logOutro(`${require_text.pluralize(configs.length, "config")} ready`);
143
+ await hooks.callHook("kubb:lifecycle:start", { version: require_package.version });
144
+ if (!quiet) require_intro.logOutro(`${require_text.pluralize(configs.length, "config")} ready`);
141
145
  try {
142
146
  let anyFailed = false;
143
147
  const tracker = watch ? require_utils.trackBuild(hooks) : void 0;
@@ -161,14 +165,14 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
161
165
  const snapshot = tracker.take();
162
166
  if (previous) logRebuild({
163
167
  diff: require_utils.diffBuilds(previous, snapshot),
164
- durationMs: require_Telemetry.getElapsedMs(hrStart)
168
+ durationMs: require_time.getElapsedMs(hrStart)
165
169
  });
166
170
  previous = snapshot;
167
- require_text.logStep(armKeys ? `${label} ${(0, node_util.styleText)("dim", "r rebuild · q quit")}` : label);
171
+ require_intro.logStep(armKeys ? `${label} ${(0, node_util.styleText)("dim", "r rebuild · q quit")}` : label);
168
172
  armKeys?.();
169
173
  if (succeeded) {
170
- require_text.logSpacer();
171
- require_text.logTip();
174
+ require_intro.logSpacer();
175
+ require_intro.logTip();
172
176
  }
173
177
  };
174
178
  let pending = false;
@@ -188,11 +192,11 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
188
192
  });
189
193
  await rebuild();
190
194
  await require_utils.startWatcher([watchPath], rebuild, {
191
- info: require_text.logInfo,
192
- error: require_text.logError
195
+ info: require_intro.logInfo,
196
+ error: require_intro.logError
193
197
  });
194
198
  } else {
195
- if (tracker && !quiet) require_text.logWarn("Watch mode only follows a local `input` file, so this config is generated once.");
199
+ if (tracker && !quiet) require_intro.logWarn("Watch mode only follows a local `input` file, so this config is generated once.");
196
200
  try {
197
201
  if (!await generate({
198
202
  input,
@@ -206,16 +210,20 @@ async function run({ input, configPath, logLevel: logLevelKey, watch, reporters:
206
210
  }
207
211
  }
208
212
  }
213
+ updateCheck.abort();
214
+ await checkForUpdate({
215
+ hooks,
216
+ latestVersion
217
+ });
209
218
  await hooks.callHook("kubb:lifecycle:end");
210
- if (!quiet && !watch && !anyFailed) require_text.logTip();
211
- if (anyFailed) node_process.default.exit(1);
219
+ if (!quiet && !watch && !anyFailed) require_intro.logTip();
220
+ if (anyFailed) node_process.default.exitCode = 1;
212
221
  } catch (error) {
213
222
  await _kubb_core.Diagnostics.emit(errorHooks, error);
214
223
  node_process.default.exit(1);
215
224
  }
216
225
  }
217
- //#endregion
218
226
  exports.generate = generate;
219
227
  exports.run = run;
220
228
 
221
- //# sourceMappingURL=run-B03V0Poj.cjs.map
229
+ //# sourceMappingURL=run-BoO7H8RA.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run-BoO7H8RA.cjs","names":["trackRun","process","memoryStorage","createKubb","isOutdated","version","Diagnostics","styleText","pluralize","formatMs","logLevelMap","Hookable","cliReporter","createPlainWriter","logBanner","getConfigs","createSpinner","path","jsonReporter","fileReporter","htmlReporter","selectReporters","trackBuild","getInputKind","diffBuilds","getElapsedMs","listenForKeys","startWatcher","logInfo","logError"],"sources":["../src/runners/generate/run.ts"],"sourcesContent":["import path from 'node:path'\nimport process from 'node:process'\nimport { styleText } from 'node:util'\nimport { formatMs, formatters, getElapsedMs, linters } from '@internals/utils'\nimport {\n Hookable,\n type CLIOptions,\n cliReporter,\n type Config,\n createKubb,\n Diagnostics,\n fileReporter,\n getInputKind,\n htmlReporter,\n jsonReporter,\n type KubbHooks,\n logLevel as logLevelMap,\n memoryStorage,\n type ReporterName,\n} from '@kubb/core'\nimport { version } from '../../../package.json'\nimport { trackRun } from '../../Telemetry.ts'\nimport { pluralize } from '../../ui/text.ts'\nimport setupReporters, { selectReporters } from '../../loggers/reporters.ts'\nimport { createPlainWriter } from '../../loggers/plainWriter.ts'\nimport { logIntro, logOutro, logSpacer, logTip } from '../../ui/intro.ts'\nimport { logError, logInfo, logStep, logWarn } from '../../ui/log.ts'\nimport { logBanner } from '../../ui/mascot.ts'\nimport { createSpinner } from '../../ui/spinner.ts'\nimport { getConfigs } from '../../config.ts'\nimport { isOutdated } from '../../utils/registry.ts'\nimport { type BuildDiff, type BuildSnapshot, diffBuilds, listenForKeys, startWatcher, trackBuild } from './utils.ts'\n\n/** NPM registry endpoint used to check for @kubb/cli updates. */\nconst KUBB_NPM_PACKAGE_URL = 'https://registry.npmjs.org/@kubb/cli/latest' as const\n\n/** Upper bound in milliseconds for the npm update check, so a slow registry never stalls a run. */\nconst UPDATE_CHECK_TIMEOUT_MS = 3_000\n\n/** The formatter names from `Config['output'].format`, without `'auto'` (detection, not a tool) and `false` (skip). */\ntype FormatterName = Exclude<NonNullable<Config['output']['format']>, 'auto' | false>\ntype LinterName = Exclude<NonNullable<Config['output']['lint']>, 'auto' | false>\n\n// Pinned here, not in `@internals/utils` (which must not import `@kubb/core`): a tool added to the union without a descriptor fails to compile.\nformatters satisfies Record<FormatterName, unknown>\nlinters satisfies Record<LinterName, unknown>\n\ntype GenerateProps = {\n input?: string\n config: Config\n hooks: Hookable<KubbHooks>\n /**\n * When `true`, generates in memory instead of writing to disk, skips formatting, linting, and\n * post-generate commands, and prints what would change on disk.\n */\n dryRun?: boolean\n}\n\nexport async function generate(options: GenerateProps): Promise<boolean> {\n const { input, hooks, dryRun = false } = options\n\n const report = trackRun({ command: 'generate', hrStart: process.hrtime() })\n\n const config: Config = {\n ...options.config,\n input: input ?? options.config.input,\n // Dry-run never touches disk, regardless of the config's own storage driver.\n storage: dryRun ? memoryStorage() : options.config.storage,\n // Also keeps core's `hasOutputPasses` false, so dry-run skips the output manifest write too.\n output: dryRun ? { ...options.config.output, format: false, lint: false, postGenerate: [] } : options.config.output,\n }\n\n // Core formats, lints and runs `output.postGenerate` after an error-free build, and reports\n // their failures as coded diagnostics that reach the summary, the json report and the exit code.\n const kubb = createKubb(config, { hooks })\n const result = await kubb.generate()\n\n // Not awaited: the request finishes in the background, capped by its timeout, so it never delays the summary.\n void report({\n // A setup that threw leaves no driver, so read the configured plugins instead.\n plugins: kubb.config.plugins.flatMap((p) =>\n p && typeof p === 'object' ? [{ name: p.meta?.name ?? p.name ?? '', options: (p.options ?? {}) as Record<string, unknown> }] : [],\n ),\n filesCreated: result.files.length,\n status: result.success ? 'success' : 'failed',\n })\n\n return result.success\n}\n\ntype GenerateCommandOptions = {\n input?: string\n configPath?: string\n logLevel: string\n watch: boolean\n reporters?: Array<ReporterName>\n dryRun?: boolean\n}\n\n/** The latest published version, `undefined` when the registry does not answer in time or `signal` aborts. Never rejects. */\nasync function fetchLatestVersion(signal: AbortSignal): Promise<string | undefined> {\n try {\n const res = await fetch(KUBB_NPM_PACKAGE_URL, { signal: AbortSignal.any([signal, AbortSignal.timeout(UPDATE_CHECK_TIMEOUT_MS)]) })\n const data = (await res.json()) as { version: string }\n return data.version\n } catch {\n // Ignore network errors\n return undefined\n }\n}\n\nasync function checkForUpdate({ hooks, latestVersion }: { hooks: Hookable<KubbHooks>; latestVersion: string | undefined }): Promise<void> {\n if (latestVersion && isOutdated({ installed: version, latest: latestVersion })) {\n await Diagnostics.emit(hooks, Diagnostics.update({ currentVersion: version, latestVersion }))\n }\n}\n\n/** Prints `Rebuilt in 1.2s · +1 schema -2 operations`, without the names part when the spec kept the same names. */\nfunction logRebuild({ diff: { schemas, operations }, durationMs }: { diff: BuildDiff; durationMs: number }): void {\n const specChange = [\n schemas.added && styleText('green', `+${pluralize(schemas.added, 'schema')}`),\n schemas.removed && styleText('red', `-${pluralize(schemas.removed, 'schema')}`),\n operations.added && styleText('green', `+${pluralize(operations.added, 'operation')}`),\n operations.removed && styleText('red', `-${pluralize(operations.removed, 'operation')}`),\n ]\n .filter(Boolean)\n .join(' ')\n logStep([`Rebuilt in ${formatMs(durationMs)}`, specChange].filter(Boolean).join(styleText('dim', ' · ')))\n}\n\n/**\n * Runs the full Kubb generation lifecycle for the given CLI options.\n * Loads configs, sets up the reporters (CLI `--reporter` picks which of `config.reporters` to trigger),\n * calls `generate` for each config entry, and prints an update notice when the registry answered in time.\n */\nexport async function run({ input, configPath, logLevel: logLevelKey, watch, reporters: cliReporters, dryRun }: GenerateCommandOptions): Promise<void> {\n // Started first and never awaited: the notice prints at the end only when the registry has answered by then.\n const updateCheck = new AbortController()\n let latestVersion: string | undefined\n void fetchLatestVersion(updateCheck.signal).then((value) => {\n latestVersion = value\n })\n const logLevel = logLevelMap[logLevelKey as keyof typeof logLevelMap] ?? logLevelMap.info\n const hooks = new Hookable<KubbHooks>()\n\n // CLI `--reporter` selects which reporters to trigger by name, defaulting to `cli`. `defineConfig`\n // registers the built-in reporters on the config; a config exported without it falls back to them below.\n const requestedNames: Array<ReporterName> = cliReporters?.length ? cliReporters : ['cli']\n\n // The `json` reporter owns stdout, so the command writes nothing of its own around it.\n const json = requestedNames.includes('json')\n const quiet = logLevel <= logLevelMap.silent || json\n\n // Errors raised outside a build have no report entry. In `json` mode they go to a stderr logger,\n // so they are never silent and stdout stays one JSON document.\n const errorHooks = json ? new Hookable<KubbHooks>() : hooks\n if (json) setupReporters(errorHooks, { logLevel, reporters: [cliReporter], writer: createPlainWriter(console.error) })\n\n // The config loads while the banner plays; the output still prints in order once the banner is done.\n const banner = quiet ? undefined : logBanner(version)\n const loading = getConfigs({\n configPath,\n input,\n watch,\n logLevel: logLevelKey as CLIOptions['logLevel'],\n })\n // Handled below; this keeps a rejection during the banner from counting as unhandled.\n loading.catch(() => undefined)\n await banner\n\n if (!quiet) {\n logIntro({ title: 'Configuration' })\n }\n\n // Load the config first so `config.reporters` can pick the reporters. A failure here has no\n // reporter installed yet, so fall back to the default `cli` reporter to surface it.\n const configSpinner = createSpinner()\n let configs: Array<Config>\n let resolvedConfigPath: string\n try {\n if (!quiet) configSpinner.start('Loading config')\n\n const loaded = await loading\n configs = loaded.configs\n resolvedConfigPath = loaded.configPath\n\n if (!quiet) configSpinner.stop(`Loaded ${styleText('dim', path.relative(process.cwd(), resolvedConfigPath))}`)\n } catch (error) {\n if (!quiet) configSpinner.error('Config failed loading')\n\n if (!json) setupReporters(hooks, { logLevel, reporters: [cliReporter] })\n // A diagnostic thrown while the config file runs, such as invalid extension options, sits in the cause chain.\n await Diagnostics.emit(errorHooks, error)\n\n if (!quiet) logOutro(styleText('red', '✗ Configuration failed'))\n process.exit(1)\n }\n\n // Without a reporter nothing is printed, not even an error, so a config written without\n // `defineConfig` gets the same built-ins it would have registered.\n const available = configs[0]?.reporters?.length ? configs[0].reporters : [cliReporter, jsonReporter, fileReporter, htmlReporter]\n const reporters = selectReporters(available, requestedNames)\n setupReporters(hooks, { logLevel, reporters, dryRun })\n\n await hooks.callHook('kubb:lifecycle:start', { version })\n\n if (!quiet) logOutro(`${pluralize(configs.length, 'config')} ready`)\n\n try {\n let anyFailed = false\n // One tracker, one key listener and one build queue serve every watched config, so several configs never mix diffs or answer `r` twice.\n const tracker = watch ? trackBuild(hooks) : undefined\n const rebuilds: Array<() => Promise<void>> = []\n let armKeys: (() => void) | undefined\n // Configs share the hooks emitter, so every build, from any watcher or the `r` key, waits for the one before it.\n let queue = Promise.resolve()\n for (const config of configs) {\n const effectiveInput = input ?? config.input\n const inputKind = typeof effectiveInput === 'string' ? getInputKind(effectiveInput) : undefined\n const watchPath = inputKind === 'file' ? (effectiveInput as string) : undefined\n if (watchPath && tracker) {\n const label = styleText('yellow', `Watching ${path.relative(process.cwd(), watchPath)}`)\n let previous: BuildSnapshot | undefined\n // Don't removeAll() between builds, that would also drop logger and lifecycle\n // listeners. Plugin listeners are already disposed by safeBuild's dispose()\n // in its finally block, so re-running generate() on the same hooks emitter is safe.\n const build = async () => {\n const hrStart = process.hrtime()\n const succeeded = await generate({ input, config, hooks, dryRun })\n const snapshot = tracker.take()\n if (previous) logRebuild({ diff: diffBuilds(previous, snapshot), durationMs: getElapsedMs(hrStart) })\n previous = snapshot\n\n logStep(armKeys ? `${label} ${styleText('dim', 'r rebuild · q quit')}` : label)\n armKeys?.()\n if (succeeded) {\n logSpacer()\n logTip()\n }\n }\n // A trigger that lands while this config's build is queued joins it; one that lands during the build queues one more. Never rejects.\n let pending = false\n const rebuild = (): Promise<void> => {\n if (pending) return queue\n pending = true\n queue = queue\n .then(() => {\n pending = false\n return build()\n })\n .catch((error) => void Diagnostics.emit(errorHooks, error))\n return queue\n }\n rebuilds.push(rebuild)\n if (!quiet) {\n armKeys ??= listenForKeys({\n rebuild: () => rebuilds.forEach((trigger) => void trigger()),\n quit: (code) => void Promise.resolve(hooks.callHook('kubb:lifecycle:end')).finally(() => process.exit(code)),\n })\n }\n\n // The watcher ignores its startup state, so run the first build here; a failing one keeps watching so the user can fix the input.\n await rebuild()\n\n await startWatcher([watchPath], rebuild, { info: logInfo, error: logError })\n } else {\n if (tracker && !quiet) logWarn('Watch mode only follows a local `input` file, so this config is generated once.')\n try {\n const succeeded = await generate({ input, config, hooks, dryRun })\n if (!succeeded) anyFailed = true\n } catch (configError) {\n await Diagnostics.emit(errorHooks, configError)\n anyFailed = true\n }\n }\n }\n\n // A request still in flight would keep the process alive until its timeout.\n updateCheck.abort()\n await checkForUpdate({ hooks, latestVersion })\n\n await hooks.callHook('kubb:lifecycle:end')\n\n // Watch mode prints a tip after each successful build. Regular generate commands need to\n // print one explicitly after the lifecycle group has closed so it stays outside the group.\n if (!quiet && !watch && !anyFailed) {\n logTip()\n }\n\n // `exitCode`, not `exit()`, so a telemetry request still in flight can finish within its timeout.\n if (anyFailed) {\n process.exitCode = 1\n }\n } catch (error) {\n await Diagnostics.emit(errorHooks, error)\n process.exit(1)\n }\n}\n"],"mappings":"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"}