@kubb/cli 5.0.0-beta.75 → 5.0.0-beta.76

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 (150) hide show
  1. package/LICENSE +17 -10
  2. package/README.md +171 -51
  3. package/bin/kubb.js +9 -3
  4. package/dist/Telemetry-CxzkLSdD.js +284 -0
  5. package/dist/Telemetry-CxzkLSdD.js.map +1 -0
  6. package/dist/Telemetry-D8jhC5Bc.cjs +315 -0
  7. package/dist/Telemetry-D8jhC5Bc.cjs.map +1 -0
  8. package/dist/{define-Bdn8j5VM.cjs → defineCommand-Bo3yZTWI.cjs} +3 -21
  9. package/dist/defineCommand-Bo3yZTWI.cjs.map +1 -0
  10. package/dist/{define-Ctii4bel.js → defineCommand-DMEeqliP.js} +4 -16
  11. package/dist/defineCommand-DMEeqliP.js.map +1 -0
  12. package/dist/{errors-CjPmyZHy.js → errors-Dc_d7BfX.js} +2 -2
  13. package/dist/{errors-CjPmyZHy.js.map → errors-Dc_d7BfX.js.map} +1 -1
  14. package/dist/{errors-CLCjoSg0.cjs → errors-gxFK0vrp.cjs} +2 -2
  15. package/dist/{errors-CLCjoSg0.cjs.map → errors-gxFK0vrp.cjs.map} +1 -1
  16. package/dist/generate-DD2TMRmo.js +77 -0
  17. package/dist/generate-DD2TMRmo.js.map +1 -0
  18. package/dist/generate-DJUcRnD9.cjs +76 -0
  19. package/dist/generate-DJUcRnD9.cjs.map +1 -0
  20. package/dist/index.cjs +93 -149
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.ts +6 -1
  23. package/dist/index.js +93 -149
  24. package/dist/index.js.map +1 -1
  25. package/dist/init-BYgTbDpy.cjs +53 -0
  26. package/dist/init-BYgTbDpy.cjs.map +1 -0
  27. package/dist/init-CONuOE9n.js +53 -0
  28. package/dist/init-CONuOE9n.js.map +1 -0
  29. package/dist/mcp---VI5xTX.js +21 -0
  30. package/dist/mcp---VI5xTX.js.map +1 -0
  31. package/dist/mcp-CbM2iAFq.cjs +21 -0
  32. package/dist/mcp-CbM2iAFq.cjs.map +1 -0
  33. package/dist/package-6guIlMlB.js +6 -0
  34. package/dist/package-6guIlMlB.js.map +1 -0
  35. package/dist/{package-D5arPDnh.cjs → package-DnvclOkv.cjs} +2 -2
  36. package/dist/package-DnvclOkv.cjs.map +1 -0
  37. package/dist/run-44Zxh8Ec.js +289 -0
  38. package/dist/run-44Zxh8Ec.js.map +1 -0
  39. package/dist/run-BPLW8mrc.cjs +52 -0
  40. package/dist/run-BPLW8mrc.cjs.map +1 -0
  41. package/dist/run-D1rr0epF.js +1327 -0
  42. package/dist/run-D1rr0epF.js.map +1 -0
  43. package/dist/run-DXEMoDFa.cjs +293 -0
  44. package/dist/run-DXEMoDFa.cjs.map +1 -0
  45. package/dist/run-Dq0CXCqU.cjs +1330 -0
  46. package/dist/run-Dq0CXCqU.cjs.map +1 -0
  47. package/dist/run-Dv-1NGl-.js +32 -0
  48. package/dist/run-Dv-1NGl-.js.map +1 -0
  49. package/dist/run-GFI-E4ua.cjs +33 -0
  50. package/dist/run-GFI-E4ua.cjs.map +1 -0
  51. package/dist/run-WfvBLKQY.js +51 -0
  52. package/dist/run-WfvBLKQY.js.map +1 -0
  53. package/dist/tools-CZT9wSA6.cjs +175 -0
  54. package/dist/tools-CZT9wSA6.cjs.map +1 -0
  55. package/dist/tools-D0UogMU3.js +152 -0
  56. package/dist/tools-D0UogMU3.js.map +1 -0
  57. package/dist/validate-CNvR28KI.cjs +26 -0
  58. package/dist/validate-CNvR28KI.cjs.map +1 -0
  59. package/dist/validate-ClAyEQgx.js +26 -0
  60. package/dist/validate-ClAyEQgx.js.map +1 -0
  61. package/package.json +24 -28
  62. package/dist/agent-BEgI2HXH.cjs +0 -58
  63. package/dist/agent-BEgI2HXH.cjs.map +0 -1
  64. package/dist/agent-B_pirbeB.cjs +0 -116
  65. package/dist/agent-B_pirbeB.cjs.map +0 -1
  66. package/dist/agent-CTdJEHEs.js +0 -56
  67. package/dist/agent-CTdJEHEs.js.map +0 -1
  68. package/dist/agent-Ev5hU5hH.js +0 -112
  69. package/dist/agent-Ev5hU5hH.js.map +0 -1
  70. package/dist/constants-CnDXa1R6.cjs +0 -148
  71. package/dist/constants-CnDXa1R6.cjs.map +0 -1
  72. package/dist/constants-aL3CP_Wq.js +0 -95
  73. package/dist/constants-aL3CP_Wq.js.map +0 -1
  74. package/dist/define-Bdn8j5VM.cjs.map +0 -1
  75. package/dist/define-Ctii4bel.js.map +0 -1
  76. package/dist/generate-Cg8yufrw.js +0 -1753
  77. package/dist/generate-Cg8yufrw.js.map +0 -1
  78. package/dist/generate-DDCwNQNo.cjs +0 -65
  79. package/dist/generate-DDCwNQNo.cjs.map +0 -1
  80. package/dist/generate-K8MJ9aQF.cjs +0 -1756
  81. package/dist/generate-K8MJ9aQF.cjs.map +0 -1
  82. package/dist/generate-YPtfjsg4.js +0 -66
  83. package/dist/generate-YPtfjsg4.js.map +0 -1
  84. package/dist/init-Bu95ML_u.cjs +0 -25
  85. package/dist/init-Bu95ML_u.cjs.map +0 -1
  86. package/dist/init-CZ5Xq2Hd.cjs +0 -293
  87. package/dist/init-CZ5Xq2Hd.cjs.map +0 -1
  88. package/dist/init-eNRlotJK.js +0 -289
  89. package/dist/init-eNRlotJK.js.map +0 -1
  90. package/dist/init-ooJeOBGt.js +0 -25
  91. package/dist/init-ooJeOBGt.js.map +0 -1
  92. package/dist/mcp-C-d5N1wZ.js +0 -16
  93. package/dist/mcp-C-d5N1wZ.js.map +0 -1
  94. package/dist/mcp-CLcDV4Jm.cjs +0 -41
  95. package/dist/mcp-CLcDV4Jm.cjs.map +0 -1
  96. package/dist/mcp-D7EIR9fR.js +0 -40
  97. package/dist/mcp-D7EIR9fR.js.map +0 -1
  98. package/dist/mcp-Dpu8vzzj.cjs +0 -16
  99. package/dist/mcp-Dpu8vzzj.cjs.map +0 -1
  100. package/dist/package-D5arPDnh.cjs.map +0 -1
  101. package/dist/package-DqZsMLZ9.js +0 -6
  102. package/dist/package-DqZsMLZ9.js.map +0 -1
  103. package/dist/shell-475fQKaX.cjs +0 -62
  104. package/dist/shell-475fQKaX.cjs.map +0 -1
  105. package/dist/shell-DLzN4fRo.js +0 -51
  106. package/dist/shell-DLzN4fRo.js.map +0 -1
  107. package/dist/telemetry-DN95_2pF.cjs +0 -282
  108. package/dist/telemetry-DN95_2pF.cjs.map +0 -1
  109. package/dist/telemetry-LgT_sdPe.js +0 -245
  110. package/dist/telemetry-LgT_sdPe.js.map +0 -1
  111. package/dist/validate-CIR3_lZI.js +0 -25
  112. package/dist/validate-CIR3_lZI.js.map +0 -1
  113. package/dist/validate-DcqUb4DM.cjs +0 -25
  114. package/dist/validate-DcqUb4DM.cjs.map +0 -1
  115. package/dist/validate-kLJoT_hi.js +0 -33
  116. package/dist/validate-kLJoT_hi.js.map +0 -1
  117. package/dist/validate-yKKzqEZ5.cjs +0 -34
  118. package/dist/validate-yKKzqEZ5.cjs.map +0 -1
  119. package/src/commands/agent/start.ts +0 -47
  120. package/src/commands/agent.ts +0 -8
  121. package/src/commands/generate.ts +0 -57
  122. package/src/commands/init.ts +0 -20
  123. package/src/commands/mcp.ts +0 -12
  124. package/src/commands/validate.ts +0 -20
  125. package/src/constants.ts +0 -104
  126. package/src/index.ts +0 -43
  127. package/src/loggers/clackLogger.ts +0 -458
  128. package/src/loggers/fileSystemLogger.ts +0 -138
  129. package/src/loggers/githubActionsLogger.ts +0 -379
  130. package/src/loggers/plainLogger.ts +0 -254
  131. package/src/loggers/types.ts +0 -1
  132. package/src/loggers/utils.ts +0 -106
  133. package/src/runners/agent.ts +0 -149
  134. package/src/runners/generate.ts +0 -333
  135. package/src/runners/init.ts +0 -296
  136. package/src/runners/mcp.ts +0 -45
  137. package/src/runners/validate.ts +0 -39
  138. package/src/types.ts +0 -11
  139. package/src/utils/Writables.ts +0 -17
  140. package/src/utils/executeHooks.ts +0 -45
  141. package/src/utils/flags.ts +0 -9
  142. package/src/utils/getConfig.ts +0 -10
  143. package/src/utils/getCosmiConfig.ts +0 -80
  144. package/src/utils/getSummary.ts +0 -68
  145. package/src/utils/packageManager.ts +0 -23
  146. package/src/utils/runHook.ts +0 -91
  147. package/src/utils/telemetry.ts +0 -273
  148. package/src/utils/watcher.ts +0 -19
  149. /package/dist/{chunk-ByKO4r7w.cjs → rolldown-runtime-Bx3C2hgW.cjs} +0 -0
  150. /package/dist/{chunk--u3MIqq1.js → rolldown-runtime-C0LytTxp.js} +0 -0
