@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":"spinner-CfB0sIPy.cjs","names":["runtime","access","readFile","resolve","writeFile","mkdir","dirname","relative","isAbsolute","writer"],"sources":["../../../internals/utils/src/fs.ts","../src/ui/spinner.ts"],"sourcesContent":["import { access, glob as globNode, mkdir, readFile, writeFile } from 'node:fs/promises'\n\nimport { dirname, isAbsolute, join, relative, resolve } from 'node:path'\nimport { runtime } from './runtime.ts'\n\nexport { existsSync } from 'node:fs'\nexport { mkdir, mkdtemp, rm } from 'node:fs/promises'\n\n/**\n * Resolves to `true` when the file or directory at `path` exists.\n * Uses `Bun.file().exists()` when running under Bun, `fs.access` otherwise.\n *\n * @example\n * ```ts\n * if (await exists('./kubb.config.ts')) {\n * const content = await read('./kubb.config.ts')\n * }\n * ```\n */\nexport async function exists(path: string): Promise<boolean> {\n if (runtime.isBun) {\n return Bun.file(path).exists()\n }\n return access(path).then(\n () => true,\n () => false,\n )\n}\n\n/**\n * Reads the file at `path` as a UTF-8 string.\n * Uses `Bun.file().text()` when running under Bun, `fs.readFile` otherwise.\n *\n * @example\n * ```ts\n * const source = await read('./src/Pet.ts')\n * ```\n */\nexport async function read(path: string): Promise<string> {\n if (runtime.isBun) {\n return Bun.file(path).text()\n }\n return readFile(path, { encoding: 'utf8' })\n}\n\ntype WriteOptions = {\n /**\n * Previously read content, or `null` when the file does not exist.\n * Omitting this value reads the file before writing.\n */\n stored?: string | null\n /**\n * When `true`, re-reads the file immediately after writing and throws if the\n * content does not match — useful for catching write failures on unreliable file systems.\n */\n sanity?: boolean\n}\n\n/**\n * Whether `stored` already holds `source`, comparing on the trimmed text rather than the exact\n * bytes. Surrounding whitespace is what a formatter adds and what editors strip, and neither is a\n * reason to rewrite the file.\n *\n * Both sides are trimmed, so a storage that keeps bytes verbatim settles on the same answer as one\n * that normalizes what it stores. Trimming only `stored` would leave a source with leading\n * whitespace rewritten on every build, since the stored copy keeps the whitespace the comparison\n * has already dropped.\n */\nexport function matchesStored({ stored, source }: { stored: string; source: string }): boolean {\n return stored.trim() === source.trim()\n}\n\n/**\n * Writes `data` to `path`, trimming surrounding whitespace and ending the file with a single newline\n * the way prettier, biome, and oxfmt all do.\n * Skips the write when the trimmed content is empty, or when the file already holds that content.\n * Creates any missing parent directories automatically.\n * When `sanity` is `true`, re-reads the file after writing and throws if the content does not match.\n *\n * @example\n * ```ts\n * await write('./src/Pet.ts', source) // writes and returns the trimmed content plus a newline\n * await write('./src/Pet.ts', source) // null — file unchanged\n * await write('./src/Pet.ts', ' ') // null — empty content skipped\n * ```\n */\nexport async function write(path: string, data: string, options: WriteOptions = {}): Promise<string | null> {\n const trimmed = data.trim()\n if (trimmed === '') return null\n\n const content = `${trimmed}\\n`\n const resolved = resolve(path)\n let stored = options.stored\n\n if (stored === undefined) {\n if (runtime.isBun) {\n const file = Bun.file(resolved)\n stored = (await file.exists()) ? await file.text() : null\n } else {\n try {\n stored = await readFile(resolved, { encoding: 'utf-8' })\n } catch {\n /* file doesn't exist yet */\n stored = null\n }\n }\n }\n if (matchesStored({ stored: stored ?? '', source: trimmed })) return null\n\n await writeRaw(resolved, content)\n\n if (options.sanity) {\n const savedData = await read(resolved)\n if (savedData !== content) {\n throw new Error(`Sanity check failed for ${path}\\n\\nData[${data.length}]:\\n${data}\\n\\nSaved[${savedData.length}]:\\n${savedData}\\n`)\n }\n return savedData\n }\n\n return content\n}\n\n/**\n * Writes UTF-8 content verbatim, including empty files and surrounding whitespace.\n * Uses Bun.write under Bun and creates missing parent directories under either runtime.\n *\n * @example\n * await writeRaw('./cache/output.ts', ' // keep these bytes\\n\\n')\n */\nexport async function writeRaw(path: string, content: string): Promise<void> {\n const resolved = resolve(path)\n if (runtime.isBun) {\n await Bun.write(resolved, content)\n return\n }\n try {\n await writeFile(resolved, content, { encoding: 'utf-8' })\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n await mkdir(dirname(resolved), { recursive: true })\n await writeFile(resolved, content, { encoding: 'utf-8' })\n }\n}\n\n/**\n * Lists non-hidden regular files below `directory` as relative POSIX paths, excluding directories and symlinks.\n * Uses Bun.Glob under Bun because its Node glob compatibility API lacks directory-entry support.\n *\n * @example\n * for await (const path of listFiles('./src')) console.log(path)\n */\nexport async function* listFiles(directory: string): AsyncGenerator<string> {\n const cwd = resolve(directory)\n if (runtime.isBun) {\n yield* new Bun.Glob('**/*').scan({ cwd, dot: false, onlyFiles: true, followSymlinks: false })\n return\n }\n for await (const entry of globNode('**/*', { cwd, withFileTypes: true })) {\n if (entry.isFile()) yield toPosixPath(relative(cwd, join(entry.parentPath, entry.name)))\n }\n}\n\n/**\n * Converts a filesystem path to use POSIX (`/`) separators.\n *\n * Most of the codebase compares and composes paths as strings (prefix matching, joining for\n * import specifiers, splitting on `/`). On POSIX `path.resolve` already returns `/`-separated\n * paths, but on Windows it returns `\\`-separated paths, which breaks every such comparison.\n *\n * Routing every path that crosses a module boundary through `toPosixPath` keeps the rest of the\n * code platform-agnostic. The conversion runs unconditionally so Windows-specific behavior is\n * exercisable from POSIX CI.\n *\n * @example\n * toPosixPath('C:\\\\repo\\\\src\\\\pet.ts') // 'C:/repo/src/pet.ts'\n */\nexport function toPosixPath(filePath: string): string {\n return filePath.replaceAll('\\\\', '/')\n}\n\n/**\n * Strips the file extension from a path or file name.\n * Only removes the last `.ext` segment when the dot is not part of a directory name.\n *\n * @example\n * trimExtName('petStore.ts') // 'petStore'\n * trimExtName('/src/models/pet.ts') // '/src/models/pet'\n * trimExtName('/project.v2/gen/pet.ts') // '/project.v2/gen/pet'\n * trimExtName('noExtension') // 'noExtension'\n */\nexport function trimExtName(text: string): string {\n const dotIndex = text.lastIndexOf('.')\n if (dotIndex > 0 && !text.includes('/', dotIndex)) {\n return text.slice(0, dotIndex)\n }\n return text\n}\n\n/**\n * Resolves to `true` when `path` is `parent` itself or nested inside it. Both sides are resolved\n * to absolute paths first, so relative and `..`-containing inputs compare correctly.\n *\n * Guards a destructive or an out-of-tree operation: before wiping an output directory, check that\n * it does not contain the project root, and before loading a path a caller supplied, check that it\n * did not escape the directory it is allowed to read from.\n *\n * @example\n * isPathInside('./src/gen', '.') // true — nested inside the root\n * isPathInside('.', '.') // true — the same directory counts as inside\n * isPathInside('.', './src/gen') // false — the root is not inside its own output\n * isPathInside('../other', '.') // false — escapes the root\n */\nexport function isPathInside(path: string, parent: string): boolean {\n const resolvedPath = resolve(path)\n const resolvedParent = resolve(parent)\n if (resolvedPath === resolvedParent) {\n return true\n }\n\n const rel = relative(resolvedParent, resolvedPath)\n\n return rel !== '' && !rel.startsWith('..') && !isAbsolute(rel)\n}\n","import type { WriterSpinner } from '../loggers/types.ts'\nimport { writer } from './log.ts'\n\n/**\n * A progress spinner, or a writer that prints each message it is given when the terminal cannot\n * animate one. Callers drive both the same way, including the failure state.\n */\nexport function createSpinner(): WriterSpinner {\n return writer().spinner()\n}\n\n/** How long a wait may run before a spinner shows, so a fast answer draws nothing. */\nconst SPINNER_DELAY_MS = 150\n\n/**\n * Awaits `promise`, showing a spinner with `message` only when it takes longer than 150 ms.\n */\nexport async function withSpinner<T>({ promise, message }: { promise: Promise<T>; message: string }): Promise<T> {\n let spinner: WriterSpinner | undefined\n const timer = setTimeout(() => {\n spinner = createSpinner()\n spinner.start(message)\n }, SPINNER_DELAY_MS)\n try {\n return await promise\n } finally {\n clearTimeout(timer)\n spinner?.clear()\n }\n}\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
- const require_rolldown_runtime = require("./rolldown-runtime-CPE0t6oh.cjs");
2
- const require_utils = require("./utils-C3vTpUje.cjs");
3
- const require_run = require("./run-C8Prej7s.cjs");
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ const require_spinner = require("./spinner-CfB0sIPy.cjs");
3
+ const require_run = require("./run-Bb19PlwV.cjs");
4
4
  let node_util = require("node:util");
