{"version":3,"file":"yarn.cjs","names":["spawnProcess","Predicate","SpawnError"],"sources":["../../../src/packagers/yarn.ts"],"sourcesContent":["import { Predicate } from 'effect';\nimport { any, isEmpty, reduce, replace, split, startsWith } from 'ramda';\nimport { satisfies } from 'semver';\n\nimport type { DependenciesResult, DependencyMap, PackagerOptions } from '../types';\nimport { SpawnError, spawnProcess } from '../utils';\nimport type { Packager } from './packager';\n\ninterface YarnTree {\n  name: string;\n  color: 'bold' | 'dim' | null;\n  children?: YarnTree[];\n  hint?: null;\n  depth?: number;\n  shadow?: boolean;\n}\nexport interface YarnDeps {\n  type: 'tree';\n  data: {\n    type: 'list';\n    trees: YarnTree[];\n  };\n}\n\nconst getNameAndVersion = (name: string): { name: string; version: string } => {\n  const atIndex = name.lastIndexOf('@');\n\n  return {\n    name: name.slice(0, atIndex),\n    version: name.slice(atIndex + 1),\n  };\n};\n\n/**\n * Yarn packager.\n *\n * Yarn specific packagerOptions (default):\n *   flat (false) - Use --flat with install\n *   ignoreScripts (false) - Do not execute scripts during install\n */\nexport class Yarn implements Packager {\n  private packagerOptions: PackagerOptions;\n\n  constructor(packagerOptions: PackagerOptions) {\n    this.packagerOptions = packagerOptions;\n  }\n\n  get lockfileName() {\n    return 'yarn.lock';\n  }\n\n  get copyPackageSectionNames() {\n    return ['resolutions'];\n  }\n\n  get mustCopyModules() {\n    return false;\n  }\n\n  async getVersion(cwd: string) {\n    const command = /^win/.test(process.platform) ? 'yarn.cmd' : 'yarn';\n    const args = ['-v'];\n\n    const output = await spawnProcess(command, args, { cwd });\n\n    return {\n      version: output.stdout,\n      isBerry: parseInt(output.stdout.charAt(0), 10) > 1,\n    };\n  }\n\n  async getProdDependencies(cwd: string, depth?: number): Promise<DependenciesResult> {\n    const command = /^win/.test(process.platform) ? 'yarn.cmd' : 'yarn';\n    const args = ['list', depth ? `--depth=${depth}` : null, '--json', '--production'].filter(Predicate.isString);\n\n    // If we need to ignore some errors add them here\n    const ignoredYarnErrors: Array<{\n      npmError: string;\n      log: boolean;\n    }> = [];\n\n    let parsedDeps: YarnDeps;\n\n    try {\n      const processOutput = await spawnProcess(command, args, { cwd });\n\n      parsedDeps = JSON.parse(processOutput.stdout) as YarnDeps;\n    } catch (err) {\n      if (err instanceof SpawnError) {\n        // Only exit with an error if we have critical npm errors for 2nd level inside\n        const errors = split('\\n', err.stderr);\n        const failed = reduce(\n          (acc, error) => {\n            if (acc) {\n              return true;\n            }\n\n            return (\n              !isEmpty(error) &&\n              !any((ignoredError) => startsWith(`npm ERR! ${ignoredError.npmError}`, error), ignoredYarnErrors)\n            );\n          },\n          false,\n          errors\n        );\n\n        if (!failed && !isEmpty(err.stdout)) {\n          return { stdout: err.stdout };\n        }\n      }\n\n      throw err;\n    }\n\n    const rootTree = parsedDeps.data.trees;\n\n    // Produces a version map for the modules present in our root node_modules folder\n    const rootDependencies = rootTree.reduce<DependencyMap>((deps, tree) => {\n      const { name, version } = getNameAndVersion(tree.name);\n\n      // eslint-disable-next-line no-param-reassign\n      deps[name] ??= {\n        version,\n      };\n\n      return deps;\n    }, {});\n\n    const convertTrees = (trees: YarnTree[]): DependencyMap => {\n      return trees.reduce<DependencyMap>((deps, tree) => {\n        const { name, version } = getNameAndVersion(tree.name);\n\n        const dependency = rootDependencies[name];\n\n        if (tree.shadow) {\n          // Package is resolved somewhere else\n          if (dependency && satisfies(dependency.version, version)) {\n            // Package is at root level\n            // {\n            //   \"name\": \"samchungy-dep-a@1.0.0\", <- MATCH\n            //   \"children\": [],\n            //   \"hint\": null,\n            //   \"color\": null,\n            //   \"depth\": 0\n            // },\n            // {\n            //   \"name\": \"samchungy-a@2.0.0\",\n            //   \"children\": [\n            //     {\n            //       \"name\": \"samchungy-dep-a@1.0.0\", <- THIS\n            //       \"color\": \"dim\",\n            //       \"shadow\": true\n            //     }\n            //   ],\n            //   \"hint\": null,\n            //   \"color\": \"bold\",\n            //   \"depth\": 0\n            // }\n            // eslint-disable-next-line no-param-reassign\n            deps[name] ??= {\n              version,\n              isRootDep: true,\n            };\n          } else {\n            // Package info is in anther child so we can just ignore\n            // samchungy-dep-a@1.0.0 is in the root (see above example)\n            // {\n            //   \"name\": \"samchungy-b@2.0.0\",\n            //   \"children\": [\n            //     {\n            //       \"name\": \"samchungy-dep-a@2.0.0\", <- THIS\n            //       \"color\": \"dim\",\n            //       \"shadow\": true\n            //     },\n            //     {\n            //       \"name\": \"samchungy-dep-a@2.0.0\",\n            //       \"children\": [],\n            //       \"hint\": null,\n            //       \"color\": \"bold\",\n            //       \"depth\": 0\n            //     }\n            //   ],\n            //   \"hint\": null,\n            //   \"color\": \"bold\",\n            //   \"depth\": 0\n            // }\n          }\n\n          return deps;\n        }\n\n        // Package is not defined, store it and get the children\n        //     {\n        //       \"name\": \"samchungy-dep-a@2.0.0\",\n        //       \"children\": [],\n        //       \"hint\": null,\n        //       \"color\": \"bold\",\n        //       \"depth\": 0\n        //     }\n        // eslint-disable-next-line no-param-reassign\n        deps[name] ??= {\n          version,\n          ...(tree?.children?.length && { dependencies: convertTrees(tree.children) }),\n        };\n\n        return deps;\n      }, {});\n    };\n\n    return {\n      dependencies: convertTrees(rootTree),\n    };\n  }\n\n  rebaseLockfile(pathToPackageRoot: string, lockfile: string) {\n    const fileVersionMatcher = /[^\"/]@(?:file:)?((?:\\.\\/|\\.\\.\\/).*?)[\":,]/gm;\n    const replacements: Array<{\n      oldRef: string;\n      newRef: string;\n    }> = [];\n    let match;\n\n    // Detect all references and create replacement line strings\n    // eslint-disable-next-line no-cond-assign\n    while ((match = fileVersionMatcher.exec(lockfile)) !== null) {\n      replacements.push({\n        oldRef: typeof match[1] === 'string' ? match[1] : '',\n        newRef: replace(/\\\\/g, '/', `${pathToPackageRoot}/${match[1]}`),\n      });\n    }\n\n    // Replace all lines in lockfile\n    return reduce(\n      (__, replacement) => replace(replacement.oldRef, replacement.newRef, __),\n      lockfile,\n      replacements.filter((item) => item.oldRef !== '')\n    );\n  }\n\n  async install(cwd: string, extraArgs: Array<string>, hasLockfile = true) {\n    if (this.packagerOptions.noInstall) {\n      return;\n    }\n\n    const version = await this.getVersion(cwd);\n    const command = /^win/.test(process.platform) ? 'yarn.cmd' : 'yarn';\n\n    const args =\n      !this.packagerOptions.ignoreLockfile && hasLockfile\n        ? ['install', ...(version.isBerry ? ['--immutable'] : ['--frozen-lockfile', '--non-interactive']), ...extraArgs]\n        : ['install', ...(version.isBerry ? [] : ['--non-interactive']), ...extraArgs];\n\n    await spawnProcess(command, args, { cwd });\n  }\n\n  // \"Yarn install\" prunes automatically\n  prune(cwd: string) {\n    return this.install(cwd, []);\n  }\n\n  async runScripts(cwd: string, scriptNames: string[]) {\n    const command = /^win/.test(process.platform) ? 'yarn.cmd' : 'yarn';\n\n    await Promise.all(scriptNames.map((scriptName) => spawnProcess(command, ['run', scriptName], { cwd })));\n  }\n}\n"],"mappings":"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"}