astro-ghostcms/.pnpm-store/v3/files/d2/987be81f6312585920081ff9381...

119 lines
3.1 KiB
Plaintext

import boxen from "boxen";
import { execa } from "execa";
import { bold, cyan, dim, magenta } from "kleur/colors";
import ora from "ora";
import prompts from "prompts";
import resolvePackage from "resolve";
import whichPm from "which-pm";
import {} from "../core/logger/core.js";
async function getPackage(packageName, logger, options, otherDeps = []) {
let packageImport;
try {
await tryResolve(packageName, options.cwd ?? process.cwd());
packageImport = await import(packageName);
} catch (e) {
logger.info(
null,
`To continue, Astro requires the following dependency to be installed: ${bold(packageName)}.`
);
const result = await installPackage([packageName, ...otherDeps], options, logger);
if (result) {
packageImport = await import(packageName);
} else {
return void 0;
}
}
return packageImport;
}
function tryResolve(packageName, cwd) {
return new Promise((resolve, reject) => {
resolvePackage(
packageName,
{
basedir: cwd
},
(err) => {
if (err) {
reject(err);
} else {
resolve(0);
}
}
);
});
}
function getInstallCommand(packages, packageManager) {
switch (packageManager) {
case "npm":
return { pm: "npm", command: "install", flags: [], dependencies: packages };
case "yarn":
return { pm: "yarn", command: "add", flags: [], dependencies: packages };
case "pnpm":
return { pm: "pnpm", command: "add", flags: [], dependencies: packages };
case "bun":
return { pm: "bun", command: "add", flags: [], dependencies: packages };
default:
return null;
}
}
async function installPackage(packageNames, options, logger) {
const cwd = options.cwd ?? process.cwd();
const packageManager = (await whichPm(cwd)).name ?? "npm";
const installCommand = getInstallCommand(packageNames, packageManager);
if (!installCommand) {
return false;
}
const coloredOutput = `${bold(installCommand.pm)} ${installCommand.command}${[
"",
...installCommand.flags
].join(" ")} ${cyan(installCommand.dependencies.join(" "))}`;
const message = `
${boxen(coloredOutput, {
margin: 0.5,
padding: 0.5,
borderStyle: "round"
})}
`;
logger.info(
null,
`
${magenta("Astro will run the following command:")}
${dim(
"If you skip this step, you can always run it yourself later"
)}
${message}`
);
let response;
if (options.skipAsk) {
response = true;
} else {
response = (await prompts({
type: "confirm",
name: "askToContinue",
message: "Continue?",
initial: true
})).askToContinue;
}
if (Boolean(response)) {
const spinner = ora("Installing dependencies...").start();
try {
await execa(
installCommand.pm,
[installCommand.command, ...installCommand.flags, ...installCommand.dependencies],
{ cwd }
);
spinner.succeed();
return true;
} catch (err) {
logger.debug("add", "Error installing dependencies", err);
spinner.fail();
return false;
}
} else {
return false;
}
}
export {
getPackage
};