5
5
  let node_os = require("node:os");
6
6
  let node_path = require("node:path");
7
7
  node_path = require_rolldown_runtime.__toESM(node_path, 1);
8
- //#region src/runners/studio/status.ts
8
+ // src/runners/studio/status.ts
9
9
  /** How long a worker has run, such as `2h 14m`, `5m` or `40s`. */
10
10
  function formatUptime(ms) {
11
11
  const minutes = Math.floor(ms / 6e4);
@@ -13,7 +13,7 @@ function formatUptime(ms) {
13
13
  if (minutes < 60) return `${minutes}m`;
14
14
  return `${Math.floor(minutes / 60)}h ${minutes % 60}m`;
15
15
  }
16
- const tilde = (file) => require_utils.isPathInside(file, (0, node_os.homedir)()) ? `~${file.slice((0, node_os.homedir)().length)}` : file;
16
+ const tilde = (file) => require_spinner.isPathInside(file, (0, node_os.homedir)()) ? `~${file.slice((0, node_os.homedir)().length)}` : file;
17
17
  /**
18
18
  * The `kubb studio status` table: one row per topic, each ending with the command that changes it.
19
19
  */
@@ -59,7 +59,7 @@ function formatStatus({ studioUrl, credentials, worker, project, logPath, now =
59
59
  ...permissions.map((value, index) => ({
60
60
  label: index === 0 ? "Permissions" : "",
61
61
  value,
62
- command: !remembered && index === 0 ? "kubb studio connect" : void 0
62
+ command: index === 0 ? remembered ? "kubb studio permissions" : "kubb studio connect" : void 0
63
63
  })),
64
64
  {
65
65
  label: "Logs",
@@ -72,7 +72,6 @@ function formatStatus({ studioUrl, credentials, worker, project, logPath, now =
72
72
  return command ? `${line}${" ".repeat(width - (0, node_util.stripVTControlCharacters)(value).length + 3)}${(0, node_util.styleText)("dim", command)}` : line;
73
73
  });
74
74
  }
75
- //#endregion
76
75
  exports.formatStatus = formatStatus;
77
76
 
78
- //# sourceMappingURL=status-DFEdbBPu.cjs.map
77
+ //# sourceMappingURL=status-Bc0_4T41.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-DFEdbBPu.cjs","names":["isPathInside","homedir","styleText","formatPermissionRows","path","stripVTControlCharacters"],"sources":["../src/runners/studio/status.ts"],"sourcesContent":["import { homedir } from 'node:os'\nimport path from 'node:path'\nimport { stripVTControlCharacters, styleText } from 'node:util'\nimport { isPathInside } from '@internals/utils'\nimport type { Credentials } from './credentials.ts'\nimport { formatPermissionRows, type WorkerState } from './run.ts'\n\ntype StatusInput = {\n studioUrl: string\n credentials: Credentials | null\n worker: { running: boolean; state: WorkerState; pid?: number; startedAt?: number }\n project: string\n logPath: string\n now?: number\n}\n\n/** How long a worker has run, such as `2h 14m`, `5m` or `40s`. */\nexport function formatUptime(ms: number): string {\n const minutes = Math.floor(ms / 60_000)\n if (minutes < 1) return `${Math.max(0, Math.floor(ms / 1000))}s`\n if (minutes < 60) return `${minutes}m`\n\n return `${Math.floor(minutes / 60)}h ${minutes % 60}m`\n}\n\nconst tilde = (file: string) => (isPathInside(file, homedir()) ? `~${file.slice(homedir().length)}` : file)\n\n/**\n * The `kubb studio status` table: one row per topic, each ending with the command that changes it.\n */\nexport function formatStatus({ studioUrl, credentials, worker, project, logPath, now = Date.now() }: StatusInput): Array<string> {\n const pairing = (() => {\n if (!credentials) return { value: `${styleText('red', '✖')} not paired`, command: 'kubb studio login' }\n const name = `${credentials.agentSlug || credentials.agentId}${credentials.organizationSlug ? ` · org ${credentials.organizationSlug}` : ''}`\n if (credentials.studioUrl !== studioUrl) return { value: `${styleText('yellow', '!')} ${name} · ${credentials.studioUrl}`, command: 'kubb studio login' }\n return { value: `${styleText('green', '✓')} ${name}`, command: 'kubb studio logout' }\n })()\n const uptime = worker.startedAt ? ` · up ${formatUptime(now - worker.startedAt)}` : ''\n const workerRow = worker.running\n ? { value: `${styleText('green', '●')} ${worker.state} · PID ${worker.pid}${uptime}`, command: 'kubb studio stop' }\n : { value: `${styleText('dim', '○')} ${worker.state}`, command: 'kubb studio start' }\n const remembered = credentials?.projects?.[project]\n const permissions = remembered ? formatPermissionRows(remembered) : [styleText('dim', 'not chosen yet')]\n\n const rows: Array<{ label: string; value: string; command?: string }> = [\n { label: 'Pairing', ...pairing },\n { label: 'Worker', ...workerRow },\n { label: 'Project', value: `${path.basename(project)} · ${tilde(project)}` },\n ...permissions.map((value, index) => ({\n label: index === 0 ? 'Permissions' : '',\n value,\n command: !remembered && index === 0 ? 'kubb studio connect' : undefined,\n })),\n { label: 'Logs', value: tilde(logPath) },\n ]\n const width = Math.max(...rows.filter((row) => row.command).map((row) => stripVTControlCharacters(row.value).length))\n\n return rows.map(({ label, value, command }) => {\n const line = ` ${label.padEnd(11)} ${value}`\n return command ? `${line}${' '.repeat(width - stripVTControlCharacters(value).length + 3)}${styleText('dim', command)}` : line\n })\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,aAAa,IAAoB;CAC/C,MAAM,UAAU,KAAK,MAAM,KAAK,GAAM;CACtC,IAAI,UAAU,GAAG,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC,EAAE;CAC9D,IAAI,UAAU,IAAI,OAAO,GAAG,QAAQ;CAEpC,OAAO,GAAG,KAAK,MAAM,UAAU,EAAE,EAAE,IAAI,UAAU,GAAG;AACtD;AAEA,MAAM,SAAS,SAAkBA,cAAAA,aAAa,OAAA,GAAMC,QAAAA,QAAAA,CAAQ,CAAC,IAAI,IAAI,KAAK,OAAA,GAAMA,QAAAA,QAAAA,CAAQ,CAAC,CAAC,MAAM,MAAM;;;;AAKtG,SAAgB,aAAa,EAAE,WAAW,aAAa,QAAQ,SAAS,SAAS,MAAM,KAAK,IAAI,KAAiC;CAC/H,MAAM,iBAAiB;EACrB,IAAI,CAAC,aAAa,OAAO;GAAE,OAAO,IAAA,GAAGC,UAAAA,UAAAA,CAAU,OAAO,GAAG,EAAE;GAAc,SAAS;EAAoB;EACtG,MAAM,OAAO,GAAG,YAAY,aAAa,YAAY,UAAU,YAAY,mBAAmB,UAAU,YAAY,qBAAqB;EACzI,IAAI,YAAY,cAAc,WAAW,OAAO;GAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,UAAU,GAAG,EAAE,GAAG,KAAK,KAAK,YAAY;GAAa,SAAS;EAAoB;EACxJ,OAAO;GAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,SAAS,GAAG,EAAE,GAAG;GAAQ,SAAS;EAAqB;CACtF,EAAA,CAAG;CACH,MAAM,SAAS,OAAO,YAAY,SAAS,aAAa,MAAM,OAAO,SAAS,MAAM;CACpF,MAAM,YAAY,OAAO,UACrB;EAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,SAAS,GAAG,EAAE,GAAG,OAAO,MAAM,SAAS,OAAO,MAAM;EAAU,SAAS;CAAmB,IAChH;EAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,OAAO,GAAG,EAAE,GAAG,OAAO;EAAS,SAAS;CAAoB;CACtF,MAAM,aAAa,aAAa,WAAW;CAC3C,MAAM,cAAc,aAAaC,YAAAA,qBAAqB,UAAU,IAAI,EAAA,GAACD,UAAAA,UAAAA,CAAU,OAAO,gBAAgB,CAAC;CAEvG,MAAM,OAAkE;EACtE;GAAE,OAAO;GAAW,GAAG;EAAQ;EAC/B;GAAE,OAAO;GAAU,GAAG;EAAU;EAChC;GAAE,OAAO;GAAW,OAAO,GAAGE,UAAAA,QAAK,SAAS,OAAO,EAAE,KAAK,MAAM,OAAO;EAAI;EAC3E,GAAG,YAAY,KAAK,OAAO,WAAW;GACpC,OAAO,UAAU,IAAI,gBAAgB;GACrC;GACA,SAAS,CAAC,cAAc,UAAU,IAAI,wBAAwB,KAAA;EAChE,EAAE;EACF;GAAE,OAAO;GAAQ,OAAO,MAAM,OAAO;EAAE;CACzC;CACA,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,SAAA,GAAQC,UAAAA,yBAAAA,CAAyB,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC;CAEpH,OAAO,KAAK,KAAK,EAAE,OAAO,OAAO,cAAc;EAC7C,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE,EAAE,IAAI;EACvC,OAAO,UAAU,GAAG,OAAO,IAAI,OAAO,SAAA,GAAQA,UAAAA,yBAAAA,CAAyB,KAAK,CAAC,CAAC,SAAS,CAAC,KAAA,GAAIH,UAAAA,UAAAA,CAAU,OAAO,OAAO,MAAM;CAC5H,CAAC;AACH"}
1
+ {"version":3,"file":"status-Bc0_4T41.cjs","names":["isPathInside","homedir","styleText","formatPermissionRows","path","stripVTControlCharacters"],"sources":["../src/runners/studio/status.ts"],"sourcesContent":["import { homedir } from 'node:os'\nimport path from 'node:path'\nimport { stripVTControlCharacters, styleText } from 'node:util'\nimport { isPathInside } from '@internals/utils'\nimport type { Credentials } from './credentials.ts'\nimport { formatPermissionRows, type WorkerState } from './run.ts'\n\ntype StatusInput = {\n studioUrl: string\n credentials: Credentials | null\n worker: { running: boolean; state: WorkerState; pid?: number; startedAt?: number }\n project: string\n logPath: string\n now?: number\n}\n\n/** How long a worker has run, such as `2h 14m`, `5m` or `40s`. */\nexport function formatUptime(ms: number): string {\n const minutes = Math.floor(ms / 60_000)\n if (minutes < 1) return `${Math.max(0, Math.floor(ms / 1000))}s`\n if (minutes < 60) return `${minutes}m`\n\n return `${Math.floor(minutes / 60)}h ${minutes % 60}m`\n}\n\nconst tilde = (file: string) => (isPathInside(file, homedir()) ? `~${file.slice(homedir().length)}` : file)\n\n/**\n * The `kubb studio status` table: one row per topic, each ending with the command that changes it.\n */\nexport function formatStatus({ studioUrl, credentials, worker, project, logPath, now = Date.now() }: StatusInput): Array<string> {\n const pairing = (() => {\n if (!credentials) return { value: `${styleText('red', '✖')} not paired`, command: 'kubb studio login' }\n const name = `${credentials.agentSlug || credentials.agentId}${credentials.organizationSlug ? ` · org ${credentials.organizationSlug}` : ''}`\n if (credentials.studioUrl !== studioUrl) return { value: `${styleText('yellow', '!')} ${name} · ${credentials.studioUrl}`, command: 'kubb studio login' }\n return { value: `${styleText('green', '✓')} ${name}`, command: 'kubb studio logout' }\n })()\n const uptime = worker.startedAt ? ` · up ${formatUptime(now - worker.startedAt)}` : ''\n const workerRow = worker.running\n ? { value: `${styleText('green', '●')} ${worker.state} · PID ${worker.pid}${uptime}`, command: 'kubb studio stop' }\n : { value: `${styleText('dim', '○')} ${worker.state}`, command: 'kubb studio start' }\n const remembered = credentials?.projects?.[project]\n const permissions = remembered ? formatPermissionRows(remembered) : [styleText('dim', 'not chosen yet')]\n\n const rows: Array<{ label: string; value: string; command?: string }> = [\n { label: 'Pairing', ...pairing },\n { label: 'Worker', ...workerRow },\n { label: 'Project', value: `${path.basename(project)} · ${tilde(project)}` },\n ...permissions.map((value, index) => ({\n label: index === 0 ? 'Permissions' : '',\n value,\n command: index === 0 ? (remembered ? 'kubb studio permissions' : 'kubb studio connect') : undefined,\n })),\n { label: 'Logs', value: tilde(logPath) },\n ]\n const width = Math.max(...rows.filter((row) => row.command).map((row) => stripVTControlCharacters(row.value).length))\n\n return rows.map(({ label, value, command }) => {\n const line = ` ${label.padEnd(11)} ${value}`\n return command ? `${line}${' '.repeat(width - stripVTControlCharacters(value).length + 3)}${styleText('dim', command)}` : line\n })\n}\n"],"mappings":";;;;;;;;;AAiBA,SAAgB,aAAa,IAAoB;CAC/C,MAAM,UAAU,KAAK,MAAM,KAAK,GAAM;CACtC,IAAI,UAAU,GAAG,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC,EAAE;CAC9D,IAAI,UAAU,IAAI,OAAO,GAAG,QAAQ;CAEpC,OAAO,GAAG,KAAK,MAAM,UAAU,EAAE,EAAE,IAAI,UAAU,GAAG;AACtD;AAEA,MAAM,SAAS,SAAkBA,gBAAAA,aAAa,OAAA,GAAMC,QAAAA,QAAAA,CAAQ,CAAC,IAAI,IAAI,KAAK,OAAA,GAAMA,QAAAA,QAAAA,CAAQ,CAAC,CAAC,MAAM,MAAM;;;;AAKtG,SAAgB,aAAa,EAAE,WAAW,aAAa,QAAQ,SAAS,SAAS,MAAM,KAAK,IAAI,KAAiC;CAC/H,MAAM,iBAAiB;EACrB,IAAI,CAAC,aAAa,OAAO;GAAE,OAAO,IAAA,GAAGC,UAAAA,UAAAA,CAAU,OAAO,GAAG,EAAE;GAAc,SAAS;EAAoB;EACtG,MAAM,OAAO,GAAG,YAAY,aAAa,YAAY,UAAU,YAAY,mBAAmB,UAAU,YAAY,qBAAqB;EACzI,IAAI,YAAY,cAAc,WAAW,OAAO;GAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,UAAU,GAAG,EAAE,GAAG,KAAK,KAAK,YAAY;GAAa,SAAS;EAAoB;EACxJ,OAAO;GAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,SAAS,GAAG,EAAE,GAAG;GAAQ,SAAS;EAAqB;CACtF,EAAA,CAAG;CACH,MAAM,SAAS,OAAO,YAAY,SAAS,aAAa,MAAM,OAAO,SAAS,MAAM;CACpF,MAAM,YAAY,OAAO,UACrB;EAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,SAAS,GAAG,EAAE,GAAG,OAAO,MAAM,SAAS,OAAO,MAAM;EAAU,SAAS;CAAmB,IAChH;EAAE,OAAO,IAAA,GAAGA,UAAAA,UAAAA,CAAU,OAAO,GAAG,EAAE,GAAG,OAAO;EAAS,SAAS;CAAoB;CACtF,MAAM,aAAa,aAAa,WAAW;CAC3C,MAAM,cAAc,aAAaC,YAAAA,qBAAqB,UAAU,IAAI,EAAA,GAACD,UAAAA,UAAAA,CAAU,OAAO,gBAAgB,CAAC;CAEvG,MAAM,OAAkE;EACtE;GAAE,OAAO;GAAW,GAAG;EAAQ;EAC/B;GAAE,OAAO;GAAU,GAAG;EAAU;EAChC;GAAE,OAAO;GAAW,OAAO,GAAGE,UAAAA,QAAK,SAAS,OAAO,EAAE,KAAK,MAAM,OAAO;EAAI;EAC3E,GAAG,YAAY,KAAK,OAAO,WAAW;GACpC,OAAO,UAAU,IAAI,gBAAgB;GACrC;GACA,SAAS,UAAU,IAAK,aAAa,4BAA4B,wBAAyB,KAAA;EAC5F,EAAE;EACF;GAAE,OAAO;GAAQ,OAAO,MAAM,OAAO;EAAE;CACzC;CACA,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,SAAA,GAAQC,UAAAA,yBAAAA,CAAyB,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC;CAEpH,OAAO,KAAK,KAAK,EAAE,OAAO,OAAO,cAAc;EAC7C,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE,EAAE,IAAI;EACvC,OAAO,UAAU,GAAG,OAAO,IAAI,OAAO,SAAA,GAAQA,UAAAA,yBAAAA,CAAyB,KAAK,CAAC,CAAC,SAAS,CAAC,KAAA,GAAIH,UAAAA,UAAAA,CAAU,OAAO,OAAO,MAAM;CAC5H,CAAC;AACH"}
@@ -1,10 +1,10 @@
1
- import "./rolldown-runtime-CRm0XQPb.js";
2
- import { r as formatPermissionRows } from "./run-9fs2T2Je.js";
3
- import { h as isPathInside } from "./utils-CIc8YFtr.js";
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { r as formatPermissionRows } from "./run-KqdudiWQ.js";
3
+ import { i as isPathInside } from "./spinner-BZaln7O8.js";
4
4
  import { stripVTControlCharacters, styleText } from "node:util";
5
5
  import { homedir } from "node:os";
6
6
  import path from "node:path";
7
- //#region src/runners/studio/status.ts
7
+ // src/runners/studio/status.ts
8
8
  /** How long a worker has run, such as `2h 14m`, `5m` or `40s`. */
9
9
  function formatUptime(ms) {
10
10
  const minutes = Math.floor(ms / 6e4);
@@ -58,7 +58,7 @@ function formatStatus({ studioUrl, credentials, worker, project, logPath, now =
58
58
  ...permissions.map((value, index) => ({
59
59
  label: index === 0 ? "Permissions" : "",
60
60
  value,
61
- command: !remembered && index === 0 ? "kubb studio connect" : void 0
61
+ command: index === 0 ? remembered ? "kubb studio permissions" : "kubb studio connect" : void 0
62
62
  })),
63
63
  {
64
64
  label: "Logs",
@@ -71,7 +71,6 @@ function formatStatus({ studioUrl, credentials, worker, project, logPath, now =
71
71
  return command ? `${line}${" ".repeat(width - stripVTControlCharacters(value).length + 3)}${styleText("dim", command)}` : line;
72
72
  });
73
73
  }
74
- //#endregion
75
74
  export { formatStatus };
76
75
 
77
- //# sourceMappingURL=status-BjmXLRm2.js.map
76
+ //# sourceMappingURL=status-DxSkp1cH.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"status-BjmXLRm2.js","names":[],"sources":["../src/runners/studio/status.ts"],"sourcesContent":["import { homedir } from 'node:os'\nimport path from 'node:path'\nimport { stripVTControlCharacters, styleText } from 'node:util'\nimport { isPathInside } from '@internals/utils'\nimport type { Credentials } from './credentials.ts'\nimport { formatPermissionRows, type WorkerState } from './run.ts'\n\ntype StatusInput = {\n studioUrl: string\n credentials: Credentials | null\n worker: { running: boolean; state: WorkerState; pid?: number; startedAt?: number }\n project: string\n logPath: string\n now?: number\n}\n\n/** How long a worker has run, such as `2h 14m`, `5m` or `40s`. */\nexport function formatUptime(ms: number): string {\n const minutes = Math.floor(ms / 60_000)\n if (minutes < 1) return `${Math.max(0, Math.floor(ms / 1000))}s`\n if (minutes < 60) return `${minutes}m`\n\n return `${Math.floor(minutes / 60)}h ${minutes % 60}m`\n}\n\nconst tilde = (file: string) => (isPathInside(file, homedir()) ? `~${file.slice(homedir().length)}` : file)\n\n/**\n * The `kubb studio status` table: one row per topic, each ending with the command that changes it.\n */\nexport function formatStatus({ studioUrl, credentials, worker, project, logPath, now = Date.now() }: StatusInput): Array<string> {\n const pairing = (() => {\n if (!credentials) return { value: `${styleText('red', '✖')} not paired`, command: 'kubb studio login' }\n const name = `${credentials.agentSlug || credentials.agentId}${credentials.organizationSlug ? ` · org ${credentials.organizationSlug}` : ''}`\n if (credentials.studioUrl !== studioUrl) return { value: `${styleText('yellow', '!')} ${name} · ${credentials.studioUrl}`, command: 'kubb studio login' }\n return { value: `${styleText('green', '✓')} ${name}`, command: 'kubb studio logout' }\n })()\n const uptime = worker.startedAt ? ` · up ${formatUptime(now - worker.startedAt)}` : ''\n const workerRow = worker.running\n ? { value: `${styleText('green', '●')} ${worker.state} · PID ${worker.pid}${uptime}`, command: 'kubb studio stop' }\n : { value: `${styleText('dim', '○')} ${worker.state}`, command: 'kubb studio start' }\n const remembered = credentials?.projects?.[project]\n const permissions = remembered ? formatPermissionRows(remembered) : [styleText('dim', 'not chosen yet')]\n\n const rows: Array<{ label: string; value: string; command?: string }> = [\n { label: 'Pairing', ...pairing },\n { label: 'Worker', ...workerRow },\n { label: 'Project', value: `${path.basename(project)} · ${tilde(project)}` },\n ...permissions.map((value, index) => ({\n label: index === 0 ? 'Permissions' : '',\n value,\n command: !remembered && index === 0 ? 'kubb studio connect' : undefined,\n })),\n { label: 'Logs', value: tilde(logPath) },\n ]\n const width = Math.max(...rows.filter((row) => row.command).map((row) => stripVTControlCharacters(row.value).length))\n\n return rows.map(({ label, value, command }) => {\n const line = ` ${label.padEnd(11)} ${value}`\n return command ? `${line}${' '.repeat(width - stripVTControlCharacters(value).length + 3)}${styleText('dim', command)}` : line\n })\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgB,aAAa,IAAoB;CAC/C,MAAM,UAAU,KAAK,MAAM,KAAK,GAAM;CACtC,IAAI,UAAU,GAAG,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC,EAAE;CAC9D,IAAI,UAAU,IAAI,OAAO,GAAG,QAAQ;CAEpC,OAAO,GAAG,KAAK,MAAM,UAAU,EAAE,EAAE,IAAI,UAAU,GAAG;AACtD;AAEA,MAAM,SAAS,SAAkB,aAAa,MAAM,QAAQ,CAAC,IAAI,IAAI,KAAK,MAAM,QAAQ,CAAC,CAAC,MAAM,MAAM;;;;AAKtG,SAAgB,aAAa,EAAE,WAAW,aAAa,QAAQ,SAAS,SAAS,MAAM,KAAK,IAAI,KAAiC;CAC/H,MAAM,iBAAiB;EACrB,IAAI,CAAC,aAAa,OAAO;GAAE,OAAO,GAAG,UAAU,OAAO,GAAG,EAAE;GAAc,SAAS;EAAoB;EACtG,MAAM,OAAO,GAAG,YAAY,aAAa,YAAY,UAAU,YAAY,mBAAmB,UAAU,YAAY,qBAAqB;EACzI,IAAI,YAAY,cAAc,WAAW,OAAO;GAAE,OAAO,GAAG,UAAU,UAAU,GAAG,EAAE,GAAG,KAAK,KAAK,YAAY;GAAa,SAAS;EAAoB;EACxJ,OAAO;GAAE,OAAO,GAAG,UAAU,SAAS,GAAG,EAAE,GAAG;GAAQ,SAAS;EAAqB;CACtF,EAAA,CAAG;CACH,MAAM,SAAS,OAAO,YAAY,SAAS,aAAa,MAAM,OAAO,SAAS,MAAM;CACpF,MAAM,YAAY,OAAO,UACrB;EAAE,OAAO,GAAG,UAAU,SAAS,GAAG,EAAE,GAAG,OAAO,MAAM,SAAS,OAAO,MAAM;EAAU,SAAS;CAAmB,IAChH;EAAE,OAAO,GAAG,UAAU,OAAO,GAAG,EAAE,GAAG,OAAO;EAAS,SAAS;CAAoB;CACtF,MAAM,aAAa,aAAa,WAAW;CAC3C,MAAM,cAAc,aAAa,qBAAqB,UAAU,IAAI,CAAC,UAAU,OAAO,gBAAgB,CAAC;CAEvG,MAAM,OAAkE;EACtE;GAAE,OAAO;GAAW,GAAG;EAAQ;EAC/B;GAAE,OAAO;GAAU,GAAG;EAAU;EAChC;GAAE,OAAO;GAAW,OAAO,GAAG,KAAK,SAAS,OAAO,EAAE,KAAK,MAAM,OAAO;EAAI;EAC3E,GAAG,YAAY,KAAK,OAAO,WAAW;GACpC,OAAO,UAAU,IAAI,gBAAgB;GACrC;GACA,SAAS,CAAC,cAAc,UAAU,IAAI,wBAAwB,KAAA;EAChE,EAAE;EACF;GAAE,OAAO;GAAQ,OAAO,MAAM,OAAO;EAAE;CACzC;CACA,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,QAAQ,yBAAyB,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC;CAEpH,OAAO,KAAK,KAAK,EAAE,OAAO,OAAO,cAAc;EAC7C,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE,EAAE,IAAI;EACvC,OAAO,UAAU,GAAG,OAAO,IAAI,OAAO,QAAQ,yBAAyB,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,UAAU,OAAO,OAAO,MAAM;CAC5H,CAAC;AACH"}
1
+ {"version":3,"file":"status-DxSkp1cH.js","names":[],"sources":["../src/runners/studio/status.ts"],"sourcesContent":["import { homedir } from 'node:os'\nimport path from 'node:path'\nimport { stripVTControlCharacters, styleText } from 'node:util'\nimport { isPathInside } from '@internals/utils'\nimport type { Credentials } from './credentials.ts'\nimport { formatPermissionRows, type WorkerState } from './run.ts'\n\ntype StatusInput = {\n studioUrl: string\n credentials: Credentials | null\n worker: { running: boolean; state: WorkerState; pid?: number; startedAt?: number }\n project: string\n logPath: string\n now?: number\n}\n\n/** How long a worker has run, such as `2h 14m`, `5m` or `40s`. */\nexport function formatUptime(ms: number): string {\n const minutes = Math.floor(ms / 60_000)\n if (minutes < 1) return `${Math.max(0, Math.floor(ms / 1000))}s`\n if (minutes < 60) return `${minutes}m`\n\n return `${Math.floor(minutes / 60)}h ${minutes % 60}m`\n}\n\nconst tilde = (file: string) => (isPathInside(file, homedir()) ? `~${file.slice(homedir().length)}` : file)\n\n/**\n * The `kubb studio status` table: one row per topic, each ending with the command that changes it.\n */\nexport function formatStatus({ studioUrl, credentials, worker, project, logPath, now = Date.now() }: StatusInput): Array<string> {\n const pairing = (() => {\n if (!credentials) return { value: `${styleText('red', '✖')} not paired`, command: 'kubb studio login' }\n const name = `${credentials.agentSlug || credentials.agentId}${credentials.organizationSlug ? ` · org ${credentials.organizationSlug}` : ''}`\n if (credentials.studioUrl !== studioUrl) return { value: `${styleText('yellow', '!')} ${name} · ${credentials.studioUrl}`, command: 'kubb studio login' }\n return { value: `${styleText('green', '✓')} ${name}`, command: 'kubb studio logout' }\n })()\n const uptime = worker.startedAt ? ` · up ${formatUptime(now - worker.startedAt)}` : ''\n const workerRow = worker.running\n ? { value: `${styleText('green', '●')} ${worker.state} · PID ${worker.pid}${uptime}`, command: 'kubb studio stop' }\n : { value: `${styleText('dim', '○')} ${worker.state}`, command: 'kubb studio start' }\n const remembered = credentials?.projects?.[project]\n const permissions = remembered ? formatPermissionRows(remembered) : [styleText('dim', 'not chosen yet')]\n\n const rows: Array<{ label: string; value: string; command?: string }> = [\n { label: 'Pairing', ...pairing },\n { label: 'Worker', ...workerRow },\n { label: 'Project', value: `${path.basename(project)} · ${tilde(project)}` },\n ...permissions.map((value, index) => ({\n label: index === 0 ? 'Permissions' : '',\n value,\n command: index === 0 ? (remembered ? 'kubb studio permissions' : 'kubb studio connect') : undefined,\n })),\n { label: 'Logs', value: tilde(logPath) },\n ]\n const width = Math.max(...rows.filter((row) => row.command).map((row) => stripVTControlCharacters(row.value).length))\n\n return rows.map(({ label, value, command }) => {\n const line = ` ${label.padEnd(11)} ${value}`\n return command ? `${line}${' '.repeat(width - stripVTControlCharacters(value).length + 3)}${styleText('dim', command)}` : line\n })\n}\n"],"mappings":";;;;;;;;AAiBA,SAAgB,aAAa,IAAoB;CAC/C,MAAM,UAAU,KAAK,MAAM,KAAK,GAAM;CACtC,IAAI,UAAU,GAAG,OAAO,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,GAAI,CAAC,EAAE;CAC9D,IAAI,UAAU,IAAI,OAAO,GAAG,QAAQ;CAEpC,OAAO,GAAG,KAAK,MAAM,UAAU,EAAE,EAAE,IAAI,UAAU,GAAG;AACtD;AAEA,MAAM,SAAS,SAAkB,aAAa,MAAM,QAAQ,CAAC,IAAI,IAAI,KAAK,MAAM,QAAQ,CAAC,CAAC,MAAM,MAAM;;;;AAKtG,SAAgB,aAAa,EAAE,WAAW,aAAa,QAAQ,SAAS,SAAS,MAAM,KAAK,IAAI,KAAiC;CAC/H,MAAM,iBAAiB;EACrB,IAAI,CAAC,aAAa,OAAO;GAAE,OAAO,GAAG,UAAU,OAAO,GAAG,EAAE;GAAc,SAAS;EAAoB;EACtG,MAAM,OAAO,GAAG,YAAY,aAAa,YAAY,UAAU,YAAY,mBAAmB,UAAU,YAAY,qBAAqB;EACzI,IAAI,YAAY,cAAc,WAAW,OAAO;GAAE,OAAO,GAAG,UAAU,UAAU,GAAG,EAAE,GAAG,KAAK,KAAK,YAAY;GAAa,SAAS;EAAoB;EACxJ,OAAO;GAAE,OAAO,GAAG,UAAU,SAAS,GAAG,EAAE,GAAG;GAAQ,SAAS;EAAqB;CACtF,EAAA,CAAG;CACH,MAAM,SAAS,OAAO,YAAY,SAAS,aAAa,MAAM,OAAO,SAAS,MAAM;CACpF,MAAM,YAAY,OAAO,UACrB;EAAE,OAAO,GAAG,UAAU,SAAS,GAAG,EAAE,GAAG,OAAO,MAAM,SAAS,OAAO,MAAM;EAAU,SAAS;CAAmB,IAChH;EAAE,OAAO,GAAG,UAAU,OAAO,GAAG,EAAE,GAAG,OAAO;EAAS,SAAS;CAAoB;CACtF,MAAM,aAAa,aAAa,WAAW;CAC3C,MAAM,cAAc,aAAa,qBAAqB,UAAU,IAAI,CAAC,UAAU,OAAO,gBAAgB,CAAC;CAEvG,MAAM,OAAkE;EACtE;GAAE,OAAO;GAAW,GAAG;EAAQ;EAC/B;GAAE,OAAO;GAAU,GAAG;EAAU;EAChC;GAAE,OAAO;GAAW,OAAO,GAAG,KAAK,SAAS,OAAO,EAAE,KAAK,MAAM,OAAO;EAAI;EAC3E,GAAG,YAAY,KAAK,OAAO,WAAW;GACpC,OAAO,UAAU,IAAI,gBAAgB;GACrC;GACA,SAAS,UAAU,IAAK,aAAa,4BAA4B,wBAAyB,KAAA;EAC5F,EAAE;EACF;GAAE,OAAO;GAAQ,OAAO,MAAM,OAAO;EAAE;CACzC;CACA,MAAM,QAAQ,KAAK,IAAI,GAAG,KAAK,QAAQ,QAAQ,IAAI,OAAO,CAAC,CAAC,KAAK,QAAQ,yBAAyB,IAAI,KAAK,CAAC,CAAC,MAAM,CAAC;CAEpH,OAAO,KAAK,KAAK,EAAE,OAAO,OAAO,cAAc;EAC7C,MAAM,OAAO,KAAK,MAAM,OAAO,EAAE,EAAE,IAAI;EACvC,OAAO,UAAU,GAAG,OAAO,IAAI,OAAO,QAAQ,yBAAyB,KAAK,CAAC,CAAC,SAAS,CAAC,IAAI,UAAU,OAAO,OAAO,MAAM;CAC5H,CAAC;AACH"}
@@ -0,0 +1,218 @@
1
+ const require_rolldown_runtime = require("./rolldown-runtime-C3-Zg-KD.cjs");
2
+ const require_shared = require("./shared-C0EtrdUm.cjs");
3
+ const require_config = require("./config-CRrmj88c.cjs");
4
+ let gunshi = require("gunshi");
5
+ let node_process = require("node:process");
6
+ node_process = require_rolldown_runtime.__toESM(node_process, 1);
7
+ let node_path = require("node:path");
8
+ node_path = require_rolldown_runtime.__toESM(node_path, 1);
9
+ // src/commands/studio/studioCommand.ts
10
+ /**
11
+ * Defines a `kubb studio` subcommand. The runner, and with it `@kubb/studio`, loads only when the
12
+ * command runs, so `kubb --help` never does.
13
+ */
14
+ function studioCommand({ action, block, ...definition }) {
15
+ return (0, gunshi.define)({
16
+ ...definition,
17
+ toKebab: true,
18
+ async run({ values }) {
19
+ const { runStudio } = await Promise.resolve().then(() => require("./run-Bb19PlwV.cjs"));
20
+ await runStudio(values, action, { block });
21
+ }
22
+ });
23
+ }
24
+ // src/commands/studio/connect.ts
25
+ const command$7 = studioCommand({
26
+ name: "connect",
27
+ description: "Connect this project to Kubb Studio and generate from the browser.",
28
+ examples: [
29
+ "kubb studio connect",
30
+ "kubb studio connect --allow-read",
31
+ "kubb studio connect --allow-write --allow-exec",
32
+ "kubb studio connect --url http://localhost:3000"
33
+ ].join("\n"),
34
+ args: {
35
+ ...require_shared.configArg,
36
+ ...require_shared.studioConnectionArgs,
37
+ ...require_shared.studioPermissionArgs,
38
+ open: {
39
+ type: "boolean",
40
+ description: "Open the approval page in a browser while pairing",
41
+ default: true,
42
+ negatable: true
43
+ },
44
+ ...require_shared.logLevelArg
45
+ },
46
+ block: true,
47
+ async action(options) {
48
+ const { connect } = await Promise.resolve().then(() => require("./run-Bb19PlwV.cjs"));
49
+ await connect(options);
50
+ }
51
+ });
52
+ // src/commands/studio/login.ts
53
+ const command$6 = studioCommand({
54
+ name: "login",
55
+ description: "Pair this machine with Kubb Studio without connecting.",
56
+ examples: ["kubb studio login", "kubb studio login --url http://localhost:3000"].join("\n"),
57
+ args: command$7.args,
58
+ async action(options) {
59
+ const { login } = await Promise.resolve().then(() => require("./run-Bb19PlwV.cjs"));
60
+ await login(options);
61
+ }
62
+ });
63
+ // src/commands/studio/logout.ts
64
+ const command$5 = studioCommand({
65
+ name: "logout",
66
+ description: "Forget the stored Kubb Studio token.",
67
+ examples: "kubb studio logout",
68
+ args: {},
69
+ async action() {
70
+ const { stopWorker } = await Promise.resolve().then(() => require("./background-B24lIehn.cjs"));
71
+ const { clearCredentials } = await Promise.resolve().then(() => require("./credentials-DEsGwcGD.cjs")).then((n) => n.credentials_exports);
72
+ await stopWorker();
73
+ await clearCredentials();
74
+ console.log("Signed out of Kubb Studio.");
75
+ }
76
+ });
77
+ // src/commands/studio/permissions.ts
78
+ const command$4 = studioCommand({
79
+ name: "permissions",
80
+ description: "Change what Kubb Studio may do in this project.",
81
+ examples: "kubb studio permissions",
82
+ args: {},
83
+ async action(options) {
84
+ const { readCredentials } = await Promise.resolve().then(() => require("./credentials-DEsGwcGD.cjs")).then((n) => n.credentials_exports);
85
+ const { resolvePermissions } = await Promise.resolve().then(() => require("./run-Bb19PlwV.cjs"));
86
+ const { canUseTTY } = await Promise.resolve().then(() => require("./env-eu3XyKqJ.cjs")).then((n) => n.env_exports);
87
+ const credentials = await readCredentials();
88
+ if (!credentials) throw new Error("This project is not paired with Kubb Studio. Run `kubb studio` first.");
89
+ if (!canUseTTY()) throw new Error("Changing permissions needs an interactive terminal.");
90
+ const configFile = require_config.findConfigFile();
91
+ await resolvePermissions(options, credentials, configFile && node_path.default.relative(node_process.default.cwd(), configFile), { edit: true });
92
+ console.log("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.");
93
+ }
94
+ });
95
+ // src/commands/studio/snapshot.ts
96
+ const command$3 = (0, gunshi.define)({
97
+ name: "snapshot",
98
+ description: "Generate and publish a Kubb Studio snapshot from CI.",
99
+ examples: ["kubb studio snapshot", "kubb studio snapshot --json"].join("\n"),
100
+ toKebab: true,
101
+ args: {
102
+ ...require_shared.configArg,
103
+ ...require_shared.studioConnectionArgs,
104
+ id: {
105
+ type: "string",
106
+ description: "Stable identity for the CI agent, such as a pull request. Auto-detected on GitHub Actions, GitLab CI, Bitbucket Pipelines and CircleCI"
107
+ },
108
+ baseId: {
109
+ type: "string",
110
+ description: "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",
111
+ toKebab: true
112
+ },
113
+ name: {
114
+ type: "string",
115
+ description: "Package name for the generated tarball. Defaults to the name in package.json"
116
+ },
117
+ packageVersion: {
118
+ type: "string",
119
+ description: "Package version for the generated tarball. Defaults to the version in package.json",
120
+ toKebab: true
121
+ },
122
+ json: {
123
+ type: "boolean",
124
+ description: "Print the result as one JSON object instead of a summary",
125
+ default: false
126
+ },
127
+ ...require_shared.logLevelArg
128
+ },
129
+ async run(ctx) {
130
+ const { runner } = await Promise.resolve().then(() => require("./snapshot-D7Ytw8S0.cjs"));
131
+ await runner(ctx);
132
+ }
133
+ });
134
+ // src/commands/studio/background.ts
135
+ const command$2 = studioCommand({
136
+ name: "start",
137
+ description: "Keep this project connected to Kubb Studio in the background.",
138
+ args: command$7.args,
139
+ async action(options) {
140
+ const { startWorker } = await Promise.resolve().then(() => require("./background-B24lIehn.cjs"));
141
+ await startWorker(options);
142
+ }
143
+ });
144
+ const stopCommand = (0, gunshi.define)({
145
+ name: "stop",
146
+ description: "Stop this project's background connection and keep its pairing.",
147
+ async run() {
148
+ const { stopWorker } = await Promise.resolve().then(() => require("./background-B24lIehn.cjs"));
149
+ await stopWorker();
150
+ console.log("Background connection stopped.");
151
+ }
152
+ });
153
+ // src/commands/studio/status.ts
154
+ const command$1 = studioCommand({
155
+ name: "status",
156
+ description: "Show the project worker, Kubb Studio pairing, and saved permissions.",
157
+ examples: "kubb studio status",
158
+ args: { url: require_shared.studioConnectionArgs.url },
159
+ async action(options) {
160
+ const { getWorkerLogPath, getWorkerStatus } = await Promise.resolve().then(() => require("./background-B24lIehn.cjs"));
161
+ const { readCredentials } = await Promise.resolve().then(() => require("./credentials-DEsGwcGD.cjs")).then((n) => n.credentials_exports);
162
+ const { formatStatus } = await Promise.resolve().then(() => require("./status-Bc0_4T41.cjs"));
163
+ const [worker, credentials] = await Promise.all([getWorkerStatus(), readCredentials()]);
164
+ console.log([
165
+ "",
166
+ ...formatStatus({
167
+ studioUrl: options.studioUrl,
168
+ credentials,
169
+ worker,
170
+ project: node_process.default.cwd(),
171
+ logPath: getWorkerLogPath()
172
+ }),
173
+ ""
174
+ ].join("\n"));
175
+ }
176
+ });
177
+ // src/commands/studio/index.ts
178
+ const command = (0, gunshi.define)({
179
+ ...command$7,
180
+ name: "studio",
181
+ description: "Connect this project to Kubb Studio, or manage its pairing and snapshots.",
182
+ examples: [
183
+ "kubb studio",
184
+ "kubb studio --allow-read",
185
+ "kubb studio login",
186
+ "kubb studio status",
187
+ "kubb studio permissions",
188
+ "kubb studio logout",
189
+ "kubb studio snapshot"
190
+ ].join("\n"),
191
+ subCommands: {
192
+ start: command$2,
193
+ stop: stopCommand,
194
+ connect: command$7,
195
+ login: command$6,
196
+ logout: command$5,
197
+ status: command$1,
198
+ permissions: command$4,
199
+ snapshot: command$3
200
+ }
201
+ });
202
+ /**
203
+ * Sends `kubb studio --flag value` to `kubb studio connect`, the same runner. gunshi picks a
204
+ * subcommand from the first token that is not a flag, so `--url http://…` would read the URL as one.
205
+ */
206
+ function routeStudioFlags(args) {
207
+ const [name, next] = args;
208
+ if (name !== "studio" || !next?.startsWith("-") || next === "--help" || next === "-h") return args;
209
+ return [
210
+ "studio",
211
+ "connect",
212
+ ...args.slice(1)
213
+ ];
214
+ }
215
+ exports.command = command;
216
+ exports.routeStudioFlags = routeStudioFlags;
217
+
218
+ //# sourceMappingURL=studio-BpYwgFb0.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"studio-BpYwgFb0.cjs","names":["define","command","configArg","studioConnectionArgs","studioPermissionArgs","logLevelArg","command","connectCommand","command","command","findConfigFile","path","process","command","define","configArg","studioConnectionArgs","logLevelArg","command","connectCommand","define","command","studioConnectionArgs","process","define","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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"}
@@ -0,0 +1,215 @@
1
+ import "./rolldown-runtime-xo6NMXYd.js";
2
+ import { a as studioPermissionArgs, i as studioConnectionArgs, r as logLevelArg, t as configArg } from "./shared-Ct9stKpp.js";
3
+ import { t as findConfigFile } from "./config-CQTxXvIG.js";
4
+ import { define } from "gunshi";
5
+ import process from "node:process";
6
+ import path from "node:path";
7
+ // src/commands/studio/studioCommand.ts
8
+ /**
9
+ * Defines a `kubb studio` subcommand. The runner, and with it `@kubb/studio`, loads only when the
10
+ * command runs, so `kubb --help` never does.
11
+ */
12
+ function studioCommand({ action, block, ...definition }) {
13
+ return define({
14
+ ...definition,
15
+ toKebab: true,
16
+ async run({ values }) {
17
+ const { runStudio } = await import("./run-CCLPt4hr.js");
18
+ await runStudio(values, action, { block });
19
+ }
20
+ });
21
+ }
22
+ // src/commands/studio/connect.ts
23
+ const command$7 = studioCommand({
24
+ name: "connect",
25
+ description: "Connect this project to Kubb Studio and generate from the browser.",
26
+ examples: [
27
+ "kubb studio connect",
28
+ "kubb studio connect --allow-read",
29
+ "kubb studio connect --allow-write --allow-exec",
30
+ "kubb studio connect --url http://localhost:3000"
31
+ ].join("\n"),
32
+ args: {
33
+ ...configArg,
34
+ ...studioConnectionArgs,
35
+ ...studioPermissionArgs,
36
+ open: {
37
+ type: "boolean",
38
+ description: "Open the approval page in a browser while pairing",
39
+ default: true,
40
+ negatable: true
41
+ },
42
+ ...logLevelArg
43
+ },
44
+ block: true,
45
+ async action(options) {
46
+ const { connect } = await import("./run-CCLPt4hr.js");
47
+ await connect(options);
48
+ }
49
+ });
50
+ // src/commands/studio/login.ts
51
+ const command$6 = studioCommand({
52
+ name: "login",
53
+ description: "Pair this machine with Kubb Studio without connecting.",
54
+ examples: ["kubb studio login", "kubb studio login --url http://localhost:3000"].join("\n"),
55
+ args: command$7.args,
56
+ async action(options) {
57
+ const { login } = await import("./run-CCLPt4hr.js");
58
+ await login(options);
59
+ }
60
+ });
61
+ // src/commands/studio/logout.ts
62
+ const command$5 = studioCommand({
63
+ name: "logout",
64
+ description: "Forget the stored Kubb Studio token.",
65
+ examples: "kubb studio logout",
66
+ args: {},
67
+ async action() {
68
+ const { stopWorker } = await import("./background-D-7OGjvg.js");
69
+ const { clearCredentials } = await import("./credentials-B77iJx9H.js");
70
+ await stopWorker();
71
+ await clearCredentials();
72
+ console.log("Signed out of Kubb Studio.");
73
+ }
74
+ });
75
+ // src/commands/studio/permissions.ts
76
+ const command$4 = studioCommand({
77
+ name: "permissions",
78
+ description: "Change what Kubb Studio may do in this project.",
79
+ examples: "kubb studio permissions",
80
+ args: {},
81
+ async action(options) {
82
+ const { readCredentials } = await import("./credentials-B77iJx9H.js");
83
+ const { resolvePermissions } = await import("./run-CCLPt4hr.js");
84
+ const { canUseTTY } = await import("./env-C3xHRMez.js");
85
+ const credentials = await readCredentials();
86
+ if (!credentials) throw new Error("This project is not paired with Kubb Studio. Run `kubb studio` first.");
87
+ if (!canUseTTY()) throw new Error("Changing permissions needs an interactive terminal.");
88
+ const configFile = findConfigFile();
89
+ await resolvePermissions(options, credentials, configFile && path.relative(process.cwd(), configFile), { edit: true });
90
+ console.log("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.");
91
+ }
92
+ });
93
+ // src/commands/studio/snapshot.ts
94
+ const command$3 = define({
95
+ name: "snapshot",
96
+ description: "Generate and publish a Kubb Studio snapshot from CI.",
97
+ examples: ["kubb studio snapshot", "kubb studio snapshot --json"].join("\n"),
98
+ toKebab: true,
99
+ args: {
100
+ ...configArg,
101
+ ...studioConnectionArgs,
102
+ id: {
103
+ type: "string",
104
+ description: "Stable identity for the CI agent, such as a pull request. Auto-detected on GitHub Actions, GitLab CI, Bitbucket Pipelines and CircleCI"
105
+ },
106
+ baseId: {
107
+ type: "string",
108
+ description: "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",
109
+ toKebab: true
110
+ },
111
+ name: {
112
+ type: "string",
113
+ description: "Package name for the generated tarball. Defaults to the name in package.json"
114
+ },
115
+ packageVersion: {
116
+ type: "string",
117
+ description: "Package version for the generated tarball. Defaults to the version in package.json",
118
+ toKebab: true
119
+ },
120
+ json: {
121
+ type: "boolean",
122
+ description: "Print the result as one JSON object instead of a summary",
123
+ default: false
124
+ },
125
+ ...logLevelArg
126
+ },
127
+ async run(ctx) {
128
+ const { runner } = await import("./snapshot-n7dJGCWv.js");
129
+ await runner(ctx);
130
+ }
131
+ });
132
+ // src/commands/studio/background.ts
133
+ const command$2 = studioCommand({
134
+ name: "start",
135
+ description: "Keep this project connected to Kubb Studio in the background.",
136
+ args: command$7.args,
137
+ async action(options) {
138
+ const { startWorker } = await import("./background-D-7OGjvg.js");
139
+ await startWorker(options);
140
+ }
141
+ });
142
+ const stopCommand = define({
143
+ name: "stop",
144
+ description: "Stop this project's background connection and keep its pairing.",
145
+ async run() {
146
+ const { stopWorker } = await import("./background-D-7OGjvg.js");
147
+ await stopWorker();
148
+ console.log("Background connection stopped.");
149
+ }
150
+ });
151
+ // src/commands/studio/status.ts
152
+ const command$1 = studioCommand({
153
+ name: "status",
154
+ description: "Show the project worker, Kubb Studio pairing, and saved permissions.",
155
+ examples: "kubb studio status",
156
+ args: { url: studioConnectionArgs.url },
157
+ async action(options) {
158
+ const { getWorkerLogPath, getWorkerStatus } = await import("./background-D-7OGjvg.js");
159
+ const { readCredentials } = await import("./credentials-B77iJx9H.js");
160
+ const { formatStatus } = await import("./status-DxSkp1cH.js");
161
+ const [worker, credentials] = await Promise.all([getWorkerStatus(), readCredentials()]);
162
+ console.log([
163
+ "",
164
+ ...formatStatus({
165
+ studioUrl: options.studioUrl,
166
+ credentials,
167
+ worker,
168
+ project: process.cwd(),
169
+ logPath: getWorkerLogPath()
170
+ }),
171
+ ""
172
+ ].join("\n"));
173
+ }
174
+ });
175
+ // src/commands/studio/index.ts
176
+ const command = define({
177
+ ...command$7,
178
+ name: "studio",
179
+ description: "Connect this project to Kubb Studio, or manage its pairing and snapshots.",
180
+ examples: [
181
+ "kubb studio",
182
+ "kubb studio --allow-read",
183
+ "kubb studio login",
184
+ "kubb studio status",
185
+ "kubb studio permissions",
186
+ "kubb studio logout",
187
+ "kubb studio snapshot"
188
+ ].join("\n"),
189
+ subCommands: {
190
+ start: command$2,
191
+ stop: stopCommand,
192
+ connect: command$7,
193
+ login: command$6,
194
+ logout: command$5,
195
+ status: command$1,
196
+ permissions: command$4,
197
+ snapshot: command$3
198
+ }
199
+ });
200
+ /**
201
+ * Sends `kubb studio --flag value` to `kubb studio connect`, the same runner. gunshi picks a
202
+ * subcommand from the first token that is not a flag, so `--url http://…` would read the URL as one.
203
+ */
204
+ function routeStudioFlags(args) {
205
+ const [name, next] = args;
206
+ if (name !== "studio" || !next?.startsWith("-") || next === "--help" || next === "-h") return args;
207
+ return [
208
+ "studio",
209
+ "connect",
210
+ ...args.slice(1)
211
+ ];
212
+ }
213
+ export { command, routeStudioFlags };
214
+
215
+ //# sourceMappingURL=studio-mw6HaPkr.js.map