UNPKG

43.1 kBSource Map (JSON)View Raw
1{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import fixturify from 'fixturify';\nimport tmp from 'tmp';\nimport fs from 'fs-extra';\nimport path from 'path';\nimport resolvePackagePath from 'resolve-package-path';\nimport CacheGroup from 'resolve-package-path/lib/cache-group.js';\nimport binLinks from 'bin-links';\nimport { PackageJson as BasePackageJson } from 'type-fest';\nimport walkSync from 'walk-sync';\nimport deepmerge from 'deepmerge';\nimport { findWorkspaceDir } from '@pnpm/find-workspace-dir';\nimport { findWorkspacePackages } from '@pnpm/workspace.find-packages';\nimport { packlist } from '@pnpm/fs.packlist';\nimport { PackageCache } from '@embroider/shared-internals';\n\n// we also allow adding arbitrary key/value pairs to a PackageJson\ntype PackageJson = BasePackageJson & Record<string, any>;\ntype ProjectCallback = (project: Project) => void;\n\ninterface ReadDirOpts {\n linkDeps?: boolean;\n linkDevDeps?: boolean;\n}\n\nexport interface ProjectArgs {\n name?: string;\n version?: string;\n files?: fixturify.DirJSON;\n requestedRange?: string;\n}\n\ntmp.setGracefulCleanup();\n\nconst defaultFiles = {\n 'index.js': `\n 'use strict';\n module.exports = {};`,\n};\n\nexport class Project {\n pkg: PackageJson;\n files: fixturify.DirJSON;\n readonly isDependency = true;\n\n private _dependencies: { [name: string]: Project } = {};\n private _devDependencies: { [name: string]: Project } = {};\n private _baseDir: string | undefined;\n private _tmp: tmp.SynchrounousResult | undefined;\n // when used as a dependency in another Project, this is the semver range it\n // will appear as within the parent's package.json\n private requestedRange: string;\n private dependencyLinks: Map<string, LinkParams> = new Map();\n private linkIsDevDependency: Set<string> = new Set();\n private usingHardLinks = true;\n // we keep our own package resolution cache because the default global one\n // could get polluted by us resolving test-specific things that will change on\n // subsequent tests.\n private resolutionCache = new CacheGroup();\n\n constructor(\n name?: string,\n version?: string,\n args?: Omit<ProjectArgs, 'name' | 'version'>,\n projectCallback?: ProjectCallback\n );\n constructor(name?: string, version?: string, args?: Omit<ProjectArgs, 'name' | 'version'>);\n constructor(name?: string, version?: string, projectCallback?: ProjectCallback);\n constructor(name?: string, args?: Omit<ProjectArgs, 'name'>, projectCallback?: ProjectCallback);\n constructor(args?: ProjectArgs, projectCallback?: ProjectCallback);\n /**\n * @constructor Project\n *\n */\n constructor(\n first?: string | ProjectArgs,\n second?: string | Omit<ProjectArgs, 'name'> | ProjectCallback,\n third?: Omit<ProjectArgs, 'name' | 'version'> | ProjectCallback,\n fourth?: ProjectCallback\n ) {\n let name: string | undefined;\n let version: string | undefined;\n let files: fixturify.DirJSON | undefined;\n let requestedRange: string | undefined;\n if (first == null) {\n // all optional args stay undefined\n } else if (typeof first === 'string') {\n name = first;\n if (typeof second === 'string') {\n version = second;\n if (third) {\n if (!isProjectCallback(third)) {\n ({ files, requestedRange } = third);\n }\n }\n } else {\n if (second) {\n if (!isProjectCallback(second)) {\n ({ version, files, requestedRange } = second);\n }\n }\n }\n } else {\n ({ name, version, files, requestedRange } = first);\n }\n\n let pkg: PackageJson = {};\n\n if (files && typeof files?.['package.json'] === 'string') {\n pkg = JSON.parse(files['package.json']);\n files = deepmerge({}, files);\n delete files['package.json'];\n }\n\n this.pkg = Object.assign({}, pkg, {\n name: name || pkg.name || 'a-fixturified-project',\n version: version || pkg.version || '0.0.0',\n keywords: pkg.keywords || [],\n });\n if (files) {\n this.files = deepmerge({}, { ...defaultFiles, ...files });\n } else {\n this.files = deepmerge({}, defaultFiles);\n }\n this.requestedRange = requestedRange || this.pkg.version!;\n\n const arity = arguments.length;\n if (arity > 1) {\n fourth;\n const projectCallback = arguments[arity - 1];\n if (isProjectCallback(projectCallback)) {\n projectCallback(this);\n }\n }\n }\n\n /**\n * Sets the base directory of the project.\n *\n * @memberof Project\n * @param dir - The directory path.\n */\n set baseDir(dir: string) {\n if (this._baseDir) {\n throw new Error(`this Project already has a baseDir`);\n }\n this._baseDir = dir;\n }\n\n /**\n * Gets the base directory path, usually a tmp directory unless a baseDir has been explicitly set.\n *\n * @readonly\n * @memberof Project\n */\n get baseDir() {\n if (!this._baseDir) {\n this._tmp = tmp.dirSync({ unsafeCleanup: true });\n this._baseDir = fs.realpathSync(this._tmp.name);\n }\n return this._baseDir;\n }\n\n /**\n * Gets the package name from the package.json.\n *\n * @type {string}\n * @memberof Project\n */\n get name(): string {\n return getPackageName(this.pkg);\n }\n\n /**\n * Sets the package name in the package.json.\n *\n * @memberof Project\n */\n set name(value: string) {\n this.pkg.name = value;\n }\n\n /**\n * Gets the version number from the package.json.\n *\n * @type {string}\n * @memberof Project\n */\n get version(): string {\n return getPackageVersion(this.pkg);\n }\n\n /**\n * Sets the version number in the package.json.\n *\n * @memberof Project\n */\n set version(value: string) {\n this.pkg.version = value;\n }\n\n /**\n * Reads an existing project from the specified base dir.\n *\n * @param baseDir - The base directory to read the project from.\n * @param opts - An options object.\n * @param opts.linkDeps - Include linking dependencies from the Project's node_modules.\n * @param opts.linkDevDeps - Include linking devDependencies from the Project's node_modules.\n * @returns - The deserialized Project.\n */\n static fromDir(baseDir: string, opts?: ReadDirOpts): Project {\n let project = new Project();\n project.readSync(baseDir, opts);\n return project;\n }\n\n /**\n * Merges an object containing a directory represention with the existing files.\n *\n * @param dirJSON - An object containing a directory representation to merge.\n */\n mergeFiles(dirJSON: fixturify.DirJSON) {\n this.files = deepmerge(this.files, dirJSON);\n }\n\n /**\n * Writes the existing files property containing a directory representation to the tmp directory.\n *\n * @param dirJSON? - An optional object containing a directory representation to write.\n */\n async write(dirJSON?: fixturify.DirJSON): Promise<void> {\n if (dirJSON) {\n this.mergeFiles(dirJSON);\n }\n\n await this.writeProject();\n await this.binLinks();\n }\n\n addDependency(\n name?: string,\n version?: string,\n args?: Omit<ProjectArgs, 'name' | 'version'>,\n projectCallback?: ProjectCallback\n ): Project;\n addDependency(name?: string, version?: string, projectCallback?: ProjectCallback): Project;\n addDependency(name?: string, args?: Omit<ProjectArgs, 'name'>, projectCallback?: ProjectCallback): Project;\n addDependency(args?: ProjectArgs, projectCallback?: ProjectCallback): Project;\n addDependency(args?: Project, projectCallback?: ProjectCallback): Project;\n /**\n * Adds a dependency to the Project's package.json.\n *\n * @returns - The Project instance.\n */\n addDependency(\n first?: string | ProjectArgs | Project,\n second?: string | Omit<ProjectArgs, 'name'> | ProjectCallback,\n third?: Omit<ProjectArgs, 'name' | 'version'> | ProjectCallback,\n fourth?: ProjectCallback\n ): Project {\n let projectCallback;\n\n const arity = arguments.length;\n if (arity > 1) {\n fourth;\n const maybeProjectCallback = arguments[arity - 1];\n if (isProjectCallback(maybeProjectCallback)) {\n projectCallback = maybeProjectCallback;\n }\n }\n\n if (isProjectCallback(second)) {\n second = undefined;\n }\n if (isProjectCallback(third)) {\n third = undefined;\n }\n\n return this.addDep(first, second, third, '_dependencies', projectCallback);\n }\n\n /**\n * Adds a devDependency to the Project's package.json.\n *\n * @returns - The Project instance.\n */\n addDevDependency(\n name?: string,\n version?: string,\n args?: Omit<ProjectArgs, 'name' | 'version'>,\n projectCallback?: ProjectCallback\n ): Project;\n addDevDependency(name?: string, version?: string, projectCallback?: ProjectCallback): Project;\n addDevDependency(name?: string, args?: Omit<ProjectArgs, 'name'>, projectCallback?: ProjectCallback): Project;\n addDevDependency(args?: ProjectArgs, projectCallback?: ProjectCallback): Project;\n addDevDependency(args?: Project, projectCallback?: ProjectCallback): Project;\n addDevDependency(\n first?: string | ProjectArgs | Project,\n second?: string | Omit<ProjectArgs, 'name'> | ProjectCallback,\n third?: Omit<ProjectArgs, 'name' | 'version'> | ProjectCallback,\n fourth?: ProjectCallback\n ): Project {\n let projectCallback;\n\n const arity = arguments.length;\n if (arity > 1) {\n fourth;\n const maybeProjectCallback = arguments[arity - 1];\n if (isProjectCallback(maybeProjectCallback)) {\n projectCallback = maybeProjectCallback;\n }\n }\n\n if (isProjectCallback(second)) {\n second = undefined;\n }\n if (isProjectCallback(third)) {\n third = undefined;\n }\n\n return this.addDep(first, second, third, '_devDependencies', projectCallback);\n }\n\n /**\n * Removes a dependency to the Project's package.json.\n *\n * @param name - The name of the dependency to remove.\n */\n removeDependency(name: string) {\n delete this._dependencies[name];\n this.dependencyLinks.delete(name);\n this.linkIsDevDependency.delete(name);\n }\n\n /**\n * Removes a devDependency.\n *\n * @param name - The name of the devDependency to remove.\n */\n removeDevDependency(name: string) {\n delete this._devDependencies[name];\n this.dependencyLinks.delete(name);\n this.linkIsDevDependency.delete(name);\n }\n\n /**\n * Links a dependency.\n *\n * @param name - The name of the dependency to link.\n */\n linkDependency(name: string, opts: LinkParams): void {\n this.removeDependency(name);\n this.removeDevDependency(name);\n this.dependencyLinks.set(name, opts);\n }\n\n /**\n * Links a devDependency.\n *\n * @param name - The name of the dependency to link.\n */\n linkDevDependency(name: string, opts: LinkParams) {\n this.linkDependency(name, opts);\n this.linkIsDevDependency.add(name);\n }\n\n /**\n * @returns - An array of the dependencies for this Projct.\n */\n dependencyProjects() {\n return Object.keys(this._dependencies).map(dependency => this._dependencies[dependency]);\n }\n\n /**\n * @returns - An array of the devDependencies for this Projct.\n */\n devDependencyProjects() {\n return Object.keys(this._devDependencies).map(dependency => this._devDependencies[dependency]);\n }\n\n /**\n * @returns - The cloned Project.\n */\n clone(): Project {\n let cloned: Project = new (this.constructor as typeof Project)();\n cloned.pkg = JSON.parse(JSON.stringify(this.pkg));\n cloned.files = JSON.parse(JSON.stringify(this.files));\n for (let [name, depProject] of Object.entries(this._dependencies)) {\n cloned._dependencies[name] = depProject.clone();\n }\n for (let [name, depProject] of Object.entries(this._devDependencies)) {\n cloned._devDependencies[name] = depProject.clone();\n }\n cloned.dependencyLinks = new Map(this.dependencyLinks);\n cloned.linkIsDevDependency = new Set(this.linkIsDevDependency);\n cloned.requestedRange = this.requestedRange;\n return cloned;\n }\n\n /**\n * Disposes of the tmp directory that the Project is stored in.\n */\n dispose() {\n if (this._tmp) {\n this._tmp.removeCallback();\n }\n }\n\n private async writeProject() {\n // this recurses through all our dependent Projects in three phases\n\n // first every package gets assigned its base dir\n this.assignBaseDirs();\n\n let resolvedLinksMap = new Map();\n\n await this.discoverWorkspaces();\n\n // then we write out all the files, including their package.jsons. Since the\n // requeste ranges of the dependencies in package.json default to the actual\n // discovered dependencies, this step also resolves dependencies.\n this.writeFiles(resolvedLinksMap);\n\n // only after all the files are in place for Projects that we are creating\n // do we handle creating symlinks and/or hard links to existing packages and\n // between Projects.\n await this.finalizeWrite(resolvedLinksMap);\n }\n\n private assignBaseDirs() {\n this.baseDir;\n for (let depList of [this.dependencyProjects(), this.devDependencyProjects()]) {\n for (let dep of depList) {\n dep.baseDir = path.join(this.baseDir, 'node_modules', dep.name);\n dep.assignBaseDirs();\n }\n }\n }\n\n private writeFiles(resolvedLinksMap: Map<Project, ResolvedLinks>) {\n fixturify.writeSync(this.baseDir, this.files);\n for (let depList of [this.dependencyProjects(), this.devDependencyProjects()]) {\n for (let dep of depList) {\n dep.writeFiles(resolvedLinksMap);\n }\n }\n let resolvedLinks = this.resolveLinks();\n fs.outputJSONSync(path.join(this.baseDir, 'package.json'), this.pkgJSONWithDeps(resolvedLinks), { spaces: 2 });\n resolvedLinksMap.set(this, resolvedLinks);\n }\n\n private async finalizeWrite(resolvedLinksMap: Map<Project, ResolvedLinks>) {\n for (let [name, { dir: target }] of resolvedLinksMap.get(this)!) {\n await this.writeLinkedPackage(name, target, path.join(this.baseDir, 'node_modules', name));\n }\n for (let depList of [this.dependencyProjects(), this.devDependencyProjects()]) {\n for (let dep of depList) {\n await dep.finalizeWrite(resolvedLinksMap);\n }\n }\n }\n\n private resolveLinks(): ResolvedLinks {\n return new Map(\n [...this.dependencyLinks.entries()].map(([name, opts]) => {\n let dir: string;\n if ('baseDir' in opts) {\n let pkgJSONPath = resolvePackagePath(opts.resolveName || name, opts.baseDir, this.resolutionCache);\n if (!pkgJSONPath) {\n throw new Error(`failed to locate ${opts.resolveName || name} in ${opts.baseDir}`);\n }\n dir = path.dirname(pkgJSONPath);\n } else if ('target' in opts) {\n dir = opts.target;\n } else {\n dir = opts.project.baseDir;\n }\n\n let requestedRange: string;\n if (opts.requestedRange) {\n requestedRange = opts.requestedRange;\n } else if ('target' in opts || 'baseDir' in opts) {\n requestedRange = fs.readJsonSync(path.join(dir, 'package.json')).version;\n } else {\n requestedRange = opts.project.version;\n }\n\n return [name, { requestedRange, dir }];\n })\n );\n }\n\n private async binLinks() {\n let nodeModules = path.join(this.baseDir, 'node_modules');\n for (const { pkg, path } of readPackages(nodeModules)) {\n await binLinks({ pkg, path, top: false, global: false, force: true });\n }\n }\n\n private transitivePeersCache = new Map<string, Set<string>>();\n\n private transitivePeers(dir: string): Set<string> {\n let peers = this.transitivePeersCache.get(dir);\n if (peers) {\n return peers;\n }\n\n peers = new Set<string>();\n // we prefill the cache before recursing so that we never get trapped in a\n // cycle.\n this.transitivePeersCache.set(dir, peers);\n\n let pkg = PackageCache.shared('fixturify-project', this.baseDir).get(dir);\n let deps = pkg.dependencies;\n\n for (let dep of deps) {\n if (pkg.categorizeDependency(dep.name) === 'dependencies') {\n for (let peer of this.transitivePeers(dep.root)) {\n if (pkg.hasDependency(peer)) {\n // we satisfied our dep's peer requirement, either with a\n // non-peer-dep (in which case it's definitely not in our\n // transitivePeers) or with our own peerDep (in which case it will\n // end up handled below when we look at our own peerDeps)\n } else {\n // dep has a peer requirement that we don't satsify, so that makes\n // it part of our own transitivePeers.\n peers.add(peer);\n }\n }\n }\n }\n\n for (let dep of deps) {\n if (pkg.categorizeDependency(dep.name) === 'peerDependencies') {\n // our own direct peer deps are also part of our transitive peers\n peers.add(dep.name);\n }\n }\n return peers;\n }\n\n private async writeLinkedPackage(name: string, target: string, destination: string) {\n let targetPkg = fs.readJsonSync(`${target}/package.json`);\n let peers = this.transitivePeers(target);\n\n if (peers.size === 0) {\n // no peerDeps, so we can just symlink the whole package\n fs.ensureSymlinkSync(target, destination, 'dir');\n return;\n }\n\n // need to reproduce the package structure in our own location\n await this.hardLinkContents(target, targetPkg, destination);\n\n // This Set deduplicates things that happen to appear in both dependencies\n // and peerDependencies so that we don't try to link the same dep twice,\n // causing EEXIST failures.\n let depsToLink = new Set<string>();\n\n for (let section of ['dependencies', 'peerDependencies']) {\n if (targetPkg[section]) {\n for (let depName of Object.keys(targetPkg[section])) {\n if (peers.has(depName)) {\n continue;\n }\n depsToLink.add(depName);\n }\n }\n }\n\n for (let depName of depsToLink) {\n let depTarget = resolvePackagePath(depName, target, this.resolutionCache);\n if (!depTarget) {\n throw new Error(\n `[FixturifyProject] package ${name} in ${target} depends on ${depName} but we could not resolve it`\n );\n }\n await this.writeLinkedPackage(depName, path.dirname(depTarget), path.join(destination, 'node_modules', depName));\n }\n }\n\n private knownWorkspaces: Map<string, boolean> = new Map();\n\n private async discoverWorkspaces(): Promise<void> {\n for (let opts of this.dependencyLinks.values()) {\n if (!('baseDir' in opts)) {\n continue;\n }\n let dir = opts.baseDir;\n if (this.knownWorkspaces.has(dir)) {\n continue;\n }\n let top = await findWorkspaceDir(dir);\n if (top) {\n let packages = await findWorkspacePackages(top);\n for (let { dir } of packages) {\n this.knownWorkspaces.set(dir, true);\n }\n if (!this.knownWorkspaces.has(dir)) {\n // the dir is not itself one of the workspace packages but was nested\n // within the monorepo. We don't need to recheck it, so make sure it\n // goes into the map.\n this.knownWorkspaces.set(dir, false);\n }\n } else {\n this.knownWorkspaces.set(dir, false);\n }\n }\n }\n\n private async publishedPackageContents(packageDir: string, pkgJSON: any): Promise<string[]> {\n if (this.knownWorkspaces.get(packageDir)) {\n // when we know that a package is under development, we determine its\n // files the same way \"pnpm pack\" would.\n return await packlist(packageDir, { packageJsonCache: { packageDir: pkgJSON } });\n }\n // when it's not under development (it was installed by the package\n // manager), we can't really use \"pnpm pack\", because the inputs to that\n // process include files that are not necessarily themselves packed. But we\n // also don't need to, because what we see on disk is necessarily the\n // published contents already.\n return walkSync(packageDir, { directories: false, ignore: ['node_modules'] });\n }\n\n private async hardLinkContents(source: string, pkgJSON: any, destination: string) {\n fs.ensureDirSync(destination);\n for (let relativePath of await this.publishedPackageContents(source, pkgJSON)) {\n fs.ensureDirSync(path.dirname(path.join(destination, relativePath)));\n this.hardLinkFile(path.join(source, relativePath), path.join(destination, relativePath));\n }\n }\n\n private hardLinkFile(source: string, destination: string) {\n if (this.usingHardLinks) {\n try {\n fs.linkSync(source, destination);\n return;\n } catch (err: any) {\n if (err.code === 'EEXIST') {\n debugger;\n }\n if (err.code !== 'EXDEV') {\n throw err;\n }\n this.usingHardLinks = false;\n }\n }\n fs.copyFileSync(source, destination, fs.constants.COPYFILE_FICLONE | fs.constants.COPYFILE_EXCL);\n }\n\n private readSync(baseDir: string, opts?: ReadDirOpts): void {\n const files = fixturify.readSync(baseDir, {\n // when linking deps, we don't need to crawl all of node_modules\n ignore: opts?.linkDeps || opts?.linkDevDeps ? ['node_modules'] : [],\n });\n\n this.pkg = deserializePackageJson(getFile(files, 'package.json'));\n this.requestedRange = this.version;\n delete files['package.json'];\n this.files = files;\n\n if (opts?.linkDeps || opts?.linkDevDeps) {\n if (this.pkg.dependencies) {\n for (let dep of Object.keys(this.pkg.dependencies)) {\n this.linkDependency(dep, { baseDir });\n }\n }\n if (this.pkg.devDependencies && opts.linkDevDeps) {\n for (let dep of Object.keys(this.pkg.devDependencies)) {\n this.linkDevDependency(dep, { baseDir });\n }\n }\n } else {\n const nodeModules = getFolder(files, 'node_modules');\n delete files['node_modules'];\n keys(this.pkg.dependencies).forEach(dependency => {\n this.addDependency(\n new (this.constructor as typeof Project)({ files: unwrapPackageName(nodeModules, dependency) })\n );\n });\n keys(this.pkg.devDependencies).forEach(dependency => {\n this.addDevDependency(\n new (this.constructor as typeof Project)({ files: unwrapPackageName(nodeModules, dependency) })\n );\n });\n }\n }\n\n private addDep(\n first: string | ProjectArgs | Project | undefined,\n second: string | Omit<ProjectArgs, 'name'> | undefined,\n third: Omit<ProjectArgs, 'name' | 'version'> | undefined,\n target: '_dependencies' | '_devDependencies',\n projectCallback?: ProjectCallback\n ): Project {\n let dep;\n if (first == null) {\n dep = new Project();\n } else if (typeof first === 'string') {\n let name = first;\n if (typeof second === 'string') {\n let version = second;\n dep = new Project(name, version, third, projectCallback);\n } else {\n dep = new Project(name, second, projectCallback);\n }\n } else if ('isDependency' in first) {\n dep = first;\n } else {\n dep = new Project(first, projectCallback);\n }\n\n this[target][dep.name] = dep;\n this.dependencyLinks.delete(dep.name);\n this.linkIsDevDependency.delete(dep.name);\n\n if (isProjectCallback(projectCallback)) {\n projectCallback(dep);\n }\n return dep;\n }\n\n private pkgJSONWithDeps(resolvedLinks: Map<string, { requestedRange: string; dir: string }>): PackageJson {\n let dependencies = this.depsToObject(this.dependencyProjects());\n let devDependencies = this.depsToObject(this.devDependencyProjects());\n for (let [name, { requestedRange }] of resolvedLinks) {\n if (requestedRange === undefined) {\n throw new Error(\n `No version found for package ${name}. All dependencies must have both a name and version in their package.json.`\n );\n }\n if (this.linkIsDevDependency.has(name)) {\n devDependencies[name] = requestedRange;\n } else {\n dependencies[name] = requestedRange;\n }\n }\n return Object.assign(this.pkg, {\n dependencies,\n devDependencies,\n });\n }\n\n private depsToObject(deps: Project[]) {\n let obj: { [name: string]: string } = {};\n deps.forEach(dep => (obj[dep.name] = dep.requestedRange));\n return obj;\n }\n}\n\nfunction deserializePackageJson(serialized: string): PackageJson {\n return JSON.parse(serialized);\n}\n\nfunction keys(object: any) {\n if (object !== null && (typeof object === 'object' || Array.isArray(object))) {\n return Object.keys(object);\n } else {\n return [];\n }\n}\n\nfunction isProjectCallback(maybe: ProjectCallback | any): maybe is ProjectCallback {\n return typeof maybe === 'function';\n}\n\nfunction getString<Obj extends Object, KeyOfObj extends keyof Obj>(\n obj: Obj,\n propertyName: KeyOfObj,\n errorMessage?: string\n): string {\n const value = obj[propertyName];\n if (typeof value === 'string') {\n return value;\n } else {\n throw new TypeError(errorMessage || `expected 'string' but got '${typeof value}'`);\n }\n}\n\nfunction getFile<Dir extends fixturify.DirJSON, FileName extends keyof Dir>(dir: Dir, fileName: FileName): string {\n const value = dir[fileName];\n if (typeof value === 'string') {\n return value;\n } else if (typeof value === 'object' && value !== null) {\n throw new TypeError(`Expected a file for name '${String(fileName)}' but got a 'Folder'`);\n } else {\n throw new TypeError(`Expected a file for name '${String(fileName)}' but got '${typeof value}'`);\n }\n}\n\nfunction getFolder<Dir extends fixturify.DirJSON, FileName extends keyof Dir>(\n dir: Dir,\n fileName: FileName\n): fixturify.DirJSON {\n const value = dir[fileName];\n\n if (isDirJSON(value)) {\n return value;\n } else if (typeof value === 'string') {\n throw new TypeError(`Expected a file for name '${String(fileName)}' but got 'File'`);\n } else {\n throw new TypeError(`Expected a folder for name '${String(fileName)}' but got '${typeof value}'`);\n }\n}\n\nfunction isDirJSON(value: any): value is fixturify.DirJSON {\n return typeof value === 'object' && value !== null;\n}\n\nfunction getPackageName(pkg: PackageJson): string {\n return getString(pkg, 'name', `package.json is missing a name.`);\n}\n\nfunction getPackageVersion(pkg: PackageJson): string {\n return getString(pkg, 'version', `${getPackageName(pkg)}'s package.json is missing a version.`);\n}\n\nfunction parseScoped(name: string) {\n let matched = name.match(/(@[^@\\/]+)\\/(.*)/);\n if (matched) {\n return {\n scope: matched[1],\n name: matched[2],\n };\n }\n return null;\n}\n\nfunction unwrapPackageName(obj: any, packageName: string): fixturify.DirJSON {\n let scoped = parseScoped(packageName);\n if (scoped) {\n return getFolder(getFolder(obj, scoped.scope), scoped.name);\n }\n return getFolder(obj, packageName);\n}\n\nfunction isObject(e: unknown): e is Object {\n return e !== null && typeof e === 'object' && !Array.isArray(e);\n}\n\nfunction isErrnoException(e: unknown): e is NodeJS.ErrnoException {\n return isObject(e) && 'code' in e;\n}\n\nfunction readString(name: string): string | undefined {\n try {\n return fs.readFileSync(name, 'utf8');\n } catch (e) {\n if (isErrnoException(e)) {\n if (e.code === 'ENOENT' || e.code === 'EISDIR') {\n return;\n }\n }\n throw e;\n }\n}\n\nfunction readdir(name: string): string[] {\n try {\n return fs.readdirSync(name);\n } catch (e) {\n if (isErrnoException(e)) {\n if (e.code === 'ENOENT' || e.code === 'ENOTDIR') {\n return [];\n }\n }\n throw e;\n }\n}\n\nfunction readPackage(dir: string | undefined): { pkg: PackageJson; path: string } | undefined {\n if (dir) {\n const fileName = path.join(dir, 'package.json');\n const content = readString(fileName);\n if (content) {\n return { pkg: deserializePackageJson(content), path: dir };\n }\n }\n return;\n}\n\nfunction readPackages(modulesPath: string): { pkg: PackageJson; path: string }[] {\n const pkgs: { pkg: PackageJson; path: string }[] = [];\n for (const name of readdir(modulesPath)) {\n if (name.startsWith('@')) {\n const scopePath = path.join(modulesPath, name);\n for (const name of readdir(scopePath)) {\n const pkg = readPackage(path.join(scopePath, name));\n if (pkg) pkgs.push(pkg);\n }\n } else {\n const pkg = readPackage(path.join(modulesPath, name));\n if (pkg) pkgs.push(pkg);\n }\n }\n return pkgs;\n}\n\nexport type LinkParams =\n | { baseDir: string; resolveName?: string; requestedRange?: string }\n | { target: string; requestedRange?: string }\n | { project: Project; requestedRange?: string };\n\ntype ResolvedLinks = Map<string, { dir: string; requestedRange: string }>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAAsB;AACtB,iBAAgB;AAChB,sBAAe;AACf,kBAAiB;AACjB,kCAA+B;AAC/B,yBAAuB;AACvB,uBAAqB;AAErB,uBAAqB;AACrB,uBAAsB;AACtB,gCAAiC;AACjC,uBAAsC;AACtC,gBAAyB;AACzB,8BAA6B;AAkB7B,WAAAA,QAAI,mBAAmB;AAEvB,IAAM,eAAe;AAAA,EACnB,YAAY;AAAA;AAAA;AAGd;AAEO,IAAM,UAAN,MAAc;AAAA,EAkCnB,YACE,OACA,QACA,OACA,QACA;AApCF,SAAS,eAAe;AAExB,SAAQ,gBAA6C,CAAC;AACtD,SAAQ,mBAAgD,CAAC;AAMzD,SAAQ,kBAA2C,oBAAI,IAAI;AAC3D,SAAQ,sBAAmC,oBAAI,IAAI;AACnD,SAAQ,iBAAiB;AAIzB,SAAQ,kBAAkB,IAAI,mBAAAC,QAAW;AAybzC,SAAQ,uBAAuB,oBAAI,IAAyB;AAkF5D,SAAQ,kBAAwC,oBAAI,IAAI;AArftD,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI;AACJ,QAAI,SAAS,MAAM;AAAA,IAEnB,WAAW,OAAO,UAAU,UAAU;AACpC,aAAO;AACP,UAAI,OAAO,WAAW,UAAU;AAC9B,kBAAU;AACV,YAAI,OAAO;AACT,cAAI,CAAC,kBAAkB,KAAK,GAAG;AAC7B,aAAC,EAAE,OAAO,eAAe,IAAI;AAAA,UAC/B;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,QAAQ;AACV,cAAI,CAAC,kBAAkB,MAAM,GAAG;AAC9B,aAAC,EAAE,SAAS,OAAO,eAAe,IAAI;AAAA,UACxC;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,OAAC,EAAE,MAAM,SAAS,OAAO,eAAe,IAAI;AAAA,IAC9C;AAEA,QAAI,MAAmB,CAAC;AAExB,QAAI,SAAS,QAAO,+BAAQ,qBAAoB,UAAU;AACxD,YAAM,KAAK,MAAM,MAAM,eAAe;AACtC,kBAAQ,iBAAAC,SAAU,CAAC,GAAG,KAAK;AAC3B,aAAO,MAAM;AAAA,IACf;AAEA,SAAK,MAAM,OAAO,OAAO,CAAC,GAAG,KAAK;AAAA,MAChC,MAAM,QAAQ,IAAI,QAAQ;AAAA,MAC1B,SAAS,WAAW,IAAI,WAAW;AAAA,MACnC,UAAU,IAAI,YAAY,CAAC;AAAA,IAC7B,CAAC;AACD,QAAI,OAAO;AACT,WAAK,YAAQ,iBAAAA,SAAU,CAAC,GAAG,EAAE,GAAG,cAAc,GAAG,MAAM,CAAC;AAAA,IAC1D,OAAO;AACL,WAAK,YAAQ,iBAAAA,SAAU,CAAC,GAAG,YAAY;AAAA,IACzC;AACA,SAAK,iBAAiB,kBAAkB,KAAK,IAAI;AAEjD,UAAM,QAAQ,UAAU;AACxB,QAAI,QAAQ,GAAG;AACb;AACA,YAAM,kBAAkB,UAAU,QAAQ;AAC1C,UAAI,kBAAkB,eAAe,GAAG;AACtC,wBAAgB,IAAI;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAAA,EAQA,IAAI,QAAQ,KAAa;AACvB,QAAI,KAAK,UAAU;AACjB,YAAM,IAAI,MAAM,oCAAoC;AAAA,IACtD;AACA,SAAK,WAAW;AAAA,EAClB;AAAA,EAQA,IAAI,UAAU;AACZ,QAAI,CAAC,KAAK,UAAU;AAClB,WAAK,OAAO,WAAAF,QAAI,QAAQ,EAAE,eAAe,KAAK,CAAC;AAC/C,WAAK,WAAW,gBAAAG,QAAG,aAAa,KAAK,KAAK,IAAI;AAAA,IAChD;AACA,WAAO,KAAK;AAAA,EACd;AAAA,EAQA,IAAI,OAAe;AACjB,WAAO,eAAe,KAAK,GAAG;AAAA,EAChC;AAAA,EAOA,IAAI,KAAK,OAAe;AACtB,SAAK,IAAI,OAAO;AAAA,EAClB;AAAA,EAQA,IAAI,UAAkB;AACpB,WAAO,kBAAkB,KAAK,GAAG;AAAA,EACnC;AAAA,EAOA,IAAI,QAAQ,OAAe;AACzB,SAAK,IAAI,UAAU;AAAA,EACrB;AAAA,EAWA,OAAO,QAAQ,SAAiB,MAA6B;AAC3D,QAAI,UAAU,IAAI,QAAQ;AAC1B,YAAQ,SAAS,SAAS,IAAI;AAC9B,WAAO;AAAA,EACT;AAAA,EAOA,WAAW,SAA4B;AACrC,SAAK,YAAQ,iBAAAD,SAAU,KAAK,OAAO,OAAO;AAAA,EAC5C;AAAA,EAOA,MAAM,MAAM,SAA4C;AACtD,QAAI,SAAS;AACX,WAAK,WAAW,OAAO;AAAA,IACzB;AAEA,UAAM,KAAK,aAAa;AACxB,UAAM,KAAK,SAAS;AAAA,EACtB;AAAA,EAiBA,cACE,OACA,QACA,OACA,QACS;AACT,QAAI;AAEJ,UAAM,QAAQ,UAAU;AACxB,QAAI,QAAQ,GAAG;AACb;AACA,YAAM,uBAAuB,UAAU,QAAQ;AAC/C,UAAI,kBAAkB,oBAAoB,GAAG;AAC3C,0BAAkB;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,kBAAkB,MAAM,GAAG;AAC7B,eAAS;AAAA,IACX;AACA,QAAI,kBAAkB,KAAK,GAAG;AAC5B,cAAQ;AAAA,IACV;AAEA,WAAO,KAAK,OAAO,OAAO,QAAQ,OAAO,iBAAiB,eAAe;AAAA,EAC3E;AAAA,EAiBA,iBACE,OACA,QACA,OACA,QACS;AACT,QAAI;AAEJ,UAAM,QAAQ,UAAU;AACxB,QAAI,QAAQ,GAAG;AACb;AACA,YAAM,uBAAuB,UAAU,QAAQ;AAC/C,UAAI,kBAAkB,oBAAoB,GAAG;AAC3C,0BAAkB;AAAA,MACpB;AAAA,IACF;AAEA,QAAI,kBAAkB,MAAM,GAAG;AAC7B,eAAS;AAAA,IACX;AACA,QAAI,kBAAkB,KAAK,GAAG;AAC5B,cAAQ;AAAA,IACV;AAEA,WAAO,KAAK,OAAO,OAAO,QAAQ,OAAO,oBAAoB,eAAe;AAAA,EAC9E;AAAA,EAOA,iBAAiB,MAAc;AAC7B,WAAO,KAAK,cAAc;AAC1B,SAAK,gBAAgB,OAAO,IAAI;AAChC,SAAK,oBAAoB,OAAO,IAAI;AAAA,EACtC;AAAA,EAOA,oBAAoB,MAAc;AAChC,WAAO,KAAK,iBAAiB;AAC7B,SAAK,gBAAgB,OAAO,IAAI;AAChC,SAAK,oBAAoB,OAAO,IAAI;AAAA,EACtC;AAAA,EAOA,eAAe,MAAc,MAAwB;AACnD,SAAK,iBAAiB,IAAI;AAC1B,SAAK,oBAAoB,IAAI;AAC7B,SAAK,gBAAgB,IAAI,MAAM,IAAI;AAAA,EACrC;AAAA,EAOA,kBAAkB,MAAc,MAAkB;AAChD,SAAK,eAAe,MAAM,IAAI;AAC9B,SAAK,oBAAoB,IAAI,IAAI;AAAA,EACnC;AAAA,EAKA,qBAAqB;AACnB,WAAO,OAAO,KAAK,KAAK,aAAa,EAAE,IAAI,gBAAc,KAAK,cAAc,WAAW;AAAA,EACzF;AAAA,EAKA,wBAAwB;AACtB,WAAO,OAAO,KAAK,KAAK,gBAAgB,EAAE,IAAI,gBAAc,KAAK,iBAAiB,WAAW;AAAA,EAC/F;AAAA,EAKA,QAAiB;AACf,QAAI,SAAkB,IAAK,KAAK,YAA+B;AAC/D,WAAO,MAAM,KAAK,MAAM,KAAK,UAAU,KAAK,GAAG,CAAC;AAChD,WAAO,QAAQ,KAAK,MAAM,KAAK,UAAU,KAAK,KAAK,CAAC;AACpD,aAAS,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK,aAAa,GAAG;AACjE,aAAO,cAAc,QAAQ,WAAW,MAAM;AAAA,IAChD;AACA,aAAS,CAAC,MAAM,UAAU,KAAK,OAAO,QAAQ,KAAK,gBAAgB,GAAG;AACpE,aAAO,iBAAiB,QAAQ,WAAW,MAAM;AAAA,IACnD;AACA,WAAO,kBAAkB,IAAI,IAAI,KAAK,eAAe;AACrD,WAAO,sBAAsB,IAAI,IAAI,KAAK,mBAAmB;AAC7D,WAAO,iBAAiB,KAAK;AAC7B,WAAO;AAAA,EACT;AAAA,EAKA,UAAU;AACR,QAAI,KAAK,MAAM;AACb,WAAK,KAAK,eAAe;AAAA,IAC3B;AAAA,EACF;AAAA,EAEA,MAAc,eAAe;AAI3B,SAAK,eAAe;AAEpB,QAAI,mBAAmB,oBAAI,IAAI;AAE/B,UAAM,KAAK,mBAAmB;AAK9B,SAAK,WAAW,gBAAgB;AAKhC,UAAM,KAAK,cAAc,gBAAgB;AAAA,EAC3C;AAAA,EAEQ,iBAAiB;AACvB,SAAK;AACL,aAAS,WAAW,CAAC,KAAK,mBAAmB,GAAG,KAAK,sBAAsB,CAAC,GAAG;AAC7E,eAAS,OAAO,SAAS;AACvB,YAAI,UAAU,YAAAE,QAAK,KAAK,KAAK,SAAS,gBAAgB,IAAI,IAAI;AAC9D,YAAI,eAAe;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,WAAW,kBAA+C;AAChE,qBAAAC,QAAU,UAAU,KAAK,SAAS,KAAK,KAAK;AAC5C,aAAS,WAAW,CAAC,KAAK,mBAAmB,GAAG,KAAK,sBAAsB,CAAC,GAAG;AAC7E,eAAS,OAAO,SAAS;AACvB,YAAI,WAAW,gBAAgB;AAAA,MACjC;AAAA,IACF;AACA,QAAI,gBAAgB,KAAK,aAAa;AACtC,oBAAAF,QAAG,eAAe,YAAAC,QAAK,KAAK,KAAK,SAAS,cAAc,GAAG,KAAK,gBAAgB,aAAa,GAAG,EAAE,QAAQ,EAAE,CAAC;AAC7G,qBAAiB,IAAI,MAAM,aAAa;AAAA,EAC1C;AAAA,EAEA,MAAc,cAAc,kBAA+C;AACzE,aAAS,CAAC,MAAM,EAAE,KAAK,OAAO,CAAC,KAAK,iBAAiB,IAAI,IAAI,GAAI;AAC/D,YAAM,KAAK,mBAAmB,MAAM,QAAQ,YAAAA,QAAK,KAAK,KAAK,SAAS,gBAAgB,IAAI,CAAC;AAAA,IAC3F;AACA,aAAS,WAAW,CAAC,KAAK,mBAAmB,GAAG,KAAK,sBAAsB,CAAC,GAAG;AAC7E,eAAS,OAAO,SAAS;AACvB,cAAM,IAAI,cAAc,gBAAgB;AAAA,MAC1C;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAA8B;AACpC,WAAO,IAAI;AAAA,MACT,CAAC,GAAG,KAAK,gBAAgB,QAAQ,CAAC,EAAE,IAAI,CAAC,CAAC,MAAM,IAAI,MAAM;AACxD,YAAI;AACJ,YAAI,aAAa,MAAM;AACrB,cAAI,kBAAc,4BAAAE,SAAmB,KAAK,eAAe,MAAM,KAAK,SAAS,KAAK,eAAe;AACjG,cAAI,CAAC,aAAa;AAChB,kBAAM,IAAI,MAAM,oBAAoB,KAAK,eAAe,WAAW,KAAK,SAAS;AAAA,UACnF;AACA,gBAAM,YAAAF,QAAK,QAAQ,WAAW;AAAA,QAChC,WAAW,YAAY,MAAM;AAC3B,gBAAM,KAAK;AAAA,QACb,OAAO;AACL,gBAAM,KAAK,QAAQ;AAAA,QACrB;AAEA,YAAI;AACJ,YAAI,KAAK,gBAAgB;AACvB,2BAAiB,KAAK;AAAA,QACxB,WAAW,YAAY,QAAQ,aAAa,MAAM;AAChD,2BAAiB,gBAAAD,QAAG,aAAa,YAAAC,QAAK,KAAK,KAAK,cAAc,CAAC,EAAE;AAAA,QACnE,OAAO;AACL,2BAAiB,KAAK,QAAQ;AAAA,QAChC;AAEA,eAAO,CAAC,MAAM,EAAE,gBAAgB,IAAI,CAAC;AAAA,MACvC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEA,MAAc,WAAW;AACvB,QAAI,cAAc,YAAAA,QAAK,KAAK,KAAK,SAAS,cAAc;AACxD,eAAW,EAAE,KAAK,MAAAA,MAAK,KAAK,aAAa,WAAW,GAAG;AACrD,gBAAM,iBAAAG,SAAS,EAAE,KAAK,MAAAH,OAAM,KAAK,OAAO,QAAQ,OAAO,OAAO,KAAK,CAAC;AAAA,IACtE;AAAA,EACF;AAAA,EAIQ,gBAAgB,KAA0B;AAChD,QAAI,QAAQ,KAAK,qBAAqB,IAAI,GAAG;AAC7C,QAAI,OAAO;AACT,aAAO;AAAA,IACT;AAEA,YAAQ,oBAAI,IAAY;AAGxB,SAAK,qBAAqB,IAAI,KAAK,KAAK;AAExC,QAAI,MAAM,qCAAa,OAAO,qBAAqB,KAAK,OAAO,EAAE,IAAI,GAAG;AACxE,QAAI,OAAO,IAAI;AAEf,aAAS,OAAO,MAAM;AACpB,UAAI,IAAI,qBAAqB,IAAI,IAAI,MAAM,gBAAgB;AACzD,iBAAS,QAAQ,KAAK,gBAAgB,IAAI,IAAI,GAAG;AAC/C,cAAI,IAAI,cAAc,IAAI,GAAG;AAAA,UAK7B,OAAO;AAGL,kBAAM,IAAI,IAAI;AAAA,UAChB;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,aAAS,OAAO,MAAM;AACpB,UAAI,IAAI,qBAAqB,IAAI,IAAI,MAAM,oBAAoB;AAE7D,cAAM,IAAI,IAAI,IAAI;AAAA,MACpB;AAAA,IACF;AACA,WAAO;AAAA,EACT;AAAA,EAEA,MAAc,mBAAmB,MAAc,QAAgB,aAAqB;AAClF,QAAI,YAAY,gBAAAD,QAAG,aAAa,GAAG,qBAAqB;AACxD,QAAI,QAAQ,KAAK,gBAAgB,MAAM;AAEvC,QAAI,MAAM,SAAS,GAAG;AAEpB,sBAAAA,QAAG,kBAAkB,QAAQ,aAAa,KAAK;AAC/C;AAAA,IACF;AAGA,UAAM,KAAK,iBAAiB,QAAQ,WAAW,WAAW;AAK1D,QAAI,aAAa,oBAAI,IAAY;AAEjC,aAAS,WAAW,CAAC,gBAAgB,kBAAkB,GAAG;AACxD,UAAI,UAAU,UAAU;AACtB,iBAAS,WAAW,OAAO,KAAK,UAAU,QAAQ,GAAG;AACnD,cAAI,MAAM,IAAI,OAAO,GAAG;AACtB;AAAA,UACF;AACA,qBAAW,IAAI,OAAO;AAAA,QACxB;AAAA,MACF;AAAA,IACF;AAEA,aAAS,WAAW,YAAY;AAC9B,UAAI,gBAAY,4BAAAG,SAAmB,SAAS,QAAQ,KAAK,eAAe;AACxE,UAAI,CAAC,WAAW;AACd,cAAM,IAAI;AAAA,UACR,8BAA8B,WAAW,qBAAqB;AAAA,QAChE;AAAA,MACF;AACA,YAAM,KAAK,mBAAmB,SAAS,YAAAF,QAAK,QAAQ,SAAS,GAAG,YAAAA,QAAK,KAAK,aAAa,gBAAgB,OAAO,CAAC;AAAA,IACjH;AAAA,EACF;AAAA,EAIA,MAAc,qBAAoC;AAChD,aAAS,QAAQ,KAAK,gBAAgB,OAAO,GAAG;AAC9C,UAAI,EAAE,aAAa,OAAO;AACxB;AAAA,MACF;AACA,UAAI,MAAM,KAAK;AACf,UAAI,KAAK,gBAAgB,IAAI,GAAG,GAAG;AACjC;AAAA,MACF;AACA,UAAI,MAAM,UAAM,4CAAiB,GAAG;AACpC,UAAI,KAAK;AACP,YAAI,WAAW,UAAM,wCAAsB,GAAG;AAC9C,iBAAS,EAAE,KAAAI,KAAI,KAAK,UAAU;AAC5B,eAAK,gBAAgB,IAAIA,MAAK,IAAI;AAAA,QACpC;AACA,YAAI,CAAC,KAAK,gBAAgB,IAAI,GAAG,GAAG;AAIlC,eAAK,gBAAgB,IAAI,KAAK,KAAK;AAAA,QACrC;AAAA,MACF,OAAO;AACL,aAAK,gBAAgB,IAAI,KAAK,KAAK;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAAA,EAEA,MAAc,yBAAyB,YAAoB,SAAiC;AAC1F,QAAI,KAAK,gBAAgB,IAAI,UAAU,GAAG;AAGxC,aAAO,UAAM,oBAAS,YAAY,EAAE,kBAAkB,EAAE,YAAY,QAAQ,EAAE,CAAC;AAAA,IACjF;AAMA,eAAO,iBAAAC,SAAS,YAAY,EAAE,aAAa,OAAO,QAAQ,CAAC,cAAc,EAAE,CAAC;AAAA,EAC9E;AAAA,EAEA,MAAc,iBAAiB,QAAgB,SAAc,aAAqB;AAChF,oBAAAN,QAAG,cAAc,WAAW;AAC5B,aAAS,gBAAgB,MAAM,KAAK,yBAAyB,QAAQ,OAAO,GAAG;AAC7E,sBAAAA,QAAG,cAAc,YAAAC,QAAK,QAAQ,YAAAA,QAAK,KAAK,aAAa,YAAY,CAAC,CAAC;AACnE,WAAK,aAAa,YAAAA,QAAK,KAAK,QAAQ,YAAY,GAAG,YAAAA,QAAK,KAAK,aAAa,YAAY,CAAC;AAAA,IACzF;AAAA,EACF;AAAA,EAEQ,aAAa,QAAgB,aAAqB;AACxD,QAAI,KAAK,gBAAgB;AACvB,UAAI;AACF,wBAAAD,QAAG,SAAS,QAAQ,WAAW;AAC/B;AAAA,MACF,SAAS,KAAP;AACA,YAAI,IAAI,SAAS,UAAU;AACzB;AAAA,QACF;AACA,YAAI,IAAI,SAAS,SAAS;AACxB,gBAAM;AAAA,QACR;AACA,aAAK,iBAAiB;AAAA,MACxB;AAAA,IACF;AACA,oBAAAA,QAAG,aAAa,QAAQ,aAAa,gBAAAA,QAAG,UAAU,mBAAmB,gBAAAA,QAAG,UAAU,aAAa;AAAA,EACjG;AAAA,EAEQ,SAAS,SAAiB,MAA0B;AAC1D,UAAM,QAAQ,iBAAAE,QAAU,SAAS,SAAS;AAAA,MAExC,SAAQ,6BAAM,cAAY,6BAAM,eAAc,CAAC,cAAc,IAAI,CAAC;AAAA,IACpE,CAAC;AAED,SAAK,MAAM,uBAAuB,QAAQ,OAAO,cAAc,CAAC;AAChE,SAAK,iBAAiB,KAAK;AAC3B,WAAO,MAAM;AACb,SAAK,QAAQ;AAEb,SAAI,6BAAM,cAAY,6BAAM,cAAa;AACvC,UAAI,KAAK,IAAI,cAAc;AACzB,iBAAS,OAAO,OAAO,KAAK,KAAK,IAAI,YAAY,GAAG;AAClD,eAAK,eAAe,KAAK,EAAE,QAAQ,CAAC;AAAA,QACtC;AAAA,MACF;AACA,UAAI,KAAK,IAAI,mBAAmB,KAAK,aAAa;AAChD,iBAAS,OAAO,OAAO,KAAK,KAAK,IAAI,eAAe,GAAG;AACrD,eAAK,kBAAkB,KAAK,EAAE,QAAQ,CAAC;AAAA,QACzC;AAAA,MACF;AAAA,IACF,OAAO;AACL,YAAM,cAAc,UAAU,OAAO,cAAc;AACnD,aAAO,MAAM;AACb,WAAK,KAAK,IAAI,YAAY,EAAE,QAAQ,gBAAc;AAChD,aAAK;AAAA,UACH,IAAK,KAAK,YAA+B,EAAE,OAAO,kBAAkB,aAAa,UAAU,EAAE,CAAC;AAAA,QAChG;AAAA,MACF,CAAC;AACD,WAAK,KAAK,IAAI,eAAe,EAAE,QAAQ,gBAAc;AACnD,aAAK;AAAA,UACH,IAAK,KAAK,YAA+B,EAAE,OAAO,kBAAkB,aAAa,UAAU,EAAE,CAAC;AAAA,QAChG;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,OACN,OACA,QACA,OACA,QACA,iBACS;AACT,QAAI;AACJ,QAAI,SAAS,MAAM;AACjB,YAAM,IAAI,QAAQ;AAAA,IACpB,WAAW,OAAO,UAAU,UAAU;AACpC,UAAI,OAAO;AACX,UAAI,OAAO,WAAW,UAAU;AAC9B,YAAI,UAAU;AACd,cAAM,IAAI,QAAQ,MAAM,SAAS,OAAO,eAAe;AAAA,MACzD,OAAO;AACL,cAAM,IAAI,QAAQ,MAAM,QAAQ,eAAe;AAAA,MACjD;AAAA,IACF,WAAW,kBAAkB,OAAO;AAClC,YAAM;AAAA,IACR,OAAO;AACL,YAAM,IAAI,QAAQ,OAAO,eAAe;AAAA,IAC1C;AAEA,SAAK,QAAQ,IAAI,QAAQ;AACzB,SAAK,gBAAgB,OAAO,IAAI,IAAI;AACpC,SAAK,oBAAoB,OAAO,IAAI,IAAI;AAExC,QAAI,kBAAkB,eAAe,GAAG;AACtC,sBAAgB,GAAG;AAAA,IACrB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,gBAAgB,eAAkF;AACxG,QAAI,eAAe,KAAK,aAAa,KAAK,mBAAmB,CAAC;AAC9D,QAAI,kBAAkB,KAAK,aAAa,KAAK,sBAAsB,CAAC;AACpE,aAAS,CAAC,MAAM,EAAE,eAAe,CAAC,KAAK,eAAe;AACpD,UAAI,mBAAmB,QAAW;AAChC,cAAM,IAAI;AAAA,UACR,gCAAgC;AAAA,QAClC;AAAA,MACF;AACA,UAAI,KAAK,oBAAoB,IAAI,IAAI,GAAG;AACtC,wBAAgB,QAAQ;AAAA,MAC1B,OAAO;AACL,qBAAa,QAAQ;AAAA,MACvB;AAAA,IACF;AACA,WAAO,OAAO,OAAO,KAAK,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,aAAa,MAAiB;AACpC,QAAI,MAAkC,CAAC;AACvC,SAAK,QAAQ,SAAQ,IAAI,IAAI,QAAQ,IAAI,cAAe;AACxD,WAAO;AAAA,EACT;AACF;AAEA,SAAS,uBAAuB,YAAiC;AAC/D,SAAO,KAAK,MAAM,UAAU;AAC9B;AAEA,SAAS,KAAK,QAAa;AACzB,MAAI,WAAW,SAAS,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,IAAI;AAC5E,WAAO,OAAO,KAAK,MAAM;AAAA,EAC3B,OAAO;AACL,WAAO,CAAC;AAAA,EACV;AACF;AAEA,SAAS,kBAAkB,OAAwD;AACjF,SAAO,OAAO,UAAU;AAC1B;AAEA,SAAS,UACP,KACA,cACA,cACQ;AACR,QAAM,QAAQ,IAAI;AAClB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT,OAAO;AACL,UAAM,IAAI,UAAU,gBAAgB,8BAA8B,OAAO,QAAQ;AAAA,EACnF;AACF;AAEA,SAAS,QAAmE,KAAU,UAA4B;AAChH,QAAM,QAAQ,IAAI;AAClB,MAAI,OAAO,UAAU,UAAU;AAC7B,WAAO;AAAA,EACT,WAAW,OAAO,UAAU,YAAY,UAAU,MAAM;AACtD,UAAM,IAAI,UAAU,6BAA6B,OAAO,QAAQ,uBAAuB;AAAA,EACzF,OAAO;AACL,UAAM,IAAI,UAAU,6BAA6B,OAAO,QAAQ,eAAe,OAAO,QAAQ;AAAA,EAChG;AACF;AAEA,SAAS,UACP,KACA,UACmB;AACnB,QAAM,QAAQ,IAAI;AAElB,MAAI,UAAU,KAAK,GAAG;AACpB,WAAO;AAAA,EACT,WAAW,OAAO,UAAU,UAAU;AACpC,UAAM,IAAI,UAAU,6BAA6B,OAAO,QAAQ,mBAAmB;AAAA,EACrF,OAAO;AACL,UAAM,IAAI,UAAU,+BAA+B,OAAO,QAAQ,eAAe,OAAO,QAAQ;AAAA,EAClG;AACF;AAEA,SAAS,UAAU,OAAwC;AACzD,SAAO,OAAO,UAAU,YAAY,UAAU;AAChD;AAEA,SAAS,eAAe,KAA0B;AAChD,SAAO,UAAU,KAAK,QAAQ,iCAAiC;AACjE;AAEA,SAAS,kBAAkB,KAA0B;AACnD,SAAO,UAAU,KAAK,WAAW,GAAG,eAAe,GAAG,wCAAwC;AAChG;AAEA,SAAS,YAAY,MAAc;AACjC,MAAI,UAAU,KAAK,MAAM,kBAAkB;AAC3C,MAAI,SAAS;AACX,WAAO;AAAA,MACL,OAAO,QAAQ;AAAA,MACf,MAAM,QAAQ;AAAA,IAChB;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAU,aAAwC;AAC3E,MAAI,SAAS,YAAY,WAAW;AACpC,MAAI,QAAQ;AACV,WAAO,UAAU,UAAU,KAAK,OAAO,KAAK,GAAG,OAAO,IAAI;AAAA,EAC5D;AACA,SAAO,UAAU,KAAK,WAAW;AACnC;AAEA,SAAS,SAAS,GAAyB;AACzC,SAAO,MAAM,QAAQ,OAAO,MAAM,YAAY,CAAC,MAAM,QAAQ,CAAC;AAChE;AAEA,SAAS,iBAAiB,GAAwC;AAChE,SAAO,SAAS,CAAC,KAAK,UAAU;AAClC;AAEA,SAAS,WAAW,MAAkC;AACpD,MAAI;AACF,WAAO,gBAAAF,QAAG,aAAa,MAAM,MAAM;AAAA,EACrC,SAAS,GAAP;AACA,QAAI,iBAAiB,CAAC,GAAG;AACvB,UAAI,EAAE,SAAS,YAAY,EAAE,SAAS,UAAU;AAC9C;AAAA,MACF;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,QAAQ,MAAwB;AACvC,MAAI;AACF,WAAO,gBAAAA,QAAG,YAAY,IAAI;AAAA,EAC5B,SAAS,GAAP;AACA,QAAI,iBAAiB,CAAC,GAAG;AACvB,UAAI,EAAE,SAAS,YAAY,EAAE,SAAS,WAAW;AAC/C,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AACA,UAAM;AAAA,EACR;AACF;AAEA,SAAS,YAAY,KAAyE;AAC5F,MAAI,KAAK;AACP,UAAM,WAAW,YAAAC,QAAK,KAAK,KAAK,cAAc;AAC9C,UAAM,UAAU,WAAW,QAAQ;AACnC,QAAI,SAAS;AACX,aAAO,EAAE,KAAK,uBAAuB,OAAO,GAAG,MAAM,IAAI;AAAA,IAC3D;AAAA,EACF;AACA;AACF;AAEA,SAAS,aAAa,aAA2D;AAC/E,QAAM,OAA6C,CAAC;AACpD,aAAW,QAAQ,QAAQ,WAAW,GAAG;AACvC,QAAI,KAAK,WAAW,GAAG,GAAG;AACxB,YAAM,YAAY,YAAAA,QAAK,KAAK,aAAa,IAAI;AAC7C,iBAAWM,SAAQ,QAAQ,SAAS,GAAG;AACrC,cAAM,MAAM,YAAY,YAAAN,QAAK,KAAK,WAAWM,KAAI,CAAC;AAClD,YAAI;AAAK,eAAK,KAAK,GAAG;AAAA,MACxB;AAAA,IACF,OAAO;AACL,YAAM,MAAM,YAAY,YAAAN,QAAK,KAAK,aAAa,IAAI,CAAC;AACpD,UAAI;AAAK,aAAK,KAAK,GAAG;AAAA,IACxB;AAAA,EACF;AACA,SAAO;AACT;","names":["tmp","CacheGroup","deepmerge","fs","path","fixturify","resolvePackagePath","binLinks","dir","walkSync","name"]}
\No newline at end of file