You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
34 lines
878 B
34 lines
878 B
|
2 years ago
|
import { installPackage } from '@antfu/install-pkg';
|
||
|
|
import { sleep } from '@antfu/utils';
|
||
|
|
import { cyan } from 'kolorist';
|
||
|
|
import { warnOnce } from './warn.mjs';
|
||
|
|
|
||
|
|
let pending;
|
||
|
|
const tasks = {};
|
||
|
|
async function tryInstallPkg(name, autoInstall) {
|
||
|
|
if (pending) {
|
||
|
|
await pending;
|
||
|
|
}
|
||
|
|
if (!tasks[name]) {
|
||
|
|
console.log(cyan(`Installing ${name}...`));
|
||
|
|
if (typeof autoInstall === "function") {
|
||
|
|
tasks[name] = pending = autoInstall(name).then(() => sleep(300)).finally(() => {
|
||
|
|
pending = void 0;
|
||
|
|
});
|
||
|
|
} else {
|
||
|
|
tasks[name] = pending = installPackage(name, {
|
||
|
|
dev: true,
|
||
|
|
preferOffline: true
|
||
|
|
}).then(() => sleep(300)).catch((e) => {
|
||
|
|
warnOnce(`Failed to install ${name}`);
|
||
|
|
console.error(e);
|
||
|
|
}).finally(() => {
|
||
|
|
pending = void 0;
|
||
|
|
});
|
||
|
|
}
|
||
|
|
}
|
||
|
|
return tasks[name];
|
||
|
|
}
|
||
|
|
|
||
|
|
export { tryInstallPkg };
|