{"version":3,"file":"dependencies.mjs","sources":["../../../../src/node/core/dependencies.ts"],"sourcesContent":["import os from 'node:os';\nimport fs from 'node:fs/promises';\nimport path from 'node:path';\nimport crypto from 'node:crypto';\nimport semver, { SemVer } from 'semver';\nimport resolveFrom from 'resolve-from';\nimport execa, { CommonOptions, ExecaReturnValue } from 'execa';\nimport readPkgUp, { PackageJson } from 'read-pkg-up';\nimport type { BuildOptions } from '../build';\nimport { getPackageManager } from './managers';\n\nconst CACHE_PATH = path.join('node_modules', '.strapi', 'deps-check.hash');\n\nconst hashPackageJson = async (cwd: string): Promise<string | null> => {\n  try {\n    const content = await fs.readFile(path.join(cwd, 'package.json'), 'utf8');\n    return crypto.createHash('sha1').update(content).digest('hex');\n  } catch {\n    return null;\n  }\n};\n\nconst readCachedHash = (cwd: string): Promise<string | null> =>\n  fs.readFile(path.join(cwd, CACHE_PATH), 'utf8').catch(() => null);\n\nconst writeCachedHash = async (cwd: string, hash: string): Promise<void> => {\n  try {\n    await fs.mkdir(path.dirname(path.join(cwd, CACHE_PATH)), { recursive: true });\n    await fs.writeFile(path.join(cwd, CACHE_PATH), hash, 'utf8');\n  } catch {\n    // best-effort cache write — silently ignore\n  }\n};\n\n/**\n * From V5 this will be imported from the package.json of `@strapi/strapi`.\n */\nconst PEER_DEPS = {\n  react: '^18.0.0',\n  'react-dom': '^18.0.0',\n  'react-router-dom': '^6.0.0',\n  'styled-components': '^6.0.0',\n};\n\ninterface CheckRequiredDependenciesResult {\n  didInstall: boolean;\n}\n\ninterface DepToInstall {\n  name: string;\n  wantedVersion: string;\n  declaredVersion?: never;\n}\n\n/**\n * Checks the user's project that it has declared and installed the required dependencies\n * needed by the Strapi admin project. Whilst generally speaking most modules will be\n * declared by the actual packages there are some packages where you only really want one of\n * and thus they are declared as peer dependencies – react / styled-components / etc.\n *\n * If these deps are not installed or declared, then we prompt the user to correct this. In\n * V4 this is not a hard requirement, but in V5 it will be. Might as well get people started now.\n */\nconst checkRequiredDependencies = async ({\n  cwd,\n  logger,\n}: Pick<BuildOptions, 'cwd' | 'logger'>): Promise<CheckRequiredDependenciesResult> => {\n  /**\n   * This enables us to use experimental deps for libraries like\n   * react or styled-components. This is useful for testing against.\n   */\n  if (process.env.USE_EXPERIMENTAL_DEPENDENCIES === 'true') {\n    logger.warn('You are using experimental dependencies that may not be compatible with Strapi.');\n    return { didInstall: false };\n  }\n\n  // Hash-cache: skip the full check when package.json hasn't changed since\n  // the last successful pass. The cache lives under node_modules so it's\n  // already gitignored and disposable (a `yarn install` wipe re-runs it).\n  const currentHash = await hashPackageJson(cwd);\n  if (currentHash) {\n    const cachedHash = await readCachedHash(cwd);\n    if (cachedHash === currentHash) {\n      return { didInstall: false };\n    }\n  }\n\n  const pkg = await readPkgUp({ cwd });\n\n  if (!pkg) {\n    throw new Error(`Could not find package.json at path: ${cwd}`);\n  }\n\n  logger.debug('Loaded package.json:', os.EOL, pkg.packageJson);\n\n  interface DepToReview {\n    name: string;\n    wantedVersion: string;\n    declaredVersion: string;\n  }\n\n  /**\n   * Run through each of the peer deps and figure out if they need to be\n   * installed or they need their version checked against.\n   */\n  const { install, review } = Object.entries(PEER_DEPS).reduce<{\n    install: DepToInstall[];\n    review: DepToReview[];\n  }>(\n    (acc, [name, version]) => {\n      if (!pkg.packageJson.dependencies) {\n        throw new Error(`Could not find dependencies in package.json at path: ${cwd}`);\n      }\n\n      const declaredVersion =\n        pkg.packageJson.dependencies[name] ?? pkg.packageJson.devDependencies?.[name];\n\n      if (!declaredVersion) {\n        acc.install.push({\n          name,\n          wantedVersion: version,\n        });\n      } else {\n        acc.review.push({\n          name,\n          wantedVersion: version,\n          declaredVersion,\n        });\n      }\n\n      return acc;\n    },\n    {\n      install: [],\n      review: [],\n    }\n  );\n\n  if (install.length > 0) {\n    logger.info(\n      'The Strapi admin needs to install the following dependencies:',\n      os.EOL,\n      install.map(({ name, wantedVersion }) => `  - ${name}@${wantedVersion}`).join(os.EOL)\n    );\n\n    await installDependencies(install, {\n      cwd,\n      logger,\n    });\n\n    const [file, ...args] = process.argv;\n\n    /**\n     * Re-run the same command after installation e.g. strapi build because the yarn.lock might\n     * not be the same and could break installations. It's not the best solution, but it works.\n     */\n    await execa(file, args, { cwd, stdio: 'inherit' });\n    return { didInstall: true };\n  }\n\n  if (review.length) {\n    const errors: string[] = [];\n\n    for (const dep of review) {\n      // The version specified in package.json could be incorrect, eg `foo`\n      let minDeclaredVersion: SemVer | null = null;\n      try {\n        minDeclaredVersion = semver.minVersion(dep.declaredVersion);\n      } catch (err) {\n        // Intentional fall-through (variable will be left as null, throwing below)\n      }\n\n      if (!minDeclaredVersion) {\n        errors.push(\n          `The declared dependency, ${dep.name} has an invalid version in package.json: ${dep.declaredVersion}`\n        );\n      } else if (!semver.satisfies(minDeclaredVersion, dep.wantedVersion)) {\n        /**\n         * The delcared version should be semver compatible with our required version\n         * of the dependency. If it's not, we should advise the user to change it.\n         */\n        logger.warn(\n          [\n            `Declared version of ${dep.name} (${minDeclaredVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n            'You may experience issues, we recommend you change this.',\n          ].join(os.EOL)\n        );\n      }\n\n      const installedVersion = await getModuleVersion(dep.name, cwd);\n\n      if (!installedVersion) {\n        /**\n         * TODO: when we know the packageManager we can advise the actual install command.\n         */\n        errors.push(\n          `The declared dependency, ${dep.name} is not installed. You should install before re-running this command`\n        );\n      } else if (!semver.satisfies(installedVersion, dep.wantedVersion)) {\n        logger.warn(\n          [\n            `Declared version of ${dep.name} (${installedVersion}) is not compatible with the version required by Strapi (${dep.wantedVersion}).`,\n            'You may experience issues, we recommend you change this.',\n          ].join(os.EOL)\n        );\n      }\n    }\n\n    if (errors.length > 0 && process.env.NODE_ENV === 'development') {\n      throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);\n    }\n  }\n\n  if (currentHash) {\n    await writeCachedHash(cwd, currentHash);\n  }\n\n  return { didInstall: false };\n};\n\nconst getModule = async (name: string, cwd: string): Promise<PackageJson | null> => {\n  const modulePackagePath = resolveFrom.silent(cwd, path.join(name, 'package.json'));\n  if (!modulePackagePath) {\n    return null;\n  }\n  const file = await fs.readFile(modulePackagePath, 'utf8').then((res) => JSON.parse(res));\n\n  return file;\n};\n\nconst getModuleVersion = async (name: string, cwd: string): Promise<string | null> => {\n  const pkg = await getModule(name, cwd);\n\n  return pkg?.version || null;\n};\n\nconst installDependencies = async (\n  install: DepToInstall[],\n  { cwd, logger }: Pick<BuildOptions, 'cwd' | 'logger'>\n) => {\n  const packageManager = getPackageManager();\n\n  if (!packageManager) {\n    logger.error(\n      'Could not find a supported package manager, please install the dependencies manually.'\n    );\n    process.exit(1);\n  }\n\n  const execOptions: CommonOptions<'utf8'> = {\n    encoding: 'utf8',\n    cwd,\n    stdio: 'inherit',\n  };\n\n  const packages = install.map(({ name, wantedVersion }) => `${name}@${wantedVersion}`);\n\n  let result: ExecaReturnValue<string> | undefined;\n\n  if (packageManager === 'npm') {\n    const npmArgs = ['install', '--legacy-peer-deps', '--save', ...packages];\n    logger.info(`Running 'npm ${npmArgs.join(' ')}'`);\n    result = await execa('npm', npmArgs, execOptions);\n  } else if (packageManager === 'yarn') {\n    const yarnArgs = ['add', ...packages];\n    logger.info(`Running 'yarn ${yarnArgs.join(' ')}'`);\n    result = await execa('yarn', yarnArgs, execOptions);\n  } else if (packageManager === 'pnpm') {\n    const pnpmArgs = ['add', '--save-prod', ...packages];\n    logger.info(`Running 'pnpm ${pnpmArgs.join(' ')}'`);\n    result = await execa('pnpm', pnpmArgs, execOptions);\n  }\n\n  if (result?.exitCode || result?.failed) {\n    throw new Error('Package installation failed');\n  }\n};\n\nexport { checkRequiredDependencies, getModule };\nexport type { CheckRequiredDependenciesResult, PackageJson };\n"],"names":["CACHE_PATH","path","join","hashPackageJson","cwd","content","fs","readFile","crypto","createHash","update","digest","readCachedHash","catch","writeCachedHash","hash","mkdir","dirname","recursive","writeFile","PEER_DEPS","react","checkRequiredDependencies","logger","process","env","USE_EXPERIMENTAL_DEPENDENCIES","warn","didInstall","currentHash","cachedHash","pkg","readPkgUp","Error","debug","os","EOL","packageJson","install","review","Object","entries","reduce","acc","name","version","dependencies","declaredVersion","devDependencies","push","wantedVersion","length","info","map","installDependencies","file","args","argv","execa","stdio","errors","dep","minDeclaredVersion","semver","minVersion","err","satisfies","installedVersion","getModuleVersion","NODE_ENV","getModule","modulePackagePath","resolveFrom","silent","then","res","JSON","parse","packageManager","getPackageManager","error","exit","execOptions","encoding","packages","result","npmArgs","yarnArgs","pnpmArgs","exitCode","failed"],"mappings":"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"}