{"version":3,"file":"index.cjs","names":["e","NodeEventEmitter","errors: Error[]","defaultParser","resolvedFiles: Array<KubbFile.ResolvedFile>","createFile","trimExtName","files: Array<KubbFile.ResolvedFile>","context: FabricContext<T>","fabric: Fabric<T>","isFunction"],"sources":["../../../node_modules/.pnpm/remeda@2.32.0/node_modules/remeda/dist/isFunction-BJjFuZR7.js","../src/utils/AsyncEventEmitter.ts","../src/FileProcessor.ts","../src/utils/Cache.ts","../src/FileManager.ts","../src/defineFabric.ts","../src/createFabric.ts"],"sourcesContent":["const e=e=>typeof e==`function`;export{e as isFunction};\n//# sourceMappingURL=isFunction-BJjFuZR7.js.map","import { EventEmitter as NodeEventEmitter } from 'node:events'\nimport type { FabricMode } from '../Fabric.ts'\n\ntype Options = {\n  mode?: FabricMode\n  maxListener?: number\n}\n\nexport class AsyncEventEmitter<TEvents extends Record<string, any>> {\n  constructor({ maxListener = 100, mode = 'sequential' }: Options = {}) {\n    this.#emitter.setMaxListeners(maxListener)\n    this.#mode = mode\n  }\n\n  #emitter = new NodeEventEmitter()\n  #mode: FabricMode\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<(...args: TEvents[TEventName]) => any>\n\n    if (listeners.length === 0) {\n      return\n    }\n\n    const errors: Error[] = []\n\n    if (this.#mode === 'sequential') {\n      // Run listeners one by one, in order\n      for (const listener of listeners) {\n        try {\n          await listener(...eventArgs)\n        } catch (err) {\n          const error = err instanceof Error ? err : new Error(String(err))\n          errors.push(error)\n        }\n      }\n    } else {\n      // Run all listeners concurrently\n      const promises = listeners.map(async (listener) => {\n        try {\n          await listener(...eventArgs)\n        } catch (err) {\n          const error = err instanceof Error ? err : new Error(String(err))\n          errors.push(error)\n        }\n      })\n      await Promise.all(promises)\n    }\n\n    if (errors.length === 1) {\n      throw errors[0]\n    }\n\n    if (errors.length > 1) {\n      throw new AggregateError(errors, `Errors in async listeners for \"${eventName}\"`)\n    }\n  }\n\n  on<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n    this.#emitter.on(eventName, handler as any)\n  }\n\n  onOnce<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArgs: TEvents[TEventName]) => void): void {\n    const wrapper = (...args: TEvents[TEventName]) => {\n      this.off(eventName, wrapper)\n      handler(...args)\n    }\n    this.on(eventName, wrapper)\n  }\n\n  off<TEventName extends keyof TEvents & string>(eventName: TEventName, handler: (...eventArg: TEvents[TEventName]) => void): void {\n    this.#emitter.off(eventName, handler as any)\n  }\n\n  removeAll(): void {\n    this.#emitter.removeAllListeners()\n  }\n}\n","import pLimit from 'p-limit'\nimport type { FabricEvents, FabricMode } from './Fabric.ts'\nimport type * as KubbFile from './KubbFile.ts'\nimport { defaultParser } from './parsers/defaultParser.ts'\nimport type { Parser } from './parsers/types.ts'\nimport { AsyncEventEmitter } from './utils/AsyncEventEmitter.ts'\n\nexport type ProcessFilesProps = {\n  parsers?: Map<KubbFile.Extname, Parser>\n  extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n  dryRun?: boolean\n  /**\n   * @default 'sequential'\n   */\n  mode?: FabricMode\n}\n\ntype GetParseOptions = {\n  parsers?: Map<KubbFile.Extname, Parser>\n  extension?: Record<KubbFile.Extname, KubbFile.Extname | ''>\n}\n\ntype Options = {\n  events?: AsyncEventEmitter<FabricEvents>\n}\n\nexport class FileProcessor {\n  #limit = pLimit(100)\n  events: AsyncEventEmitter<FabricEvents>\n\n  constructor({ events = new AsyncEventEmitter<FabricEvents>() }: Options = {}) {\n    this.events = events\n\n    return this\n  }\n\n  async parse(file: KubbFile.ResolvedFile, { parsers, extension }: GetParseOptions = {}): Promise<string> {\n    const parseExtName = extension?.[file.extname] || undefined\n\n    if (!parsers) {\n      console.warn('No parsers provided, using default parser. If you want to use a specific parser, please provide it in the options.')\n\n      return defaultParser.parse(file, { extname: parseExtName })\n    }\n\n    if (!file.extname) {\n      return defaultParser.parse(file, { extname: parseExtName })\n    }\n\n    const parser = parsers.get(file.extname)\n\n    if (!parser) {\n      return defaultParser.parse(file, { extname: parseExtName })\n    }\n\n    return parser.parse(file, { extname: parseExtName })\n  }\n\n  async run(\n    files: Array<KubbFile.ResolvedFile>,\n    { parsers, mode = 'sequential', dryRun, extension }: ProcessFilesProps = {},\n  ): Promise<KubbFile.ResolvedFile[]> {\n    await this.events.emit('process:start', { files })\n\n    const total = files.length\n    let processed = 0\n\n    const processOne = async (resolvedFile: KubbFile.ResolvedFile, index: number) => {\n      await this.events.emit('file:start', { file: resolvedFile, index, total })\n\n      const source = dryRun ? undefined : await this.parse(resolvedFile, { extension, parsers })\n\n      const currentProcessed = ++processed\n      const percentage = (currentProcessed / total) * 100\n\n      await this.events.emit('process:progress', {\n        file: resolvedFile,\n        source,\n        processed: currentProcessed,\n        percentage,\n        total,\n      })\n\n      await this.events.emit('file:end', { file: resolvedFile, index, total })\n    }\n\n    if (mode === 'sequential') {\n      async function* asyncFiles() {\n        for (let index = 0; index < files.length; index++) {\n          yield [files[index], index] as const\n        }\n      }\n\n      for await (const [file, index] of asyncFiles()) {\n        if (file) {\n          await processOne(file, index)\n        }\n      }\n    } else {\n      const promises = files.map((resolvedFile, index) => this.#limit(() => processOne(resolvedFile, index)))\n      await Promise.all(promises)\n    }\n\n    await this.events.emit('process:end', { files })\n\n    return files\n  }\n}\n","export class Cache<T> {\n  #buffer = new Map<string, T>()\n\n  get(key: string): T | null {\n    return this.#buffer.get(key) ?? null\n  }\n\n  set(key: string, value: T): void {\n    this.#buffer.set(key, value)\n  }\n\n  delete(key: string): void {\n    this.#buffer.delete(key)\n  }\n\n  clear(): void {\n    this.#buffer.clear()\n  }\n\n  keys(): string[] {\n    return [...this.#buffer.keys()]\n  }\n\n  values(): Array<T> {\n    return [...this.#buffer.values()]\n  }\n\n  flush(): void {\n    // No-op for base cache\n  }\n}\n","import { orderBy } from 'natural-orderby'\nimport { createFile } from './createFile.ts'\nimport type { FabricEvents } from './Fabric.ts'\nimport { FileProcessor, type ProcessFilesProps } from './FileProcessor.ts'\nimport type * as KubbFile from './KubbFile.ts'\nimport { AsyncEventEmitter } from './utils/AsyncEventEmitter.ts'\nimport { Cache } from './utils/Cache.ts'\nimport { trimExtName } from './utils/trimExtName.ts'\n\nfunction mergeFile<TMeta extends object = object>(a: KubbFile.File<TMeta>, b: KubbFile.File<TMeta>): KubbFile.File<TMeta> {\n  return {\n    ...a,\n    sources: [...(a.sources || []), ...(b.sources || [])],\n    imports: [...(a.imports || []), ...(b.imports || [])],\n    exports: [...(a.exports || []), ...(b.exports || [])],\n  }\n}\n\ntype Options = {\n  events?: AsyncEventEmitter<FabricEvents>\n}\n\nexport class FileManager {\n  #cache = new Cache<KubbFile.ResolvedFile>()\n  #filesCache: Array<KubbFile.ResolvedFile> | null = null\n  events: AsyncEventEmitter<FabricEvents>\n  processor: FileProcessor\n\n  constructor({ events = new AsyncEventEmitter<FabricEvents>() }: Options = {}) {\n    this.processor = new FileProcessor({ events })\n\n    this.events = events\n    return this\n  }\n\n  #resolvePath(file: KubbFile.File): KubbFile.File {\n    this.events.emit('file:resolve:path', { file })\n\n    return file\n  }\n\n  #resolveName(file: KubbFile.File): KubbFile.File {\n    this.events.emit('file:resolve:name', { file })\n\n    return file\n  }\n\n  async add(...files: Array<KubbFile.File>) {\n    const resolvedFiles: Array<KubbFile.ResolvedFile> = []\n\n    const mergedFiles = new Map<string, KubbFile.File>()\n\n    files.forEach((file) => {\n      const existing = mergedFiles.get(file.path)\n      if (existing) {\n        mergedFiles.set(file.path, mergeFile(existing, file))\n      } else {\n        mergedFiles.set(file.path, file)\n      }\n    })\n\n    for (let file of mergedFiles.values()) {\n      const existing = this.#cache.get(file.path)\n\n      file = this.#resolveName(file)\n      file = this.#resolvePath(file)\n\n      const merged = existing ? mergeFile(existing, file) : file\n      const resolvedFile = createFile(merged)\n\n      this.#cache.set(resolvedFile.path, resolvedFile)\n      this.flush()\n\n      resolvedFiles.push(resolvedFile)\n    }\n\n    await this.events.emit('file:add', { files: resolvedFiles })\n\n    return resolvedFiles\n  }\n\n  flush() {\n    this.#filesCache = null\n    this.#cache.flush()\n  }\n\n  getByPath(path: KubbFile.Path): KubbFile.ResolvedFile | null {\n    return this.#cache.get(path)\n  }\n\n  deleteByPath(path: KubbFile.Path): void {\n    this.#cache.delete(path)\n    this.#filesCache = null\n  }\n\n  clear(): void {\n    this.#cache.clear()\n    this.#filesCache = null\n  }\n\n  get files(): Array<KubbFile.ResolvedFile> {\n    if (this.#filesCache) {\n      return this.#filesCache\n    }\n\n    const cachedKeys = this.#cache.keys()\n\n    // order by path length and if file is a barrel file\n    const keys = orderBy(cachedKeys, [(v) => v.length, (v) => trimExtName(v).endsWith('index')])\n\n    const files: Array<KubbFile.ResolvedFile> = []\n\n    for (const key of keys) {\n      const file = this.#cache.get(key)\n      if (file) {\n        files.push(file)\n      }\n    }\n\n    this.#filesCache = files\n\n    return files\n  }\n\n  //TODO add test and check if write of FileManager contains the newly added file\n  async write(options: ProcessFilesProps): Promise<KubbFile.ResolvedFile[]> {\n    await this.events.emit('write:start', { files: this.files })\n\n    const resolvedFiles = await this.processor.run(this.files, options)\n\n    this.clear()\n\n    await this.events.emit('write:end', { files: resolvedFiles })\n\n    return resolvedFiles\n  }\n}\n","import { isFunction } from 'remeda'\nimport type { Fabric, FabricConfig, FabricContext, FabricEvents, FabricOptions } from './Fabric.ts'\nimport { FileManager } from './FileManager.ts'\nimport type * as KubbFile from './KubbFile.ts'\nimport type { Parser } from './parsers/types.ts'\nimport type { Plugin } from './plugins/types.ts'\nimport { AsyncEventEmitter } from './utils/AsyncEventEmitter.ts'\n\n/**\n * Function that initializes the root Fabric instance.\n *\n * Used for setting up plugins, parsers, or performing side effects\n * once the Fabric context is ready.\n */\ntype FabricInitializer<T extends FabricOptions> = (fabric: Fabric<T>) => void | Promise<void>\n\n/**\n * A function returned by {@link defineFabric} that creates a Fabric instance.\n */\nexport type CreateFabric<T extends FabricOptions> = (config?: FabricConfig<T>) => Fabric<T>\n\n/**\n * Defines a new Fabric factory function.\n *\n * @example\n * export const createFabric = defineFabric((fabric) => {\n *   fabric.use(myPlugin())\n * })\n */\nexport function defineFabric<T extends FabricOptions>(init?: FabricInitializer<T>): CreateFabric<T> {\n  function create(config: FabricConfig<T> = { mode: 'sequential' } as FabricConfig<T>): Fabric<T> {\n    const events = new AsyncEventEmitter<FabricEvents>()\n    const installedPlugins = new Set<Plugin<any>>()\n    const installedParsers = new Map<KubbFile.Extname, Parser<any>>()\n    const installedParserNames = new Set<string>()\n    const fileManager = new FileManager({ events })\n\n    const context: FabricContext<T> = {\n      get files() {\n        return fileManager.files\n      },\n      async addFile(...files) {\n        await fileManager.add(...files)\n      },\n      config,\n      fileManager,\n      installedPlugins,\n      installedParsers,\n      on: events.on.bind(events),\n      off: events.off.bind(events),\n      onOnce: events.onOnce.bind(events),\n      removeAll: events.removeAll.bind(events),\n      emit: events.emit.bind(events),\n    } as FabricContext<T>\n\n    const fabric: Fabric<T> = {\n      context,\n      get files() {\n        return fileManager.files\n      },\n      async addFile(...files) {\n        await fileManager.add(...files)\n      },\n      async use(pluginOrParser, ...options) {\n        if (pluginOrParser.type === 'plugin') {\n          if (installedPlugins.has(pluginOrParser)) {\n            console.warn(`Plugin \"${pluginOrParser.name}\" already applied.`)\n          } else {\n            installedPlugins.add(pluginOrParser)\n          }\n\n          if (isFunction(pluginOrParser.inject)) {\n            const injecter = pluginOrParser.inject\n\n            const injected = (injecter as any)(context, ...options)\n            Object.assign(fabric, injected)\n          }\n        }\n\n        if (pluginOrParser.type === 'parser') {\n          if (installedParserNames.has(pluginOrParser.name)) {\n            console.warn(`Parser \"${pluginOrParser.name}\" already applied.`)\n          } else {\n            installedParserNames.add(pluginOrParser.name)\n          }\n\n          if (pluginOrParser.extNames) {\n            for (const extName of pluginOrParser.extNames) {\n              const existing = installedParsers.get(extName)\n              if (existing && existing.name !== pluginOrParser.name) {\n                console.warn(`Parser \"${pluginOrParser.name}\" is overriding parser \"${existing.name}\" for extension \"${extName}\".`)\n              }\n              installedParsers.set(extName, pluginOrParser)\n            }\n          }\n        }\n\n        if (isFunction(pluginOrParser.install)) {\n          const installer = pluginOrParser.install\n\n          await (installer as any)(context, ...options)\n        }\n\n        return fabric\n      },\n    } as Fabric<T>\n\n    if (init) {\n      init(fabric)\n    }\n\n    return fabric\n  }\n\n  return create\n}\n","import { defineFabric } from './defineFabric.ts'\n\nexport const createFabric = defineFabric()\n"],"x_google_ignoreList":[0],"mappings":"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"}