UNPKG

@monorepo-utilities/install-dependencies

Version:

Builds node modules to a spectified path 📦

78 lines (74 loc) • 3.29 kB
#!/usr/bin/env node // src/program.ts import { program } from "commander"; import { cosmiconfigSync } from "cosmiconfig"; // src/script.ts import { promisify } from "util"; import { exec } from "child_process"; import { resolve } from "path"; import { readFileSync } from "fs-extra"; var execPromise = promisify(exec); function resolveJSON(path, debug = false) { try { const json = JSON.parse(readFileSync(path, "utf8")); return json; } catch (err) { if (debug) console.log(err); return; } } function depsToInstall({ dependencies = {}, ignore = [], include = {} } = {}) { const dependencyNames = Object.keys(dependencies); const includeNames = Object.keys(include); const hasDependencies = dependencyNames.length > 0; const hasInclude = includeNames.length > 0; if (!hasDependencies && !hasInclude) return []; const deps = hasDependencies ? dependencyNames.filter((dep) => !ignore.includes(dep)).map((name) => ({ name, version: dependencies[name] })) : []; const includeDeps = hasInclude ? includeNames.map((name) => ({ name, version: include[name] })) : []; const mergedDeps = deps.filter(({ name }) => !includeDeps.map(({ name: name2 }) => name2).includes(name)).concat(includeDeps); return mergedDeps; } async function installDependencies({ config, file = "package.json", dest, debug = false, isTesting = false, exec: exec2 = execPromise, hasLockfile = false, path = "./", runner = "npm" }) { const json = resolve(`${path}${file}`); const data = resolveJSON(json, debug); const { dependencies = {}, ideps } = data || {}; const { ignore = [], include = {} } = config || ideps || installDependencies || {}; const deps = depsToInstall({ dependencies, ignore, include }); const depsString = deps.map(({ name, version: version2 }) => `${name}@${version2}`).join(" "); if (debug) console.log("install-dependencies:debugging:", { deps, config, depsString }); if (isTesting || deps.length < 1) return; await exec2(`${runner} install ${dest ? `--prefix ${dest} ` : " "}${depsString} -S --package-lock=${hasLockfile}`); } var script_default = installDependencies; // src/program.ts var version = "VERSION"; var explorer = cosmiconfigSync("ideps"); async function action(options = {}) { const result = (options == null ? void 0 : options.config) ? explorer.load(options.config) : explorer.search(); const { config = {} } = result || {}; const { config: unusedConfig, isTestingCLI, ...rest } = options; if (isTestingCLI) { console.info({ options, config }); return; } await script_default({ ...rest, config }); } program.version(version).description("Install monorepo package dependencies with control! \u{1F4E6}").option("-c, --config <config>", "config path").option("--debug", "enables debug mode").option("-d, --dest <string>", "dest path").option("-f, --file <file>", "path to package.json file").option("--has-lockfile", "use lock file").option("-t, --isTestingCLI", "enables CLI testing, no scripts are run").option("--isTesting", "enables testing, no scripts are run").option("-p, --path <path>", "path to package.json file").option("-r, --runner <runner>", "npm, pnpm, or yarn").action(action).parse(process.argv); export { installDependencies, script_default as script };