iles
Version:
Vite & Vue powered static site generator with partial hydration
145 lines (142 loc) • 4.09 kB
JavaScript
import {
importModule
} from "./chunk-HKPEBJDI.js";
// src/node/plugin/utils.ts
import { promises as fs, constants as fsConstants } from "node:fs";
import process from "node:process";
import { resolve } from "node:path";
import childProcess from "node:child_process";
import util from "node:util";
import createDebugger from "debug";
import newSpinner from "mico-spinner";
import { detectPackageManager } from "@antfu/install-pkg";
import { default as default2 } from "@nuxt/devalue";
var exec = util.promisify(childProcess.exec);
var debug = {
config: createDebugger("iles:config"),
documents: createDebugger("iles:documents"),
mdx: createDebugger("iles:mdx"),
layout: createDebugger("iles:layout"),
detect: createDebugger("iles:detect"),
resolve: createDebugger("iles:resolve"),
build: createDebugger("iles:build")
};
function sleep(ms) {
return new Promise((resolve2) => {
setTimeout(resolve2, ms);
});
}
async function installPackage(names, options = {}) {
const detectedAgent = options.packageManager || await detectPackageManager(options.cwd) || "npm";
const [agent] = detectedAgent.split("@");
if (!Array.isArray(names)) {
names = [names];
}
const args = options.additionalArgs || [];
if (options.preferOffline) {
if (detectedAgent === "yarn@berry") {
args.unshift("--cached");
} else {
args.unshift("--prefer-offline");
}
}
if (agent === "pnpm" && await exists(resolve(options.cwd ?? process.cwd(), "pnpm-workspace.yaml"))) {
args.unshift("-w");
}
const command = `${agent} ${agent === "yarn" ? "add" : "install"} ${options.dev ? "-D" : ""} ${names.join(" ")} ${args.join(" ")}`;
try {
await exec(command, {
cwd: options.cwd || process.cwd()
});
} catch (error) {
const { stderr, stdout } = error;
if (stdout) {
console.log(stdout);
}
if (stderr) {
console.error(stderr);
}
throw new Error(`Auto-install of ${names.join(" ")} failed, install manually and try again!`);
}
}
async function tryImportOrInstallModule(name) {
try {
return await importModule(name);
} catch (error) {
if (error.code !== "MODULE_NOT_FOUND")
throw error;
console.info(`
${name} not found. Proceeding to auto-install.
`);
await withSpinner(`Installing ${name}`, async () => await installPackage(name, { dev: true, preferOffline: true, silent: true }));
return await importModule(name);
}
}
async function importLibrary(pkgName) {
return await tryImportOrInstallModule(pkgName);
}
async function withSpinner(message, fn) {
const spinner = newSpinner(message).start();
try {
const result = await fn();
spinner.succeed();
return result;
} catch (e) {
spinner.fail();
throw e;
}
}
function isString(val) {
return typeof val === "string";
}
function isStringPlugin(val) {
return Array.isArray(val) && isString(val[0]);
}
function uniq(arr) {
return [...new Set(arr.filter((x) => x))];
}
function escapeRegex(str) {
return str.replace(/[-/\\^$*+?.()|[\]{}]/g, "\\$&");
}
function pascalCase(str) {
return capitalize(camelCase(str));
}
function camelCase(str) {
return str.replace(/[^\w_]+(\w)/g, (_, c) => c ? c.toUpperCase() : "");
}
function uncapitalize(str) {
return str.charAt(0).toLowerCase() + str.slice(1);
}
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
async function replaceAsync(str, regex, asyncFn) {
const promises = Array.from(str.matchAll(regex)).map(([match, ...args]) => asyncFn(match, ...args));
const replacements = await Promise.all(promises);
return str.replace(regex, () => replacements.shift());
}
async function exists(filePath) {
return await fs.access(filePath, fsConstants.F_OK).then(() => true, () => false);
}
function compact(val) {
return val.filter((x) => x);
}
export {
debug,
sleep,
installPackage,
tryImportOrInstallModule,
importLibrary,
isString,
isStringPlugin,
uniq,
escapeRegex,
pascalCase,
camelCase,
uncapitalize,
capitalize,
replaceAsync,
exists,
compact,
default2 as default
};