unplugin-kubb 6.0.0-alpha.34 → 6.0.0-alpha.35
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/dist/astro.cjs +1 -1
- package/dist/esbuild.cjs +1 -1
- package/dist/esbuild.js +1 -1
- package/dist/farm.cjs +1 -1
- package/dist/farm.js +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.js +1 -1
- package/dist/nuxt.cjs +1 -1
- package/dist/rolldown.cjs +1 -1
- package/dist/rolldown.js +1 -1
- package/dist/rollup.cjs +1 -1
- package/dist/rollup.js +1 -1
- package/dist/rspack.cjs +1 -1
- package/dist/rspack.js +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/{unpluginFactory-CQel1bdX.cjs → unpluginFactory-DNTiGHkS.cjs} +34 -22
- package/dist/unpluginFactory-DNTiGHkS.cjs.map +1 -0
- package/dist/{unpluginFactory-D6pw_FXK.js → unpluginFactory-DOwvduC5.js} +34 -22
- package/dist/unpluginFactory-DOwvduC5.js.map +1 -0
- package/dist/unpluginFactory.cjs +1 -1
- package/dist/unpluginFactory.js +1 -1
- package/dist/vite.cjs +1 -1
- package/dist/vite.js +1 -1
- package/dist/webpack.cjs +1 -1
- package/dist/webpack.js +1 -1
- package/package.json +6 -6
- package/src/types.ts +2 -2
- package/src/unpluginFactory.ts +20 -20
- package/dist/unpluginFactory-CQel1bdX.cjs.map +0 -1
- package/dist/unpluginFactory-D6pw_FXK.js.map +0 -1
package/dist/astro.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_unpluginFactory = require("./unpluginFactory-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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) => ({
|
package/dist/esbuild.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_unpluginFactory = require("./unpluginFactory-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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-
|
|
1
|
+
import { t as unpluginFactory } from "./unpluginFactory-DOwvduC5.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-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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
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-
|
|
5
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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-
|
|
1
|
+
import { t as unpluginFactory } from "./unpluginFactory-DOwvduC5.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
package/dist/rolldown.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_unpluginFactory = require("./unpluginFactory-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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-
|
|
1
|
+
import { t as unpluginFactory } from "./unpluginFactory-DOwvduC5.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-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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-
|
|
1
|
+
import { t as unpluginFactory } from "./unpluginFactory-DOwvduC5.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-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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-
|
|
1
|
+
import { t as unpluginFactory } from "./unpluginFactory-DOwvduC5.js";
|
|
2
2
|
import { createRspackPlugin } from "unplugin";
|
|
3
3
|
//#region src/rspack.ts
|
|
4
4
|
var rspack_default = createRspackPlugin(unpluginFactory);
|
package/dist/types.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { t as __name } from "./chunk--u3MIqq1.js";
|
|
2
|
-
import {
|
|
2
|
+
import { Config } from "@kubb/core";
|
|
3
3
|
|
|
4
4
|
//#region src/types.d.ts
|
|
5
5
|
type Options = {
|
|
6
6
|
/**
|
|
7
7
|
* Kubb config without the Hooks.
|
|
8
8
|
*/
|
|
9
|
-
config?: Omit<
|
|
9
|
+
config?: Omit<Config, 'hooks'>;
|
|
10
10
|
};
|
|
11
11
|
//#endregion
|
|
12
12
|
export { Options };
|
|
@@ -25,7 +25,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
25
25
|
}) : target, mod));
|
|
26
26
|
//#endregion
|
|
27
27
|
let node_process = require("node:process");
|
|
28
|
-
node_process = __toESM(node_process);
|
|
28
|
+
node_process = __toESM(node_process, 1);
|
|
29
29
|
let node_events = require("node:events");
|
|
30
30
|
let _kubb_adapter_oas = require("@kubb/adapter-oas");
|
|
31
31
|
let _kubb_core = require("@kubb/core");
|
|
@@ -129,6 +129,18 @@ var AsyncEventEmitter = class {
|
|
|
129
129
|
this.#emitter.off(eventName, handler);
|
|
130
130
|
}
|
|
131
131
|
/**
|
|
132
|
+
* Returns the number of listeners registered for `eventName`.
|
|
133
|
+
*
|
|
134
|
+
* @example
|
|
135
|
+
* ```ts
|
|
136
|
+
* emitter.on('build', handler)
|
|
137
|
+
* emitter.listenerCount('build') // 1
|
|
138
|
+
* ```
|
|
139
|
+
*/
|
|
140
|
+
listenerCount(eventName) {
|
|
141
|
+
return this.#emitter.listenerCount(eventName);
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
132
144
|
* Removes all listeners from every event channel.
|
|
133
145
|
*
|
|
134
146
|
* @example
|
|
@@ -142,12 +154,12 @@ var AsyncEventEmitter = class {
|
|
|
142
154
|
};
|
|
143
155
|
//#endregion
|
|
144
156
|
//#region package.json
|
|
145
|
-
var version = "6.0.0-alpha.
|
|
157
|
+
var version = "6.0.0-alpha.35";
|
|
146
158
|
//#endregion
|
|
147
159
|
//#region src/unpluginFactory.ts
|
|
148
160
|
const unpluginFactory = (options, meta) => {
|
|
149
161
|
const name = "unplugin-kubb";
|
|
150
|
-
const
|
|
162
|
+
const hooks = new AsyncEventEmitter();
|
|
151
163
|
const isVite = meta.framework === "vite";
|
|
152
164
|
const hrStart = node_process.default.hrtime();
|
|
153
165
|
async function runBuild(ctx) {
|
|
@@ -161,40 +173,40 @@ const unpluginFactory = (options, meta) => {
|
|
|
161
173
|
adapter: options.config.adapter ?? (0, _kubb_adapter_oas.adapterOas)(),
|
|
162
174
|
parsers: options.config.parsers?.length ? options.config.parsers : [_kubb_parser_ts.parserTs]
|
|
163
175
|
};
|
|
164
|
-
|
|
176
|
+
hooks.on("kubb:lifecycle:start", (version) => {
|
|
165
177
|
console.log(`Kubb Unplugin ${version} 🧩`);
|
|
166
178
|
});
|
|
167
|
-
|
|
179
|
+
hooks.on("kubb:error", (error) => {
|
|
168
180
|
console.error(`✗ ${error?.message || "failed"}`);
|
|
169
181
|
});
|
|
170
|
-
|
|
182
|
+
hooks.on("kubb:warn", (message) => {
|
|
171
183
|
console.warn(`⚠ ${message}`);
|
|
172
184
|
});
|
|
173
|
-
|
|
185
|
+
hooks.on("kubb:info", (message) => {
|
|
174
186
|
console.info(`ℹ ${message}`);
|
|
175
187
|
});
|
|
176
|
-
|
|
188
|
+
hooks.on("kubb:success", (message) => {
|
|
177
189
|
console.log(`✓ ${message}`);
|
|
178
190
|
});
|
|
179
|
-
|
|
191
|
+
hooks.on("kubb:plugin:end", (plugin, { duration }) => {
|
|
180
192
|
const durationStr = duration >= 1e3 ? `${(duration / 1e3).toFixed(2)}s` : `${duration}ms`;
|
|
181
193
|
console.log(`✓ ${plugin.name} completed in ${durationStr}`);
|
|
182
194
|
});
|
|
183
|
-
|
|
195
|
+
hooks.on("kubb:files:processing:end", () => {
|
|
184
196
|
console.log("✓ Files written successfully");
|
|
185
197
|
});
|
|
186
|
-
|
|
198
|
+
hooks.on("kubb:generation:end", (config) => {
|
|
187
199
|
console.log(config.name ? `✓ Generation completed for ${config.name}` : "✓ Generation completed");
|
|
188
200
|
});
|
|
189
|
-
|
|
201
|
+
hooks.on("kubb:generation:summary", (config, { status, failedPlugins }) => {
|
|
190
202
|
const pluginsCount = config.plugins.length;
|
|
191
203
|
const successCount = pluginsCount - failedPlugins.size;
|
|
192
204
|
console.log(status === "success" ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total` : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`);
|
|
193
205
|
});
|
|
194
|
-
await
|
|
206
|
+
await hooks.emit("kubb:lifecycle:start", version);
|
|
195
207
|
const { root: _root, ...userConfig } = config;
|
|
196
|
-
await
|
|
197
|
-
const { error, failedPlugins, pluginTimings, files, sources } = await (0, _kubb_core.
|
|
208
|
+
await hooks.emit("kubb:generation:start", config);
|
|
209
|
+
const { error, failedPlugins, pluginTimings, files, sources } = await (0, _kubb_core.createKubb)({
|
|
198
210
|
config: {
|
|
199
211
|
root: node_process.default.cwd(),
|
|
200
212
|
...userConfig,
|
|
@@ -203,20 +215,20 @@ const unpluginFactory = (options, meta) => {
|
|
|
203
215
|
...userConfig.output
|
|
204
216
|
}
|
|
205
217
|
},
|
|
206
|
-
|
|
207
|
-
});
|
|
218
|
+
hooks
|
|
219
|
+
}).safeBuild();
|
|
208
220
|
if (failedPlugins.size > 0 || error) [error, ...Array.from(failedPlugins).filter((it) => it.error).map((it) => it.error)].filter(Boolean).forEach((err) => {
|
|
209
|
-
|
|
221
|
+
hooks.emit("kubb:error", err);
|
|
210
222
|
});
|
|
211
|
-
await
|
|
212
|
-
await
|
|
223
|
+
await hooks.emit("kubb:generation:end", config, files, sources);
|
|
224
|
+
await hooks.emit("kubb:generation:summary", config, {
|
|
213
225
|
failedPlugins,
|
|
214
226
|
filesCreated: files.length,
|
|
215
227
|
status: failedPlugins.size > 0 || error ? "failed" : "success",
|
|
216
228
|
hrStart,
|
|
217
229
|
pluginTimings
|
|
218
230
|
});
|
|
219
|
-
await
|
|
231
|
+
await hooks.emit("kubb:lifecycle:end");
|
|
220
232
|
}
|
|
221
233
|
return {
|
|
222
234
|
name,
|
|
@@ -248,4 +260,4 @@ Object.defineProperty(exports, "unpluginFactory", {
|
|
|
248
260
|
}
|
|
249
261
|
});
|
|
250
262
|
|
|
251
|
-
//# sourceMappingURL=unpluginFactory-
|
|
263
|
+
//# sourceMappingURL=unpluginFactory-DNTiGHkS.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpluginFactory-DNTiGHkS.cjs","names":["#emitter","NodeEventEmitter","process","parserTs","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/** Thrown when a plugin's configuration or input fails validation.\n *\n * @example\n * ```ts\n * throw new ValidationPluginError('Invalid config: \"output.path\" is required')\n * ```\n */\nexport class ValidationPluginError extends Error {}\n\n/**\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 { 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 config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],\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', unpluginVersion)\n\n const { root: _root, ...userConfig } = config as Config\n\n await hooks.emit('kubb:generation:start', config as Config)\n\n const { error, failedPlugins, pluginTimings, files, sources } = await createKubb({\n config: {\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', err)\n })\n }\n\n await hooks.emit('kubb:generation:end', config as Config, files, sources)\n await hooks.emit('kubb:generation:summary', 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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"}
|
|
@@ -2,7 +2,7 @@ import "./chunk--u3MIqq1.js";
|
|
|
2
2
|
import process from "node:process";
|
|
3
3
|
import { EventEmitter } from "node:events";
|
|
4
4
|
import { adapterOas } from "@kubb/adapter-oas";
|
|
5
|
-
import {
|
|
5
|
+
import { createKubb } from "@kubb/core";
|
|
6
6
|
import { parserTs } from "@kubb/parser-ts";
|
|
7
7
|
//#region ../../internals/utils/src/errors.ts
|
|
8
8
|
/**
|
|
@@ -103,6 +103,18 @@ var AsyncEventEmitter = class {
|
|
|
103
103
|
this.#emitter.off(eventName, handler);
|
|
104
104
|
}
|
|
105
105
|
/**
|
|
106
|
+
* Returns the number of listeners registered for `eventName`.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```ts
|
|
110
|
+
* emitter.on('build', handler)
|
|
111
|
+
* emitter.listenerCount('build') // 1
|
|
112
|
+
* ```
|
|
113
|
+
*/
|
|
114
|
+
listenerCount(eventName) {
|
|
115
|
+
return this.#emitter.listenerCount(eventName);
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
106
118
|
* Removes all listeners from every event channel.
|
|
107
119
|
*
|
|
108
120
|
* @example
|
|
@@ -116,12 +128,12 @@ var AsyncEventEmitter = class {
|
|
|
116
128
|
};
|
|
117
129
|
//#endregion
|
|
118
130
|
//#region package.json
|
|
119
|
-
var version = "6.0.0-alpha.
|
|
131
|
+
var version = "6.0.0-alpha.35";
|
|
120
132
|
//#endregion
|
|
121
133
|
//#region src/unpluginFactory.ts
|
|
122
134
|
const unpluginFactory = (options, meta) => {
|
|
123
135
|
const name = "unplugin-kubb";
|
|
124
|
-
const
|
|
136
|
+
const hooks = new AsyncEventEmitter();
|
|
125
137
|
const isVite = meta.framework === "vite";
|
|
126
138
|
const hrStart = process.hrtime();
|
|
127
139
|
async function runBuild(ctx) {
|
|
@@ -135,40 +147,40 @@ const unpluginFactory = (options, meta) => {
|
|
|
135
147
|
adapter: options.config.adapter ?? adapterOas(),
|
|
136
148
|
parsers: options.config.parsers?.length ? options.config.parsers : [parserTs]
|
|
137
149
|
};
|
|
138
|
-
|
|
150
|
+
hooks.on("kubb:lifecycle:start", (version) => {
|
|
139
151
|
console.log(`Kubb Unplugin ${version} 🧩`);
|
|
140
152
|
});
|
|
141
|
-
|
|
153
|
+
hooks.on("kubb:error", (error) => {
|
|
142
154
|
console.error(`✗ ${error?.message || "failed"}`);
|
|
143
155
|
});
|
|
144
|
-
|
|
156
|
+
hooks.on("kubb:warn", (message) => {
|
|
145
157
|
console.warn(`⚠ ${message}`);
|
|
146
158
|
});
|
|
147
|
-
|
|
159
|
+
hooks.on("kubb:info", (message) => {
|
|
148
160
|
console.info(`ℹ ${message}`);
|
|
149
161
|
});
|
|
150
|
-
|
|
162
|
+
hooks.on("kubb:success", (message) => {
|
|
151
163
|
console.log(`✓ ${message}`);
|
|
152
164
|
});
|
|
153
|
-
|
|
165
|
+
hooks.on("kubb:plugin:end", (plugin, { duration }) => {
|
|
154
166
|
const durationStr = duration >= 1e3 ? `${(duration / 1e3).toFixed(2)}s` : `${duration}ms`;
|
|
155
167
|
console.log(`✓ ${plugin.name} completed in ${durationStr}`);
|
|
156
168
|
});
|
|
157
|
-
|
|
169
|
+
hooks.on("kubb:files:processing:end", () => {
|
|
158
170
|
console.log("✓ Files written successfully");
|
|
159
171
|
});
|
|
160
|
-
|
|
172
|
+
hooks.on("kubb:generation:end", (config) => {
|
|
161
173
|
console.log(config.name ? `✓ Generation completed for ${config.name}` : "✓ Generation completed");
|
|
162
174
|
});
|
|
163
|
-
|
|
175
|
+
hooks.on("kubb:generation:summary", (config, { status, failedPlugins }) => {
|
|
164
176
|
const pluginsCount = config.plugins.length;
|
|
165
177
|
const successCount = pluginsCount - failedPlugins.size;
|
|
166
178
|
console.log(status === "success" ? `Kubb Summary: ✓ ${`${successCount} successful`}, ${pluginsCount} total` : `Kubb Summary: ✓ ${`${successCount} successful`}, ✗ ${`${failedPlugins.size} failed`}, ${pluginsCount} total`);
|
|
167
179
|
});
|
|
168
|
-
await
|
|
180
|
+
await hooks.emit("kubb:lifecycle:start", version);
|
|
169
181
|
const { root: _root, ...userConfig } = config;
|
|
170
|
-
await
|
|
171
|
-
const { error, failedPlugins, pluginTimings, files, sources } = await
|
|
182
|
+
await hooks.emit("kubb:generation:start", config);
|
|
183
|
+
const { error, failedPlugins, pluginTimings, files, sources } = await createKubb({
|
|
172
184
|
config: {
|
|
173
185
|
root: process.cwd(),
|
|
174
186
|
...userConfig,
|
|
@@ -177,20 +189,20 @@ const unpluginFactory = (options, meta) => {
|
|
|
177
189
|
...userConfig.output
|
|
178
190
|
}
|
|
179
191
|
},
|
|
180
|
-
|
|
181
|
-
});
|
|
192
|
+
hooks
|
|
193
|
+
}).safeBuild();
|
|
182
194
|
if (failedPlugins.size > 0 || error) [error, ...Array.from(failedPlugins).filter((it) => it.error).map((it) => it.error)].filter(Boolean).forEach((err) => {
|
|
183
|
-
|
|
195
|
+
hooks.emit("kubb:error", err);
|
|
184
196
|
});
|
|
185
|
-
await
|
|
186
|
-
await
|
|
197
|
+
await hooks.emit("kubb:generation:end", config, files, sources);
|
|
198
|
+
await hooks.emit("kubb:generation:summary", config, {
|
|
187
199
|
failedPlugins,
|
|
188
200
|
filesCreated: files.length,
|
|
189
201
|
status: failedPlugins.size > 0 || error ? "failed" : "success",
|
|
190
202
|
hrStart,
|
|
191
203
|
pluginTimings
|
|
192
204
|
});
|
|
193
|
-
await
|
|
205
|
+
await hooks.emit("kubb:lifecycle:end");
|
|
194
206
|
}
|
|
195
207
|
return {
|
|
196
208
|
name,
|
|
@@ -205,4 +217,4 @@ const unpluginFactory = (options, meta) => {
|
|
|
205
217
|
//#endregion
|
|
206
218
|
export { unpluginFactory as t };
|
|
207
219
|
|
|
208
|
-
//# sourceMappingURL=unpluginFactory-
|
|
220
|
+
//# sourceMappingURL=unpluginFactory-DOwvduC5.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unpluginFactory-DOwvduC5.js","names":["#emitter","NodeEventEmitter","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/** Thrown when a plugin's configuration or input fails validation.\n *\n * @example\n * ```ts\n * throw new ValidationPluginError('Invalid config: \"output.path\" is required')\n * ```\n */\nexport class ValidationPluginError extends Error {}\n\n/**\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 { 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 config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],\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', unpluginVersion)\n\n const { root: _root, ...userConfig } = config as Config\n\n await hooks.emit('kubb:generation:start', config as Config)\n\n const { error, failedPlugins, pluginTimings, files, sources } = await createKubb({\n config: {\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', err)\n })\n }\n\n await hooks.emit('kubb:generation:end', config as Config, files, sources)\n await hooks.emit('kubb:generation:summary', 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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"}
|
package/dist/unpluginFactory.cjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
-
const require_unpluginFactory = require("./unpluginFactory-
|
|
2
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.cjs");
|
|
3
3
|
exports.unpluginFactory = require_unpluginFactory.unpluginFactory;
|
package/dist/unpluginFactory.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { t as unpluginFactory } from "./unpluginFactory-
|
|
1
|
+
import { t as unpluginFactory } from "./unpluginFactory-DOwvduC5.js";
|
|
2
2
|
export { unpluginFactory };
|
package/dist/vite.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_unpluginFactory = require("./unpluginFactory-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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
package/dist/webpack.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const require_unpluginFactory = require("./unpluginFactory-
|
|
1
|
+
const require_unpluginFactory = require("./unpluginFactory-DNTiGHkS.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-
|
|
1
|
+
import { t as unpluginFactory } from "./unpluginFactory-DOwvduC5.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,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unplugin-kubb",
|
|
3
|
-
"version": "6.0.0-alpha.
|
|
3
|
+
"version": "6.0.0-alpha.35",
|
|
4
4
|
"description": "Universal build plugin for Kubb, integrating OpenAPI code generation into Vite, Webpack, Rollup, esbuild, Rspack, Nuxt, and Astro build processes.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"unplugin",
|
|
@@ -98,19 +98,19 @@
|
|
|
98
98
|
],
|
|
99
99
|
"dependencies": {
|
|
100
100
|
"unplugin": "^3.0.0",
|
|
101
|
-
"@kubb/adapter-oas": "5.0.0-alpha.
|
|
102
|
-
"@kubb/core": "5.0.0-alpha.
|
|
103
|
-
"@kubb/parser-ts": "5.0.0-alpha.
|
|
101
|
+
"@kubb/adapter-oas": "5.0.0-alpha.35",
|
|
102
|
+
"@kubb/core": "5.0.0-alpha.35",
|
|
103
|
+
"@kubb/parser-ts": "5.0.0-alpha.35"
|
|
104
104
|
},
|
|
105
105
|
"devDependencies": {
|
|
106
106
|
"@farmfe/core": "^1.7.11",
|
|
107
107
|
"@nuxt/kit": "^4.4.2",
|
|
108
108
|
"@nuxt/schema": "^4.4.2",
|
|
109
109
|
"esbuild": "*",
|
|
110
|
-
"rolldown": "~1.0.0-rc.
|
|
110
|
+
"rolldown": "~1.0.0-rc.16",
|
|
111
111
|
"rollup": "^4.60.1",
|
|
112
112
|
"vite": "^7.3.2",
|
|
113
|
-
"webpack": "^5.
|
|
113
|
+
"webpack": "^5.106.2",
|
|
114
114
|
"@internals/utils": "0.0.0"
|
|
115
115
|
},
|
|
116
116
|
"peerDependencies": {
|
package/src/types.ts
CHANGED
package/src/unpluginFactory.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import process from 'node:process'
|
|
2
2
|
import { AsyncEventEmitter } from '@internals/utils'
|
|
3
3
|
import { adapterOas } from '@kubb/adapter-oas'
|
|
4
|
-
import { type Config, type
|
|
4
|
+
import { type Config, createKubb, type KubbHooks } from '@kubb/core'
|
|
5
5
|
import { parserTs } from '@kubb/parser-ts'
|
|
6
6
|
import type { UnpluginFactory } from 'unplugin'
|
|
7
7
|
import { version as unpluginVersion } from '../package.json'
|
|
@@ -15,7 +15,7 @@ type RollupContext = {
|
|
|
15
15
|
|
|
16
16
|
export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, meta) => {
|
|
17
17
|
const name = 'unplugin-kubb' as const
|
|
18
|
-
const
|
|
18
|
+
const hooks = new AsyncEventEmitter<KubbHooks>()
|
|
19
19
|
const isVite = meta.framework === 'vite'
|
|
20
20
|
const hrStart = process.hrtime()
|
|
21
21
|
|
|
@@ -35,43 +35,43 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
|
|
|
35
35
|
parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
|
|
38
|
+
hooks.on('kubb:lifecycle:start', (version) => {
|
|
39
39
|
console.log(`Kubb Unplugin ${version} 🧩`)
|
|
40
40
|
})
|
|
41
41
|
|
|
42
|
-
|
|
42
|
+
hooks.on('kubb:error', (error) => {
|
|
43
43
|
console.error(`✗ ${error?.message || 'failed'}`)
|
|
44
44
|
})
|
|
45
45
|
|
|
46
|
-
|
|
46
|
+
hooks.on('kubb:warn', (message) => {
|
|
47
47
|
console.warn(`⚠ ${message}`)
|
|
48
48
|
})
|
|
49
49
|
|
|
50
|
-
|
|
50
|
+
hooks.on('kubb:info', (message) => {
|
|
51
51
|
console.info(`ℹ ${message}`)
|
|
52
52
|
})
|
|
53
53
|
|
|
54
|
-
|
|
54
|
+
hooks.on('kubb:success', (message) => {
|
|
55
55
|
console.log(`✓ ${message}`)
|
|
56
56
|
})
|
|
57
57
|
|
|
58
|
-
|
|
58
|
+
hooks.on('kubb:plugin:end', (plugin, { duration }) => {
|
|
59
59
|
const durationStr = duration >= 1000 ? `${(duration / 1000).toFixed(2)}s` : `${duration}ms`
|
|
60
60
|
|
|
61
61
|
console.log(`✓ ${plugin.name} completed in ${durationStr}`)
|
|
62
62
|
})
|
|
63
63
|
|
|
64
|
-
|
|
64
|
+
hooks.on('kubb:files:processing:end', () => {
|
|
65
65
|
const text = '✓ Files written successfully'
|
|
66
66
|
|
|
67
67
|
console.log(text)
|
|
68
68
|
})
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
hooks.on('kubb:generation:end', (config) => {
|
|
71
71
|
console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')
|
|
72
72
|
})
|
|
73
73
|
|
|
74
|
-
|
|
74
|
+
hooks.on('kubb:generation:summary', (config, { status, failedPlugins }) => {
|
|
75
75
|
const pluginsCount = config.plugins.length
|
|
76
76
|
const successCount = pluginsCount - failedPlugins.size
|
|
77
77
|
|
|
@@ -82,13 +82,13 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
|
|
|
82
82
|
)
|
|
83
83
|
})
|
|
84
84
|
|
|
85
|
-
await
|
|
85
|
+
await hooks.emit('kubb:lifecycle:start', unpluginVersion)
|
|
86
86
|
|
|
87
87
|
const { root: _root, ...userConfig } = config as Config
|
|
88
88
|
|
|
89
|
-
await
|
|
89
|
+
await hooks.emit('kubb:generation:start', config as Config)
|
|
90
90
|
|
|
91
|
-
const { error, failedPlugins, pluginTimings, files, sources } = await
|
|
91
|
+
const { error, failedPlugins, pluginTimings, files, sources } = await createKubb({
|
|
92
92
|
config: {
|
|
93
93
|
root: process.cwd(),
|
|
94
94
|
...userConfig,
|
|
@@ -97,8 +97,8 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
|
|
|
97
97
|
...userConfig.output,
|
|
98
98
|
},
|
|
99
99
|
},
|
|
100
|
-
|
|
101
|
-
})
|
|
100
|
+
hooks,
|
|
101
|
+
}).safeBuild()
|
|
102
102
|
|
|
103
103
|
const hasFailures = failedPlugins.size > 0 || error
|
|
104
104
|
if (hasFailures) {
|
|
@@ -111,12 +111,12 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
|
|
|
111
111
|
].filter(Boolean)
|
|
112
112
|
|
|
113
113
|
allErrors.forEach((err) => {
|
|
114
|
-
|
|
114
|
+
hooks.emit('kubb:error', err)
|
|
115
115
|
})
|
|
116
116
|
}
|
|
117
117
|
|
|
118
|
-
await
|
|
119
|
-
await
|
|
118
|
+
await hooks.emit('kubb:generation:end', config as Config, files, sources)
|
|
119
|
+
await hooks.emit('kubb:generation:summary', config as Config, {
|
|
120
120
|
failedPlugins,
|
|
121
121
|
filesCreated: files.length,
|
|
122
122
|
status: failedPlugins.size > 0 || error ? 'failed' : 'success',
|
|
@@ -124,7 +124,7 @@ export const unpluginFactory: UnpluginFactory<Options | undefined> = (options, m
|
|
|
124
124
|
pluginTimings,
|
|
125
125
|
})
|
|
126
126
|
|
|
127
|
-
await
|
|
127
|
+
await hooks.emit('kubb:lifecycle:end')
|
|
128
128
|
}
|
|
129
129
|
|
|
130
130
|
return {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unpluginFactory-CQel1bdX.cjs","names":["#emitter","NodeEventEmitter","process","parserTs","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/** Thrown when a plugin's configuration or input fails validation.\n *\n * @example\n * ```ts\n * throw new ValidationPluginError('Invalid config: \"output.path\" is required')\n * ```\n */\nexport class ValidationPluginError extends Error {}\n\n/**\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 * 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, type KubbEvents, safeBuild } from '@kubb/core'\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 events = new AsyncEventEmitter<KubbEvents>()\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 config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],\n }\n\n events.on('lifecycle:start', (version) => {\n console.log(`Kubb Unplugin ${version} 🧩`)\n })\n\n events.on('error', (error) => {\n console.error(`✗ ${error?.message || 'failed'}`)\n })\n\n events.on('warn', (message) => {\n console.warn(`⚠ ${message}`)\n })\n\n events.on('info', (message) => {\n console.info(`ℹ ${message}`)\n })\n\n events.on('success', (message) => {\n console.log(`✓ ${message}`)\n })\n\n events.on('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 events.on('files:processing:end', () => {\n const text = '✓ Files written successfully'\n\n console.log(text)\n })\n\n events.on('generation:end', (config) => {\n console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')\n })\n\n events.on('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 events.emit('lifecycle:start', unpluginVersion)\n\n const { root: _root, ...userConfig } = config as Config\n\n await events.emit('generation:start', config as Config)\n\n const { error, failedPlugins, pluginTimings, files, sources } = await safeBuild({\n config: {\n root: process.cwd(),\n ...userConfig,\n output: {\n write: true,\n ...userConfig.output,\n },\n },\n events,\n })\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 events.emit('error', err)\n })\n }\n\n await events.emit('generation:end', config as Config, files, sources)\n await events.emit('generation:summary', 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 events.emit('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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCA,SAAgB,QAAQ,OAAuB;AAC7C,QAAO,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,OAAO,MAAM,CAAC;;;;;;;;;;;;;;;ACrBlE,IAAa,oBAAb,MAAoF;;;;;CAKlF,YAAY,cAAc,IAAI;AAC5B,QAAA,QAAc,gBAAgB,YAAY;;CAG5C,WAAW,IAAIC,YAAAA,cAAkB;;;;;;;;;;CAWjC,MAAM,KAAgD,WAAuB,GAAG,WAA+C;EAC7H,MAAM,YAAY,MAAA,QAAc,UAAU,UAAU;AAEpD,MAAI,UAAU,WAAW,EACvB;AAGF,OAAK,MAAM,YAAY,UACrB,KAAI;AACF,SAAM,SAAS,GAAG,UAAU;WACrB,KAAK;GACZ,IAAI;AACJ,OAAI;AACF,qBAAiB,KAAK,UAAU,UAAU;WACpC;AACN,qBAAiB,OAAO,UAAU;;AAEpC,SAAM,IAAI,MAAM,gCAAgC,UAAU,mBAAmB,kBAAkB,EAAE,OAAO,QAAQ,IAAI,EAAE,CAAC;;;;;;;;;;;CAa7H,GAA8C,WAAuB,SAAmD;AACtH,QAAA,QAAc,GAAG,WAAW,QAAoC;;;;;;;;;;CAWlE,OAAkD,WAAuB,SAAmD;EAC1H,MAAM,WAA+C,GAAG,SAAS;AAC/D,QAAK,IAAI,WAAW,QAAQ;AAC5B,UAAO,QAAQ,GAAG,KAAK;;AAEzB,OAAK,GAAG,WAAW,QAAQ;;;;;;;;;;CAW7B,IAA+C,WAAuB,SAAmD;AACvH,QAAA,QAAc,IAAI,WAAW,QAAoC;;;;;;;;;;CAWnE,YAAkB;AAChB,QAAA,QAAc,oBAAoB;;;;;;;;AE/FtC,MAAa,mBAAyD,SAAS,SAAS;CACtF,MAAM,OAAO;CACb,MAAM,SAAS,IAAI,mBAA+B;CAClD,MAAM,SAAS,KAAK,cAAc;CAClC,MAAM,UAAUC,aAAAA,QAAQ,QAAQ;CAEhC,eAAe,SAAS,KAAoB;AAC1C,MAAI,CAAC,SAAS,QAAQ;AACpB,OAAI,IAAI,MACN,KAAI,QAAQ,IAAI,KAAK,qBAAqB;OAE1C,SAAQ,MAAM,IAAI,KAAK,qBAAqB;AAE9C;;EAGF,MAAM,SAAS;GACb,GAAG,QAAQ;GACX,SAAS,QAAQ,OAAO,YAAA,GAAA,kBAAA,aAAuB;GAC/C,SAAS,QAAQ,OAAO,SAAS,SAAS,QAAQ,OAAO,UAAU,CAACC,gBAAAA,SAAS;GAC9E;AAED,SAAO,GAAG,oBAAoB,YAAY;AACxC,WAAQ,IAAI,iBAAiB,QAAQ,KAAK;IAC1C;AAEF,SAAO,GAAG,UAAU,UAAU;AAC5B,WAAQ,MAAM,KAAK,OAAO,WAAW,WAAW;IAChD;AAEF,SAAO,GAAG,SAAS,YAAY;AAC7B,WAAQ,KAAK,KAAK,UAAU;IAC5B;AAEF,SAAO,GAAG,SAAS,YAAY;AAC7B,WAAQ,KAAK,KAAK,UAAU;IAC5B;AAEF,SAAO,GAAG,YAAY,YAAY;AAChC,WAAQ,IAAI,KAAK,UAAU;IAC3B;AAEF,SAAO,GAAG,eAAe,QAAQ,EAAE,eAAe;GAChD,MAAM,cAAc,YAAY,MAAO,IAAI,WAAW,KAAM,QAAQ,EAAE,CAAC,KAAK,GAAG,SAAS;AAExF,WAAQ,IAAI,KAAK,OAAO,KAAK,gBAAgB,cAAc;IAC3D;AAEF,SAAO,GAAG,8BAA8B;AAGtC,WAAQ,IAFK,+BAEI;IACjB;AAEF,SAAO,GAAG,mBAAmB,WAAW;AACtC,WAAQ,IAAI,OAAO,OAAO,8BAA8B,OAAO,SAAS,yBAAyB;IACjG;AAEF,SAAO,GAAG,uBAAuB,QAAQ,EAAE,QAAQ,oBAAoB;GACrE,MAAM,eAAe,OAAO,QAAQ;GACpC,MAAM,eAAe,eAAe,cAAc;AAElD,WAAQ,IACN,WAAW,YACP,mBAAmB,GAAG,aAAa,aAAa,IAAI,aAAa,UACjE,mBAAmB,GAAG,aAAa,aAAa,MAAM,GAAG,cAAc,KAAK,SAAS,IAAI,aAAa,QAC3G;IACD;AAEF,QAAM,OAAO,KAAK,mBAAmBC,QAAgB;EAErD,MAAM,EAAE,MAAM,OAAO,GAAG,eAAe;AAEvC,QAAM,OAAO,KAAK,oBAAoB,OAAiB;EAEvD,MAAM,EAAE,OAAO,eAAe,eAAe,OAAO,YAAY,OAAA,GAAA,WAAA,WAAgB;GAC9E,QAAQ;IACN,MAAMF,aAAAA,QAAQ,KAAK;IACnB,GAAG;IACH,QAAQ;KACN,OAAO;KACP,GAAG,WAAW;KACf;IACF;GACD;GACD,CAAC;AAGF,MADoB,cAAc,OAAO,KAAK,MAGjB,EACzB,OACA,GAAG,MAAM,KAAK,cAAc,CACzB,QAAQ,OAAO,GAAG,MAAM,CACxB,KAAK,OAAO,GAAG,MAAM,CACzB,CAAC,OAAO,QAAQ,CAEP,SAAS,QAAQ;AACzB,UAAO,KAAK,SAAS,IAAI;IACzB;AAGJ,QAAM,OAAO,KAAK,kBAAkB,QAAkB,OAAO,QAAQ;AACrE,QAAM,OAAO,KAAK,sBAAsB,QAAkB;GACxD;GACA,cAAc,MAAM;GACpB,QAAQ,cAAc,OAAO,KAAK,QAAQ,WAAW;GACrD;GACA;GACD,CAAC;AAEF,QAAM,OAAO,KAAK,gBAAgB;;AAGpC,QAAO;EACL;EACA,SAAS;EACT,OAAO,SAAS,UAAU,KAAA;EAC1B,MAAM,aAAa;AACjB,SAAM,SAAS,KAAiC;;EAGlD,MAAM,EAAE;EACT"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unpluginFactory-D6pw_FXK.js","names":["#emitter","NodeEventEmitter","unpluginVersion"],"sources":["../../../internals/utils/src/errors.ts","../../../internals/utils/src/asyncEventEmitter.ts","../package.json","../src/unpluginFactory.ts"],"sourcesContent":["/** Thrown when a plugin's configuration or input fails validation.\n *\n * @example\n * ```ts\n * throw new ValidationPluginError('Invalid config: \"output.path\" is required')\n * ```\n */\nexport class ValidationPluginError extends Error {}\n\n/**\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 * 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, type KubbEvents, safeBuild } from '@kubb/core'\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 events = new AsyncEventEmitter<KubbEvents>()\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 config = {\n ...options.config,\n adapter: options.config.adapter ?? adapterOas(),\n parsers: options.config.parsers?.length ? options.config.parsers : [parserTs],\n }\n\n events.on('lifecycle:start', (version) => {\n console.log(`Kubb Unplugin ${version} 🧩`)\n })\n\n events.on('error', (error) => {\n console.error(`✗ ${error?.message || 'failed'}`)\n })\n\n events.on('warn', (message) => {\n console.warn(`⚠ ${message}`)\n })\n\n events.on('info', (message) => {\n console.info(`ℹ ${message}`)\n })\n\n events.on('success', (message) => {\n console.log(`✓ ${message}`)\n })\n\n events.on('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 events.on('files:processing:end', () => {\n const text = '✓ Files written successfully'\n\n console.log(text)\n })\n\n events.on('generation:end', (config) => {\n console.log(config.name ? `✓ Generation completed for ${config.name}` : '✓ Generation completed')\n })\n\n events.on('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 events.emit('lifecycle:start', unpluginVersion)\n\n const { root: _root, ...userConfig } = config as Config\n\n await events.emit('generation:start', config as Config)\n\n const { error, failedPlugins, pluginTimings, files, sources } = await safeBuild({\n config: {\n root: process.cwd(),\n ...userConfig,\n output: {\n write: true,\n ...userConfig.output,\n },\n },\n events,\n })\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 events.emit('error', err)\n })\n }\n\n await events.emit('generation:end', config as Config, files, sources)\n await events.emit('generation:summary', 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 events.emit('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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"}
|