{"version":3,"file":"index.cjs","names":["#context","#options","fs","path","reader","fs","path","syncReader","fs","path","createLogger","pc","URLPath","definedConfig: Config","fsPlugin","typescriptParser","PluginManager","rootFile: KubbFile.File","getRelativePath","files","write","build","Queue","resolve","toPath","process","fsPromises","path","fs","path","#cache","#cwd","#SLASHES","path","mod","os","module","#match"],"sources":["../src/BaseGenerator.ts","../src/config.ts","../src/fs/clean.ts","../src/fs/exists.ts","../src/fs/read.ts","../src/build.ts","../src/definePlugin.ts","../../../node_modules/.pnpm/p-limit@4.0.0/node_modules/p-limit/index.js","../../../node_modules/.pnpm/p-locate@6.0.0/node_modules/p-locate/index.js","../../../node_modules/.pnpm/locate-path@7.2.0/node_modules/locate-path/index.js","../../../node_modules/.pnpm/unicorn-magic@0.1.0/node_modules/unicorn-magic/node.js","../../../node_modules/.pnpm/find-up@7.0.0/node_modules/find-up/index.js","../src/PackageManager.ts"],"sourcesContent":["/**\n * Abstract class that contains the building blocks for plugins to create their own Generator\n * @link idea based on https://github.com/colinhacks/zod/blob/master/src/types.ts#L137\n */\nexport abstract class BaseGenerator<TOptions = unknown, TContext = unknown> {\n  #options: TOptions = {} as TOptions\n  #context: TContext = {} as TContext\n\n  constructor(options?: TOptions, context?: TContext) {\n    if (context) {\n      this.#context = context\n    }\n\n    if (options) {\n      this.#options = options\n    }\n\n    return this\n  }\n\n  get options(): TOptions {\n    return this.#options\n  }\n\n  get context(): TContext {\n    return this.#context\n  }\n\n  set options(options: TOptions) {\n    this.#options = { ...this.#options, ...options }\n  }\n\n  abstract build(...params: unknown[]): unknown\n}\n","import type { InputPath, UserConfig } from './types.ts'\nimport type { PossiblePromise } from './utils/types.ts'\n\n/**\n * CLI options derived from command-line flags.\n */\nexport type CLIOptions = {\n  /** Path to `kubb.config.js` */\n  config?: string\n\n  /** Enable watch mode for input files */\n  watch?: boolean\n\n  /**\n   * Logging verbosity for CLI usage.\n   *\n   * - `silent`: hide non-essential logs\n   * - `info`: show general logs (non-plugin-related)\n   * - `debug`: include detailed plugin lifecycle logs\n   * @default 'silent'\n   */\n  logLevel?: 'silent' | 'info' | 'debug'\n\n  /** Run Kubb with Bun */\n  bun?: boolean\n}\n\n/**\n * Helper for defining a Kubb configuration.\n *\n * Accepts either:\n * - A config object or array of configs\n * - A function returning the config(s), optionally async,\n *   receiving the CLI options as argument\n *\n * @example\n * export default defineConfig(({ logLevel }) => ({\n *   root: 'src',\n *   plugins: [myPlugin()],\n * }))\n */\nexport function defineConfig(\n  config: PossiblePromise<UserConfig | UserConfig[]> | ((cli: CLIOptions) => PossiblePromise<UserConfig | UserConfig[]>),\n): typeof config {\n  return config\n}\n\n/**\n * Type guard to check if a given config has an `input.path`.\n */\nexport function isInputPath(config: UserConfig | undefined): config is UserConfig<InputPath> {\n  return typeof config?.input === 'object' && config.input !== null && 'path' in config.input\n}\n","import fs from 'fs-extra'\n\nexport async function clean(path: string): Promise<void> {\n  return fs.remove(path)\n}\n","import fs from 'fs-extra'\nimport { switcher } from 'js-runtime'\n\nconst reader = switcher(\n  {\n    node: async (path: string) => {\n      return fs.pathExists(path)\n    },\n    bun: async (path: string) => {\n      const file = Bun.file(path)\n\n      return file.exists()\n    },\n  },\n  'node',\n)\n\nconst syncReader = switcher(\n  {\n    node: (path: string) => {\n      return fs.pathExistsSync(path)\n    },\n    bun: () => {\n      throw new Error('Bun cannot read sync')\n    },\n  },\n  'node',\n)\n\nexport async function exists(path: string): Promise<boolean> {\n  return reader(path)\n}\n\nexport function existsSync(path: string): boolean {\n  return syncReader(path)\n}\n","import fs from 'fs-extra'\nimport { switcher } from 'js-runtime'\n\nconst reader = switcher(\n  {\n    node: async (path: string) => {\n      return fs.readFile(path, { encoding: 'utf8' })\n    },\n    bun: async (path: string) => {\n      const file = Bun.file(path)\n\n      return file.text()\n    },\n  },\n  'node',\n)\n\nconst syncReader = switcher(\n  {\n    node: (path: string) => {\n      return fs.readFileSync(path, { encoding: 'utf8' })\n    },\n    bun: () => {\n      throw new Error('Bun cannot read sync')\n    },\n  },\n  'node',\n)\n\nexport async function read(path: string): Promise<string> {\n  return reader(path)\n}\n\nexport function readSync(path: string): string {\n  return syncReader(path)\n}\n","import { join, relative, resolve } from 'node:path'\nimport type { KubbFile } from '@kubb/fabric-core/types'\nimport type { Fabric } from '@kubb/react-fabric'\nimport { createFabric } from '@kubb/react-fabric'\nimport { typescriptParser } from '@kubb/react-fabric/parsers'\nimport { fsPlugin } from '@kubb/react-fabric/plugins'\nimport pc from 'picocolors'\nimport { isDeepEqual } from 'remeda'\nimport { isInputPath } from './config.ts'\nimport { clean, exists, getRelativePath, write } from './fs/index.ts'\nimport type { Logger } from './logger.ts'\nimport { createLogger } from './logger.ts'\nimport { PluginManager } from './PluginManager.ts'\nimport type { Config, Output, Plugin, UserConfig } from './types.ts'\nimport { URLPath } from './utils/URLPath.ts'\n\ntype BuildOptions = {\n  config: UserConfig\n  /**\n   * @default Logger without the spinner\n   */\n  logger?: Logger\n}\n\ntype BuildOutput = {\n  failedPlugins: Set<{ plugin: Plugin; error: Error }>\n  fabric: Fabric\n  files: Array<KubbFile.ResolvedFile>\n  pluginManager: PluginManager\n  // TODO check if we can remove error\n  /**\n   * Only for safeBuild,\n   * @deprecated\n   */\n  error?: Error\n}\n\ntype SetupResult = {\n  fabric: Fabric\n  pluginManager: PluginManager\n}\n\nexport async function setup(options: BuildOptions): Promise<SetupResult> {\n  const { config: userConfig, logger = createLogger() } = options\n\n  if (Array.isArray(userConfig.input)) {\n    console.warn(pc.yellow('This feature is still under development — use with caution'))\n  }\n\n  try {\n    if (isInputPath(userConfig) && !new URLPath(userConfig.input.path).isURL) {\n      await exists(userConfig.input.path)\n    }\n  } catch (e) {\n    if (isInputPath(userConfig)) {\n      throw new Error(\n        `Cannot read file/URL defined in \\`input.path\\` or set with \\`kubb generate PATH\\` in the CLI of your Kubb config ${userConfig.input.path}`,\n        {\n          cause: e,\n        },\n      )\n    }\n  }\n\n  const definedConfig: Config = {\n    root: userConfig.root || process.cwd(),\n    ...userConfig,\n    output: {\n      write: true,\n      barrelType: 'named',\n      extension: {\n        '.ts': '.ts',\n      },\n      defaultBanner: 'simple',\n      ...userConfig.output,\n    },\n    plugins: userConfig.plugins as Config['plugins'],\n  }\n\n  if (definedConfig.output.clean) {\n    await clean(definedConfig.output.path)\n    await clean(join(definedConfig.root, '.kubb'))\n  }\n\n  const fabric = createFabric()\n  fabric.use(fsPlugin, { dryRun: !definedConfig.output.write })\n  fabric.use(typescriptParser)\n\n  const pluginManager = new PluginManager(definedConfig, { fabric, logger, concurrency: 5 })\n\n  return {\n    fabric,\n    pluginManager,\n  }\n}\n\nexport async function build(options: BuildOptions, overrides?: SetupResult): Promise<BuildOutput> {\n  const { fabric, files, pluginManager, failedPlugins, error } = await safeBuild(options, overrides)\n\n  if (error) {\n    throw error\n  }\n\n  return {\n    failedPlugins,\n    fabric,\n    files,\n    pluginManager,\n    error,\n  }\n}\n\nexport async function safeBuild(options: BuildOptions, overrides?: SetupResult): Promise<BuildOutput> {\n  const { fabric, pluginManager } = overrides ? overrides : await setup(options)\n\n  const failedPlugins = new Set<{ plugin: Plugin; error: Error }>()\n  const config = pluginManager.config\n\n  try {\n    for (const plugin of pluginManager.plugins) {\n      const context = pluginManager.getContext(plugin)\n\n      const installer = plugin.install.bind(context)\n\n      try {\n        await installer(context)\n      } catch (e) {\n        failedPlugins.add({ plugin, error: e as Error })\n      }\n    }\n\n    if (config.output.barrelType) {\n      const root = resolve(config.root)\n      const rootPath = resolve(root, config.output.path, 'index.ts')\n\n      const barrelFiles = fabric.files.filter((file) => {\n        return file.sources.some((source) => source.isIndexable)\n      })\n\n      const rootFile: KubbFile.File = {\n        path: rootPath,\n        baseName: 'index.ts',\n        exports: barrelFiles\n          .flatMap((file) => {\n            const containsOnlyTypes = file.sources?.every((source) => source.isTypeOnly)\n\n            return file.sources\n              ?.map((source) => {\n                if (!file.path || !source.isIndexable) {\n                  return undefined\n                }\n\n                // validate of the file is coming from plugin x, needs pluginKey on every file TODO update typing\n                const plugin = [...pluginManager.plugins].find((item) => {\n                  const meta = file.meta as any\n                  return isDeepEqual(item.key, meta?.pluginKey)\n                })\n                const pluginOptions = plugin?.options as { output?: Output<any> }\n\n                if (!pluginOptions || pluginOptions?.output?.barrelType === false) {\n                  return undefined\n                }\n\n                return {\n                  name: config.output.barrelType === 'all' ? undefined : [source.name],\n                  path: getRelativePath(rootPath, file.path),\n                  isTypeOnly: config.output.barrelType === 'all' ? containsOnlyTypes : source.isTypeOnly,\n                } as KubbFile.Export\n              })\n              .filter(Boolean)\n          })\n          .filter(Boolean),\n        sources: [],\n        meta: {},\n      }\n\n      await fabric.addFile(rootFile)\n    }\n\n    fabric.context.on('process:start', ({ files }) => {\n      pluginManager.logger.emit('progress_start', { id: 'files', size: files.length, message: 'Writing files ...' })\n    })\n\n    fabric.context.on('process:progress', async ({ file, source }) => {\n      const message = file ? `Writing ${relative(config.root, file.path)}` : ''\n      pluginManager.logger.emit('progressed', { id: 'files', message })\n\n      if (source) {\n        await write(file.path, source, { sanity: false })\n      }\n    })\n\n    fabric.context.on('process:end', () => {\n      pluginManager.logger.emit('progress_stop', { id: 'files' })\n    })\n    const files = [...fabric.files]\n\n    await fabric.write({ extension: config.output.extension })\n\n    return {\n      failedPlugins,\n      fabric,\n      files,\n      pluginManager,\n    }\n  } catch (e) {\n    return {\n      failedPlugins,\n      fabric,\n      files: [],\n      pluginManager,\n      error: e as Error,\n    }\n  }\n}\n","import type { PluginFactoryOptions, UserPluginWithLifeCycle } from './types.ts'\n\ntype PluginBuilder<T extends PluginFactoryOptions = PluginFactoryOptions> = (options: T['options']) => UserPluginWithLifeCycle<T>\n\n/**\n * Wraps a plugin builder to make the options parameter optional.\n */\nexport function definePlugin<T extends PluginFactoryOptions = PluginFactoryOptions>(\n  build: PluginBuilder<T>,\n): (options?: T['options']) => UserPluginWithLifeCycle<T> {\n  return (options) => build(options ?? ({} as T['options']))\n}\n","import Queue from 'yocto-queue';\n\nexport default function pLimit(concurrency) {\n\tif (!((Number.isInteger(concurrency) || concurrency === Number.POSITIVE_INFINITY) && concurrency > 0)) {\n\t\tthrow new TypeError('Expected `concurrency` to be a number from 1 and up');\n\t}\n\n\tconst queue = new Queue();\n\tlet activeCount = 0;\n\n\tconst next = () => {\n\t\tactiveCount--;\n\n\t\tif (queue.size > 0) {\n\t\t\tqueue.dequeue()();\n\t\t}\n\t};\n\n\tconst run = async (fn, resolve, args) => {\n\t\tactiveCount++;\n\n\t\tconst result = (async () => fn(...args))();\n\n\t\tresolve(result);\n\n\t\ttry {\n\t\t\tawait result;\n\t\t} catch {}\n\n\t\tnext();\n\t};\n\n\tconst enqueue = (fn, resolve, args) => {\n\t\tqueue.enqueue(run.bind(undefined, fn, resolve, args));\n\n\t\t(async () => {\n\t\t\t// This function needs to wait until the next microtask before comparing\n\t\t\t// `activeCount` to `concurrency`, because `activeCount` is updated asynchronously\n\t\t\t// when the run function is dequeued and called. The comparison in the if-statement\n\t\t\t// needs to happen asynchronously as well to get an up-to-date value for `activeCount`.\n\t\t\tawait Promise.resolve();\n\n\t\t\tif (activeCount < concurrency && queue.size > 0) {\n\t\t\t\tqueue.dequeue()();\n\t\t\t}\n\t\t})();\n\t};\n\n\tconst generator = (fn, ...args) => new Promise(resolve => {\n\t\tenqueue(fn, resolve, args);\n\t});\n\n\tObject.defineProperties(generator, {\n\t\tactiveCount: {\n\t\t\tget: () => activeCount,\n\t\t},\n\t\tpendingCount: {\n\t\t\tget: () => queue.size,\n\t\t},\n\t\tclearQueue: {\n\t\t\tvalue: () => {\n\t\t\t\tqueue.clear();\n\t\t\t},\n\t\t},\n\t});\n\n\treturn generator;\n}\n","import pLimit from 'p-limit';\n\nclass EndError extends Error {\n\tconstructor(value) {\n\t\tsuper();\n\t\tthis.value = value;\n\t}\n}\n\n// The input can also be a promise, so we await it.\nconst testElement = async (element, tester) => tester(await element);\n\n// The input can also be a promise, so we `Promise.all()` them both.\nconst finder = async element => {\n\tconst values = await Promise.all(element);\n\tif (values[1] === true) {\n\t\tthrow new EndError(values[0]);\n\t}\n\n\treturn false;\n};\n\nexport default async function pLocate(\n\titerable,\n\ttester,\n\t{\n\t\tconcurrency = Number.POSITIVE_INFINITY,\n\t\tpreserveOrder = true,\n\t} = {},\n) {\n\tconst limit = pLimit(concurrency);\n\n\t// Start all the promises concurrently with optional limit.\n\tconst items = [...iterable].map(element => [element, limit(testElement, element, tester)]);\n\n\t// Check the promises either serially or concurrently.\n\tconst checkLimit = pLimit(preserveOrder ? 1 : Number.POSITIVE_INFINITY);\n\n\ttry {\n\t\tawait Promise.all(items.map(element => checkLimit(finder, element)));\n\t} catch (error) {\n\t\tif (error instanceof EndError) {\n\t\t\treturn error.value;\n\t\t}\n\n\t\tthrow error;\n\t}\n}\n","import process from 'node:process';\nimport path from 'node:path';\nimport fs, {promises as fsPromises} from 'node:fs';\nimport {fileURLToPath} from 'node:url';\nimport pLocate from 'p-locate';\n\nconst typeMappings = {\n\tdirectory: 'isDirectory',\n\tfile: 'isFile',\n};\n\nfunction checkType(type) {\n\tif (Object.hasOwnProperty.call(typeMappings, type)) {\n\t\treturn;\n\t}\n\n\tthrow new Error(`Invalid type specified: ${type}`);\n}\n\nconst matchType = (type, stat) => stat[typeMappings[type]]();\n\nconst toPath = urlOrPath => urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n\nexport async function locatePath(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t\tconcurrency,\n\t\tpreserveOrder,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fsPromises.stat : fsPromises.lstat;\n\n\treturn pLocate(paths, async path_ => {\n\t\ttry {\n\t\t\tconst stat = await statFunction(path.resolve(cwd, path_));\n\t\t\treturn matchType(type, stat);\n\t\t} catch {\n\t\t\treturn false;\n\t\t}\n\t}, {concurrency, preserveOrder});\n}\n\nexport function locatePathSync(\n\tpaths,\n\t{\n\t\tcwd = process.cwd(),\n\t\ttype = 'file',\n\t\tallowSymlinks = true,\n\t} = {},\n) {\n\tcheckType(type);\n\tcwd = toPath(cwd);\n\n\tconst statFunction = allowSymlinks ? fs.statSync : fs.lstatSync;\n\n\tfor (const path_ of paths) {\n\t\ttry {\n\t\t\tconst stat = statFunction(path.resolve(cwd, path_), {\n\t\t\t\tthrowIfNoEntry: false,\n\t\t\t});\n\n\t\t\tif (!stat) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (matchType(type, stat)) {\n\t\t\t\treturn path_;\n\t\t\t}\n\t\t} catch {}\n\t}\n}\n","import {fileURLToPath} from 'node:url';\n\nexport function toPath(urlOrPath) {\n\treturn urlOrPath instanceof URL ? fileURLToPath(urlOrPath) : urlOrPath;\n}\n\nexport * from './default.js';\n","import path from 'node:path';\nimport {locatePath, locatePathSync} from 'locate-path';\nimport {toPath} from 'unicorn-magic';\n\nexport const findUpStop = Symbol('findUpStop');\n\nexport async function findUpMultiple(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt ?? root));\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = async locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePath(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = await name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePath([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\t// eslint-disable-next-line no-await-in-loop\n\t\tconst foundPath = await runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport function findUpMultipleSync(name, options = {}) {\n\tlet directory = path.resolve(toPath(options.cwd) ?? '');\n\tconst {root} = path.parse(directory);\n\tconst stopAt = path.resolve(directory, toPath(options.stopAt) ?? root);\n\tconst limit = options.limit ?? Number.POSITIVE_INFINITY;\n\tconst paths = [name].flat();\n\n\tconst runMatcher = locateOptions => {\n\t\tif (typeof name !== 'function') {\n\t\t\treturn locatePathSync(paths, locateOptions);\n\t\t}\n\n\t\tconst foundPath = name(locateOptions.cwd);\n\t\tif (typeof foundPath === 'string') {\n\t\t\treturn locatePathSync([foundPath], locateOptions);\n\t\t}\n\n\t\treturn foundPath;\n\t};\n\n\tconst matches = [];\n\t// eslint-disable-next-line no-constant-condition\n\twhile (true) {\n\t\tconst foundPath = runMatcher({...options, cwd: directory});\n\n\t\tif (foundPath === findUpStop) {\n\t\t\tbreak;\n\t\t}\n\n\t\tif (foundPath) {\n\t\t\tmatches.push(path.resolve(directory, foundPath));\n\t\t}\n\n\t\tif (directory === stopAt || matches.length >= limit) {\n\t\t\tbreak;\n\t\t}\n\n\t\tdirectory = path.dirname(directory);\n\t}\n\n\treturn matches;\n}\n\nexport async function findUp(name, options = {}) {\n\tconst matches = await findUpMultiple(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport function findUpSync(name, options = {}) {\n\tconst matches = findUpMultipleSync(name, {...options, limit: 1});\n\treturn matches[0];\n}\n\nexport {\n\tpathExists,\n\tpathExistsSync,\n} from 'path-exists';\n","import mod from 'node:module'\nimport os from 'node:os'\nimport { pathToFileURL } from 'node:url'\n\nimport { findUp, findUpSync } from 'find-up'\nimport { coerce, satisfies } from 'semver'\n\nimport { read, readSync } from './fs/index.ts'\n\ntype PackageJSON = {\n  dependencies?: Record<string, string>\n  devDependencies?: Record<string, string>\n}\n\ntype DependencyName = string\n\ntype DependencyVersion = string\n\nexport class PackageManager {\n  static #cache: Record<DependencyName, DependencyVersion> = {}\n\n  #cwd?: string\n  #SLASHES = new Set(['/', '\\\\'])\n  constructor(workspace?: string) {\n    if (workspace) {\n      this.#cwd = workspace\n    }\n\n    return this\n  }\n\n  set workspace(workspace: string) {\n    this.#cwd = workspace\n  }\n\n  get workspace(): string | undefined {\n    return this.#cwd\n  }\n\n  normalizeDirectory(directory: string): string {\n    if (!this.#SLASHES.has(directory[directory.length - 1]!)) {\n      return `${directory}/`\n    }\n\n    return directory\n  }\n\n  getLocation(path: string): string {\n    let location = path\n\n    if (this.#cwd) {\n      const require = mod.createRequire(this.normalizeDirectory(this.#cwd))\n      location = require.resolve(path)\n    }\n\n    return location\n  }\n\n  async import(path: string): Promise<any | undefined> {\n    try {\n      let location = this.getLocation(path)\n\n      if (os.platform() === 'win32') {\n        location = pathToFileURL(location).href\n      }\n\n      const module = await import(location)\n\n      return module?.default ?? module\n    } catch (e) {\n      console.error(e)\n      return undefined\n    }\n  }\n\n  async getPackageJSON(): Promise<PackageJSON | undefined> {\n    const pkgPath = await findUp(['package.json'], {\n      cwd: this.#cwd,\n    })\n    if (!pkgPath) {\n      return undefined\n    }\n\n    const json = await read(pkgPath)\n\n    return JSON.parse(json) as PackageJSON\n  }\n\n  getPackageJSONSync(): PackageJSON | undefined {\n    const pkgPath = findUpSync(['package.json'], {\n      cwd: this.#cwd,\n    })\n    if (!pkgPath) {\n      return undefined\n    }\n\n    const json = readSync(pkgPath)\n\n    return JSON.parse(json) as PackageJSON\n  }\n\n  static setVersion(dependency: DependencyName, version: DependencyVersion): void {\n    PackageManager.#cache[dependency] = version\n  }\n\n  #match(packageJSON: PackageJSON, dependency: DependencyName | RegExp): string | undefined {\n    const dependencies = {\n      ...(packageJSON['dependencies'] || {}),\n      ...(packageJSON['devDependencies'] || {}),\n    }\n\n    if (typeof dependency === 'string' && dependencies[dependency]) {\n      return dependencies[dependency]\n    }\n\n    const matchedDependency = Object.keys(dependencies).find((dep) => dep.match(dependency))\n\n    return matchedDependency ? dependencies[matchedDependency] : undefined\n  }\n\n  async getVersion(dependency: DependencyName | RegExp): Promise<DependencyVersion | undefined> {\n    if (typeof dependency === 'string' && PackageManager.#cache[dependency]) {\n      return PackageManager.#cache[dependency]\n    }\n\n    const packageJSON = await this.getPackageJSON()\n\n    if (!packageJSON) {\n      return undefined\n    }\n\n    return this.#match(packageJSON, dependency)\n  }\n\n  getVersionSync(dependency: DependencyName | RegExp): DependencyVersion | undefined {\n    if (typeof dependency === 'string' && PackageManager.#cache[dependency]) {\n      return PackageManager.#cache[dependency]\n    }\n\n    const packageJSON = this.getPackageJSONSync()\n\n    if (!packageJSON) {\n      return undefined\n    }\n\n    return this.#match(packageJSON, dependency)\n  }\n\n  async isValid(dependency: DependencyName | RegExp, version: DependencyVersion): Promise<boolean> {\n    const packageVersion = await this.getVersion(dependency)\n\n    if (!packageVersion) {\n      return false\n    }\n\n    if (packageVersion === version) {\n      return true\n    }\n\n    const semVer = coerce(packageVersion)\n\n    if (!semVer) {\n      throw new Error(`${packageVersion} is not valid`)\n    }\n\n    return satisfies(semVer, version)\n  }\n  isValidSync(dependency: DependencyName | RegExp, version: DependencyVersion): boolean {\n    const packageVersion = this.getVersionSync(dependency)\n\n    if (!packageVersion) {\n      return false\n    }\n\n    if (version === 'next' && packageVersion === version) {\n      return true\n    }\n\n    const semVer = coerce(packageVersion)\n\n    if (!semVer) {\n      return false\n    }\n\n    return satisfies(semVer, version)\n  }\n}\n"],"x_google_ignoreList":[7,8,9,10,11],"mappings":"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"}