@kubb/cli 5.14.6 → 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-DrnGartf.js → Telemetry-B3edcFoB.js} +12 -86
  3. package/dist/Telemetry-B3edcFoB.js.map +1 -0
  4. package/dist/{Telemetry-B5V_ufmv.cjs → Telemetry-COWGqYmh.cjs} +14 -118
  5. package/dist/Telemetry-COWGqYmh.cjs.map +1 -0
  6. package/dist/{background-CdPT1eaq.cjs → background-B24lIehn.cjs} +5 -6
  7. package/dist/{background-CdPT1eaq.cjs.map → background-B24lIehn.cjs.map} +1 -1
  8. package/dist/{background-C6XHpEo7.js → background-D-7OGjvg.js} +1 -1
  9. package/dist/{background-DlK0by5c.js → background-_dKcGjM7.js} +5 -6
  10. package/dist/{background-DlK0by5c.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-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-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-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-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-C8Prej7s.cjs → run-Bb19PlwV.cjs} +44 -37
  89. package/dist/run-Bb19PlwV.cjs.map +1 -0
  90. package/dist/{run-DC_xH5H3.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-l8IiOR_c.js → run-C0KI-NE3.js} +9 -9
  95. package/dist/{run-l8IiOR_c.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-EJtgdIin.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-CypFtkVE.cjs → run-D5Z6nfzK.cjs} +5 -6
  108. package/dist/{run-CypFtkVE.cjs.map → run-D5Z6nfzK.cjs.map} +1 -1
  109. package/dist/{run-sjzj0ir-.cjs → run-DCqmf5W1.cjs} +10 -10
  110. package/dist/{run-sjzj0ir-.cjs.map → run-DCqmf5W1.cjs.map} +1 -1
  111. package/dist/{run-j1g5si5R.js → run-DFXhBS64.js} +5 -6
  112. package/dist/{run-j1g5si5R.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-9fs2T2Je.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-laSRD0z1.cjs → snapshot-D7Ytw8S0.cjs} +13 -14
  124. package/dist/{snapshot-laSRD0z1.cjs.map → snapshot-D7Ytw8S0.cjs.map} +1 -1
  125. package/dist/{snapshot-BJWnL6hE.js → snapshot-n7dJGCWv.js} +10 -11
  126. package/dist/{snapshot-BJWnL6hE.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-DFEdbBPu.cjs → status-Bc0_4T41.cjs} +7 -8
  132. package/dist/{status-DFEdbBPu.cjs.map → status-Bc0_4T41.cjs.map} +1 -1
  133. package/dist/{status-BjmXLRm2.js → status-DxSkp1cH.js} +6 -7
  134. package/dist/{status-BjmXLRm2.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-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-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-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 @@
1
+ {"version":3,"file":"studio-mw6HaPkr.js","names":["command","command","connectCommand","command","command","command","command","connectCommand","command","connectCommand","startCommand","loginCommand","logoutCommand","statusCommand","permissionsCommand","snapshotCommand"],"sources":["../src/commands/studio/studioCommand.ts","../src/commands/studio/connect.ts","../src/commands/studio/login.ts","../src/commands/studio/logout.ts","../src/commands/studio/permissions.ts","../src/commands/studio/snapshot.ts","../src/commands/studio/background.ts","../src/commands/studio/status.ts","../src/commands/studio/index.ts"],"sourcesContent":["import { type Args, define } from 'gunshi'\nimport type { StudioOptions, StudioValues } from '../../runners/studio/run.ts'\n\n/**\n * Defines a `kubb studio` subcommand. The runner, and with it `@kubb/studio`, loads only when the\n * command runs, so `kubb --help` never does.\n */\nexport function studioCommand({\n action,\n block,\n ...definition\n}: {\n name: string\n description: string\n examples?: string\n args?: Args\n /** Opens a block a later `logOutro` closes, for a command that keeps running. */\n block?: boolean\n /** The command body, given the options built from its flags. */\n action: (options: StudioOptions) => Promise<unknown>\n}) {\n return define({\n ...definition,\n toKebab: true,\n async run({ values }) {\n const { runStudio } = await import('../../runners/studio/run.ts')\n await runStudio(values as StudioValues, action, { block })\n },\n })\n}\n","import { configArg, logLevelArg, studioConnectionArgs, studioPermissionArgs } from '../shared.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'connect',\n description: 'Connect this project to Kubb Studio and generate from the browser.',\n examples: [\n 'kubb studio connect',\n 'kubb studio connect --allow-read',\n 'kubb studio connect --allow-write --allow-exec',\n 'kubb studio connect --url http://localhost:3000',\n ].join('\\n'),\n args: {\n ...configArg,\n ...studioConnectionArgs,\n ...studioPermissionArgs,\n open: {\n type: 'boolean',\n description: 'Open the approval page in a browser while pairing',\n default: true,\n negatable: true,\n },\n ...logLevelArg,\n },\n block: true,\n async action(options) {\n const { connect } = await import('../../runners/studio/run.ts')\n await connect(options)\n },\n})\n","import { command as connectCommand } from './connect.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'login',\n description: 'Pair this machine with Kubb Studio without connecting.',\n examples: ['kubb studio login', 'kubb studio login --url http://localhost:3000'].join('\\n'),\n args: connectCommand.args,\n async action(options) {\n const { login } = await import('../../runners/studio/run.ts')\n await login(options)\n },\n})\n","import { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'logout',\n description: 'Forget the stored Kubb Studio token.',\n examples: 'kubb studio logout',\n args: {},\n async action() {\n const { stopWorker } = await import('../../runners/studio/background.ts')\n const { clearCredentials } = await import('../../runners/studio/credentials.ts')\n await stopWorker()\n await clearCredentials()\n console.log('Signed out of Kubb Studio.')\n },\n})\n","import path from 'node:path'\nimport process from 'node:process'\nimport { findConfigFile } from '@internals/shared'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'permissions',\n description: 'Change what Kubb Studio may do in this project.',\n examples: 'kubb studio permissions',\n args: {},\n async action(options) {\n const { readCredentials } = await import('../../runners/studio/credentials.ts')\n const { resolvePermissions } = await import('../../runners/studio/run.ts')\n const { canUseTTY } = await import('../../utils/env.ts')\n\n const credentials = await readCredentials()\n if (!credentials) throw new Error('This project is not paired with Kubb Studio. Run `kubb studio` first.')\n if (!canUseTTY()) throw new Error('Changing permissions needs an interactive terminal.')\n\n const configFile = findConfigFile()\n await resolvePermissions(options, credentials, configFile && path.relative(process.cwd(), configFile), { edit: true })\n console.log(\n 'Permissions saved. A running connection keeps the old ones until you restart it: press Ctrl+C and run `kubb studio` again, or run `kubb studio stop`, then `kubb studio start`. Keep `--url` and `--config`, and leave out the `--allow-*` flag of any permission you turned off, since a flag grants it anyway.',\n )\n },\n})\n","import { define } from 'gunshi'\nimport { configArg, logLevelArg, studioConnectionArgs } from '../shared.ts'\n\nexport const command = define({\n name: 'snapshot',\n description: 'Generate and publish a Kubb Studio snapshot from CI.',\n examples: ['kubb studio snapshot', 'kubb studio snapshot --json'].join('\\n'),\n toKebab: true,\n args: {\n ...configArg,\n ...studioConnectionArgs,\n id: {\n type: 'string',\n description: 'Stable identity for the CI agent, such as a pull request. Auto-detected on GitHub Actions, GitLab CI, Bitbucket Pipelines and CircleCI',\n },\n baseId: {\n type: 'string',\n description:\n \"Identity of another CI agent, such as the base branch's, to also compare this snapshot with. Auto-detected on GitHub pull requests and GitLab merge requests\",\n toKebab: true,\n },\n name: {\n type: 'string',\n description: 'Package name for the generated tarball. Defaults to the name in package.json',\n },\n packageVersion: {\n type: 'string',\n description: 'Package version for the generated tarball. Defaults to the version in package.json',\n toKebab: true,\n },\n json: {\n type: 'boolean',\n description: 'Print the result as one JSON object instead of a summary',\n default: false,\n },\n ...logLevelArg,\n },\n async run(ctx) {\n const { runner } = await import('../../runners/studio/snapshot.ts')\n await runner(ctx)\n },\n})\n","import { define } from 'gunshi'\nimport { command as connectCommand } from './connect.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'start',\n description: 'Keep this project connected to Kubb Studio in the background.',\n args: connectCommand.args,\n async action(options) {\n const { startWorker } = await import('../../runners/studio/background.ts')\n await startWorker(options)\n },\n})\n\nexport const stopCommand = define({\n name: 'stop',\n description: \"Stop this project's background connection and keep its pairing.\",\n async run() {\n const { stopWorker } = await import('../../runners/studio/background.ts')\n await stopWorker()\n console.log('Background connection stopped.')\n },\n})\n","import process from 'node:process'\nimport { studioConnectionArgs } from '../shared.ts'\nimport { studioCommand } from './studioCommand.ts'\n\nexport const command = studioCommand({\n name: 'status',\n description: 'Show the project worker, Kubb Studio pairing, and saved permissions.',\n examples: 'kubb studio status',\n args: { url: studioConnectionArgs.url },\n async action(options) {\n const { getWorkerLogPath, getWorkerStatus } = await import('../../runners/studio/background.ts')\n const { readCredentials } = await import('../../runners/studio/credentials.ts')\n const { formatStatus } = await import('../../runners/studio/status.ts')\n\n const [worker, credentials] = await Promise.all([getWorkerStatus(), readCredentials()])\n console.log(\n ['', ...formatStatus({ studioUrl: options.studioUrl, credentials, worker, project: process.cwd(), logPath: getWorkerLogPath() }), ''].join('\\n'),\n )\n },\n})\n","import { define } from 'gunshi'\nimport { command as connectCommand } from './connect.ts'\nimport { command as loginCommand } from './login.ts'\nimport { command as logoutCommand } from './logout.ts'\nimport { command as permissionsCommand } from './permissions.ts'\nimport { command as snapshotCommand } from './snapshot.ts'\nimport { command as startCommand, stopCommand } from './background.ts'\nimport { command as statusCommand } from './status.ts'\n\nexport const command = define({\n ...connectCommand,\n name: 'studio',\n description: 'Connect this project to Kubb Studio, or manage its pairing and snapshots.',\n examples: [\n 'kubb studio',\n 'kubb studio --allow-read',\n 'kubb studio login',\n 'kubb studio status',\n 'kubb studio permissions',\n 'kubb studio logout',\n 'kubb studio snapshot',\n ].join('\\n'),\n subCommands: {\n start: startCommand,\n stop: stopCommand,\n connect: connectCommand,\n login: loginCommand,\n logout: logoutCommand,\n status: statusCommand,\n permissions: permissionsCommand,\n snapshot: snapshotCommand,\n },\n})\n\n/**\n * Sends `kubb studio --flag value` to `kubb studio connect`, the same runner. gunshi picks a\n * subcommand from the first token that is not a flag, so `--url http://…` would read the URL as one.\n */\nexport function routeStudioFlags(args: Array<string>): Array<string> {\n const [name, next] = args\n if (name !== 'studio' || !next?.startsWith('-') || next === '--help' || next === '-h') return args\n\n return ['studio', 'connect', ...args.slice(1)]\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
- import "./rolldown-runtime-CRm0XQPb.js";
2
- import { t as connect } from "./run-9fs2T2Je.js";
3
- import { r as serveWorker, t as getWorkerLogPath } from "./background-DlK0by5c.js";
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { t as connect } from "./run-KqdudiWQ.js";
3
+ import { r as serveWorker, t as getWorkerLogPath } from "./background-_dKcGjM7.js";
4
4
  import { format } from "node:util";
5
5
  import { appendFileSync, statSync, writeFileSync } from "node:fs";
6
- //#region src/runners/studio/worker.ts
6
+ // src/runners/studio/worker.ts
7
7
  process.title = "Kubb";
8
8
  const logPath = getWorkerLogPath();
9
9
  const tokens = [process.env.KUBB_TOKEN];
@@ -51,7 +51,6 @@ if (!("existing" in control)) try {
51
51
  } finally {
52
52
  await control.close();
53
53
  }
54
- //#endregion
55
54
  export {};
56
55
 
57
56
  //# sourceMappingURL=studioWorker.js.map
@@ -1,8 +1,8 @@
1
- import "./rolldown-runtime-CRm0XQPb.js";
2
- import { a as getElapsedMs, i as formatMs } from "./Telemetry-DrnGartf.js";
3
- import { a as logOutro } from "./text-CL6N6yPS.js";
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { n as getElapsedMs, t as formatMs } from "./time-C-wU7VhC.js";
3
+ import { r as logOutro } from "./intro-9PB8sE8z.js";
4
4
  import { styleText } from "node:util";
5
- //#region src/ui/summary.ts
5
+ // src/ui/summary.ts
6
6
  /**
7
7
  * Finishes a command with its outcome and duration before the labeled details.
8
8
  * A command with prompts closes its existing block; validation writes a standalone summary.
@@ -35,7 +35,6 @@ function logCommandSummary({ title, status, hrStart, lines, block = false }) {
35
35
  }
36
36
  console.log(summary);
37
37
  }
38
- //#endregion
39
38
  export { logCommandSummary as t };
40
39
 
41
- //# sourceMappingURL=summary-DDnI70tn.js.map
40
+ //# sourceMappingURL=summary-CbmQKA8l.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"summary-DDnI70tn.js","names":[],"sources":["../src/ui/summary.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { logOutro } from './intro.ts'\n\n/**\n * Finishes a command with its outcome and duration before the labeled details.\n * A command with prompts closes its existing block; validation writes a standalone summary.\n */\nexport function logCommandSummary({\n title,\n status,\n hrStart,\n lines,\n block = false,\n}: {\n title: string\n status: 'success' | 'failed' | 'warning' | 'planned' | 'canceled'\n hrStart: [number, number]\n lines: ReadonlyArray<string>\n block?: boolean\n}): void {\n const colors = { success: 'green', failed: 'red', warning: 'yellow', planned: 'cyan', canceled: 'dim' } as const\n const symbols = { success: '✓', failed: '✗', warning: '!', planned: '◇', canceled: '○' } as const\n const summary = [`${styleText(colors[status], `${symbols[status]} ${title}`)} ${styleText('dim', formatMs(getElapsedMs(hrStart)))}`, '', ...lines].join('\\n')\n if (block) {\n logOutro(summary)\n return\n }\n if (status === 'failed') {\n console.error(summary)\n return\n }\n console.log(summary)\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,kBAAkB,EAChC,OACA,QACA,SACA,OACA,QAAQ,SAOD;CAGP,MAAM,UAAU;EAAC,GAAG,UAAU;GAFb,SAAS;GAAS,QAAQ;GAAO,SAAS;GAAU,SAAS;GAAQ,UAAU;EAE7D,EAAE,SAAS,GAAG;GAD/B,SAAS;GAAK,QAAQ;GAAK,SAAS;GAAK,SAAS;GAAK,UAAU;EAC5B,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,UAAU,OAAO,SAAS,aAAa,OAAO,CAAC,CAAC;EAAK;EAAI,GAAG;CAAK,CAAC,CAAC,KAAK,IAAI;CAC7J,IAAI,OAAO;EACT,SAAS,OAAO;EAChB;CACF;CACA,IAAI,WAAW,UAAU;EACvB,QAAQ,MAAM,OAAO;EACrB;CACF;CACA,QAAQ,IAAI,OAAO;AACrB"}
1
+ {"version":3,"file":"summary-CbmQKA8l.js","names":[],"sources":["../src/ui/summary.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { logOutro } from './intro.ts'\n\n/**\n * Finishes a command with its outcome and duration before the labeled details.\n * A command with prompts closes its existing block; validation writes a standalone summary.\n */\nexport function logCommandSummary({\n title,\n status,\n hrStart,\n lines,\n block = false,\n}: {\n title: string\n status: 'success' | 'failed' | 'warning' | 'planned' | 'canceled'\n hrStart: [number, number]\n lines: ReadonlyArray<string>\n block?: boolean\n}): void {\n const colors = { success: 'green', failed: 'red', warning: 'yellow', planned: 'cyan', canceled: 'dim' } as const\n const symbols = { success: '✓', failed: '✗', warning: '!', planned: '◇', canceled: '○' } as const\n const summary = [`${styleText(colors[status], `${symbols[status]} ${title}`)} ${styleText('dim', formatMs(getElapsedMs(hrStart)))}`, '', ...lines].join('\\n')\n if (block) {\n logOutro(summary)\n return\n }\n if (status === 'failed') {\n console.error(summary)\n return\n }\n console.log(summary)\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,kBAAkB,EAChC,OACA,QACA,SACA,OACA,QAAQ,SAOD;CAGP,MAAM,UAAU;EAAC,GAAG,UAAU;GAFb,SAAS;GAAS,QAAQ;GAAO,SAAS;GAAU,SAAS;GAAQ,UAAU;EAE7D,EAAE,SAAS,GAAG;GAD/B,SAAS;GAAK,QAAQ;GAAK,SAAS;GAAK,SAAS;GAAK,UAAU;EAC5B,EAAE,QAAQ,GAAG,OAAO,EAAE,IAAI,UAAU,OAAO,SAAS,aAAa,OAAO,CAAC,CAAC;EAAK;EAAI,GAAG;CAAK,CAAC,CAAC,KAAK,IAAI;CAC7J,IAAI,OAAO;EACT,SAAS,OAAO;EAChB;CACF;CACA,IAAI,WAAW,UAAU;EACvB,QAAQ,MAAM,OAAO;EACrB;CACF;CACA,QAAQ,IAAI,OAAO;AACrB"}
@@ -1,8 +1,8 @@
1
- require("./rolldown-runtime-CPE0t6oh.cjs");
2
- const require_Telemetry = require("./Telemetry-B5V_ufmv.cjs");
3
- const require_text = require("./text-DrsG1EDN.cjs");
1
+ require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ const require_time = require("./time-3BKoci3G.cjs");
3
+ const require_intro = require("./intro-YPaf1Imr.cjs");
4
4
  let node_util = require("node:util");
5
- //#region src/ui/summary.ts
5
+ // src/ui/summary.ts
6
6
  /**
7
7
  * Finishes a command with its outcome and duration before the labeled details.
8
8
  * A command with prompts closes its existing block; validation writes a standalone summary.
@@ -21,12 +21,12 @@ function logCommandSummary({ title, status, hrStart, lines, block = false }) {
21
21
  warning: "!",
22
22
  planned: "◇",
23
23
  canceled: "○"
24
- }[status]} ${title}`)} ${(0, node_util.styleText)("dim", require_Telemetry.formatMs(require_Telemetry.getElapsedMs(hrStart)))}`,
24
+ }[status]} ${title}`)} ${(0, node_util.styleText)("dim", require_time.formatMs(require_time.getElapsedMs(hrStart)))}`,
25
25
  "",
26
26
  ...lines
27
27
  ].join("\n");
28
28
  if (block) {
29
- require_text.logOutro(summary);
29
+ require_intro.logOutro(summary);
30
30
  return;
31
31
  }
32
32
  if (status === "failed") {
@@ -35,7 +35,6 @@ function logCommandSummary({ title, status, hrStart, lines, block = false }) {
35
35
  }
36
36
  console.log(summary);
37
37
  }
38
- //#endregion
39
38
  Object.defineProperty(exports, "logCommandSummary", {
40
39
  enumerable: true,
41
40
  get: function() {
@@ -43,4 +42,4 @@ Object.defineProperty(exports, "logCommandSummary", {
43
42
  }
44
43
  });
45
44
 
46
- //# sourceMappingURL=summary-1DCwzWEU.cjs.map
45
+ //# sourceMappingURL=summary-Clvl5Hxs.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"summary-1DCwzWEU.cjs","names":["styleText","formatMs","getElapsedMs"],"sources":["../src/ui/summary.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { logOutro } from './intro.ts'\n\n/**\n * Finishes a command with its outcome and duration before the labeled details.\n * A command with prompts closes its existing block; validation writes a standalone summary.\n */\nexport function logCommandSummary({\n title,\n status,\n hrStart,\n lines,\n block = false,\n}: {\n title: string\n status: 'success' | 'failed' | 'warning' | 'planned' | 'canceled'\n hrStart: [number, number]\n lines: ReadonlyArray<string>\n block?: boolean\n}): void {\n const colors = { success: 'green', failed: 'red', warning: 'yellow', planned: 'cyan', canceled: 'dim' } as const\n const symbols = { success: '✓', failed: '✗', warning: '!', planned: '◇', canceled: '○' } as const\n const summary = [`${styleText(colors[status], `${symbols[status]} ${title}`)} ${styleText('dim', formatMs(getElapsedMs(hrStart)))}`, '', ...lines].join('\\n')\n if (block) {\n logOutro(summary)\n return\n }\n if (status === 'failed') {\n console.error(summary)\n return\n }\n console.log(summary)\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,kBAAkB,EAChC,OACA,QACA,SACA,OACA,QAAQ,SAOD;CAGP,MAAM,UAAU;EAAC,IAAA,GAAGA,UAAAA,UAAAA,CAAU;GAFb,SAAS;GAAS,QAAQ;GAAO,SAAS;GAAU,SAAS;GAAQ,UAAU;EAE7D,EAAE,SAAS,GAAG;GAD/B,SAAS;GAAK,QAAQ;GAAK,SAAS;GAAK,SAAS;GAAK,UAAU;EAC5B,EAAE,QAAQ,GAAG,OAAO,EAAE,KAAA,GAAIA,UAAAA,UAAAA,CAAU,OAAOC,kBAAAA,SAASC,kBAAAA,aAAa,OAAO,CAAC,CAAC;EAAK;EAAI,GAAG;CAAK,CAAC,CAAC,KAAK,IAAI;CAC7J,IAAI,OAAO;EACT,aAAA,SAAS,OAAO;EAChB;CACF;CACA,IAAI,WAAW,UAAU;EACvB,QAAQ,MAAM,OAAO;EACrB;CACF;CACA,QAAQ,IAAI,OAAO;AACrB"}
1
+ {"version":3,"file":"summary-Clvl5Hxs.cjs","names":["styleText","formatMs","getElapsedMs"],"sources":["../src/ui/summary.ts"],"sourcesContent":["import { styleText } from 'node:util'\nimport { formatMs, getElapsedMs } from '@internals/utils'\nimport { logOutro } from './intro.ts'\n\n/**\n * Finishes a command with its outcome and duration before the labeled details.\n * A command with prompts closes its existing block; validation writes a standalone summary.\n */\nexport function logCommandSummary({\n title,\n status,\n hrStart,\n lines,\n block = false,\n}: {\n title: string\n status: 'success' | 'failed' | 'warning' | 'planned' | 'canceled'\n hrStart: [number, number]\n lines: ReadonlyArray<string>\n block?: boolean\n}): void {\n const colors = { success: 'green', failed: 'red', warning: 'yellow', planned: 'cyan', canceled: 'dim' } as const\n const symbols = { success: '✓', failed: '✗', warning: '!', planned: '◇', canceled: '○' } as const\n const summary = [`${styleText(colors[status], `${symbols[status]} ${title}`)} ${styleText('dim', formatMs(getElapsedMs(hrStart)))}`, '', ...lines].join('\\n')\n if (block) {\n logOutro(summary)\n return\n }\n if (status === 'failed') {\n console.error(summary)\n return\n }\n console.log(summary)\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,kBAAkB,EAChC,OACA,QACA,SACA,OACA,QAAQ,SAOD;CAGP,MAAM,UAAU;EAAC,IAAA,GAAGA,UAAAA,UAAAA,CAAU;GAFb,SAAS;GAAS,QAAQ;GAAO,SAAS;GAAU,SAAS;GAAQ,UAAU;EAE7D,EAAE,SAAS,GAAG;GAD/B,SAAS;GAAK,QAAQ;GAAK,SAAS;GAAK,SAAS;GAAK,UAAU;EAC5B,EAAE,QAAQ,GAAG,OAAO,EAAE,KAAA,GAAIA,UAAAA,UAAAA,CAAU,OAAOC,aAAAA,SAASC,aAAAA,aAAa,OAAO,CAAC,CAAC;EAAK;EAAI,GAAG;CAAK,CAAC,CAAC,KAAK,IAAI;CAC7J,IAAI,OAAO;EACT,cAAA,SAAS,OAAO;EAChB;CACF;CACA,IAAI,WAAW,UAAU;EACvB,QAAQ,MAAM,OAAO;EACrB;CACF;CACA,QAAQ,IAAI,OAAO;AACrB"}
@@ -0,0 +1,15 @@
1
+ require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ // src/ui/table.ts
3
+ /** Pads each column to its widest cell, one line per row. */
4
+ function formatTable(rows) {
5
+ const widths = Array.from({ length: Math.max(0, ...rows.map((row) => row.length)) }, (_, index) => Math.max(...rows.map((row) => row[index]?.length ?? 0)));
6
+ return rows.map((row) => row.map((cell, index) => cell.padEnd(widths[index])).join(" ").trimEnd());
7
+ }
8
+ Object.defineProperty(exports, "formatTable", {
9
+ enumerable: true,
10
+ get: function() {
11
+ return formatTable;
12
+ }
13
+ });
14
+
15
+ //# sourceMappingURL=table-BlRe9YTZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-BlRe9YTZ.cjs","names":[],"sources":["../src/ui/table.ts"],"sourcesContent":["/** Pads each column to its widest cell, one line per row. */\nexport function formatTable(rows: ReadonlyArray<ReadonlyArray<string>>): Array<string> {\n const widths = Array.from({ length: Math.max(0, ...rows.map((row) => row.length)) }, (_, index) => Math.max(...rows.map((row) => row[index]?.length ?? 0)))\n return rows.map((row) =>\n row\n .map((cell, index) => cell.padEnd(widths[index]!))\n .join(' ')\n .trimEnd(),\n )\n}\n"],"mappings":";;;AACA,SAAgB,YAAY,MAA2D;CACrF,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,GAAG,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,IAAI,GAAG,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC1J,OAAO,KAAK,KAAK,QACf,IACG,KAAK,MAAM,UAAU,KAAK,OAAO,OAAO,MAAO,CAAC,CAAC,CACjD,KAAK,IAAI,CAAC,CACV,QAAQ,CACb;AACF"}
@@ -0,0 +1,10 @@
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ // src/ui/table.ts
3
+ /** Pads each column to its widest cell, one line per row. */
4
+ function formatTable(rows) {
5
+ const widths = Array.from({ length: Math.max(0, ...rows.map((row) => row.length)) }, (_, index) => Math.max(...rows.map((row) => row[index]?.length ?? 0)));
6
+ return rows.map((row) => row.map((cell, index) => cell.padEnd(widths[index])).join(" ").trimEnd());
7
+ }
8
+ export { formatTable as t };
9
+
10
+ //# sourceMappingURL=table-CR7iZJGo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table-CR7iZJGo.js","names":[],"sources":["../src/ui/table.ts"],"sourcesContent":["/** Pads each column to its widest cell, one line per row. */\nexport function formatTable(rows: ReadonlyArray<ReadonlyArray<string>>): Array<string> {\n const widths = Array.from({ length: Math.max(0, ...rows.map((row) => row.length)) }, (_, index) => Math.max(...rows.map((row) => row[index]?.length ?? 0)))\n return rows.map((row) =>\n row\n .map((cell, index) => cell.padEnd(widths[index]!))\n .join(' ')\n .trimEnd(),\n )\n}\n"],"mappings":";;;AACA,SAAgB,YAAY,MAA2D;CACrF,MAAM,SAAS,MAAM,KAAK,EAAE,QAAQ,KAAK,IAAI,GAAG,GAAG,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,EAAE,IAAI,GAAG,UAAU,KAAK,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAI,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;CAC1J,OAAO,KAAK,KAAK,QACf,IACG,KAAK,MAAM,UAAU,KAAK,OAAO,OAAO,MAAO,CAAC,CAAC,CACjD,KAAK,IAAI,CAAC,CACV,QAAQ,CACb;AACF"}
@@ -0,0 +1,13 @@
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ // src/ui/text.ts
3
+ /** Counts a noun, so a message never reads `1 files`. */
4
+ function pluralize(count, noun) {
5
+ return `${count} ${count === 1 ? noun : `${noun}s`}`;
6
+ }
7
+ /** The flag that grants a permission, such as `--allow-read-ast`. */
8
+ function toPermissionFlag(key) {
9
+ return `--${key.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)}`;
10
+ }
11
+ export { toPermissionFlag as n, pluralize as t };
12
+
13
+ //# sourceMappingURL=text-BmiI4s6N.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-BmiI4s6N.js","names":[],"sources":["../src/ui/text.ts"],"sourcesContent":["/** Counts a noun, so a message never reads `1 files`. */\nexport function pluralize(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : `${noun}s`}`\n}\n\n/** The flag that grants a permission, such as `--allow-read-ast`. */\nexport function toPermissionFlag(key: string): string {\n return `--${key.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)}`\n}\n"],"mappings":";;;AACA,SAAgB,UAAU,OAAe,MAAsB;CAC7D,OAAO,GAAG,MAAM,GAAG,UAAU,IAAI,OAAO,GAAG,KAAK;AAClD;;AAGA,SAAgB,iBAAiB,KAAqB;CACpD,OAAO,KAAK,IAAI,QAAQ,WAAW,SAAS,IAAI,KAAK,YAAY,GAAG;AACtE"}
@@ -0,0 +1,24 @@
1
+ require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ // src/ui/text.ts
3
+ /** Counts a noun, so a message never reads `1 files`. */
4
+ function pluralize(count, noun) {
5
+ return `${count} ${count === 1 ? noun : `${noun}s`}`;
6
+ }
7
+ /** The flag that grants a permission, such as `--allow-read-ast`. */
8
+ function toPermissionFlag(key) {
9
+ return `--${key.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)}`;
10
+ }
11
+ Object.defineProperty(exports, "pluralize", {
12
+ enumerable: true,
13
+ get: function() {
14
+ return pluralize;
15
+ }
16
+ });
17
+ Object.defineProperty(exports, "toPermissionFlag", {
18
+ enumerable: true,
19
+ get: function() {
20
+ return toPermissionFlag;
21
+ }
22
+ });
23
+
24
+ //# sourceMappingURL=text-Ep3AulAS.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text-Ep3AulAS.cjs","names":[],"sources":["../src/ui/text.ts"],"sourcesContent":["/** Counts a noun, so a message never reads `1 files`. */\nexport function pluralize(count: number, noun: string): string {\n return `${count} ${count === 1 ? noun : `${noun}s`}`\n}\n\n/** The flag that grants a permission, such as `--allow-read-ast`. */\nexport function toPermissionFlag(key: string): string {\n return `--${key.replace(/[A-Z]/g, (char) => `-${char.toLowerCase()}`)}`\n}\n"],"mappings":";;;AACA,SAAgB,UAAU,OAAe,MAAsB;CAC7D,OAAO,GAAG,MAAM,GAAG,UAAU,IAAI,OAAO,GAAG,KAAK;AAClD;;AAGA,SAAgB,iBAAiB,KAAqB;CACpD,OAAO,KAAK,IAAI,QAAQ,WAAW,SAAS,IAAI,KAAK,YAAY,GAAG;AACtE"}
@@ -0,0 +1,82 @@
1
+ require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ // ../../internals/utils/src/runtime.ts
3
+ const isBun = typeof Bun !== "undefined";
4
+ const isDeno = "Deno" in globalThis;
5
+ /**
6
+ * The JavaScript runtime executing the current process: its name, version and whether it is Bun.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * runtime.name // 'bun' when run with `bun kubb`, 'node' otherwise
11
+ * ```
12
+ */
13
+ const runtime = {
14
+ isBun,
15
+ ...detect()
16
+ };
17
+ function detect() {
18
+ if (isBun) return {
19
+ name: "bun",
20
+ version: process.versions.bun ?? ""
21
+ };
22
+ if (isDeno) return {
23
+ name: "deno",
24
+ version: globalThis.Deno?.version?.deno ?? ""
25
+ };
26
+ return {
27
+ name: "node",
28
+ version: process.versions?.node ?? ""
29
+ };
30
+ }
31
+ // ../../internals/utils/src/time.ts
32
+ /**
33
+ * Calculates elapsed time in milliseconds from a high-resolution `process.hrtime` start time.
34
+ * Rounds to 2 decimal places for sub-millisecond precision without noise.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const start = process.hrtime()
39
+ * doWork()
40
+ * getElapsedMs(start) // 42.35
41
+ * ```
42
+ */
43
+ function getElapsedMs(hrStart) {
44
+ const [seconds, nanoseconds] = process.hrtime(hrStart);
45
+ const ms = seconds * 1e3 + nanoseconds / 1e6;
46
+ return Math.round(ms * 100) / 100;
47
+ }
48
+ /**
49
+ * Converts a millisecond duration into a human-readable string (`ms`, `s`, or `m s`).
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * formatMs(250) // '250ms'
54
+ * formatMs(1500) // '1.50s'
55
+ * formatMs(90000) // '1m 30.0s'
56
+ * ```
57
+ */
58
+ function formatMs(ms) {
59
+ if (ms >= 6e4) return `${Math.floor(ms / 6e4)}m ${(ms % 6e4 / 1e3).toFixed(1)}s`;
60
+ if (ms >= 1e3) return `${(ms / 1e3).toFixed(2)}s`;
61
+ return `${Math.round(ms)}ms`;
62
+ }
63
+ Object.defineProperty(exports, "formatMs", {
64
+ enumerable: true,
65
+ get: function() {
66
+ return formatMs;
67
+ }
68
+ });
69
+ Object.defineProperty(exports, "getElapsedMs", {
70
+ enumerable: true,
71
+ get: function() {
72
+ return getElapsedMs;
73
+ }
74
+ });
75
+ Object.defineProperty(exports, "runtime", {
76
+ enumerable: true,
77
+ get: function() {
78
+ return runtime;
79
+ }
80
+ });
81
+
82
+ //# sourceMappingURL=time-3BKoci3G.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-3BKoci3G.cjs","names":[],"sources":["../../../internals/utils/src/runtime.ts","../../../internals/utils/src/time.ts"],"sourcesContent":["// Bun polyfills `process.versions.node`, so detection keys off the globals instead.\nconst isBun = typeof Bun !== 'undefined'\nconst isDeno = 'Deno' in globalThis\n\n/**\n * The JavaScript runtime executing the current process: its name, version and whether it is Bun.\n *\n * @example\n * ```ts\n * runtime.name // 'bun' when run with `bun kubb`, 'node' otherwise\n * ```\n */\nexport const runtime = { isBun, ...detect() } as const\n\nfunction detect(): { name: 'bun' | 'deno' | 'node'; version: string } {\n if (isBun) return { name: 'bun', version: process.versions.bun ?? '' }\n if (isDeno) return { name: 'deno', version: (globalThis as { Deno?: { version?: { deno?: string } } }).Deno?.version?.deno ?? '' }\n return { name: 'node', version: process.versions?.node ?? '' }\n}\n","/**\n * Calculates elapsed time in milliseconds from a high-resolution `process.hrtime` start time.\n * Rounds to 2 decimal places for sub-millisecond precision without noise.\n *\n * @example\n * ```ts\n * const start = process.hrtime()\n * doWork()\n * getElapsedMs(start) // 42.35\n * ```\n */\nexport function getElapsedMs(hrStart: [number, number]): number {\n const [seconds, nanoseconds] = process.hrtime(hrStart)\n const ms = seconds * 1000 + nanoseconds / 1e6\n return Math.round(ms * 100) / 100\n}\n\n/**\n * Converts a millisecond duration into a human-readable string (`ms`, `s`, or `m s`).\n *\n * @example\n * ```ts\n * formatMs(250) // '250ms'\n * formatMs(1500) // '1.50s'\n * formatMs(90000) // '1m 30.0s'\n * ```\n */\nexport function formatMs(ms: number): string {\n if (ms >= 60000) {\n const mins = Math.floor(ms / 60000)\n const secs = ((ms % 60000) / 1000).toFixed(1)\n return `${mins}m ${secs}s`\n }\n\n if (ms >= 1000) {\n return `${(ms / 1000).toFixed(2)}s`\n }\n return `${Math.round(ms)}ms`\n}\n"],"mappings":";;AACA,MAAM,QAAQ,OAAO,QAAQ;AAC7B,MAAM,SAAS,UAAU;;;;;;;;;AAUzB,MAAa,UAAU;CAAE;CAAO,GAAG,OAAO;AAAE;AAE5C,SAAS,SAA6D;CACpE,IAAI,OAAO,OAAO;EAAE,MAAM;EAAO,SAAS,QAAQ,SAAS,OAAO;CAAG;CACrE,IAAI,QAAQ,OAAO;EAAE,MAAM;EAAQ,SAAU,WAA0D,MAAM,SAAS,QAAQ;CAAG;CACjI,OAAO;EAAE,MAAM;EAAQ,SAAS,QAAQ,UAAU,QAAQ;CAAG;AAC/D;;;;;;;;;;;;;ACPA,SAAgB,aAAa,SAAmC;CAC9D,MAAM,CAAC,SAAS,eAAe,QAAQ,OAAO,OAAO;CACrD,MAAM,KAAK,UAAU,MAAO,cAAc;CAC1C,OAAO,KAAK,MAAM,KAAK,GAAG,IAAI;AAChC;;;;;;;;;;;AAYA,SAAgB,SAAS,IAAoB;CAC3C,IAAI,MAAM,KAGR,OAAO,GAFM,KAAK,MAAM,KAAK,GAEhB,EAAE,KADA,KAAK,MAAS,IAAA,CAAM,QAAQ,CACrB,EAAE;CAG1B,IAAI,MAAM,KACR,OAAO,IAAI,KAAK,IAAA,CAAM,QAAQ,CAAC,EAAE;CAEnC,OAAO,GAAG,KAAK,MAAM,EAAE,EAAE;AAC3B"}
@@ -0,0 +1,65 @@
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ // ../../internals/utils/src/runtime.ts
3
+ const isBun = typeof Bun !== "undefined";
4
+ const isDeno = "Deno" in globalThis;
5
+ /**
6
+ * The JavaScript runtime executing the current process: its name, version and whether it is Bun.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * runtime.name // 'bun' when run with `bun kubb`, 'node' otherwise
11
+ * ```
12
+ */
13
+ const runtime = {
14
+ isBun,
15
+ ...detect()
16
+ };
17
+ function detect() {
18
+ if (isBun) return {
19
+ name: "bun",
20
+ version: process.versions.bun ?? ""
21
+ };
22
+ if (isDeno) return {
23
+ name: "deno",
24
+ version: globalThis.Deno?.version?.deno ?? ""
25
+ };
26
+ return {
27
+ name: "node",
28
+ version: process.versions?.node ?? ""
29
+ };
30
+ }
31
+ // ../../internals/utils/src/time.ts
32
+ /**
33
+ * Calculates elapsed time in milliseconds from a high-resolution `process.hrtime` start time.
34
+ * Rounds to 2 decimal places for sub-millisecond precision without noise.
35
+ *
36
+ * @example
37
+ * ```ts
38
+ * const start = process.hrtime()
39
+ * doWork()
40
+ * getElapsedMs(start) // 42.35
41
+ * ```
42
+ */
43
+ function getElapsedMs(hrStart) {
44
+ const [seconds, nanoseconds] = process.hrtime(hrStart);
45
+ const ms = seconds * 1e3 + nanoseconds / 1e6;
46
+ return Math.round(ms * 100) / 100;
47
+ }
48
+ /**
49
+ * Converts a millisecond duration into a human-readable string (`ms`, `s`, or `m s`).
50
+ *
51
+ * @example
52
+ * ```ts
53
+ * formatMs(250) // '250ms'
54
+ * formatMs(1500) // '1.50s'
55
+ * formatMs(90000) // '1m 30.0s'
56
+ * ```
57
+ */
58
+ function formatMs(ms) {
59
+ if (ms >= 6e4) return `${Math.floor(ms / 6e4)}m ${(ms % 6e4 / 1e3).toFixed(1)}s`;
60
+ if (ms >= 1e3) return `${(ms / 1e3).toFixed(2)}s`;
61
+ return `${Math.round(ms)}ms`;
62
+ }
63
+ export { getElapsedMs as n, runtime as r, formatMs as t };
64
+
65
+ //# sourceMappingURL=time-C-wU7VhC.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-C-wU7VhC.js","names":[],"sources":["../../../internals/utils/src/runtime.ts","../../../internals/utils/src/time.ts"],"sourcesContent":["// Bun polyfills `process.versions.node`, so detection keys off the globals instead.\nconst isBun = typeof Bun !== 'undefined'\nconst isDeno = 'Deno' in globalThis\n\n/**\n * The JavaScript runtime executing the current process: its name, version and whether it is Bun.\n *\n * @example\n * ```ts\n * runtime.name // 'bun' when run with `bun kubb`, 'node' otherwise\n * ```\n */\nexport const runtime = { isBun, ...detect() } as const\n\nfunction detect(): { name: 'bun' | 'deno' | 'node'; version: string } {\n if (isBun) return { name: 'bun', version: process.versions.bun ?? '' }\n if (isDeno) return { name: 'deno', version: (globalThis as { Deno?: { version?: { deno?: string } } }).Deno?.version?.deno ?? '' }\n return { name: 'node', version: process.versions?.node ?? '' }\n}\n","/**\n * Calculates elapsed time in milliseconds from a high-resolution `process.hrtime` start time.\n * Rounds to 2 decimal places for sub-millisecond precision without noise.\n *\n * @example\n * ```ts\n * const start = process.hrtime()\n * doWork()\n * getElapsedMs(start) // 42.35\n * ```\n */\nexport function getElapsedMs(hrStart: [number, number]): number {\n const [seconds, nanoseconds] = process.hrtime(hrStart)\n const ms = seconds * 1000 + nanoseconds / 1e6\n return Math.round(ms * 100) / 100\n}\n\n/**\n * Converts a millisecond duration into a human-readable string (`ms`, `s`, or `m s`).\n *\n * @example\n * ```ts\n * formatMs(250) // '250ms'\n * formatMs(1500) // '1.50s'\n * formatMs(90000) // '1m 30.0s'\n * ```\n */\nexport function formatMs(ms: number): string {\n if (ms >= 60000) {\n const mins = Math.floor(ms / 60000)\n const secs = ((ms % 60000) / 1000).toFixed(1)\n return `${mins}m ${secs}s`\n }\n\n if (ms >= 1000) {\n return `${(ms / 1000).toFixed(2)}s`\n }\n return `${Math.round(ms)}ms`\n}\n"],"mappings":";;AACA,MAAM,QAAQ,OAAO,QAAQ;AAC7B,MAAM,SAAS,UAAU;;;;;;;;;AAUzB,MAAa,UAAU;CAAE;CAAO,GAAG,OAAO;AAAE;AAE5C,SAAS,SAA6D;CACpE,IAAI,OAAO,OAAO;EAAE,MAAM;EAAO,SAAS,QAAQ,SAAS,OAAO;CAAG;CACrE,IAAI,QAAQ,OAAO;EAAE,MAAM;EAAQ,SAAU,WAA0D,MAAM,SAAS,QAAQ;CAAG;CACjI,OAAO;EAAE,MAAM;EAAQ,SAAS,QAAQ,UAAU,QAAQ;CAAG;AAC/D;;;;;;;;;;;;;ACPA,SAAgB,aAAa,SAAmC;CAC9D,MAAM,CAAC,SAAS,eAAe,QAAQ,OAAO,OAAO;CACrD,MAAM,KAAK,UAAU,MAAO,cAAc;CAC1C,OAAO,KAAK,MAAM,KAAK,GAAG,IAAI;AAChC;;;;;;;;;;;AAYA,SAAgB,SAAS,IAAoB;CAC3C,IAAI,MAAM,KAGR,OAAO,GAFM,KAAK,MAAM,KAAK,GAEhB,EAAE,KADA,KAAK,MAAS,IAAA,CAAM,QAAQ,CACrB,EAAE;CAG1B,IAAI,MAAM,KACR,OAAO,IAAI,KAAK,IAAA,CAAM,QAAQ,CAAC,EAAE;CAEnC,OAAO,GAAG,KAAK,MAAM,EAAE,EAAE;AAC3B"}
@@ -0,0 +1,244 @@
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { a as matchesStored, o as read } from "./spinner-BZaln7O8.js";
3
+ import { styleText } from "node:util";
4
+ import process from "node:process";
5
+ import { readdir } from "node:fs/promises";
6
+ import { join, relative } from "node:path";
7
+ // ../../internals/utils/src/promise.ts
8
+ /**
9
+ * Runs `run` over every item with at most `limit` in flight. Workers share one iterator, so each
10
+ * takes the next item the moment it frees up instead of waiting for a batch to drain.
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * await inParallel({ items: files, limit: 50, run: (file) => storage.writeItem(file.path, file.source) })
15
+ * ```
16
+ */
17
+ async function inParallel({ items, limit, run }) {
18
+ const queue = items.entries();
19
+ const worker = async () => {
20
+ for (const [index, item] of queue) await run(item, index);
21
+ };
22
+ await Promise.all(Array.from({ length: Math.min(limit, items.length) }, () => worker()));
23
+ }
24
+ // src/runners/generate/utils.ts
25
+ /** Glob pattern for paths the file watcher ignores. */
26
+ const WATCHER_IGNORED_PATHS = "**/{.git,node_modules}/**";
27
+ /**
28
+ * Quiet window in milliseconds that collapses a burst of watcher events (an editor save emits several) into one rebuild.
29
+ * It outlasts chokidar's 100 ms atomic-save window, which holds back the event of a write-then-rename save.
30
+ */
31
+ const WATCHER_DEBOUNCE_MS = 250;
32
+ /** `14:02:11 petStore.yaml changed`, the line a watcher prints when its input changes. */
33
+ function formatChange({ target, removed = false, now = /* @__PURE__ */ new Date() }) {
34
+ return `${styleText("dim", now.toTimeString().slice(0, 8))} ${styleText("bold", target)} ${removed ? "removed" : "changed"}`;
35
+ }
36
+ /**
37
+ * Starts a file watcher on the given paths and calls `cb` on any change.
38
+ * Ignores `.git` and `node_modules` directories. Event bursts (an editor save emits several)
39
+ * are debounced into one call. `cb` must never reject: its result is not awaited, so the caller
40
+ * serializes and reports its own builds. Resolves to a function that stops watching.
41
+ */
42
+ async function startWatcher(path, cb, log = {
43
+ info: console.log,
44
+ error: console.log
45
+ }) {
46
+ const { watch } = await import("chokidar");
47
+ const watcher = watch(path, {
48
+ ignorePermissionErrors: true,
49
+ ignored: WATCHER_IGNORED_PATHS,
50
+ ignoreInitial: true
51
+ });
52
+ for (const signal of ["SIGINT", "SIGTERM"]) process.once(signal, () => void watcher.close());
53
+ let debounceTimer = null;
54
+ watcher.on("all", (type, file) => {
55
+ log.info(formatChange({
56
+ target: relative(process.cwd(), file),
57
+ removed: type === "unlink"
58
+ }));
59
+ if (debounceTimer) clearTimeout(debounceTimer);
60
+ debounceTimer = setTimeout(() => {
61
+ debounceTimer = null;
62
+ cb(path);
63
+ }, WATCHER_DEBOUNCE_MS);
64
+ });
65
+ return async () => {
66
+ if (debounceTimer) clearTimeout(debounceTimer);
67
+ await watcher.close();
68
+ };
69
+ }
70
+ function createSnapshot() {
71
+ return {
72
+ schemas: /* @__PURE__ */ new Set(),
73
+ operations: /* @__PURE__ */ new Set()
74
+ };
75
+ }
76
+ /**
77
+ * Collects a {@link BuildSnapshot} from the hooks while a build runs. `take` hands back the finished
78
+ * build's snapshot and starts the next one.
79
+ */
80
+ function trackBuild(hooks) {
81
+ let current = createSnapshot();
82
+ hooks.hook("kubb:generate:schema", (node) => {
83
+ if (node.name) current.schemas.add(node.name);
84
+ });
85
+ hooks.hook("kubb:generate:operation", (node) => {
86
+ current.operations.add(node.operationId);
87
+ });
88
+ return { take() {
89
+ const snapshot = current;
90
+ current = createSnapshot();
91
+ return snapshot;
92
+ } };
93
+ }
94
+ function diffNames(previous, next) {
95
+ return {
96
+ added: [...next].filter((name) => !previous.has(name)).length,
97
+ removed: [...previous].filter((name) => !next.has(name)).length
98
+ };
99
+ }
100
+ /**
101
+ * Compares two {@link BuildSnapshot}s by name.
102
+ */
103
+ function diffBuilds(previous, next) {
104
+ return {
105
+ schemas: diffNames(previous.schemas, next.schemas),
106
+ operations: diffNames(previous.operations, next.operations)
107
+ };
108
+ }
109
+ /**
110
+ * Compares file contents or fingerprints by path.
111
+ */
112
+ function diffFiles(previous, next) {
113
+ const files = [];
114
+ let unchanged = 0;
115
+ for (const [path, fingerprint] of next) {
116
+ const before = previous.get(path);
117
+ if (before === fingerprint) unchanged++;
118
+ else files.push({
119
+ status: before === void 0 ? "A" : "M",
120
+ path
121
+ });
122
+ }
123
+ for (const path of previous.keys()) if (!next.has(path)) files.push({
124
+ status: "D",
125
+ path
126
+ });
127
+ return {
128
+ files,
129
+ unchanged
130
+ };
131
+ }
132
+ function countLineChanges(before, after) {
133
+ const remaining = /* @__PURE__ */ new Map();
134
+ for (const line of before ? before.split("\n") : []) remaining.set(line, (remaining.get(line) ?? 0) + 1);
135
+ let added = 0;
136
+ for (const line of after ? after.split("\n") : []) {
137
+ const count = remaining.get(line) ?? 0;
138
+ if (count > 0) remaining.set(line, count - 1);
139
+ else added++;
140
+ }
141
+ const removed = [...remaining.values()].reduce((sum, count) => sum + count, 0);
142
+ return {
143
+ added,
144
+ removed
145
+ };
146
+ }
147
+ /**
148
+ * Reads the output before generation, so cleaning the directory cannot erase the diff baseline.
149
+ * A missing directory or an unreadable file is skipped.
150
+ */
151
+ async function readOutputFiles(outputPath) {
152
+ const entries = await readdir(outputPath, {
153
+ recursive: true,
154
+ withFileTypes: true
155
+ }).catch(() => []);
156
+ const files = /* @__PURE__ */ new Map();
157
+ await inParallel({
158
+ items: entries.filter((entry) => entry.isFile()).map((entry) => join(entry.parentPath, entry.name)),
159
+ limit: 50,
160
+ run: async (filePath) => {
161
+ const source = await read(filePath).catch(() => null);
162
+ if (source !== null) files.set(filePath, source);
163
+ }
164
+ });
165
+ return files;
166
+ }
167
+ /**
168
+ * Compares generated output with the files captured before generation. The manifest recognizes
169
+ * output rewritten by a formatter, and `clean` includes files the run would delete.
170
+ */
171
+ async function diffOutput({ storage, paths, clean, manifest, previousFiles }) {
172
+ const generated = new Set(paths);
173
+ const changes = [];
174
+ let unchanged = 0;
175
+ await inParallel({
176
+ items: paths,
177
+ limit: 50,
178
+ run: async (filePath, index) => {
179
+ const next = await storage.readItem(filePath);
180
+ if (next === null) return;
181
+ const previous = previousFiles.get(filePath) ?? null;
182
+ if (previous !== null && (matchesStored({
183
+ stored: previous,
184
+ source: next
185
+ }) || manifest?.isUpToDate({
186
+ key: filePath,
187
+ source: next,
188
+ disk: previous
189
+ }))) {
190
+ unchanged++;
191
+ return;
192
+ }
193
+ changes[index] = {
194
+ status: previous === null ? "A" : "M",
195
+ path: filePath,
196
+ ...countLineChanges(previous?.trim() ?? "", previous === null ? next.trimEnd() : next.trim())
197
+ };
198
+ }
199
+ });
200
+ const files = changes.filter((file) => file !== void 0);
201
+ if (clean) {
202
+ for (const [filePath, source] of previousFiles) if (!generated.has(filePath)) files.push({
203
+ status: "D",
204
+ path: filePath,
205
+ ...countLineChanges(source.trimEnd(), "")
206
+ });
207
+ }
208
+ return {
209
+ files,
210
+ unchanged
211
+ };
212
+ }
213
+ /**
214
+ * Reads `r` (rebuild) and `q` (quit) from an interactive stdin in raw mode, and keeps ctrl+c
215
+ * working. Returns `undefined` when stdin is not a TTY. Otherwise returns `arm`, which turns raw
216
+ * mode back on: a spinner restores the terminal when it stops, so call it after each build. Raw mode
217
+ * is restored on exit.
218
+ */
219
+ function listenForKeys({ rebuild, quit, input = process.stdin }) {
220
+ if (!input.isTTY) return void 0;
221
+ const arm = () => {
222
+ input.setRawMode(true);
223
+ input.resume();
224
+ };
225
+ input.setEncoding("utf8");
226
+ input.on("data", (data) => {
227
+ const key = data.trim();
228
+ if (key === "r") {
229
+ rebuild();
230
+ return;
231
+ }
232
+ if (key === "q" || data === "") {
233
+ input.setRawMode(false);
234
+ input.pause();
235
+ quit(key === "q" ? 0 : 130);
236
+ }
237
+ });
238
+ process.once("exit", () => input.setRawMode(false));
239
+ arm();
240
+ return arm;
241
+ }
242
+ export { readOutputFiles as a, listenForKeys as i, diffFiles as n, startWatcher as o, diffOutput as r, trackBuild as s, diffBuilds as t };
243
+
244
+ //# sourceMappingURL=utils-BdibacYq.js.map