package/LICENSE CHANGED
@@ -1,14 +1,21 @@
1
- Copyright (c) 2026 Stijn Van Hulle
2
-
3
- This repository contains software under two licenses:
1
+ MIT License
4
2
 
5
- 1. Most of the code in this repository is licensed under the
6
- MIT License — see licenses/LICENSE-MIT for the full license text.
3
+ Copyright (c) 2026 Stijn Van Hulle
7
4
 
8
- 2. The following components are licensed under the
9
- GNU Affero General Public License v3.0 or later (AGPL-3.0-or-later)
10
- see licenses/LICENSE-AGPL-3.0 for the full license text:
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
11
 
12
- - packages/agent (published as @kubb/agent)
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
13
14
 
14
- Each package's own LICENSE file or package.json specifies its applicable license.
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,95 +1,215 @@
1
1
  <div align="center">
2
- <h1>Kubb Cli</h1>
3
2
  <a href="https://kubb.dev" target="_blank" rel="noopener noreferrer">
4
- <img width="180" src="https://raw.githubusercontent.com/kubb-labs/kubb/main/assets/logo.png" alt="Kubb logo">
3
+ <img src="https://kubb.dev/og.png" alt="Kubb banner">
5
4
  </a>
6
5
 
7
6
  [![npm version][npm-version-src]][npm-version-href]
8
7
  [![npm downloads][npm-downloads-src]][npm-downloads-href]
9
- [![Coverage][coverage-src]][coverage-href]
8
+ [![Stars][stars-src]][stars-href]
10
9
  [![License][license-src]][license-href]
11
- [![Sponsors][sponsors-src]][sponsors-href]
10
+ [![Node][node-src]][node-href]
12
11
 
13
12
  <h4>
14
- <a href="https://codesandbox.io/s/github/kubb-labs/kubb/tree/main//examples/typescript" target="_blank">View Demo</a>
15
- <span> · </span>
16
- <a href="https://kubb.dev/" target="_blank">Documentation</a>
17
- <span> · </span>
18
- <a href="https://github.com/kubb-labs/kubb/issues/" target="_blank">Report Bug</a>
19
- <span> · </span>
20
- <a href="https://github.com/kubb-labs/kubb/issues/" target="_blank">Request Feature</a>
21
- </h4>
13
+ <a href="https://kubb.dev" target="_blank">Documentation</a>
14
+ <span> · </span>
15
+ <a href="https://github.com/kubb-labs/kubb/issues/" target="_blank">Report Bug</a>
16
+ <span> · </span>
17
+ <a href="https://github.com/kubb-labs/kubb/issues/" target="_blank">Request Feature</a>
18
+ </h4>
22
19
  </div>
