export async function installBlockDeps()

in packages/plugin-block/src/dep.ts [68:144]


export async function installBlockDeps(param: DepsArgs) {
  const { projectPkg, cwd, spinner, args, ctx, npmClient } = param;
  const { dryRun } = args;
  const {
    conflicts,
    lacks,
    devConflicts,
    devLacks
  } = dependenciesConflictCheck(
    ctx.pkg.dependencies,
    projectPkg.dependencies,
    ctx.pkg.devDependencies,
    projectPkg.devDependencies,
  );

  debug(`conflictDeps ${conflicts}, lackDeps ${lacks}`, `devConflictDeps ${devConflicts}, devLackDeps ${devLacks}`);

  // find confilict dependencies throw error
  const allConflicts = [
    ...conflicts,
    ...devConflicts,
  ];

  if (allConflicts.length) {
    throw new Error(getErrors(allConflicts));
  }

  // find lack confilict, auto install
  if (dryRun) {
    debug(DEBUG_TAG, 'dryRun is true, skip install dependencies');
  } else {
    if (lacks.length) {
      const deps = lacks.map((dep: string[]) => `${dep[0]}@${dep[1]}`);
      spinner.start(
        `Install additional dependencies ${deps.join(',')} with ${npmClient}`,
      );
      try {
        await execa(
          npmClient,
          npmClient.includes('yarn')
            ? ['add', ...deps]
            : ['install', ...deps, '--save'],
          { cwd },
        );
      } catch (e) {
        spinner.fail();
        throw new Error(e);
      }
      spinner.succeed();
    }

    if (devLacks.length) {
      // need skip devDependency which already install in dependencies
      const devDeps = devLacks
        .filter(dep => !lacks.find(item => item[0] === dep[0]))
        .map(dep => `${dep[0]}@${dep[1]}`);
      spinner.start(
        `Install additional devDependencies ${devDeps.join(',')} with ${npmClient}`,
      );
      try {
        await execa(
          npmClient,
          npmClient.includes('yarn')
            ? ['add', ...devDeps, '--dev']
            : ['install', ...devDeps, '--save-dev'],
          {
            cwd
          },
        );
      } catch (e) {
        spinner.fail();
        throw new Error(e);
      }
      spinner.succeed();
    }
  }
}