unplugin-kubb 5.0.0-beta.2 → 5.0.0-beta.20

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.
package/README.md CHANGED
@@ -21,12 +21,16 @@
21
21
  </h4>
22
22
  </div>
23
23
 
24
- Kubb plugin for Vite, webpack, esbuild, Rollup, Nuxt, Astro and Rspack.
24
+ Universal build integration for Kubb using [unplugin](https://github.com/unjs/unplugin). Runs OpenAPI code generation as part of your build pipeline in Vite, Webpack, Rollup, esbuild, Rspack, Nuxt, and Astro.
25
25
 
26
- ## Install
26
+ ## Installation
27
27
 
28
28
  ```bash
29
- npm i -D unplugin-kubb @kubb/core
29
+ bun add -D unplugin-kubb @kubb/core
30
+ # or
31
+ pnpm add -D unplugin-kubb @kubb/core
32
+ # or
33
+ npm install -D unplugin-kubb @kubb/core
30
34
  ```
31
35
 
32
36
  ```typescript
@@ -77,20 +81,6 @@ export default defineNuxtConfig({
77
81
  })
78
82
  ```
79
83
 
80
- > This module works for both Nuxt 2 and [Nuxt Vite](https://github.com/nuxt/vite)
81
-
82
- ```typescript
83
- module.exports = {
84
- configureWebpack: {
85
- plugins: [
86
- require('unplugin-kubb/webpack')({
87
- /* options */
88
- }),
89
- ],
90
- },
91
- }
92
- ```
93
-
94
84
  ```typescript
95
85
  import { build } from 'esbuild'
96
86
  import kubb from 'unplugin-kubb/esbuild'
@@ -114,7 +104,7 @@ type Options = {
114
104
 
115
105
  ## Supporting Kubb
116
106
 
117
- 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:
107
+ Kubb is 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:
118
108
 
119
109
  - [Become a Sponsor on GitHub](https://github.com/sponsors/stijnvanhulle)
120
110
 
package/dist/astro.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  const require_vite = require("./vite.cjs");
3
3
  //#region src/astro.ts
4
4
  var astro_default = /* @__PURE__ */ require_unpluginFactory.__name((options) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"astro.cjs","names":["vitePlugin"],"sources":["../src/astro.ts"],"sourcesContent":["import type { Options } from './types.ts'\nimport vitePlugin from './vite.ts'\n\nexport default (options: Options): any => ({\n name: 'unplugin-kubb',\n hooks: {\n 'astro:config:setup': async (astro: any) => {\n astro.config.vite.plugins ||= []\n astro.config.vite.plugins.push(vitePlugin(options))\n },\n },\n})\n"],"mappings":";;;AAGA,IAAA,gBAAA,wCAAA,QAAgB,aAA2B;CACzC,MAAM;CACN,OAAO,EACL,sBAAsB,OAAO,UAAe;AAC1C,QAAM,OAAO,KAAK,YAAY,EAAE;AAChC,QAAM,OAAO,KAAK,QAAQ,KAAKA,aAAW,QAAQ,CAAC;IAEtD;CACF,GAAA,UAAA"}
1
+ {"version":3,"file":"astro.cjs","names":["vitePlugin"],"sources":["../src/astro.ts"],"sourcesContent":["import type { Options } from './types.ts'\nimport vitePlugin from './vite.ts'\n\nexport default (options: Options): any => ({\n name: 'unplugin-kubb',\n hooks: {\n 'astro:config:setup': async (astro: any) => {\n astro.config.vite.plugins ||= []\n astro.config.vite.plugins.push(vitePlugin(options))\n },\n },\n})\n"],"mappings":";;;AAGA,IAAA,gBAAA,wCAAA,QAAgB,aAA2B;CACzC,MAAM;CACN,OAAO,EACL,sBAAsB,OAAO,UAAe;EAC1C,MAAM,OAAO,KAAK,YAAY,EAAE;EAChC,MAAM,OAAO,KAAK,QAAQ,KAAKA,aAAW,QAAQ,CAAC;IAEtD;CACF,GAAA,UAAA"}
package/dist/astro.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"astro.js","names":["vitePlugin"],"sources":["../src/astro.ts"],"sourcesContent":["import type { Options } from './types.ts'\nimport vitePlugin from './vite.ts'\n\nexport default (options: Options): any => ({\n name: 'unplugin-kubb',\n hooks: {\n 'astro:config:setup': async (astro: any) => {\n astro.config.vite.plugins ||= []\n astro.config.vite.plugins.push(vitePlugin(options))\n },\n },\n})\n"],"mappings":";;;AAGA,IAAA,gBAAA,wBAAgB,aAA2B;CACzC,MAAM;CACN,OAAO,EACL,sBAAsB,OAAO,UAAe;AAC1C,QAAM,OAAO,KAAK,YAAY,EAAE;AAChC,QAAM,OAAO,KAAK,QAAQ,KAAKA,aAAW,QAAQ,CAAC;IAEtD;CACF,GAAA,UAAA"}
1
+ {"version":3,"file":"astro.js","names":["vitePlugin"],"sources":["../src/astro.ts"],"sourcesContent":["import type { Options } from './types.ts'\nimport vitePlugin from './vite.ts'\n\nexport default (options: Options): any => ({\n name: 'unplugin-kubb',\n hooks: {\n 'astro:config:setup': async (astro: any) => {\n astro.config.vite.plugins ||= []\n astro.config.vite.plugins.push(vitePlugin(options))\n },\n },\n})\n"],"mappings":";;;AAGA,IAAA,gBAAA,wBAAgB,aAA2B;CACzC,MAAM;CACN,OAAO,EACL,sBAAsB,OAAO,UAAe;EAC1C,MAAM,OAAO,KAAK,YAAY,EAAE;EAChC,MAAM,OAAO,KAAK,QAAQ,KAAKA,aAAW,QAAQ,CAAC;IAEtD;CACF,GAAA,UAAA"}
package/dist/esbuild.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  //#region src/esbuild.ts
3
3
  var esbuild_default = (0, require("unplugin").createEsbuildPlugin)(require_unpluginFactory.unpluginFactory);
4
4
  //#endregion
package/dist/esbuild.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createEsbuildPlugin } from "unplugin";
3
3
  //#region src/esbuild.ts
4
4
  var esbuild_default = createEsbuildPlugin(unpluginFactory);
package/dist/farm.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  //#region src/farm.ts
3
3
  var farm_default = (0, require("unplugin").createFarmPlugin)(require_unpluginFactory.unpluginFactory);
4
4
  //#endregion
package/dist/farm.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createFarmPlugin } from "unplugin";
3
3
  //#region src/farm.ts
4
4
  var farm_default = createFarmPlugin(unpluginFactory);
package/dist/index.cjs CHANGED
@@ -2,7 +2,7 @@ Object.defineProperties(exports, {
2
2
  __esModule: { value: true },
3
3
  [Symbol.toStringTag]: { value: "Module" }
4
4
  });
5
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
5
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
6
6
  //#region src/index.ts
7
7
  const plugin = /* @__PURE__ */ (0, require("unplugin").createUnplugin)(require_unpluginFactory.unpluginFactory);
8
8
  //#endregion
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createUnplugin } from "unplugin";
3
3
  //#region src/index.ts
4
4
  const plugin = /* @__PURE__ */ createUnplugin(unpluginFactory);
package/dist/nuxt.cjs CHANGED
@@ -1,4 +1,4 @@
1
- require("./unpluginFactory-BgaJy4bp.cjs");
1
+ require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  const require_vite = require("./vite.cjs");
3
3
  const require_webpack = require("./webpack.cjs");
4
4
  let _nuxt_kit = require("@nuxt/kit");
package/dist/nuxt.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt.cjs","names":["vite","webpack"],"sources":["../src/nuxt.ts"],"sourcesContent":["import { addVitePlugin, addWebpackPlugin, defineNuxtModule } from '@nuxt/kit'\nimport '@nuxt/schema'\n\nimport type { Options } from './types.ts'\nimport vite from './vite.ts'\nimport webpack from './webpack.ts'\n\nexport interface ModuleOptions extends Options {}\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: 'nuxt-unplugin-kubb',\n configKey: 'unpluginKubb',\n },\n defaults: undefined,\n setup(options, _nuxt) {\n addVitePlugin(() => vite(options))\n addWebpackPlugin(() => webpack(options))\n\n // ...\n },\n})\n"],"mappings":";;;;;;AASA,IAAA,gBAAA,GAAA,UAAA,kBAA+C;CAC7C,MAAM;EACJ,MAAM;EACN,WAAW;EACZ;CACD,UAAU,KAAA;CACV,MAAM,SAAS,OAAO;AACpB,GAAA,GAAA,UAAA,qBAAoBA,aAAK,QAAQ,CAAC;AAClC,GAAA,GAAA,UAAA,wBAAuBC,gBAAQ,QAAQ,CAAC;;CAI3C,CAAC"}
1
+ {"version":3,"file":"nuxt.cjs","names":["vite","webpack"],"sources":["../src/nuxt.ts"],"sourcesContent":["import { addVitePlugin, addWebpackPlugin, defineNuxtModule } from '@nuxt/kit'\nimport '@nuxt/schema'\n\nimport type { Options } from './types.ts'\nimport vite from './vite.ts'\nimport webpack from './webpack.ts'\n\nexport interface ModuleOptions extends Options {}\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: 'nuxt-unplugin-kubb',\n configKey: 'unpluginKubb',\n },\n defaults: undefined,\n setup(options, _nuxt) {\n addVitePlugin(() => vite(options))\n addWebpackPlugin(() => webpack(options))\n },\n})\n"],"mappings":";;;;;;AASA,IAAA,gBAAA,GAAA,UAAA,kBAA+C;CAC7C,MAAM;EACJ,MAAM;EACN,WAAW;EACZ;CACD,UAAU,KAAA;CACV,MAAM,SAAS,OAAO;EACpB,CAAA,GAAA,UAAA,qBAAoBA,aAAK,QAAQ,CAAC;EAClC,CAAA,GAAA,UAAA,wBAAuBC,gBAAQ,QAAQ,CAAC;;CAE3C,CAAC"}
package/dist/nuxt.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"nuxt.js","names":["vite","webpack"],"sources":["../src/nuxt.ts"],"sourcesContent":["import { addVitePlugin, addWebpackPlugin, defineNuxtModule } from '@nuxt/kit'\nimport '@nuxt/schema'\n\nimport type { Options } from './types.ts'\nimport vite from './vite.ts'\nimport webpack from './webpack.ts'\n\nexport interface ModuleOptions extends Options {}\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: 'nuxt-unplugin-kubb',\n configKey: 'unpluginKubb',\n },\n defaults: undefined,\n setup(options, _nuxt) {\n addVitePlugin(() => vite(options))\n addWebpackPlugin(() => webpack(options))\n\n // ...\n },\n})\n"],"mappings":";;;;;;AASA,IAAA,eAAe,iBAAgC;CAC7C,MAAM;EACJ,MAAM;EACN,WAAW;EACZ;CACD,UAAU,KAAA;CACV,MAAM,SAAS,OAAO;AACpB,sBAAoBA,aAAK,QAAQ,CAAC;AAClC,yBAAuBC,gBAAQ,QAAQ,CAAC;;CAI3C,CAAC"}
1
+ {"version":3,"file":"nuxt.js","names":["vite","webpack"],"sources":["../src/nuxt.ts"],"sourcesContent":["import { addVitePlugin, addWebpackPlugin, defineNuxtModule } from '@nuxt/kit'\nimport '@nuxt/schema'\n\nimport type { Options } from './types.ts'\nimport vite from './vite.ts'\nimport webpack from './webpack.ts'\n\nexport interface ModuleOptions extends Options {}\n\nexport default defineNuxtModule<ModuleOptions>({\n meta: {\n name: 'nuxt-unplugin-kubb',\n configKey: 'unpluginKubb',\n },\n defaults: undefined,\n setup(options, _nuxt) {\n addVitePlugin(() => vite(options))\n addWebpackPlugin(() => webpack(options))\n },\n})\n"],"mappings":";;;;;;AASA,IAAA,eAAe,iBAAgC;CAC7C,MAAM;EACJ,MAAM;EACN,WAAW;EACZ;CACD,UAAU,KAAA;CACV,MAAM,SAAS,OAAO;EACpB,oBAAoBA,aAAK,QAAQ,CAAC;EAClC,uBAAuBC,gBAAQ,QAAQ,CAAC;;CAE3C,CAAC"}
package/dist/rolldown.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  //#region src/rolldown.ts
3
3
  var rolldown_default = (0, require("unplugin").createRolldownPlugin)(require_unpluginFactory.unpluginFactory);
4
4
  //#endregion
package/dist/rolldown.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createRolldownPlugin } from "unplugin";
3
3
  //#region src/rolldown.ts
4
4
  var rolldown_default = createRolldownPlugin(unpluginFactory);
package/dist/rollup.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  //#region src/rollup.ts
3
3
  var rollup_default = (0, require("unplugin").createRollupPlugin)(require_unpluginFactory.unpluginFactory);
4
4
  //#endregion
package/dist/rollup.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createRollupPlugin } from "unplugin";
3
3
  //#region src/rollup.ts
4
4
  var rollup_default = createRollupPlugin(unpluginFactory);
package/dist/rspack.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  //#region src/rspack.ts
3
3
  var rspack_default = (0, require("unplugin").createRspackPlugin)(require_unpluginFactory.unpluginFactory);
4
4
  //#endregion
package/dist/rspack.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createRspackPlugin } from "unplugin";
3
3
  //#region src/rspack.ts
4
4
  var rspack_default = createRspackPlugin(unpluginFactory);
@@ -4,7 +4,7 @@ import { EventEmitter } from "node:events";
4
4
  import { adapterOas } from "@kubb/adapter-oas";
5
5
  import { createKubb } from "@kubb/core";
6
6
  import { middlewareBarrel, middlewareBarrelName } from "@kubb/middleware-barrel";
7
- import { parserTs } from "@kubb/parser-ts";
7
+ import { parserTs, parserTsx } from "@kubb/parser-ts";
8
8
  //#region ../../internals/utils/src/errors.ts
9
9
  /**
10
10
  * Coerces an unknown thrown value to an `Error` instance.
@@ -51,9 +51,12 @@ var AsyncEventEmitter = class {
51
51
  * await emitter.emit('build', 'petstore')
52
52
  * ```
53
53
  */
54
- async emit(eventName, ...eventArgs) {
54
+ emit(eventName, ...eventArgs) {
55
55
  const listeners = this.#emitter.listeners(eventName);
56
56
  if (listeners.length === 0) return;
57
+ return this.#emitAll(eventName, listeners, eventArgs);
58
+ }
59
+ async #emitAll(eventName, listeners, eventArgs) {
57
60
  for (const listener of listeners) try {
58
61
  await listener(...eventArgs);
59
62
  } catch (err) {
@@ -129,18 +132,46 @@ var AsyncEventEmitter = class {
129
132
  };
130
133
  //#endregion
131
134
  //#region package.json
132
- var version = "5.0.0-beta.2";
135
+ var version = "5.0.0-beta.20";
133
136
  //#endregion
134
137
  //#region src/unpluginFactory.ts
135
138
  const unpluginFactory = (options, meta) => {
136
139
  const name = "unplugin-kubb";
137
140
  const hooks = new AsyncEventEmitter();
138
141
  const isVite = meta.framework === "vite";
139
- const hrStart = process.hrtime();
142
+ hooks.on("kubb:lifecycle:start", ({ version }) => {
143
+ console.log(`Kubb Unplugin ${version} 🧩`);
144
+ });
145
+ hooks.on("kubb:error", ({ error }) => {
146
+ console.error(`✗ ${error?.message || "failed"}`);
147
+ });
148
+ hooks.on("kubb:warn", ({ message }) => {
149
+ console.warn(`⚠ ${message}`);
150
+ });
151
+ hooks.on("kubb:info", ({ message }) => {
152
+ console.info(`ℹ ${message}`);
153
+ });
154
+ hooks.on("kubb:success", ({ message }) => {
155
+ console.log(`✓ ${message}`);
156
+ });
157
+ hooks.on("kubb:plugin:end", ({ plugin, duration }) => {
158
+ const durationStr = duration >= 1e3 ? `${(duration / 1e3).toFixed(2)}s` : `${duration}ms`;
159
+ console.log(`✓ ${plugin.name} completed in ${durationStr}`);
160
+ });
161
+ hooks.on("kubb:files:processing:end", () => {
162
+ console.log("✓ Files written successfully");
163
+ });
164
+ hooks.on("kubb:generation:end", ({ config }) => {
165
+ console.log(config.name ? `✓ Generation completed for ${config.name}` : "✓ Generation completed");
166
+ });
167
+ hooks.on("kubb:generation:summary", ({ config, status, failedPlugins }) => {
168
+ const pluginsCount = config.plugins.length;
169
+ const successCount = pluginsCount - failedPlugins.size;
170
+ console.log(status === "success" ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total` : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`);
171
+ });
140
172
  async function runBuild(ctx) {
141
173
  if (!options?.config) {
142
- if (ctx.error) ctx.error?.(`[${name}] Config is not set`);
143
- else console.error(`[${name}] Config is not set`);
174
+ (ctx.error ?? console.error)(`[${name}] Config is not set`);
144
175
  return;
145
176
  }
146
177
  const middleware = options.config.middleware?.length ? options.config.middleware : [middlewareBarrel()];
@@ -152,61 +183,28 @@ const unpluginFactory = (options, meta) => {
152
183
  const config = {
153
184
  ...options.config,
154
185
  adapter: options.config.adapter ?? adapterOas(),
155
- parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],
186
+ parsers: options.config.parsers?.length ? options.config.parsers : [parserTs, parserTsx],
156
187
  middleware,
157
188
  output
158
189
  };
159
- hooks.on("kubb:lifecycle:start", ({ version }) => {
160
- console.log(`Kubb Unplugin ${version} 🧩`);
161
- });
162
- hooks.on("kubb:error", ({ error }) => {
163
- console.error(`✗ ${error?.message || "failed"}`);
164
- });
165
- hooks.on("kubb:warn", ({ message }) => {
166
- console.warn(`⚠ ${message}`);
167
- });
168
- hooks.on("kubb:info", ({ message }) => {
169
- console.info(`ℹ ${message}`);
170
- });
171
- hooks.on("kubb:success", ({ message }) => {
172
- console.log(`✓ ${message}`);
173
- });
174
- hooks.on("kubb:plugin:end", ({ plugin, duration }) => {
175
- const durationStr = duration >= 1e3 ? `${(duration / 1e3).toFixed(2)}s` : `${duration}ms`;
176
- console.log(`✓ ${plugin.name} completed in ${durationStr}`);
177
- });
178
- hooks.on("kubb:files:processing:end", () => {
179
- console.log("✓ Files written successfully");
180
- });
181
- hooks.on("kubb:generation:end", ({ config }) => {
182
- console.log(config.name ? `✓ Generation completed for ${config.name}` : "✓ Generation completed");
183
- });
184
- hooks.on("kubb:generation:summary", ({ config, status, failedPlugins }) => {
185
- const pluginsCount = config.plugins.length;
186
- const successCount = pluginsCount - failedPlugins.size;
187
- console.log(status === "success" ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total` : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`);
188
- });
190
+ const hrStart = process.hrtime();
189
191
  await hooks.emit("kubb:lifecycle:start", { version });
190
- const { root: _root, ...userConfig } = config;
191
- await hooks.emit("kubb:generation:start", { config });
192
- const { error, failedPlugins, pluginTimings, files, sources } = await createKubb({
193
- root: process.cwd(),
194
- ...userConfig,
195
- output: {
196
- write: true,
197
- ...userConfig.output
198
- }
199
- }, { hooks }).safeBuild();
200
- if (failedPlugins.size > 0 || error) [error, ...Array.from(failedPlugins).filter((it) => it.error).map((it) => it.error)].filter(Boolean).forEach((err) => {
192
+ const userConfig = config;
193
+ const kubb = createKubb(userConfig, { hooks });
194
+ await kubb.setup();
195
+ const resolvedConfig = kubb.config ?? userConfig;
196
+ await hooks.emit("kubb:generation:start", { config: resolvedConfig });
197
+ const { error, failedPlugins, pluginTimings, files, storage } = await kubb.safeBuild();
198
+ const hasFailures = failedPlugins.size > 0 || error;
199
+ if (hasFailures) [error, ...Array.from(failedPlugins).filter((it) => it.error).map((it) => it.error)].filter(Boolean).forEach((err) => {
201
200
  hooks.emit("kubb:error", { error: err });
202
201
  });
203
202
  await hooks.emit("kubb:generation:end", {
204
- config,
205
- files,
206
- sources
203
+ config: resolvedConfig,
204
+ storage
207
205
  });
208
206
  await hooks.emit("kubb:generation:summary", {
209
- config,
207
+ config: resolvedConfig,
210
208
  failedPlugins,
211
209
  filesCreated: files.length,
212
210
  status: failedPlugins.size > 0 || error ? "failed" : "success",
@@ -214,6 +212,14 @@ const unpluginFactory = (options, meta) => {
214
212
  pluginTimings
215
213
  });
216
214
  await hooks.emit("kubb:lifecycle:end");
215
+ if (hasFailures) {
216
+ const message = error?.message ?? `Build Error with ${failedPlugins.size} failed plugins`;
217
+ if (ctx.error) {
218
+ ctx.error(`[${name}] ${message}`);
219
+ return;
220
+ }
221
+ throw new Error(`[${name}] ${message}`, { cause: error });
222
+ }
217
223
  }
218
224
  return {
219
225
  name,
@@ -228,4 +234,4 @@ const unpluginFactory = (options, meta) => {
228
234
  //#endregion
229
235
  export { unpluginFactory as t };
230
236
 
231
- //# sourceMappingURL=unpluginFactory-BjBUK-ea.js.map
237
+ //# sourceMappingURL=unpluginFactory-CvgstE94.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpluginFactory-CvgstE94.js","names":["#emitter","NodeEventEmitter","#emitAll","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/**\n * Thrown when one or more errors occur during a Kubb build.\n * Carries the full list of underlying errors on `errors`.\n *\n * @example\n * ```ts\n * throw new BuildError('Build failed', { errors: [err1, err2] })\n * ```\n */\nexport class BuildError extends Error {\n errors: Array<Error>\n\n constructor(message: string, options: { cause?: Error; errors: Array<Error> }) {\n super(message, { cause: options.cause })\n this.name = 'BuildError'\n this.errors = options.errors\n }\n}\n\n/**\n * Coerces an unknown thrown value to an `Error` instance.\n * Returns the value as-is when it is already an `Error`; otherwise wraps it with `String(value)`.\n *\n * @example\n * ```ts\n * try { ... } catch(err) {\n * throw new BuildError('Build failed', { cause: toError(err), errors: [] })\n * }\n * ```\n */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\n/**\n * Extracts a human-readable message from any thrown value.\n *\n * @example\n * ```ts\n * getErrorMessage(new Error('oops')) // 'oops'\n * getErrorMessage('plain string') // 'plain string'\n * ```\n */\nexport function getErrorMessage(value: unknown): string {\n return value instanceof Error ? value.message : String(value)\n}\n\n/**\n * Extracts the `.cause` of an `Error` as an `Error`, or `undefined` when absent or not an `Error`.\n *\n * @example\n * ```ts\n * const cause = toCause(buildError) // Error | undefined\n * ```\n */\nexport function toCause(error: Error): Error | undefined {\n return error.cause instanceof Error ? error.cause : undefined\n}\n","import { EventEmitter as NodeEventEmitter } from 'node:events'\nimport { toError } from './errors.ts'\n\n/**\n * A function that can be registered as an event listener, synchronous or async.\n */\ntype AsyncListener<TArgs extends unknown[]> = (...args: TArgs) => void | Promise<void>\n\n/**\n * Typed `EventEmitter` that awaits all async listeners before resolving.\n * Wraps Node's `EventEmitter` with full TypeScript event-map inference.\n *\n * @example\n * ```ts\n * const emitter = new AsyncEventEmitter<{ build: [name: string] }>()\n * emitter.on('build', async (name) => { console.log(name) })\n * await emitter.emit('build', 'petstore') // all listeners awaited\n * ```\n */\nexport class AsyncEventEmitter<TEvents extends { [K in keyof TEvents]: unknown[] }> {\n /**\n * Maximum number of listeners per event before Node emits a memory-leak warning.\n * @default 10\n */\n constructor(maxListener = 10) {\n this.#emitter.setMaxListeners(maxListener)\n }\n\n #emitter = new NodeEventEmitter()\n\n /**\n * Emits `eventName` and awaits all registered listeners sequentially.\n * Throws if any listener rejects, wrapping the cause with the event name and serialized arguments.\n *\n * @example\n * ```ts\n * await emitter.emit('build', 'petstore')\n * ```\n */\n emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArgs: TEvents[TEventName]): Promise<void> | void {\n const listeners = this.#emitter.listeners(eventName) as Array<AsyncListener<TEvents[TEventName]>>\n\n if (listeners.length === 0) {\n return\n }\n\n return this.#emitAll(eventName, listeners, eventArgs)\n }\n\n async #emitAll<TEventName extends keyof TEvents & string>(\n eventName: TEventName,\n listeners: Array<AsyncListener<TEvents[TEventName]>>,\n eventArgs: TEvents[TEventName],\n ): Promise<void> {\n for (const listener of listeners) {\n try {\n await listener(...eventArgs)\n } catch (err) {\n let serializedArgs: string\n try {\n serializedArgs = JSON.stringify(eventArgs)\n } catch {\n serializedArgs = String(eventArgs)\n }\n throw new Error(`Error in async listener for \"${eventName}\" with eventArgs ${serializedArgs}`, { cause: toError(err) })\n }\n }\n }\n\n /**\n * Registers a persistent listener for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', async (name) => { console.log(name) })\n * ```\n */\n on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.on(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Registers a one-shot listener that removes itself after the first invocation.\n *\n * @example\n * ```ts\n * emitter.onOnce('build', async (name) => { console.log(name) })\n * ```\n */\n onOnce<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n const wrapper: AsyncListener<TEvents[TEventName]> = (...args) => {\n this.off(eventName, wrapper)\n return handler(...args)\n }\n this.on(eventName, wrapper)\n }\n\n /**\n * Removes a previously registered listener.\n *\n * @example\n * ```ts\n * emitter.off('build', handler)\n * ```\n */\n off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.off(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Returns the number of listeners registered for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', handler)\n * emitter.listenerCount('build') // 1\n * ```\n */\n listenerCount<TEventName extends keyof TEvents & string>(eventName: TEventName): number {\n return this.#emitter.listenerCount(eventName)\n }\n\n /**\n * Removes all listeners from every event channel.\n *\n * @example\n * ```ts\n * emitter.removeAll()\n * ```\n */\n removeAll(): void {\n this.#emitter.removeAllListeners()\n }\n}\n","","import process from 'node:process'\nimport { AsyncEventEmitter } from '@internals/utils'\nimport { adapterOas } from '@kubb/adapter-oas'\nimport { type Config, createKubb, type KubbHooks } from '@kubb/core'\nimport { middlewareBarrel, middlewareBarrelName } from '@kubb/middleware-barrel'\nimport { parserTs, parserTsx } from '@kubb/parser-ts'\nimport type { UnpluginFactory } from 'unplugin'\nimport { version as unpluginVersion } from '../package.json'\nimport type { Options } from './types.ts'\n\ntype RollupContext = {\n info?: (message: string) => void\n warn?: (message: string) => void\n error?: (message: string) => void\n}\n\nexport const unpluginFactory: UnpluginFactory<Options | undefined> = (options, meta) => {\n const name = 'unplugin-kubb' as const\n const hooks = new AsyncEventEmitter<KubbHooks>()\n const isVite = meta.framework === 'vite'\n\n hooks.on('kubb:lifecycle:start', ({ version }) => {\n console.log(`Kubb Unplugin ${version} 🧩`)\n })\n\n hooks.on('kubb:error', ({ error }) => {\n console.error(`✗ ${error?.message || 'failed'}`)\n })\n\n hooks.on('kubb:warn', ({ message }) => {\n console.warn(`⚠ ${message}`)\n })\n\n hooks.on('kubb:info', ({ message }) => {\n console.info(`ℹ ${message}`)\n })\n\n hooks.on('kubb:success', ({ message }) => {\n console.log(`✓ ${message}`)\n })\n\n hooks.on('kubb:plugin:end', ({ plugin, duration }) => {\n const durationStr = duration >= 1000 ? `${(duration / 1000).toFixed(2)}s` : `${duration}ms`\n\n console.log(`✓ ${plugin.name} completed in ${durationStr}`)\n })\n\n hooks.on('kubb:files:processing:end', () => {\n const text = '✓ Files written successfully'\n\n console.log(text)\n })\n\n hooks.on('kubb:generation:end', ({ config }) => {\n console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')\n })\n\n hooks.on('kubb:generation:summary', ({ config, status, failedPlugins }) => {\n const pluginsCount = config.plugins.length\n const successCount = pluginsCount - failedPlugins.size\n\n console.log(\n status === 'success'\n ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total`\n : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`,\n )\n })\n\n async function runBuild(ctx: RollupContext) {\n if (!options?.config) {\n ;(ctx.error ?? console.error)(`[${name}] Config is not set`)\n return\n }\n\n const middleware = options.config.middleware?.length ? options.config.middleware : [middlewareBarrel()]\n const hasBarrelMiddleware = middleware.some((m) => m.name === middlewareBarrelName)\n const output = { ...options.config.output }\n if (hasBarrelMiddleware && output.barrel === undefined) {\n output.barrel = { type: 'named' }\n }\n if (output.format === undefined) {\n output.format = false\n }\n if (output.lint === undefined) {\n output.lint = false\n }\n\n const config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs, parserTsx],\n middleware,\n output,\n }\n const hrStart = process.hrtime()\n\n await hooks.emit('kubb:lifecycle:start', { version: unpluginVersion })\n\n const userConfig = config as Config\n\n const kubb = createKubb(userConfig, { hooks })\n await kubb.setup()\n\n const resolvedConfig = kubb.config ?? userConfig\n\n await hooks.emit('kubb:generation:start', { config: resolvedConfig })\n\n const { error, failedPlugins, pluginTimings, files, storage } = await kubb.safeBuild()\n\n const hasFailures = failedPlugins.size > 0 || error\n if (hasFailures) {\n // Collect all errors from failed plugins and general error\n const allErrors: Error[] = [\n error,\n ...Array.from(failedPlugins)\n .filter((it) => it.error)\n .map((it) => it.error),\n ].filter(Boolean)\n\n allErrors.forEach((err) => {\n hooks.emit('kubb:error', { error: err })\n })\n }\n\n await hooks.emit('kubb:generation:end', { config: resolvedConfig, storage })\n await hooks.emit('kubb:generation:summary', {\n config: resolvedConfig,\n failedPlugins,\n filesCreated: files.length,\n status: failedPlugins.size > 0 || error ? 'failed' : 'success',\n hrStart,\n pluginTimings,\n })\n\n await hooks.emit('kubb:lifecycle:end')\n\n if (hasFailures) {\n const message = error?.message ?? `Build Error with ${failedPlugins.size} failed plugins`\n if (ctx.error) {\n ctx.error(`[${name}] ${message}`)\n return\n }\n\n throw new Error(`[${name}] ${message}`, { cause: error })\n }\n }\n\n return {\n name,\n enforce: 'pre',\n apply: isVite ? 'build' : undefined,\n async buildStart() {\n await runBuild(this as unknown as RollupContext)\n },\n vite: {},\n }\n}\n"],"mappings":"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"}
@@ -77,9 +77,12 @@ var AsyncEventEmitter = class {
77
77
  * await emitter.emit('build', 'petstore')
78
78
  * ```
79
79
  */
80
- async emit(eventName, ...eventArgs) {
80
+ emit(eventName, ...eventArgs) {
81
81
  const listeners = this.#emitter.listeners(eventName);
82
82
  if (listeners.length === 0) return;
83
+ return this.#emitAll(eventName, listeners, eventArgs);
84
+ }
85
+ async #emitAll(eventName, listeners, eventArgs) {
83
86
  for (const listener of listeners) try {
84
87
  await listener(...eventArgs);
85
88
  } catch (err) {
@@ -155,18 +158,46 @@ var AsyncEventEmitter = class {
155
158
  };
156
159
  //#endregion
157
160
  //#region package.json
158
- var version = "5.0.0-beta.2";
161
+ var version = "5.0.0-beta.20";
159
162
  //#endregion
160
163
  //#region src/unpluginFactory.ts
161
164
  const unpluginFactory = (options, meta) => {
162
165
  const name = "unplugin-kubb";
163
166
  const hooks = new AsyncEventEmitter();
164
167
  const isVite = meta.framework === "vite";
165
- const hrStart = node_process.default.hrtime();
168
+ hooks.on("kubb:lifecycle:start", ({ version }) => {
169
+ console.log(`Kubb Unplugin ${version} 🧩`);
170
+ });
171
+ hooks.on("kubb:error", ({ error }) => {
172
+ console.error(`✗ ${error?.message || "failed"}`);
173
+ });
174
+ hooks.on("kubb:warn", ({ message }) => {
175
+ console.warn(`⚠ ${message}`);
176
+ });
177
+ hooks.on("kubb:info", ({ message }) => {
178
+ console.info(`ℹ ${message}`);
179
+ });
180
+ hooks.on("kubb:success", ({ message }) => {
181
+ console.log(`✓ ${message}`);
182
+ });
183
+ hooks.on("kubb:plugin:end", ({ plugin, duration }) => {
184
+ const durationStr = duration >= 1e3 ? `${(duration / 1e3).toFixed(2)}s` : `${duration}ms`;
185
+ console.log(`✓ ${plugin.name} completed in ${durationStr}`);
186
+ });
187
+ hooks.on("kubb:files:processing:end", () => {
188
+ console.log("✓ Files written successfully");
189
+ });
190
+ hooks.on("kubb:generation:end", ({ config }) => {
191
+ console.log(config.name ? `✓ Generation completed for ${config.name}` : "✓ Generation completed");
192
+ });
193
+ hooks.on("kubb:generation:summary", ({ config, status, failedPlugins }) => {
194
+ const pluginsCount = config.plugins.length;
195
+ const successCount = pluginsCount - failedPlugins.size;
196
+ console.log(status === "success" ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total` : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`);
197
+ });
166
198
  async function runBuild(ctx) {
167
199
  if (!options?.config) {
168
- if (ctx.error) ctx.error?.(`[${name}] Config is not set`);
169
- else console.error(`[${name}] Config is not set`);
200
+ (ctx.error ?? console.error)(`[${name}] Config is not set`);
170
201
  return;
171
202
  }
172
203
  const middleware = options.config.middleware?.length ? options.config.middleware : [(0, _kubb_middleware_barrel.middlewareBarrel)()];
@@ -178,61 +209,28 @@ const unpluginFactory = (options, meta) => {
178
209
  const config = {
179
210
  ...options.config,
180
211
  adapter: options.config.adapter ?? (0, _kubb_adapter_oas.adapterOas)(),
181
- parsers: options.config.parsers?.length ? options.config.parsers : [_kubb_parser_ts.parserTs],
212
+ parsers: options.config.parsers?.length ? options.config.parsers : [_kubb_parser_ts.parserTs, _kubb_parser_ts.parserTsx],
182
213
  middleware,
183
214
  output
184
215
  };
185
- hooks.on("kubb:lifecycle:start", ({ version }) => {
186
- console.log(`Kubb Unplugin ${version} 🧩`);
187
- });
188
- hooks.on("kubb:error", ({ error }) => {
189
- console.error(`✗ ${error?.message || "failed"}`);
190
- });
191
- hooks.on("kubb:warn", ({ message }) => {
192
- console.warn(`⚠ ${message}`);
193
- });
194
- hooks.on("kubb:info", ({ message }) => {
195
- console.info(`ℹ ${message}`);
196
- });
197
- hooks.on("kubb:success", ({ message }) => {
198
- console.log(`✓ ${message}`);
199
- });
200
- hooks.on("kubb:plugin:end", ({ plugin, duration }) => {
201
- const durationStr = duration >= 1e3 ? `${(duration / 1e3).toFixed(2)}s` : `${duration}ms`;
202
- console.log(`✓ ${plugin.name} completed in ${durationStr}`);
203
- });
204
- hooks.on("kubb:files:processing:end", () => {
205
- console.log("✓ Files written successfully");
206
- });
207
- hooks.on("kubb:generation:end", ({ config }) => {
208
- console.log(config.name ? `✓ Generation completed for ${config.name}` : "✓ Generation completed");
209
- });
210
- hooks.on("kubb:generation:summary", ({ config, status, failedPlugins }) => {
211
- const pluginsCount = config.plugins.length;
212
- const successCount = pluginsCount - failedPlugins.size;
213
- console.log(status === "success" ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total` : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`);
214
- });
216
+ const hrStart = node_process.default.hrtime();
215
217
  await hooks.emit("kubb:lifecycle:start", { version });
216
- const { root: _root, ...userConfig } = config;
217
- await hooks.emit("kubb:generation:start", { config });
218
- const { error, failedPlugins, pluginTimings, files, sources } = await (0, _kubb_core.createKubb)({
219
- root: node_process.default.cwd(),
220
- ...userConfig,
221
- output: {
222
- write: true,
223
- ...userConfig.output
224
- }
225
- }, { hooks }).safeBuild();
226
- if (failedPlugins.size > 0 || error) [error, ...Array.from(failedPlugins).filter((it) => it.error).map((it) => it.error)].filter(Boolean).forEach((err) => {
218
+ const userConfig = config;
219
+ const kubb = (0, _kubb_core.createKubb)(userConfig, { hooks });
220
+ await kubb.setup();
221
+ const resolvedConfig = kubb.config ?? userConfig;
222
+ await hooks.emit("kubb:generation:start", { config: resolvedConfig });
223
+ const { error, failedPlugins, pluginTimings, files, storage } = await kubb.safeBuild();
224
+ const hasFailures = failedPlugins.size > 0 || error;
225
+ if (hasFailures) [error, ...Array.from(failedPlugins).filter((it) => it.error).map((it) => it.error)].filter(Boolean).forEach((err) => {
227
226
  hooks.emit("kubb:error", { error: err });
228
227
  });
229
228
  await hooks.emit("kubb:generation:end", {
230
- config,
231
- files,
232
- sources
229
+ config: resolvedConfig,
230
+ storage
233
231
  });
234
232
  await hooks.emit("kubb:generation:summary", {
235
- config,
233
+ config: resolvedConfig,
236
234
  failedPlugins,
237
235
  filesCreated: files.length,
238
236
  status: failedPlugins.size > 0 || error ? "failed" : "success",
@@ -240,6 +238,14 @@ const unpluginFactory = (options, meta) => {
240
238
  pluginTimings
241
239
  });
242
240
  await hooks.emit("kubb:lifecycle:end");
241
+ if (hasFailures) {
242
+ const message = error?.message ?? `Build Error with ${failedPlugins.size} failed plugins`;
243
+ if (ctx.error) {
244
+ ctx.error(`[${name}] ${message}`);
245
+ return;
246
+ }
247
+ throw new Error(`[${name}] ${message}`, { cause: error });
248
+ }
243
249
  }
244
250
  return {
245
251
  name,
@@ -271,4 +277,4 @@ Object.defineProperty(exports, "unpluginFactory", {
271
277
  }
272
278
  });
273
279
 
274
- //# sourceMappingURL=unpluginFactory-BgaJy4bp.cjs.map
280
+ //# sourceMappingURL=unpluginFactory-DC7xVoEm.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unpluginFactory-DC7xVoEm.cjs","names":["#emitter","NodeEventEmitter","#emitAll","middlewareBarrelName","parserTs","parserTsx","process","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/**\n * Thrown when one or more errors occur during a Kubb build.\n * Carries the full list of underlying errors on `errors`.\n *\n * @example\n * ```ts\n * throw new BuildError('Build failed', { errors: [err1, err2] })\n * ```\n */\nexport class BuildError extends Error {\n errors: Array<Error>\n\n constructor(message: string, options: { cause?: Error; errors: Array<Error> }) {\n super(message, { cause: options.cause })\n this.name = 'BuildError'\n this.errors = options.errors\n }\n}\n\n/**\n * Coerces an unknown thrown value to an `Error` instance.\n * Returns the value as-is when it is already an `Error`; otherwise wraps it with `String(value)`.\n *\n * @example\n * ```ts\n * try { ... } catch(err) {\n * throw new BuildError('Build failed', { cause: toError(err), errors: [] })\n * }\n * ```\n */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\n/**\n * Extracts a human-readable message from any thrown value.\n *\n * @example\n * ```ts\n * getErrorMessage(new Error('oops')) // 'oops'\n * getErrorMessage('plain string') // 'plain string'\n * ```\n */\nexport function getErrorMessage(value: unknown): string {\n return value instanceof Error ? value.message : String(value)\n}\n\n/**\n * Extracts the `.cause` of an `Error` as an `Error`, or `undefined` when absent or not an `Error`.\n *\n * @example\n * ```ts\n * const cause = toCause(buildError) // Error | undefined\n * ```\n */\nexport function toCause(error: Error): Error | undefined {\n return error.cause instanceof Error ? error.cause : undefined\n}\n","import { EventEmitter as NodeEventEmitter } from 'node:events'\nimport { toError } from './errors.ts'\n\n/**\n * A function that can be registered as an event listener, synchronous or async.\n */\ntype AsyncListener<TArgs extends unknown[]> = (...args: TArgs) => void | Promise<void>\n\n/**\n * Typed `EventEmitter` that awaits all async listeners before resolving.\n * Wraps Node's `EventEmitter` with full TypeScript event-map inference.\n *\n * @example\n * ```ts\n * const emitter = new AsyncEventEmitter<{ build: [name: string] }>()\n * emitter.on('build', async (name) => { console.log(name) })\n * await emitter.emit('build', 'petstore') // all listeners awaited\n * ```\n */\nexport class AsyncEventEmitter<TEvents extends { [K in keyof TEvents]: unknown[] }> {\n /**\n * Maximum number of listeners per event before Node emits a memory-leak warning.\n * @default 10\n */\n constructor(maxListener = 10) {\n this.#emitter.setMaxListeners(maxListener)\n }\n\n #emitter = new NodeEventEmitter()\n\n /**\n * Emits `eventName` and awaits all registered listeners sequentially.\n * Throws if any listener rejects, wrapping the cause with the event name and serialized arguments.\n *\n * @example\n * ```ts\n * await emitter.emit('build', 'petstore')\n * ```\n */\n emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArgs: TEvents[TEventName]): Promise<void> | void {\n const listeners = this.#emitter.listeners(eventName) as Array<AsyncListener<TEvents[TEventName]>>\n\n if (listeners.length === 0) {\n return\n }\n\n return this.#emitAll(eventName, listeners, eventArgs)\n }\n\n async #emitAll<TEventName extends keyof TEvents & string>(\n eventName: TEventName,\n listeners: Array<AsyncListener<TEvents[TEventName]>>,\n eventArgs: TEvents[TEventName],\n ): Promise<void> {\n for (const listener of listeners) {\n try {\n await listener(...eventArgs)\n } catch (err) {\n let serializedArgs: string\n try {\n serializedArgs = JSON.stringify(eventArgs)\n } catch {\n serializedArgs = String(eventArgs)\n }\n throw new Error(`Error in async listener for \"${eventName}\" with eventArgs ${serializedArgs}`, { cause: toError(err) })\n }\n }\n }\n\n /**\n * Registers a persistent listener for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', async (name) => { console.log(name) })\n * ```\n */\n on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.on(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Registers a one-shot listener that removes itself after the first invocation.\n *\n * @example\n * ```ts\n * emitter.onOnce('build', async (name) => { console.log(name) })\n * ```\n */\n onOnce<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n const wrapper: AsyncListener<TEvents[TEventName]> = (...args) => {\n this.off(eventName, wrapper)\n return handler(...args)\n }\n this.on(eventName, wrapper)\n }\n\n /**\n * Removes a previously registered listener.\n *\n * @example\n * ```ts\n * emitter.off('build', handler)\n * ```\n */\n off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.off(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Returns the number of listeners registered for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', handler)\n * emitter.listenerCount('build') // 1\n * ```\n */\n listenerCount<TEventName extends keyof TEvents & string>(eventName: TEventName): number {\n return this.#emitter.listenerCount(eventName)\n }\n\n /**\n * Removes all listeners from every event channel.\n *\n * @example\n * ```ts\n * emitter.removeAll()\n * ```\n */\n removeAll(): void {\n this.#emitter.removeAllListeners()\n }\n}\n","","import process from 'node:process'\nimport { AsyncEventEmitter } from '@internals/utils'\nimport { adapterOas } from '@kubb/adapter-oas'\nimport { type Config, createKubb, type KubbHooks } from '@kubb/core'\nimport { middlewareBarrel, middlewareBarrelName } from '@kubb/middleware-barrel'\nimport { parserTs, parserTsx } from '@kubb/parser-ts'\nimport type { UnpluginFactory } from 'unplugin'\nimport { version as unpluginVersion } from '../package.json'\nimport type { Options } from './types.ts'\n\ntype RollupContext = {\n info?: (message: string) => void\n warn?: (message: string) => void\n error?: (message: string) => void\n}\n\nexport const unpluginFactory: UnpluginFactory<Options | undefined> = (options, meta) => {\n const name = 'unplugin-kubb' as const\n const hooks = new AsyncEventEmitter<KubbHooks>()\n const isVite = meta.framework === 'vite'\n\n hooks.on('kubb:lifecycle:start', ({ version }) => {\n console.log(`Kubb Unplugin ${version} 🧩`)\n })\n\n hooks.on('kubb:error', ({ error }) => {\n console.error(`✗ ${error?.message || 'failed'}`)\n })\n\n hooks.on('kubb:warn', ({ message }) => {\n console.warn(`⚠ ${message}`)\n })\n\n hooks.on('kubb:info', ({ message }) => {\n console.info(`ℹ ${message}`)\n })\n\n hooks.on('kubb:success', ({ message }) => {\n console.log(`✓ ${message}`)\n })\n\n hooks.on('kubb:plugin:end', ({ plugin, duration }) => {\n const durationStr = duration >= 1000 ? `${(duration / 1000).toFixed(2)}s` : `${duration}ms`\n\n console.log(`✓ ${plugin.name} completed in ${durationStr}`)\n })\n\n hooks.on('kubb:files:processing:end', () => {\n const text = '✓ Files written successfully'\n\n console.log(text)\n })\n\n hooks.on('kubb:generation:end', ({ config }) => {\n console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')\n })\n\n hooks.on('kubb:generation:summary', ({ config, status, failedPlugins }) => {\n const pluginsCount = config.plugins.length\n const successCount = pluginsCount - failedPlugins.size\n\n console.log(\n status === 'success'\n ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total`\n : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`,\n )\n })\n\n async function runBuild(ctx: RollupContext) {\n if (!options?.config) {\n ;(ctx.error ?? console.error)(`[${name}] Config is not set`)\n return\n }\n\n const middleware = options.config.middleware?.length ? options.config.middleware : [middlewareBarrel()]\n const hasBarrelMiddleware = middleware.some((m) => m.name === middlewareBarrelName)\n const output = { ...options.config.output }\n if (hasBarrelMiddleware && output.barrel === undefined) {\n output.barrel = { type: 'named' }\n }\n if (output.format === undefined) {\n output.format = false\n }\n if (output.lint === undefined) {\n output.lint = false\n }\n\n const config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs, parserTsx],\n middleware,\n output,\n }\n const hrStart = process.hrtime()\n\n await hooks.emit('kubb:lifecycle:start', { version: unpluginVersion })\n\n const userConfig = config as Config\n\n const kubb = createKubb(userConfig, { hooks })\n await kubb.setup()\n\n const resolvedConfig = kubb.config ?? userConfig\n\n await hooks.emit('kubb:generation:start', { config: resolvedConfig })\n\n const { error, failedPlugins, pluginTimings, files, storage } = await kubb.safeBuild()\n\n const hasFailures = failedPlugins.size > 0 || error\n if (hasFailures) {\n // Collect all errors from failed plugins and general error\n const allErrors: Error[] = [\n error,\n ...Array.from(failedPlugins)\n .filter((it) => it.error)\n .map((it) => it.error),\n ].filter(Boolean)\n\n allErrors.forEach((err) => {\n hooks.emit('kubb:error', { error: err })\n })\n }\n\n await hooks.emit('kubb:generation:end', { config: resolvedConfig, storage })\n await hooks.emit('kubb:generation:summary', {\n config: resolvedConfig,\n failedPlugins,\n filesCreated: files.length,\n status: failedPlugins.size > 0 || error ? 'failed' : 'success',\n hrStart,\n pluginTimings,\n })\n\n await hooks.emit('kubb:lifecycle:end')\n\n if (hasFailures) {\n const message = error?.message ?? `Build Error with ${failedPlugins.size} failed plugins`\n if (ctx.error) {\n ctx.error(`[${name}] ${message}`)\n return\n }\n\n throw new Error(`[${name}] ${message}`, { cause: error })\n }\n }\n\n return {\n name,\n enforce: 'pre',\n apply: isVite ? 'build' : undefined,\n async buildStart() {\n await runBuild(this as unknown as RollupContext)\n },\n vite: {},\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
2
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
3
3
  exports.unpluginFactory = require_unpluginFactory.unpluginFactory;
@@ -1,2 +1,2 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  export { unpluginFactory };
package/dist/vite.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  //#region src/vite.ts
3
3
  var vite_default = (0, require("unplugin").createVitePlugin)(require_unpluginFactory.unpluginFactory);
4
4
  //#endregion
package/dist/vite.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createVitePlugin } from "unplugin";
3
3
  //#region src/vite.ts
4
4
  var vite_default = createVitePlugin(unpluginFactory);
package/dist/webpack.cjs CHANGED
@@ -1,4 +1,4 @@
1
- const require_unpluginFactory = require("./unpluginFactory-BgaJy4bp.cjs");
1
+ const require_unpluginFactory = require("./unpluginFactory-DC7xVoEm.cjs");
2
2
  //#region src/webpack.ts
3
3
  var webpack_default = (0, require("unplugin").createWebpackPlugin)(require_unpluginFactory.unpluginFactory);
4
4
  //#endregion
package/dist/webpack.js CHANGED
@@ -1,4 +1,4 @@
1
- import { t as unpluginFactory } from "./unpluginFactory-BjBUK-ea.js";
1
+ import { t as unpluginFactory } from "./unpluginFactory-CvgstE94.js";
2
2
  import { createWebpackPlugin } from "unplugin";
3
3
  //#region src/webpack.ts
4
4
  var webpack_default = createWebpackPlugin(unpluginFactory);
package/package.json CHANGED
@@ -1,20 +1,17 @@
1
1
  {
2
2
  "name": "unplugin-kubb",
3
- "version": "5.0.0-beta.2",
4
- "description": "Universal build plugin for Kubb, integrating OpenAPI code generation into Vite, Webpack, Rollup, esbuild, Rspack, Nuxt, and Astro build processes.",
3
+ "version": "5.0.0-beta.20",
4
+ "description": "Universal build integration for Kubb using unplugin. Plug OpenAPI code generation into Vite, Webpack, Rollup, esbuild, Rspack, Nuxt, and Astro as part of your regular build pipeline.",
5
5
  "keywords": [
6
6
  "astro",
7
- "build-tool",
8
- "bundler",
9
- "code-generator",
7
+ "codegen",
10
8
  "esbuild",
9
+ "farm",
11
10
  "kubb",
12
11
  "nuxt",
13
12
  "openapi",
14
13
  "rollup",
15
14
  "rspack",
16
- "swagger",
17
- "transform",
18
15
  "typescript",
19
16
  "unplugin",
20
17
  "vite",
@@ -104,19 +101,19 @@
104
101
  },
105
102
  "dependencies": {
106
103
  "unplugin": "^3.0.0",
107
- "@kubb/adapter-oas": "5.0.0-beta.2",
108
- "@kubb/core": "5.0.0-beta.2",
109
- "@kubb/middleware-barrel": "5.0.0-beta.2",
110
- "@kubb/parser-ts": "5.0.0-beta.2"
104
+ "@kubb/adapter-oas": "5.0.0-beta.20",
105
+ "@kubb/core": "5.0.0-beta.20",
106
+ "@kubb/middleware-barrel": "5.0.0-beta.20",
107
+ "@kubb/parser-ts": "5.0.0-beta.20"
111
108
  },
112
109
  "devDependencies": {
113
110
  "@farmfe/core": "^1.7.11",
114
- "@nuxt/kit": "^4.4.2",
115
- "@nuxt/schema": "^4.4.2",
111
+ "@nuxt/kit": "^4.4.5",
112
+ "@nuxt/schema": "^4.4.5",
116
113
  "esbuild": "^0.28.0",
117
114
  "rolldown": "1.0.0-rc.16",
118
- "rollup": "^4.60.2",
119
- "vite": "^8.0.10",
115
+ "rollup": "^4.60.4",
116
+ "vite": "^8.0.13",
120
117
  "webpack": "^5.106.2",
121
118
  "@internals/utils": "0.0.0"
122
119
  },
package/src/nuxt.ts CHANGED
@@ -16,7 +16,5 @@ export default defineNuxtModule<ModuleOptions>({
16
16
  setup(options, _nuxt) {
17
17
  addVitePlugin(() => vite(options))
18
18
  addWebpackPlugin(() => webpack(options))
19
-
20
- // ...
21
19
  },
22
20
  })
@@ -3,7 +3,7 @@ import { AsyncEventEmitter } from '@internals/utils'
3
3
  import { adapterOas } from '@kubb/adapter-oas'
4
4
  import { type Config, createKubb, type KubbHooks } from '@kubb/core'
5
5
  import { middlewareBarrel, middlewareBarrelName } from '@kubb/middleware-barrel'
6
- import { parserTs } from '@kubb/parser-ts'
6
+ import { parserTs, parserTsx } from '@kubb/parser-ts'
7
7
  import type { UnpluginFactory } from 'unplugin'
8
8
  import { version as unpluginVersion } from '../package.json'
9
9
  import type { Options } from './types.ts'
@@ -18,15 +18,57 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
18
18
  const name = 'unplugin-kubb' as const
19
19
  const hooks = new AsyncEventEmitter<KubbHooks>()
20
20
  const isVite = meta.framework === 'vite'
21
- const hrStart = process.hrtime()
21
+
22
+ hooks.on('kubb:lifecycle:start', ({ version }) => {
23
+ console.log(`Kubb Unplugin ${version} 🧩`)
24
+ })
25
+
26
+ hooks.on('kubb:error', ({ error }) => {
27
+ console.error(`✗ ${error?.message || 'failed'}`)
28
+ })
29
+
30
+ hooks.on('kubb:warn', ({ message }) => {
31
+ console.warn(`⚠ ${message}`)
32
+ })
33
+
34
+ hooks.on('kubb:info', ({ message }) => {
35
+ console.info(`ℹ ${message}`)
36
+ })
37
+
38
+ hooks.on('kubb:success', ({ message }) => {
39
+ console.log(`✓ ${message}`)
40
+ })
41
+
42
+ hooks.on('kubb:plugin:end', ({ plugin, duration }) => {
43
+ const durationStr = duration >= 1000 ? `${(duration / 1000).toFixed(2)}s` : `${duration}ms`
44
+
45
+ console.log(`✓ ${plugin.name} completed in ${durationStr}`)
46
+ })
47
+
48
+ hooks.on('kubb:files:processing:end', () => {
49
+ const text = '✓ Files written successfully'
50
+
51
+ console.log(text)
52
+ })
53
+
54
+ hooks.on('kubb:generation:end', ({ config }) => {
55
+ console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')
56
+ })
57
+
58
+ hooks.on('kubb:generation:summary', ({ config, status, failedPlugins }) => {
59
+ const pluginsCount = config.plugins.length
60
+ const successCount = pluginsCount - failedPlugins.size
61
+
62
+ console.log(
63
+ status === 'success'
64
+ ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total`
65
+ : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`,
66
+ )
67
+ })
22
68
 
23
69
  async function runBuild(ctx: RollupContext) {
24
70
  if (!options?.config) {
25
- if (ctx.error) {
26
- ctx.error?.(`[${name}] Config is not set`)
27
- } else {
28
- console.error(`[${name}] Config is not set`)
29
- }
71
+ ;(ctx.error ?? console.error)(`[${name}] Config is not set`)
30
72
  return
31
73
  }
32
74
 
@@ -46,75 +88,24 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
46
88
  const config = {
47
89
  ...options.config,
48
90
  adapter: options.config.adapter ?? adapterOas(),
49
- parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],
91
+ parsers: options.config.parsers?.length ? options.config.parsers : [parserTs, parserTsx],
50
92
  middleware,
51
93
  output,
52
94
  }
95
+ const hrStart = process.hrtime()
53
96
 
54
- hooks.on('kubb:lifecycle:start', ({ version }) => {
55
- console.log(`Kubb Unplugin ${version} 🧩`)
56
- })
57
-
58
- hooks.on('kubb:error', ({ error }) => {
59
- console.error(`✗ ${error?.message || 'failed'}`)
60
- })
61
-
62
- hooks.on('kubb:warn', ({ message }) => {
63
- console.warn(`⚠ ${message}`)
64
- })
65
-
66
- hooks.on('kubb:info', ({ message }) => {
67
- console.info(`ℹ ${message}`)
68
- })
69
-
70
- hooks.on('kubb:success', ({ message }) => {
71
- console.log(`✓ ${message}`)
72
- })
73
-
74
- hooks.on('kubb:plugin:end', ({ plugin, duration }) => {
75
- const durationStr = duration >= 1000 ? `${(duration / 1000).toFixed(2)}s` : `${duration}ms`
76
-
77
- console.log(`✓ ${plugin.name} completed in ${durationStr}`)
78
- })
79
-
80
- hooks.on('kubb:files:processing:end', () => {
81
- const text = '✓ Files written successfully'
82
-
83
- console.log(text)
84
- })
85
-
86
- hooks.on('kubb:generation:end', ({ config }) => {
87
- console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')
88
- })
89
-
90
- hooks.on('kubb:generation:summary', ({ config, status, failedPlugins }) => {
91
- const pluginsCount = config.plugins.length
92
- const successCount = pluginsCount - failedPlugins.size
97
+ await hooks.emit('kubb:lifecycle:start', { version: unpluginVersion })
93
98
 
94
- console.log(
95
- status === 'success'
96
- ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total`
97
- : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`,
98
- )
99
- })
99
+ const userConfig = config as Config
100
100
 
101
- await hooks.emit('kubb:lifecycle:start', { version: unpluginVersion })
101
+ const kubb = createKubb(userConfig, { hooks })
102
+ await kubb.setup()
102
103
 
103
- const { root: _root, ...userConfig } = config as Config
104
+ const resolvedConfig = kubb.config ?? userConfig
104
105
 
105
- await hooks.emit('kubb:generation:start', { config: config as Config })
106
+ await hooks.emit('kubb:generation:start', { config: resolvedConfig })
106
107
 
107
- const { error, failedPlugins, pluginTimings, files, sources } = await createKubb(
108
- {
109
- root: process.cwd(),
110
- ...userConfig,
111
- output: {
112
- write: true,
113
- ...userConfig.output,
114
- },
115
- },
116
- { hooks },
117
- ).safeBuild()
108
+ const { error, failedPlugins, pluginTimings, files, storage } = await kubb.safeBuild()
118
109
 
119
110
  const hasFailures = failedPlugins.size > 0 || error
120
111
  if (hasFailures) {
@@ -131,9 +122,9 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
131
122
  })
132
123
  }
133
124
 
134
- await hooks.emit('kubb:generation:end', { config: config as Config, files, sources })
125
+ await hooks.emit('kubb:generation:end', { config: resolvedConfig, storage })
135
126
  await hooks.emit('kubb:generation:summary', {
136
- config: config as Config,
127
+ config: resolvedConfig,
137
128
  failedPlugins,
138
129
  filesCreated: files.length,
139
130
  status: failedPlugins.size > 0 || error ? 'failed' : 'success',
@@ -142,6 +133,16 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
142
133
  })
143
134
 
144
135
  await hooks.emit('kubb:lifecycle:end')
136
+
137
+ if (hasFailures) {
138
+ const message = error?.message ?? `Build Error with ${failedPlugins.size} failed plugins`
139
+ if (ctx.error) {
140
+ ctx.error(`[${name}] ${message}`)
141
+ return
142
+ }
143
+
144
+ throw new Error(`[${name}] ${message}`, { cause: error })
145
+ }
145
146
  }
146
147
 
147
148
  return {
@@ -151,7 +152,6 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
151
152
  async buildStart() {
152
153
  await runBuild(this as unknown as RollupContext)
153
154
  },
154
-
155
155
  vite: {},
156
156
  }
157
157
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"unpluginFactory-BgaJy4bp.cjs","names":["#emitter","NodeEventEmitter","process","middlewareBarrelName","parserTs","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/**\n * Thrown when one or more errors occur during a Kubb build.\n * Carries the full list of underlying errors on `errors`.\n *\n * @example\n * ```ts\n * throw new BuildError('Build failed', { errors: [err1, err2] })\n * ```\n */\nexport class BuildError extends Error {\n errors: Array<Error>\n\n constructor(message: string, options: { cause?: Error; errors: Array<Error> }) {\n super(message, { cause: options.cause })\n this.name = 'BuildError'\n this.errors = options.errors\n }\n}\n\n/**\n * Coerces an unknown thrown value to an `Error` instance.\n * Returns the value as-is when it is already an `Error`; otherwise wraps it with `String(value)`.\n *\n * @example\n * ```ts\n * try { ... } catch(err) {\n * throw new BuildError('Build failed', { cause: toError(err), errors: [] })\n * }\n * ```\n */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\n/**\n * Extracts a human-readable message from any thrown value.\n *\n * @example\n * ```ts\n * getErrorMessage(new Error('oops')) // 'oops'\n * getErrorMessage('plain string') // 'plain string'\n * ```\n */\nexport function getErrorMessage(value: unknown): string {\n return value instanceof Error ? value.message : String(value)\n}\n\n/**\n * Extracts the `.cause` of an `Error` as an `Error`, or `undefined` when absent or not an `Error`.\n *\n * @example\n * ```ts\n * const cause = toCause(buildError) // Error | undefined\n * ```\n */\nexport function toCause(error: Error): Error | undefined {\n return error.cause instanceof Error ? error.cause : undefined\n}\n","import { EventEmitter as NodeEventEmitter } from 'node:events'\nimport { toError } from './errors.ts'\n\n/**\n * A function that can be registered as an event listener, synchronous or async.\n */\ntype AsyncListener<TArgs extends unknown[]> = (...args: TArgs) => void | Promise<void>\n\n/**\n * Typed `EventEmitter` that awaits all async listeners before resolving.\n * Wraps Node's `EventEmitter` with full TypeScript event-map inference.\n *\n * @example\n * ```ts\n * const emitter = new AsyncEventEmitter<{ build: [name: string] }>()\n * emitter.on('build', async (name) => { console.log(name) })\n * await emitter.emit('build', 'petstore') // all listeners awaited\n * ```\n */\nexport class AsyncEventEmitter<TEvents extends { [K in keyof TEvents]: unknown[] }> {\n /**\n * Maximum number of listeners per event before Node emits a memory-leak warning.\n * @default 10\n */\n constructor(maxListener = 10) {\n this.#emitter.setMaxListeners(maxListener)\n }\n\n #emitter = new NodeEventEmitter()\n\n /**\n * Emits `eventName` and awaits all registered listeners sequentially.\n * Throws if any listener rejects, wrapping the cause with the event name and serialized arguments.\n *\n * @example\n * ```ts\n * await emitter.emit('build', 'petstore')\n * ```\n */\n async emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArgs: TEvents[TEventName]): Promise<void> {\n const listeners = this.#emitter.listeners(eventName) as Array<AsyncListener<TEvents[TEventName]>>\n\n if (listeners.length === 0) {\n return\n }\n\n for (const listener of listeners) {\n try {\n await listener(...eventArgs)\n } catch (err) {\n let serializedArgs: string\n try {\n serializedArgs = JSON.stringify(eventArgs)\n } catch {\n serializedArgs = String(eventArgs)\n }\n throw new Error(`Error in async listener for \"${eventName}\" with eventArgs ${serializedArgs}`, { cause: toError(err) })\n }\n }\n }\n\n /**\n * Registers a persistent listener for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', async (name) => { console.log(name) })\n * ```\n */\n on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.on(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Registers a one-shot listener that removes itself after the first invocation.\n *\n * @example\n * ```ts\n * emitter.onOnce('build', async (name) => { console.log(name) })\n * ```\n */\n onOnce<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n const wrapper: AsyncListener<TEvents[TEventName]> = (...args) => {\n this.off(eventName, wrapper)\n return handler(...args)\n }\n this.on(eventName, wrapper)\n }\n\n /**\n * Removes a previously registered listener.\n *\n * @example\n * ```ts\n * emitter.off('build', handler)\n * ```\n */\n off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.off(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Returns the number of listeners registered for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', handler)\n * emitter.listenerCount('build') // 1\n * ```\n */\n listenerCount<TEventName extends keyof TEvents & string>(eventName: TEventName): number {\n return this.#emitter.listenerCount(eventName)\n }\n\n /**\n * Removes all listeners from every event channel.\n *\n * @example\n * ```ts\n * emitter.removeAll()\n * ```\n */\n removeAll(): void {\n this.#emitter.removeAllListeners()\n }\n}\n","","import process from 'node:process'\nimport { AsyncEventEmitter } from '@internals/utils'\nimport { adapterOas } from '@kubb/adapter-oas'\nimport { type Config, createKubb, type KubbHooks } from '@kubb/core'\nimport { middlewareBarrel, middlewareBarrelName } from '@kubb/middleware-barrel'\nimport { parserTs } from '@kubb/parser-ts'\nimport type { UnpluginFactory } from 'unplugin'\nimport { version as unpluginVersion } from '../package.json'\nimport type { Options } from './types.ts'\n\ntype RollupContext = {\n info?: (message: string) => void\n warn?: (message: string) => void\n error?: (message: string) => void\n}\n\nexport const unpluginFactory: UnpluginFactory<Options | undefined> = (options, meta) => {\n const name = 'unplugin-kubb' as const\n const hooks = new AsyncEventEmitter<KubbHooks>()\n const isVite = meta.framework === 'vite'\n const hrStart = process.hrtime()\n\n async function runBuild(ctx: RollupContext) {\n if (!options?.config) {\n if (ctx.error) {\n ctx.error?.(`[${name}] Config is not set`)\n } else {\n console.error(`[${name}] Config is not set`)\n }\n return\n }\n\n const middleware = options.config.middleware?.length ? options.config.middleware : [middlewareBarrel()]\n const hasBarrelMiddleware = middleware.some((m) => m.name === middlewareBarrelName)\n const output = { ...options.config.output }\n if (hasBarrelMiddleware && output.barrel === undefined) {\n output.barrel = { type: 'named' }\n }\n if (output.format === undefined) {\n output.format = false\n }\n if (output.lint === undefined) {\n output.lint = false\n }\n\n const config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],\n middleware,\n output,\n }\n\n hooks.on('kubb:lifecycle:start', ({ version }) => {\n console.log(`Kubb Unplugin ${version} 🧩`)\n })\n\n hooks.on('kubb:error', ({ error }) => {\n console.error(`✗ ${error?.message || 'failed'}`)\n })\n\n hooks.on('kubb:warn', ({ message }) => {\n console.warn(`⚠ ${message}`)\n })\n\n hooks.on('kubb:info', ({ message }) => {\n console.info(`ℹ ${message}`)\n })\n\n hooks.on('kubb:success', ({ message }) => {\n console.log(`✓ ${message}`)\n })\n\n hooks.on('kubb:plugin:end', ({ plugin, duration }) => {\n const durationStr = duration >= 1000 ? `${(duration / 1000).toFixed(2)}s` : `${duration}ms`\n\n console.log(`✓ ${plugin.name} completed in ${durationStr}`)\n })\n\n hooks.on('kubb:files:processing:end', () => {\n const text = '✓ Files written successfully'\n\n console.log(text)\n })\n\n hooks.on('kubb:generation:end', ({ config }) => {\n console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')\n })\n\n hooks.on('kubb:generation:summary', ({ config, status, failedPlugins }) => {\n const pluginsCount = config.plugins.length\n const successCount = pluginsCount - failedPlugins.size\n\n console.log(\n status === 'success'\n ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total`\n : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`,\n )\n })\n\n await hooks.emit('kubb:lifecycle:start', { version: unpluginVersion })\n\n const { root: _root, ...userConfig } = config as Config\n\n await hooks.emit('kubb:generation:start', { config: config as Config })\n\n const { error, failedPlugins, pluginTimings, files, sources } = await createKubb(\n {\n root: process.cwd(),\n ...userConfig,\n output: {\n write: true,\n ...userConfig.output,\n },\n },\n { hooks },\n ).safeBuild()\n\n const hasFailures = failedPlugins.size > 0 || error\n if (hasFailures) {\n // Collect all errors from failed plugins and general error\n const allErrors: Error[] = [\n error,\n ...Array.from(failedPlugins)\n .filter((it) => it.error)\n .map((it) => it.error),\n ].filter(Boolean)\n\n allErrors.forEach((err) => {\n hooks.emit('kubb:error', { error: err })\n })\n }\n\n await hooks.emit('kubb:generation:end', { config: config as Config, files, sources })\n await hooks.emit('kubb:generation:summary', {\n config: config as Config,\n failedPlugins,\n filesCreated: files.length,\n status: failedPlugins.size > 0 || error ? 'failed' : 'success',\n hrStart,\n pluginTimings,\n })\n\n await hooks.emit('kubb:lifecycle:end')\n }\n\n return {\n name,\n enforce: 'pre',\n apply: isVite ? 'build' : undefined,\n async buildStart() {\n await runBuild(this as unknown as RollupContext)\n },\n\n vite: {},\n }\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"unpluginFactory-BjBUK-ea.js","names":["#emitter","NodeEventEmitter","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/**\n * Thrown when one or more errors occur during a Kubb build.\n * Carries the full list of underlying errors on `errors`.\n *\n * @example\n * ```ts\n * throw new BuildError('Build failed', { errors: [err1, err2] })\n * ```\n */\nexport class BuildError extends Error {\n errors: Array<Error>\n\n constructor(message: string, options: { cause?: Error; errors: Array<Error> }) {\n super(message, { cause: options.cause })\n this.name = 'BuildError'\n this.errors = options.errors\n }\n}\n\n/**\n * Coerces an unknown thrown value to an `Error` instance.\n * Returns the value as-is when it is already an `Error`; otherwise wraps it with `String(value)`.\n *\n * @example\n * ```ts\n * try { ... } catch(err) {\n * throw new BuildError('Build failed', { cause: toError(err), errors: [] })\n * }\n * ```\n */\nexport function toError(value: unknown): Error {\n return value instanceof Error ? value : new Error(String(value))\n}\n\n/**\n * Extracts a human-readable message from any thrown value.\n *\n * @example\n * ```ts\n * getErrorMessage(new Error('oops')) // 'oops'\n * getErrorMessage('plain string') // 'plain string'\n * ```\n */\nexport function getErrorMessage(value: unknown): string {\n return value instanceof Error ? value.message : String(value)\n}\n\n/**\n * Extracts the `.cause` of an `Error` as an `Error`, or `undefined` when absent or not an `Error`.\n *\n * @example\n * ```ts\n * const cause = toCause(buildError) // Error | undefined\n * ```\n */\nexport function toCause(error: Error): Error | undefined {\n return error.cause instanceof Error ? error.cause : undefined\n}\n","import { EventEmitter as NodeEventEmitter } from 'node:events'\nimport { toError } from './errors.ts'\n\n/**\n * A function that can be registered as an event listener, synchronous or async.\n */\ntype AsyncListener<TArgs extends unknown[]> = (...args: TArgs) => void | Promise<void>\n\n/**\n * Typed `EventEmitter` that awaits all async listeners before resolving.\n * Wraps Node's `EventEmitter` with full TypeScript event-map inference.\n *\n * @example\n * ```ts\n * const emitter = new AsyncEventEmitter<{ build: [name: string] }>()\n * emitter.on('build', async (name) => { console.log(name) })\n * await emitter.emit('build', 'petstore') // all listeners awaited\n * ```\n */\nexport class AsyncEventEmitter<TEvents extends { [K in keyof TEvents]: unknown[] }> {\n /**\n * Maximum number of listeners per event before Node emits a memory-leak warning.\n * @default 10\n */\n constructor(maxListener = 10) {\n this.#emitter.setMaxListeners(maxListener)\n }\n\n #emitter = new NodeEventEmitter()\n\n /**\n * Emits `eventName` and awaits all registered listeners sequentially.\n * Throws if any listener rejects, wrapping the cause with the event name and serialized arguments.\n *\n * @example\n * ```ts\n * await emitter.emit('build', 'petstore')\n * ```\n */\n async emit<TEventName extends keyof TEvents & string>(eventName: TEventName, ...eventArgs: TEvents[TEventName]): Promise<void> {\n const listeners = this.#emitter.listeners(eventName) as Array<AsyncListener<TEvents[TEventName]>>\n\n if (listeners.length === 0) {\n return\n }\n\n for (const listener of listeners) {\n try {\n await listener(...eventArgs)\n } catch (err) {\n let serializedArgs: string\n try {\n serializedArgs = JSON.stringify(eventArgs)\n } catch {\n serializedArgs = String(eventArgs)\n }\n throw new Error(`Error in async listener for \"${eventName}\" with eventArgs ${serializedArgs}`, { cause: toError(err) })\n }\n }\n }\n\n /**\n * Registers a persistent listener for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', async (name) => { console.log(name) })\n * ```\n */\n on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.on(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Registers a one-shot listener that removes itself after the first invocation.\n *\n * @example\n * ```ts\n * emitter.onOnce('build', async (name) => { console.log(name) })\n * ```\n */\n onOnce<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n const wrapper: AsyncListener<TEvents[TEventName]> = (...args) => {\n this.off(eventName, wrapper)\n return handler(...args)\n }\n this.on(eventName, wrapper)\n }\n\n /**\n * Removes a previously registered listener.\n *\n * @example\n * ```ts\n * emitter.off('build', handler)\n * ```\n */\n off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: AsyncListener<TEvents[TEventName]>): void {\n this.#emitter.off(eventName, handler as AsyncListener<unknown[]>)\n }\n\n /**\n * Returns the number of listeners registered for `eventName`.\n *\n * @example\n * ```ts\n * emitter.on('build', handler)\n * emitter.listenerCount('build') // 1\n * ```\n */\n listenerCount<TEventName extends keyof TEvents & string>(eventName: TEventName): number {\n return this.#emitter.listenerCount(eventName)\n }\n\n /**\n * Removes all listeners from every event channel.\n *\n * @example\n * ```ts\n * emitter.removeAll()\n * ```\n */\n removeAll(): void {\n this.#emitter.removeAllListeners()\n }\n}\n","","import process from 'node:process'\nimport { AsyncEventEmitter } from '@internals/utils'\nimport { adapterOas } from '@kubb/adapter-oas'\nimport { type Config, createKubb, type KubbHooks } from '@kubb/core'\nimport { middlewareBarrel, middlewareBarrelName } from '@kubb/middleware-barrel'\nimport { parserTs } from '@kubb/parser-ts'\nimport type { UnpluginFactory } from 'unplugin'\nimport { version as unpluginVersion } from '../package.json'\nimport type { Options } from './types.ts'\n\ntype RollupContext = {\n info?: (message: string) => void\n warn?: (message: string) => void\n error?: (message: string) => void\n}\n\nexport const unpluginFactory: UnpluginFactory<Options | undefined> = (options, meta) => {\n const name = 'unplugin-kubb' as const\n const hooks = new AsyncEventEmitter<KubbHooks>()\n const isVite = meta.framework === 'vite'\n const hrStart = process.hrtime()\n\n async function runBuild(ctx: RollupContext) {\n if (!options?.config) {\n if (ctx.error) {\n ctx.error?.(`[${name}] Config is not set`)\n } else {\n console.error(`[${name}] Config is not set`)\n }\n return\n }\n\n const middleware = options.config.middleware?.length ? options.config.middleware : [middlewareBarrel()]\n const hasBarrelMiddleware = middleware.some((m) => m.name === middlewareBarrelName)\n const output = { ...options.config.output }\n if (hasBarrelMiddleware && output.barrel === undefined) {\n output.barrel = { type: 'named' }\n }\n if (output.format === undefined) {\n output.format = false\n }\n if (output.lint === undefined) {\n output.lint = false\n }\n\n const config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],\n middleware,\n output,\n }\n\n hooks.on('kubb:lifecycle:start', ({ version }) => {\n console.log(`Kubb Unplugin ${version} 🧩`)\n })\n\n hooks.on('kubb:error', ({ error }) => {\n console.error(`✗ ${error?.message || 'failed'}`)\n })\n\n hooks.on('kubb:warn', ({ message }) => {\n console.warn(`⚠ ${message}`)\n })\n\n hooks.on('kubb:info', ({ message }) => {\n console.info(`ℹ ${message}`)\n })\n\n hooks.on('kubb:success', ({ message }) => {\n console.log(`✓ ${message}`)\n })\n\n hooks.on('kubb:plugin:end', ({ plugin, duration }) => {\n const durationStr = duration >= 1000 ? `${(duration / 1000).toFixed(2)}s` : `${duration}ms`\n\n console.log(`✓ ${plugin.name} completed in ${durationStr}`)\n })\n\n hooks.on('kubb:files:processing:end', () => {\n const text = '✓ Files written successfully'\n\n console.log(text)\n })\n\n hooks.on('kubb:generation:end', ({ config }) => {\n console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')\n })\n\n hooks.on('kubb:generation:summary', ({ config, status, failedPlugins }) => {\n const pluginsCount = config.plugins.length\n const successCount = pluginsCount - failedPlugins.size\n\n console.log(\n status === 'success'\n ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total`\n : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`,\n )\n })\n\n await hooks.emit('kubb:lifecycle:start', { version: unpluginVersion })\n\n const { root: _root, ...userConfig } = config as Config\n\n await hooks.emit('kubb:generation:start', { config: config as Config })\n\n const { error, failedPlugins, pluginTimings, files, sources } = await createKubb(\n {\n root: process.cwd(),\n ...userConfig,\n output: {\n write: true,\n ...userConfig.output,\n },\n },\n { hooks },\n ).safeBuild()\n\n const hasFailures = failedPlugins.size > 0 || error\n if (hasFailures) {\n // Collect all errors from failed plugins and general error\n const allErrors: Error[] = [\n error,\n ...Array.from(failedPlugins)\n .filter((it) => it.error)\n .map((it) => it.error),\n ].filter(Boolean)\n\n allErrors.forEach((err) => {\n hooks.emit('kubb:error', { error: err })\n })\n }\n\n await hooks.emit('kubb:generation:end', { config: config as Config, files, sources })\n await hooks.emit('kubb:generation:summary', {\n config: config as Config,\n failedPlugins,\n filesCreated: files.length,\n status: failedPlugins.size > 0 || error ? 'failed' : 'success',\n hrStart,\n pluginTimings,\n })\n\n await hooks.emit('kubb:lifecycle:end')\n }\n\n return {\n name,\n enforce: 'pre',\n apply: isVite ? 'build' : undefined,\n async buildStart() {\n await runBuild(this as unknown as RollupContext)\n },\n\n vite: {},\n }\n}\n"],"mappings":"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"}