import fs from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; import { fileURLToPath } from 'node:url'; import { execa, type Options } from 'execa'; const DEBUG = process.env.DEBUG === 'true'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); // repo-root const blueprintPath = path.join(__dirname, '../..'); export const SUPPORTED_PACKAGE_MANAGERS = ['npm', 'yarn', 'pnpm'] as const; export async function createTmp() { let prefix = 'v2-addon-blueprint--'; let prefixPath = path.join(os.tmpdir(), prefix); let tmpDirPath = await fs.mkdtemp(prefixPath); return tmpDirPath; } /** * Abstraction for install, as the blueprint supports multiple package managers */ export async function install({ cwd, packageManager, skipPrepare, }: { cwd: string; packageManager: string; skipPrepare?: boolean; }) { if (packageManager === 'yarn') { await execa('yarn', ['install', '--non-interactive'], { cwd }); } else { let installOptions = []; if (packageManager === 'pnpm') { installOptions.push('--no-frozen-lockfile'); } await execa(packageManager, ['install', '--ignore-scripts', ...installOptions], { cwd }); } const pkg = await packageJsonAt(cwd); // in order to test prepare, we need to have ignore-scripts=false // which is a security risk so we'll manually invoke install + prepare if (pkg.scripts?.prepare && !skipPrepare) { await execa(packageManager, ['run', 'prepare'], { cwd }); } } /** * Abstraction for install, as the blueprint supports multiple package managers */ export async function runScript({ cwd, script, packageManager, }: { cwd: string; script: string; packageManager: string; }) { // all package managers allow a more verbose run