23
20
 
21
+ <br />
22
+
23
+ # @kubb/cli
24
+
25
+ ### The command-line interface for Kubb
26
+
27
+ Official CLI for Kubb. Run `kubb generate` to produce TypeScript types, API clients, hooks, validators, and mocks.
28
+ Includes interactive project setup (`kubb init`), spec validation, watch mode, and an MCP server.
29
+
30
+ ## Installation
31
+
32
+ ```bash
33
+ bun add -D @kubb/cli
34
+ # or
35
+ pnpm add -D @kubb/cli
36
+ # or
37
+ npm install -D @kubb/cli
38
+ ```
39
+
24
40
  ## Commands
25
41
 
42
+ - [`kubb init`](#kubb-init) — scaffold a new project
43
+ - [`kubb generate`](#kubb-generate) — run code generation
44
+ - [`kubb validate`](#kubb-validate) — validate an OpenAPI spec
45
+ - [`kubb mcp`](#kubb-mcp) — start the MCP server for AI assistants
46
+
47
+ ---
48
+
26
49
  ### `kubb init`
27
50
 
28
- Initialize a new Kubb project with an interactive setup wizard.
51
+ Scaffold a `kubb.config.ts` and install plugins for code generation from an OpenAPI spec. Run without flags for an interactive setup wizard, or pass flags to skip the prompts.
29
52
 
30
53
  ```bash
31
54
  npx kubb init
32
55
  ```
33
56
 
34
- Use the `-y` / `--yes` flag to skip all prompts and accept the defaults:
57
+ #### Options
58
+
59
+ | Flag | Short | Type | Default | Description |
60
+ | ------------------ | ----- | ------- | ---------------- | ------------------------------------------ |
61
+ | `--yes` | `-y` | boolean | `false` | Skip all prompts and use defaults |
62
+ | `--input <path>` | `-i` | string | `./openapi.yaml` | Path to the OpenAPI specification |
63
+ | `--output <path>` | `-o` | string | `./src/gen` | Output directory for generated files |
64
+ | `--plugins <list>` | | string | | Comma-separated list of plugins to install |
65
+
66
+ Available plugin values for `--plugins`: `plugin-ts`, `plugin-axios`, `plugin-fetch`, `plugin-react-query`, `plugin-vue-query`, `plugin-zod`, `plugin-faker`, `plugin-msw`, `plugin-cypress`, `plugin-mcp`, `plugin-redoc`.
67
+
68
+ #### Examples
35
69
 
36
70
  ```bash
37
- npx kubb init -y
38
- ```
71
+ # Interactive wizard
72
+ npx kubb init
39
73
 
40
- Defaults when using `-y`:
74
+ # Accept all defaults
75
+ npx kubb init --yes
41
76
 
42
- - Input path: `./openapi.yaml`
43
- - Output path: `./src/gen`
44
- - Plugins: OpenAPI Parser + TypeScript
77
+ # Fully non-interactive
78
+ npx kubb init --input ./openapi.yaml --output ./src/gen --plugins plugin-ts,plugin-zod
79
+
80
+ # Select specific plugins only
81
+ npx kubb init --plugins plugin-ts,plugin-axios,plugin-react-query
82
+ ```
45
83
 
46
- This command will:
84
+ The wizard will:
47
85
 
48
- 1. Detect or create a `package.json` if it doesn't exist
49
- 2. Prompt you for your OpenAPI specification path (default: `./openapi.yaml`)
50
- 3. Ask for the output directory for generated files (default: `./src/gen`)
51
- 4. Let you select which Kubb plugins to use (default: OpenAPI Parser + TypeScript)
86
+ 1. Detect or create a `package.json` if one does not exist
87
+ 2. Prompt for your OpenAPI specification path (default: `./openapi.yaml`)
88
+ 3. Ask for the output directory (default: `./src/gen`)
89
+ 4. Let you choose which plugins to install
52
90
  5. Install the selected packages using your package manager (npm, pnpm, yarn, or bun)
53
- 6. Generate a `kubb.config.ts` file with your chosen configuration
91
+ 6. Generate a `kubb.config.ts` with your chosen configuration
92
+
93
+ ---
54
94
 
55
95
  ### `kubb generate`
56
96
 
57
- Generate files based on your `kubb.config.ts` configuration.
97
+ Generate TypeScript types, API clients, React Query hooks, Zod schemas, and more from an OpenAPI specification. Reads `kubb.config.ts` by default. Pass an OpenAPI file path as the first argument to override the input without editing the config.
58
98
 
59
99
  ```bash
60
100
  npx kubb generate
61
101
  ```
62
102
 
63
- Options:
103
+ #### Options
104
+
105
+ | Flag | Short | Type | Default | Description |
106
+ | -------------------- | ----- | ------- | ------- | --------------------------------------------------------------------------------------------------- |
107
+ | `[input]` | | string | | OpenAPI file path — overrides `input.path` in the config |
108
+ | `--config <path>` | `-c` | string | | Path to the Kubb config file |
109
+ | `--logLevel <level>` | `-l` | string | `info` | Log level: `silent`, `info`, or `verbose` |
110
+ | `--watch` | `-w` | boolean | `false` | Re-generate whenever the input file changes |
111
+ | `--verbose` | `-v` | boolean | `false` | Override log level to `verbose` |
112
+ | `--silent` | `-s` | boolean | `false` | Override log level to `silent` |
113
+ | `--reporter <names>` | | string | `cli` | Reporters that render the run, comma-separated: `cli`, `json`, `file`. Overrides `config.reporters` |
114
+
115
+ #### Examples
116
+
117
+ ```bash
118
+ # Use kubb.config.ts in the current directory
119
+ npx kubb generate
120
+
121
+ # Override the input spec without editing the config
122
+ npx kubb generate ./openapi.yaml
123
+
124
+ # Point to a custom config file
125
+ npx kubb generate --config ./configs/kubb.config.ts
126
+
127
+ # Watch for changes and regenerate automatically
128
+ npx kubb generate --watch
64
129
 
65
- - `-c, --config <path>` - Path to the Kubb config file
66
- - `-l, --logLevel <level>` - Set log level (silent, info, verbose, debug)
67
- - `-w, --watch` - Watch mode based on the input file
68
- - `-d, --debug` - Enable debug mode
69
- - `-v, --verbose` - Enable verbose mode
70
- - `-s, --silent` - Enable silent mode
130
+ # Verbose output
131
+ npx kubb generate --verbose
132
+
133
+ # Write a JSON run report alongside the CLI output
134
+ npx kubb generate --reporter cli,json
135
+ ```
136
+
137
+ ---
71
138
 
72
139
  ### `kubb validate`
73
140
 
74
- Validate a Swagger/OpenAPI file.
141
+ Parse and validate an OpenAPI/Swagger file for structural correctness. Reports schema errors, missing required fields, and malformed references. Use this before running `generate` to catch spec issues early.
75
142
 
76
143
  ```bash
77
- npx kubb validate <path-to-openapi>
144
+ npx kubb validate --input <path-or-url>
78
145
  ```
79
146
 
147
+ #### Options
148
+
149
+ | Flag | Short | Type | Required | Description |
150
+ | ---------------- | ----- | ------ | -------- | --------------------------------------------------- |
151
+ | `--input <path>` | `-i` | string | ✅ | Path or URL to the OpenAPI/Swagger file to validate |
152
+
153
+ #### Examples
154
+
155
+ ```bash
156
+ # Validate a local file
157
+ npx kubb validate --input ./openapi.yaml
158
+
159
+ # Validate a remote spec
160
+ npx kubb validate --input https://petstore3.swagger.io/api/v3/openapi.json
161
+ ```
162
+
163
+ ---
164
+
80
165
  ### `kubb mcp`
81
166
 
82
- Start the MCP server to enable the MCP client to interact with the LLM.
167
+ Start a Model Context Protocol (MCP) server that exposes Kubb code generation as a tool for AI assistants. Once running, configure your AI client (Claude, Cursor, Windsurf, etc.) to connect the assistant can then call `kubb generate` directly without leaving the chat.
168
+
169
+ Runs over **stdio** by default (compatible with all MCP clients). Pass `--port` to expose an HTTP server instead.
170
+
171
+ ```bash
172
+ npx kubb mcp
173
+ ```
174
+
175
+ #### Options
176
+
177
+ | Flag | Short | Type | Default | Description |
178
+ | ------------------- | ----- | ------ | ----------- | ----------------------------------------- |
179
+ | `--port <number>` | `-p` | string | | Port for HTTP MCP server (omit for stdio) |
180
+ | `--host <hostname>` | | string | `localhost` | Hostname to bind to (HTTP mode only) |
181
+
182
+ #### Examples
83
183
 
84
184
  ```bash
185
+ # stdio mode (recommended for Claude Desktop, Cursor, etc.)
85
186
  npx kubb mcp
187
+
188
+ # HTTP mode
189
+ npx kubb mcp --port 3001
190
+ ```
191
+
192
+ #### MCP client configuration
193
+
194
+ Add the following to your MCP client config (e.g. Claude Desktop's `claude_desktop_config.json`):
195
+
196
+ ```json
197
+ {
198
+ "mcpServers": {
199
+ "kubb": {
200
+ "command": "npx",
201
+ "args": ["kubb", "mcp"]
202
+ }
203
+ }
204
+ }
86
205
  ```
87
206
 
88
207
  ## Supporting Kubb
89
208
 
90
- Kubb uses an MIT-licensed open source project with its ongoing development made possible entirely by the support of Sponsors. If you would like to become a sponsor, please consider:
209
+ Kubb is an open source project, and its development is funded entirely by sponsors. If you would like to become a sponsor, please consider:
91
210
 
92
211
  - [Become a Sponsor on GitHub](https://github.com/sponsors/stijnvanhulle)
212
+ - [See sponsorship tiers and our sponsors](https://kubb.dev/sponsors)
93
213
 
94
214
  <p align="center">
95
215
  <a href="https://github.com/sponsors/stijnvanhulle">
@@ -97,19 +217,19 @@ Kubb uses an MIT-licensed open source project with its ongoing development made
97
217
  </a>
98
218
  </p>
99
219
 
220
+ ## License
221
+
222
+ [MIT](https://github.com/kubb-labs/kubb/blob/main/licenses/LICENSE-MIT)
223
+
100
224
  <!-- Badges -->
101
225
 
102
- [npm-version-src]: https://img.shields.io/npm/v/@kubb/cli?flat&colorA=18181B&colorB=f58517
103
- [npm-version-href]: https://npmjs.com/package/@kubb/cli
104
- [npm-downloads-src]: https://img.shields.io/npm/dm/@kubb/cli?flat&colorA=18181B&colorB=f58517
105
- [npm-downloads-href]: https://npmjs.com/package/@kubb/cli
106
- [license-src]: https://img.shields.io/github/license/kubb-labs/kubb.svg?flat&colorA=18181B&colorB=f58517
226
+ [npm-version-src]: https://shieldcn.dev/npm/v/@kubb/cli.svg?variant=secondary&size=xs&theme=zinc&mode=dark
227
+ [npm-version-href]: https://npmx.dev/package/@kubb/cli
228
+ [npm-downloads-src]: https://shieldcn.dev/npm/dm/@kubb/cli.svg?variant=secondary&size=xs&theme=zinc&mode=dark
229
+ [npm-downloads-href]: https://npmx.dev/package/@kubb/cli
230
+ [stars-src]: https://shieldcn.dev/github/stars/kubb-labs/kubb.svg?variant=secondary&size=xs&theme=zinc&mode=dark
231
+ [stars-href]: https://github.com/kubb-labs/kubb
232
+ [license-src]: https://shieldcn.dev/npm/license/@kubb/cli.svg?variant=secondary&size=xs&theme=zinc
107
233
  [license-href]: https://github.com/kubb-labs/kubb/blob/main/LICENSE
108
- [build-src]: https://img.shields.io/github/actions/workflow/status/kubb-labs/kubb/ci.yaml?style=flat&colorA=18181B&colorB=f58517
109
- [build-href]: https://www.npmjs.com/package/@kubb/cli
110
- [minified-src]: https://img.shields.io/bundlephobia/min/@kubb/cli?style=flat&colorA=18181B&colorB=f58517
111
- [minified-href]: https://www.npmjs.com/package/@kubb/cli
112
- [coverage-src]: https://img.shields.io/codecov/c/github/kubb-labs/kubb?style=flat&colorA=18181B&colorB=f58517
113
- [coverage-href]: https://www.npmjs.com/package/@kubb/cli
114
- [sponsors-src]: https://img.shields.io/github/sponsors/stijnvanhulle?style=flat&colorA=18181B&colorB=f58517
115
- [sponsors-href]: https://github.com/sponsors/stijnvanhulle/
234
+ [node-src]: https://shieldcn.dev/npm/node/@kubb/cli.svg?variant=secondary&size=xs&theme=zinc&mode=dark
235
+ [node-href]: https://npmx.dev/package/@kubb/cli
package/bin/kubb.js CHANGED
@@ -1,6 +1,12 @@
1
1
  #!/usr/bin/env node
2
- process.setSourceMapsEnabled?.(true)
3
2
 
4
- const { run } = await import('../dist/index.js')
3
+ process.setSourceMapsEnabled?.(true)
5
4
  process.title = 'Kubb'
6
- run(process.argv)
5
+
6
+ try {
7
+ const { run } = await import('../dist/index.js')
8
+ await run(process.argv)
9
+ } catch (err) {
10
+ console.error(err)
11
+ process.exit(1)
12
+ }
@@ -0,0 +1,284 @@
1
+ import "./rolldown-runtime-C0LytTxp.js";
2
+ import { randomBytes } from "node:crypto";
3
+ import os from "node:os";
4
+ import process$1 from "node:process";
5
+ //#region ../../internals/utils/src/env.ts
6
+ /**
7
+ * Returns `true` when the process is running in a CI environment.
8
+ * Covers GitHub Actions, GitLab CI, CircleCI, Travis CI, Jenkins, Bitbucket,
9
+ * TeamCity, Buildkite, and Azure Pipelines.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * if (isCIEnvironment()) {
14
+ * logger.level = 'error'
15
+ * }
16
+ * ```
17
+ */
18
+ function isCIEnvironment() {
19
+ return !!(process.env.CI || process.env.GITHUB_ACTIONS || process.env.GITLAB_CI || process.env.BITBUCKET_BUILD_NUMBER || process.env.JENKINS_URL || process.env.CIRCLECI || process.env.TRAVIS || process.env.TEAMCITY_VERSION || process.env.BUILDKITE || process.env.TF_BUILD);
20
+ }
21
+ /**
22
+ * Returns `true` when the process has an interactive TTY with a valid terminal
23
+ * width and is not running in CI.
24
+ *
25
+ * Some IDE-embedded terminals report `isTTY = true` but set `columns` to `0`,
26
+ * which breaks clack's box-drawing helpers (they call `String.prototype.repeat`
27
+ * with a negative count and throw a `RangeError`). We therefore require a
28
+ * positive column count before declaring the TTY usable.
29
+ *
30
+ * @example
31
+ * ```ts
32
+ * if (canUseTTY()) {
33
+ * renderProgressBar()
34
+ * }
35
+ * ```
36
+ */
37
+ function canUseTTY() {
38
+ return process.stdout.isTTY && (process.stdout.columns ?? 0) > 0 && !isCIEnvironment();
39
+ }
40
+ //#endregion
41
+ //#region ../../internals/utils/src/runtime.ts
42
+ /**
43
+ * Detects the JavaScript runtime executing the current process and exposes its name and version.
44
+ *
45
+ * Prefer the shared {@link runtime} instance over constructing your own.
46
+ */
47
+ var Runtime = class {
48
+ /**
49
+ * `true` when the current process is running under Bun.
50
+ *
51
+ * Detection keys off the global `Bun` object rather than `process.versions`,
52
+ * because Bun polyfills `process.versions.node` for Node compatibility and would
53
+ * otherwise look like Node.
54
+ *
55
+ * @example
56
+ * ```ts
57
+ * if (runtime.isBun) {
58
+ * await Bun.write(path, data)
59
+ * }
60
+ * ```
61
+ */
62
+ get isBun() {
63
+ return typeof Bun !== "undefined";
64
+ }
65
+ /**
66
+ * `true` when the current process is running under Deno.
67
+ */
68
+ get isDeno() {
69
+ return typeof globalThis.Deno !== "undefined";
70
+ }
71
+ /**
72
+ * `true` when the current process is running under Node.
73
+ *
74
+ * Bun and Deno are excluded first so a polyfilled `process` does not register as Node.
75
+ */
76
+ get isNode() {
77
+ return !this.isBun && !this.isDeno && typeof process !== "undefined" && process.versions?.node != null;
78
+ }
79
+ /**
80
+ * Name of the runtime executing the current process.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * runtime.name // 'bun' when run with `bun kubb`, 'node' otherwise
85
+ * ```
86
+ */
87
+ get name() {
88
+ if (this.isBun) return "bun";
89
+ if (this.isDeno) return "deno";
90
+ return "node";
91
+ }
92
+ /**
93
+ * Version of the active runtime, or an empty string when it cannot be read.
94
+ *
95
+ * @example
96
+ * ```ts
97
+ * runtime.version // '1.3.11' under Bun, '22.22.2' under Node
98
+ * ```
99
+ */
100
+ get version() {
101
+ if (this.isBun) return process.versions.bun ?? "";
102
+ if (this.isDeno) return globalThis.Deno?.version?.deno ?? "";
103
+ return process.versions?.node ?? "";
104
+ }
105
+ };
106
+ /**
107
+ * Shared {@link Runtime} instance describing the JavaScript runtime executing the current process.
108
+ */
109
+ const runtime = new Runtime();
110
+ //#endregion
111
+ //#region src/constants.ts
112
+ /**
113
+ * NPM registry endpoint used to check for @kubb/cli updates.
114
+ */
115
+ const KUBB_NPM_PACKAGE_URL = "https://registry.npmjs.org/@kubb/cli/latest";
116
+ /**
117
+ * OpenTelemetry ingestion endpoint for anonymous usage telemetry.
118
+ */
119
+ const OTLP_ENDPOINT = "https://otlp.kubb.dev";
120
+ /**
121
+ * Glob pattern for paths the file watcher ignores.
122
+ */
123
+ const WATCHER_IGNORED_PATHS = "**/{.git,node_modules}/**";
124
+ /**
125
+ * Flags that short-circuit execution (help and version). The telemetry notice is suppressed for these.
126
+ */
127
+ const QUIET_FLAGS = new Set([
128
+ "--help",
129
+ "-h",
130
+ "--version",
131
+ "-v"
132
+ ]);
133
+ //#endregion
134
+ //#region src/Telemetry.ts
135
+ /**
136
+ * Anonymous OTLP usage telemetry for a Kubb run. The API is static, so call it as `Telemetry.build(...)`
137
+ * and `Telemetry.send(...)`. No file paths, OpenAPI specs, or secrets are sent, and sending fails
138
+ * silently so a failed request never breaks the run.
139
+ */
140
+ var Telemetry = class Telemetry {
141
+ /**
142
+ * Returns `true` when telemetry is disabled via `DO_NOT_TRACK` or `KUBB_DISABLE_TELEMETRY`.
143
+ */
144
+ static get isDisabled() {
145
+ return process$1.env["DO_NOT_TRACK"] === "1" || process$1.env["DO_NOT_TRACK"] === "true" || process$1.env["KUBB_DISABLE_TELEMETRY"] === "1" || process$1.env["KUBB_DISABLE_TELEMETRY"] === "true";
146
+ }
147
+ /**
148
+ * Build an anonymous telemetry payload from a completed generation run.
149
+ */
150
+ static build(options) {
151
+ const [seconds, nanoseconds] = process$1.hrtime(options.hrStart);
152
+ const duration = Math.round(seconds * 1e3 + nanoseconds / 1e6);
153
+ return {
154
+ command: options.command,
155
+ kubbVersion: options.kubbVersion,
156
+ nodeVersion: process$1.versions.node.split(".")[0],
157
+ runtime: runtime.name,
158
+ runtimeVersion: runtime.version.split(".")[0],
159
+ platform: os.platform(),
160
+ ci: isCIEnvironment(),
161
+ plugins: options.plugins ?? [],
162
+ duration,
163
+ filesCreated: options.filesCreated ?? 0,
164
+ status: options.status
165
+ };
166
+ }
167
+ /**
168
+ * Convert a {@link TelemetryEvent} into an OTLP-compatible JSON trace payload.
169
+ *
170
+ * @see https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/
171
+ */
172
+ static buildOtlpPayload(event) {
173
+ const traceId = randomBytes(16).toString("hex");
174
+ const spanId = randomBytes(8).toString("hex");
175
+ const endTimeNs = BigInt(Date.now()) * 1000000n;
176
+ const startTimeNs = endTimeNs - BigInt(event.duration) * 1000000n;
177
+ const attributes = [
178
+ {
179
+ key: "kubb.command",
180
+ value: { stringValue: event.command }
181
+ },
182
+ {
183
+ key: "kubb.version",
184
+ value: { stringValue: event.kubbVersion }
185
+ },
186
+ {
187
+ key: "kubb.node_version",
188
+ value: { stringValue: event.nodeVersion }
189
+ },
190
+ {
191
+ key: "kubb.runtime",
192
+ value: { stringValue: event.runtime }
193
+ },
194
+ {
195
+ key: "kubb.runtime_version",
196
+ value: { stringValue: event.runtimeVersion }
197
+ },
198
+ {
199
+ key: "kubb.platform",
200
+ value: { stringValue: event.platform }
201
+ },
202
+ {
203
+ key: "kubb.ci",
204
+ value: { boolValue: event.ci }
205
+ },
206
+ {
207
+ key: "kubb.files_created",
208
+ value: { intValue: event.filesCreated }
209
+ },
210
+ {
211
+ key: "kubb.status",
212
+ value: { stringValue: event.status }
213
+ },
214
+ {
215
+ key: "kubb.plugins",
216
+ value: { arrayValue: { values: event.plugins.map((p) => ({ kvlistValue: { values: [{
217
+ key: "name",
218
+ value: { stringValue: p.name }
219
+ }, {
220
+ key: "options",
221
+ value: { stringValue: JSON.stringify({
222
+ ...p.options,
223
+ usedEnumNames: void 0
224
+ }) }
225
+ }] } })) } }
226
+ }
227
+ ];
228
+ return { resourceSpans: [{
229
+ resource: { attributes: [
230
+ {
231
+ key: "service.name",
232
+ value: { stringValue: "kubb-core" }
233
+ },
234
+ {
235
+ key: "service.version",
236
+ value: { stringValue: event.kubbVersion }
237
+ },
238
+ {
239
+ key: "telemetry.sdk.language",
240
+ value: { stringValue: "nodejs" }
241
+ }
242
+ ] },
243
+ scopeSpans: [{
244
+ scope: {
245
+ name: "kubb-core",
246
+ version: event.kubbVersion
247
+ },
248
+ spans: [{
249
+ traceId,
250
+ spanId,
251
+ name: event.command,
252
+ kind: 1,
253
+ startTimeUnixNano: String(startTimeNs),
254
+ endTimeUnixNano: String(endTimeNs),
255
+ attributes,
256
+ status: { code: event.status === "success" ? 1 : 2 }
257
+ }]
258
+ }]
259
+ }] };
260
+ }
261
+ /**
262
+ * Send an anonymous telemetry event to the Kubb OTLP endpoint. Respects `DO_NOT_TRACK` and
263
+ * `KUBB_DISABLE_TELEMETRY`, and fails silently so telemetry never interrupts a run.
264
+ */
265
+ static async send(event) {
266
+ if (Telemetry.isDisabled) return;
267
+ try {
268
+ await fetch(`${OTLP_ENDPOINT}/v1/traces`, {
269
+ method: "POST",
270
+ headers: {
271
+ "Content-Type": "application/json",
272
+ "Kubb-Telemetry-Version": "1",
273
+ "Kubb-Telemetry-Source": "kubb-core"
274
+ },
275
+ body: JSON.stringify(Telemetry.buildOtlpPayload(event)),
276
+ signal: AbortSignal.timeout(5e3)
277
+ });
278
+ } catch (_e) {}
279
+ }
280
+ };
281
+ //#endregion
282
+ export { canUseTTY as a, WATCHER_IGNORED_PATHS as i, KUBB_NPM_PACKAGE_URL as n, QUIET_FLAGS as r, Telemetry as t };
283
+
284
+ //# sourceMappingURL=Telemetry-CxzkLSdD.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Telemetry-CxzkLSdD.js","names":["process"],"sources":["../../../internals/utils/src/env.ts","../../../internals/utils/src/runtime.ts","../src/constants.ts","../src/Telemetry.ts"],"sourcesContent":["/**\n * Returns `true` when the process is running in a CI environment.\n * Covers GitHub Actions, GitLab CI, CircleCI, Travis CI, Jenkins, Bitbucket,\n * TeamCity, Buildkite, and Azure Pipelines.\n *\n * @example\n * ```ts\n * if (isCIEnvironment()) {\n * logger.level = 'error'\n * }\n * ```\n */\nexport function isCIEnvironment(): boolean {\n return !!(\n process.env.CI ||\n process.env.GITHUB_ACTIONS ||\n process.env.GITLAB_CI ||\n process.env.BITBUCKET_BUILD_NUMBER ||\n process.env.JENKINS_URL ||\n process.env.CIRCLECI ||\n process.env.TRAVIS ||\n process.env.TEAMCITY_VERSION ||\n process.env.BUILDKITE ||\n process.env.TF_BUILD\n )\n}\n\n/**\n * Returns `true` when the process has an interactive TTY with a valid terminal\n * width and is not running in CI.\n *\n * Some IDE-embedded terminals report `isTTY = true` but set `columns` to `0`,\n * which breaks clack's box-drawing helpers (they call `String.prototype.repeat`\n * with a negative count and throw a `RangeError`). We therefore require a\n * positive column count before declaring the TTY usable.\n *\n * @example\n * ```ts\n * if (canUseTTY()) {\n * renderProgressBar()\n * }\n * ```\n */\nexport function canUseTTY(): boolean {\n return process.stdout.isTTY && (process.stdout.columns ?? 0) > 0 && !isCIEnvironment()\n}\n","/**\n * Name of the JavaScript runtime executing the current process.\n */\ntype RuntimeName = 'bun' | 'deno' | 'node'\n\n/**\n * Detects the JavaScript runtime executing the current process and exposes its name and version.\n *\n * Prefer the shared {@link runtime} instance over constructing your own.\n */\nclass Runtime {\n /**\n * `true` when the current process is running under Bun.\n *\n * Detection keys off the global `Bun` object rather than `process.versions`,\n * because Bun polyfills `process.versions.node` for Node compatibility and would\n * otherwise look like Node.\n *\n * @example\n * ```ts\n * if (runtime.isBun) {\n * await Bun.write(path, data)\n * }\n * ```\n */\n get isBun(): boolean {\n return typeof Bun !== 'undefined'\n }\n\n /**\n * `true` when the current process is running under Deno.\n */\n get isDeno(): boolean {\n return typeof (globalThis as { Deno?: unknown }).Deno !== 'undefined'\n }\n\n /**\n * `true` when the current process is running under Node.\n *\n * Bun and Deno are excluded first so a polyfilled `process` does not register as Node.\n */\n get isNode(): boolean {\n return !this.isBun && !this.isDeno && typeof process !== 'undefined' && process.versions?.node != null\n }\n\n /**\n * Name of the runtime executing the current process.\n *\n * @example\n * ```ts\n * runtime.name // 'bun' when run with `bun kubb`, 'node' otherwise\n * ```\n */\n get name(): RuntimeName {\n if (this.isBun) return 'bun'\n if (this.isDeno) return 'deno'\n\n return 'node'\n }\n\n /**\n * Version of the active runtime, or an empty string when it cannot be read.\n *\n * @example\n * ```ts\n * runtime.version // '1.3.11' under Bun, '22.22.2' under Node\n * ```\n */\n get version(): string {\n if (this.isBun) return process.versions.bun ?? ''\n if (this.isDeno) return (globalThis as { Deno?: { version?: { deno?: string } } }).Deno?.version?.deno ?? ''\n\n return process.versions?.node ?? ''\n }\n}\n\n/**\n * Shared {@link Runtime} instance describing the JavaScript runtime executing the current process.\n */\nexport const runtime = new Runtime()\n","/**\n * NPM registry endpoint used to check for @kubb/cli updates.\n */\nexport const KUBB_NPM_PACKAGE_URL = 'https://registry.npmjs.org/@kubb/cli/latest' as const\n\n/**\n * OpenTelemetry ingestion endpoint for anonymous usage telemetry.\n */\nexport const OTLP_ENDPOINT = 'https://otlp.kubb.dev' as const\n\n/**\n * Glob pattern for paths the file watcher ignores.\n */\nexport const WATCHER_IGNORED_PATHS = '**/{.git,node_modules}/**' as const\n\n/**\n * Flags that short-circuit execution (help and version). The telemetry notice is suppressed for these.\n */\nexport const QUIET_FLAGS = new Set<string>(['--help', '-h', '--version', '-v'])\n","import { randomBytes } from 'node:crypto'\nimport os from 'node:os'\nimport process from 'node:process'\nimport { isCIEnvironment, runtime } from '@internals/utils'\nimport { OTLP_ENDPOINT } from './constants.ts'\n\n// OpenTelemetry OTLP JSON types\n// https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/trace/v1/trace.proto\n// https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/common/v1/common.proto\n\ntype OtlpStringValue = { stringValue: string }\ntype OtlpBoolValue = { boolValue: boolean }\ntype OtlpIntValue = { intValue: number }\ntype OtlpDoubleValue = { doubleValue: number }\ntype OtlpBytesValue = { bytesValue: string }\ntype OtlpArrayValue = { arrayValue: { values: Array<OtlpAnyValue> } }\ntype OtlpKvListValue = { kvlistValue: { values: Array<OtlpKeyValue> } }\n\ntype OtlpAnyValue = OtlpStringValue | OtlpBoolValue | OtlpIntValue | OtlpDoubleValue | OtlpBytesValue | OtlpArrayValue | OtlpKvListValue\n\ntype OtlpKeyValue = {\n key: string\n value: OtlpAnyValue\n}\n\ntype OtlpResource = {\n attributes: Array<OtlpKeyValue>\n droppedAttributesCount?: number\n}\n\ntype OtlpInstrumentationScope = {\n name: string\n version?: string\n attributes?: Array<OtlpKeyValue>\n droppedAttributesCount?: number\n}\n\n/**\n * @see https://github.com/open-telemetry/opentelemetry-proto/blob/main/opentelemetry/proto/trace/v1/trace.proto#L103\n */\ntype OtlpSpanKind = 0 | 1 | 2 | 3 | 4 | 5\n\n/**\n * Span status code.\n * - `0` is unset\n * - `1` is OK\n * - `2` is error\n */\ntype OtlpStatusCode = 0 | 1 | 2\n\ntype OtlpStatus = {\n code: OtlpStatusCode\n message?: string\n}\n\ntype OtlpSpan = {\n traceId: string\n spanId: string\n traceState?: string\n parentSpanId?: string\n name: string\n kind: OtlpSpanKind\n startTimeUnixNano: string\n endTimeUnixNano: string\n attributes?: Array<OtlpKeyValue>\n droppedAttributesCount?: number\n events?: Array<OtlpSpanEvent>\n droppedEventsCount?: number\n links?: Array<OtlpSpanLink>\n droppedLinksCount?: number\n status?: OtlpStatus\n}\n\ntype OtlpSpanEvent = {\n timeUnixNano: string\n name: string\n attributes?: Array<OtlpKeyValue>\n droppedAttributesCount?: number\n}\n\ntype OtlpSpanLink = {\n traceId: string\n spanId: string\n traceState?: string\n attributes?: Array<OtlpKeyValue>\n droppedAttributesCount?: number\n}\n\ntype OtlpScopeSpans = {\n scope: OtlpInstrumentationScope\n spans: Array<OtlpSpan>\n schemaUrl?: string\n}\n\ntype OtlpResourceSpans = {\n resource: OtlpResource\n scopeSpans: Array<OtlpScopeSpans>\n schemaUrl?: string\n}\n\n/**\n * Root payload sent to POST /v1/traces.\n */\ntype OtlpExportTraceServiceRequest = {\n resourceSpans: Array<OtlpResourceSpans>\n}\n\n/**\n * Anonymous plugin name and options snapshot sent with each telemetry event.\n */\nexport type TelemetryPlugin = {\n /**\n * Plugin name as registered in the Kubb config, e.g. `'@kubb/plugin-ts'`.\n */\n name: string\n /**\n * Anonymized snapshot of the plugin options. Values are included but cannot be traced back to a user.\n */\n options: Record<string, unknown>\n}\n\n/**\n * Anonymous snapshot of a single Kubb run, built by {@link Telemetry.build} and sent by {@link Telemetry.send}.\n */\nexport type TelemetryEvent = {\n command: string\n kubbVersion: string\n /**\n * Major version of Node that executed the run, e.g. `'22'`.\n */\n nodeVersion: string\n /**\n * Name of the JavaScript runtime that executed the run, `'bun'`, `'deno'`, or `'node'`.\n */\n runtime: string\n /**\n * Major version of the active runtime, e.g. `'1'` under Bun or `'22'` under Node.\n */\n runtimeVersion: string\n platform: string\n ci: boolean\n plugins: Array<TelemetryPlugin>\n duration: number\n filesCreated: number\n status: 'success' | 'failed'\n}\n\n/**\n * Anonymous OTLP usage telemetry for a Kubb run. The API is static, so call it as `Telemetry.build(...)`\n * and `Telemetry.send(...)`. No file paths, OpenAPI specs, or secrets are sent, and sending fails\n * silently so a failed request never breaks the run.\n */\nexport class Telemetry {\n /**\n * Returns `true` when telemetry is disabled via `DO_NOT_TRACK` or `KUBB_DISABLE_TELEMETRY`.\n */\n static get isDisabled(): boolean {\n return (\n process.env['DO_NOT_TRACK'] === '1' ||\n process.env['DO_NOT_TRACK'] === 'true' ||\n process.env['KUBB_DISABLE_TELEMETRY'] === '1' ||\n process.env['KUBB_DISABLE_TELEMETRY'] === 'true'\n )\n }\n\n /**\n * Build an anonymous telemetry payload from a completed generation run.\n */\n static build(options: {\n command: 'generate' | 'mcp' | 'validate' | 'agent'\n kubbVersion: string\n plugins?: Array<TelemetryPlugin>\n hrStart: [number, number]\n filesCreated?: number\n status: 'success' | 'failed'\n }): TelemetryEvent {\n const [seconds, nanoseconds] = process.hrtime(options.hrStart)\n const duration = Math.round(seconds * 1000 + nanoseconds / 1e6)\n\n return {\n command: options.command,\n kubbVersion: options.kubbVersion,\n nodeVersion: process.versions.node.split('.')[0] as string,\n runtime: runtime.name,\n runtimeVersion: runtime.version.split('.')[0] as string,\n platform: os.platform(),\n ci: isCIEnvironment(),\n plugins: options.plugins ?? [],\n duration,\n filesCreated: options.filesCreated ?? 0,\n status: options.status,\n }\n }\n\n /**\n * Convert a {@link TelemetryEvent} into an OTLP-compatible JSON trace payload.\n *\n * @see https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/\n */\n static buildOtlpPayload(event: TelemetryEvent): OtlpExportTraceServiceRequest {\n const traceId = randomBytes(16).toString('hex')\n const spanId = randomBytes(8).toString('hex')\n const endTimeNs = BigInt(Date.now()) * 1_000_000n\n const startTimeNs = endTimeNs - BigInt(event.duration) * 1_000_000n\n\n const attributes: Array<OtlpKeyValue> = [\n { key: 'kubb.command', value: { stringValue: event.command } },\n { key: 'kubb.version', value: { stringValue: event.kubbVersion } },\n { key: 'kubb.node_version', value: { stringValue: event.nodeVersion } },\n { key: 'kubb.runtime', value: { stringValue: event.runtime } },\n { key: 'kubb.runtime_version', value: { stringValue: event.runtimeVersion } },\n { key: 'kubb.platform', value: { stringValue: event.platform } },\n { key: 'kubb.ci', value: { boolValue: event.ci } },\n { key: 'kubb.files_created', value: { intValue: event.filesCreated } },\n { key: 'kubb.status', value: { stringValue: event.status } },\n {\n key: 'kubb.plugins',\n value: {\n arrayValue: {\n values: event.plugins.map(\n (p): OtlpKvListValue => ({\n kvlistValue: {\n values: [\n { key: 'name', value: { stringValue: p.name } },\n {\n key: 'options',\n value: {\n stringValue: JSON.stringify({\n ...p.options,\n usedEnumNames: undefined,\n }),\n },\n },\n ],\n },\n }),\n ),\n },\n },\n },\n ]\n\n return {\n resourceSpans: [\n {\n resource: {\n attributes: [\n { key: 'service.name', value: { stringValue: 'kubb-core' } },\n {\n key: 'service.version',\n value: { stringValue: event.kubbVersion },\n },\n { key: 'telemetry.sdk.language', value: { stringValue: 'nodejs' } },\n ],\n },\n scopeSpans: [\n {\n scope: { name: 'kubb-core', version: event.kubbVersion },\n spans: [\n {\n traceId,\n spanId,\n name: event.command,\n kind: 1 satisfies OtlpSpanKind,\n startTimeUnixNano: String(startTimeNs),\n endTimeUnixNano: String(endTimeNs),\n attributes,\n status: {\n code: (event.status === 'success' ? 1 : 2) satisfies OtlpStatusCode,\n },\n },\n ],\n },\n ],\n },\n ],\n }\n }\n\n /**\n * Send an anonymous telemetry event to the Kubb OTLP endpoint. Respects `DO_NOT_TRACK` and\n * `KUBB_DISABLE_TELEMETRY`, and fails silently so telemetry never interrupts a run.\n */\n static async send(event: TelemetryEvent): Promise<void> {\n if (Telemetry.isDisabled) {\n return\n }\n\n try {\n await fetch(`${OTLP_ENDPOINT}/v1/traces`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'Kubb-Telemetry-Version': '1',\n 'Kubb-Telemetry-Source': 'kubb-core',\n },\n body: JSON.stringify(Telemetry.buildOtlpPayload(event)),\n signal: AbortSignal.timeout(5_000),\n })\n } catch (_e) {\n // Fail silently, telemetry must never break the run\n }\n }\n}\n"],"mappings":"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"}