{"version":3,"file":"unpluginFactory-DedduH6n.cjs","names":["#emitter","NodeEventEmitter","process","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. */\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 */\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 * When the value is already an `Error` it is returned as-is;\n * otherwise a new `Error` is created whose message is `String(value)`.\n */\nexport function toError(value: unknown): Error {\n  return value instanceof Error ? value : new Error(String(value))\n}\n\n/**\n * Safely extracts a human-readable message from any thrown value.\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 | undefined`.\n * Returns `undefined` when the cause is absent or is not an `Error`.\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/** A function that can be registered as an event listener, synchronous or async. */\ntype AsyncListener<TArgs extends unknown[]> = (...args: TArgs) => void | Promise<void>\n\n/**\n * A typed EventEmitter that awaits all async listeners before resolving.\n * Wraps Node's `EventEmitter` with full TypeScript event-map inference.\n */\nexport class AsyncEventEmitter<TEvents extends { [K in keyof TEvents]: unknown[] }> {\n  /**\n   * `maxListener` controls the 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 an event and awaits all registered listeners in parallel.\n   * Throws if any listener rejects, wrapping the cause with the event name and serialized arguments.\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 undefined\n    }\n\n    await Promise.all(\n      listeners.map(async (listener) => {\n        try {\n          return 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 the given event. */\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  /** Registers a one-shot listener that removes itself after the first invocation. */\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  /** Removes a previously registered listener. */\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  /** Removes all listeners from every event channel. */\n  removeAll(): void {\n    this.#emitter.removeAllListeners()\n  }\n}\n","","import process from 'node:process'\nimport { AsyncEventEmitter } from '@internals/utils'\nimport { type Config, type KubbEvents, safeBuild } from '@kubb/core'\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    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 || 0\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 } = options.config as Config\n\n    await events.emit('generation:start', options.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', options.config as Config, files, sources)\n    await events.emit('generation:summary', options.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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"}