{
  "version": 3,
  "sources": ["../../../../../src/packages/core/install/validateModules.ts"],
  "sourcesContent": ["import { promises as fs } from 'node:fs';\nimport path from 'node:path';\nimport { PnpmError } from '../../error/index.ts';\nimport { logger } from '../../logger/index.ts';\nimport type {\n  IncludedDependencies,\n  Modules,\n} from '../../modules-yaml/index.ts';\nimport {\n  DEPENDENCIES_FIELDS,\n  type Registries,\n  type ProjectRootDir,\n  type GlobalPkgDir,\n  type ProjectRootDirRealPath,\n  type LockFileDir,\n  type WorkspaceDir,\n  type ModulesDir,\n} from '../../types/index.ts';\nimport rimraf from '@zkochan/rimraf';\nimport enquirer from 'enquirer';\nimport equals from 'ramda/src/equals';\nimport { checkCompatibility } from './checkCompatibility/index.ts';\n\ntype ImporterToPurge = {\n  modulesDir: ModulesDir;\n  rootDir:\n    | ProjectRootDir\n    | ProjectRootDirRealPath\n    | GlobalPkgDir\n    | WorkspaceDir\n    | LockFileDir;\n};\n\nexport async function validateModules(\n  modules: Modules,\n  projects: Array<{\n    modulesDir: ModulesDir;\n    id: string;\n    rootDir:\n      | ProjectRootDir\n      | ProjectRootDirRealPath\n      | GlobalPkgDir\n      | WorkspaceDir\n      | LockFileDir;\n  }>,\n  opts: {\n    currentHoistPattern?: string[] | undefined;\n    currentPublicHoistPattern?: string[] | undefined;\n    forceNewModules: boolean;\n    include?: IncludedDependencies;\n    lockfileDir:\n      | WorkspaceDir\n      | LockFileDir\n      | ProjectRootDir\n      | ProjectRootDirRealPath\n      | GlobalPkgDir;\n    modulesDir: ModulesDir;\n    registries: Registries;\n    storeDir: string;\n    virtualStoreDir: string;\n    virtualStoreDirMaxLength: number;\n    confirmModulesPurge?: boolean | undefined;\n\n    hoistPattern?: string[] | undefined;\n    forceHoistPattern?: boolean | undefined;\n\n    publicHoistPattern?: string[] | undefined;\n    forcePublicHoistPattern?: boolean | undefined;\n    global?: boolean | undefined;\n  }\n): Promise<{ purged: boolean }> {\n  const rootProject = projects.find(({ id }) => id === '.');\n\n  if (opts.virtualStoreDirMaxLength !== modules.virtualStoreDirMaxLength) {\n    if (opts.forceNewModules && rootProject != null) {\n      await purgeModulesDirsOfImporter(opts, rootProject);\n\n      return { purged: true };\n    }\n    throw new PnpmError(\n      'VIRTUAL_STORE_DIR_MAX_LENGTH_DIFF',\n      'This modules directory was created using a different virtual-store-dir-max-length value.' +\n        ' Run \"pnpm install\" to recreate the modules directory.'\n    );\n  }\n\n  if (\n    opts.forcePublicHoistPattern === true &&\n    !equals.default(modules.publicHoistPattern, opts.publicHoistPattern)\n  ) {\n    if (opts.forceNewModules && rootProject != null) {\n      await purgeModulesDirsOfImporter(opts, rootProject);\n\n      return { purged: true };\n    }\n\n    throw new PnpmError(\n      'PUBLIC_HOIST_PATTERN_DIFF',\n      'This modules directory was created using a different public-hoist-pattern value.' +\n        ' Run \"pnpm install\" to recreate the modules directory.'\n    );\n  }\n\n  const importersToPurge: ImporterToPurge[] = [];\n\n  if (opts.forceHoistPattern === true && typeof rootProject !== 'undefined') {\n    try {\n      if (\n        !equals.default(\n          opts.currentHoistPattern,\n          opts.hoistPattern || undefined\n        )\n      ) {\n        throw new PnpmError(\n          'HOIST_PATTERN_DIFF',\n          'This modules directory was created using a different hoist-pattern value.' +\n            ' Run \"pnpm install\" to recreate the modules directory.'\n        );\n      }\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (err: any) {\n      if (!opts.forceNewModules) {\n        throw err;\n      }\n\n      importersToPurge.push(rootProject);\n    }\n  }\n\n  for (const project of projects) {\n    try {\n      checkCompatibility(modules, {\n        modulesDir: project.modulesDir,\n        storeDir: opts.storeDir,\n        virtualStoreDir: opts.virtualStoreDir,\n      });\n\n      if (\n        opts.lockfileDir !== project.rootDir &&\n        opts.include != null &&\n        typeof modules.included !== 'undefined'\n      ) {\n        for (const depsField of DEPENDENCIES_FIELDS) {\n          if (opts.include[depsField] !== modules.included[depsField]) {\n            throw new PnpmError(\n              'INCLUDED_DEPS_CONFLICT',\n              `modules directory (at \"${opts.lockfileDir}\") was installed with ${stringifyIncludedDeps(modules.included)}. ` +\n                `Current install wants ${stringifyIncludedDeps(opts.include)}.`\n            );\n          }\n        }\n      }\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    } catch (err: any) {\n      if (!opts.forceNewModules) {\n        throw err;\n      }\n\n      importersToPurge.push(project);\n    }\n  }\n\n  if (importersToPurge.length > 0 && rootProject == null) {\n    importersToPurge.push({\n      modulesDir: path.join(opts.lockfileDir, opts.modulesDir) as ModulesDir,\n      rootDir: opts.lockfileDir,\n    });\n  }\n\n  const purged = importersToPurge.length > 0;\n\n  if (purged) {\n    await purgeModulesDirsOfImporters(opts, importersToPurge);\n  }\n\n  return { purged };\n}\n\nasync function purgeModulesDirsOfImporter(\n  opts: {\n    confirmModulesPurge?: boolean | undefined;\n    virtualStoreDir: string;\n  },\n  importer: ImporterToPurge\n): Promise<void> {\n  return purgeModulesDirsOfImporters(opts, [importer]);\n}\n\nasync function purgeModulesDirsOfImporters(\n  opts: {\n    confirmModulesPurge?: boolean | undefined;\n    virtualStoreDir: string;\n  },\n  importers: ImporterToPurge[]\n): Promise<void> {\n  if (opts.confirmModulesPurge ?? true) {\n    const confirmed = await enquirer.prompt<{ question: boolean }>({\n      type: 'confirm',\n      name: 'question',\n      message:\n        importers.length === 1\n          ? `The modules directory at \"${importers[0]?.modulesDir ?? ''}\" will be removed and reinstalled from scratch. Proceed?`\n          : 'The modules directories will be removed and reinstalled from scratch. Proceed?',\n      initial: true,\n    });\n\n    if (!confirmed.question) {\n      throw new PnpmError(\n        'ABORTED_REMOVE_MODULES_DIR',\n        'Aborted removal of modules directory'\n      );\n    }\n  }\n\n  await Promise.all(\n    importers.map(async (importer: ImporterToPurge): Promise<void> => {\n      logger.info({\n        message: `Recreating ${importer.modulesDir}`,\n        prefix: importer.rootDir,\n      });\n\n      try {\n        // We don't remove the actual modules directory, just the contents of it.\n        // 1. we will need the directory anyway.\n        // 2. in some setups, pnpm won't even have permission to remove the modules directory.\n        await removeContentsOfDir(importer.modulesDir, opts.virtualStoreDir);\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      } catch (err: any) {\n        if (err.code !== 'ENOENT') {\n          throw err;\n        }\n      }\n    })\n  );\n}\n\nasync function removeContentsOfDir(\n  dir: string,\n  virtualStoreDir: string\n): Promise<void> {\n  const items = await fs.readdir(dir);\n  await Promise.all(\n    items.map(async (item) => {\n      // The non-pnpm related hidden files are kept\n      if (\n        item.startsWith('.') &&\n        item !== '.bin' &&\n        item !== '.modules.yaml' &&\n        !dirsAreEqual(path.join(dir, item), virtualStoreDir)\n      ) {\n        return;\n      }\n      await rimraf(path.join(dir, item));\n    })\n  );\n}\n\nfunction dirsAreEqual(dir1: string, dir2: string): boolean {\n  return path.relative(dir1, dir2) === '';\n}\n\nfunction stringifyIncludedDeps(included: IncludedDependencies): string {\n  return DEPENDENCIES_FIELDS.filter((depsField) => included[depsField]).join(\n    ', '\n  );\n}\n"],
  "mappings": "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",
  "names": []
}
