UNPKG

vsix-utils

Version:

utilities for working with VSIX packages

181 lines (178 loc) 6.16 kB
export { createVsixManifest, getManifestTags, isWebKind, readProjectManifest, transformExtensionKind } from './chunk-B6LXV7ZN.mjs'; export { ALLOWED_SPONSOR_PROTOCOLS, EXTENSION_NAME_REGEX, EXTENSION_PRICING, GITHUB_BADGE_URL_REGEX, VALID_EXTENSION_KINDS, VSCODE_ENGINE_COMPATIBILITY_REGEX, validateProjectManifest, validateVSCodeTypesCompatability } from './chunk-EPPBUJGT.mjs'; export { readVsix, writeVsix } from './chunk-5EQ5A35C.mjs'; export { collect, getContentTypesForFiles, getExtensionPackageManager, inferBaseUrls, isInMemoryFile, isLocalFile, transformFiles, transformMarkdown } from './chunk-M7VDGRNO.mjs'; import './chunk-WRSU2XB2.mjs'; import { exec } from 'node:child_process'; import path, { isAbsolute, resolve, join } from 'node:path'; import process from 'node:process'; import { promisify } from 'node:util'; var execAsync = promisify(exec); async function getExtensionDependencies(manifest, options) { const { packageManager, cwd = process.cwd() } = options; const dependencies = /* @__PURE__ */ new Set(); if (packageManager === "npm") { const { stdout } = await execAsync("npm list --production --parseable --depth=99999 --loglevel=error", { cwd }); const lines = stdout.split(/[\r\n]/).filter((path2) => isAbsolute(path2)); for (const line of lines) { if (line === resolve(cwd)) { continue; } const dependency = line.split(`${path.sep}node_modules${path.sep}`)[1]; if (dependency == null) { throw new Error(`could not parse dependency: ${line}`); } dependencies.add({ name: dependency.replace(/\\/g, "/"), version: manifest.dependencies != null ? manifest.dependencies[dependency.replace(/\\/g, "/")] : undefined, path: line }); } } else if (packageManager === "yarn") { let asYarnDependency2 = function(prefix, tree, prune2) { if (prune2 && /@[\^~]/.test(tree.name)) { return null; } let name; let version = ""; try { const tmp = tree.name.split("@"); if (tmp[0] === "") { tmp.shift(); tmp[0] = `@${tmp[0]}`; } name = tmp[0]; version = tmp[1] || ""; } catch { name = tree.name.replace(/^([^@+])@.*$/, "$1"); } const dependencyPath = path.join(prefix, name); const children = []; for (const child of tree.children || []) { const dep = asYarnDependency2(path.join(prefix, name, "node_modules"), child, prune2); if (dep) { children.push(dep); } } return { name, path: dependencyPath, children, version }; }; const { stdout } = await execAsync("yarn list --prod --json", { cwd }); const match = /^\{"type":"tree".*$/m.exec(stdout); if (!match || match.length !== 1) { throw new Error("Could not parse result of `yarn list --json`"); } const trees = JSON.parse(match[0]).data.trees; if (!Array.isArray(trees) || trees.length === 0) { return []; } const prune = true; const result = trees.map((tree) => asYarnDependency2(join(cwd, "node_modules"), tree, prune)).filter((dep) => dep != null); const internalDeps = /* @__PURE__ */ new Set(); const flatten = (dep) => { if (internalDeps.has(dep.path)) { return; } dependencies.add({ name: dep.name, version: dep.version, path: dep.path }); internalDeps.add(dep.path); if (dep.children) { for (const child of dep.children) { flatten(child); } } }; for (const dep of result) { flatten(dep); } } else if (packageManager === "pnpm") { const { stdout } = await execAsync("pnpm list --production --json --depth=99999 --loglevel=error --ignore-workspace", { cwd }); let entryList = []; try { entryList = JSON.parse(stdout); } catch { return []; } if (!Array.isArray(entryList) || entryList.length === 0) { return []; } const entry = entryList[0]; if (entry == null || typeof entry !== "object" || entry.dependencies == null || typeof entry.dependencies !== "object") { return []; } const internalDeps = /* @__PURE__ */ new Set(); const flatten = (dep) => { if (internalDeps.has(dep.path)) { return; } dependencies.add({ name: dep.from, version: dep.version, path: dep.path }); internalDeps.add(dep.path); if (dep.dependencies) { for (const child of Object.values(dep.dependencies)) { flatten(child); } } }; for (const value of Object.values(entry.dependencies)) { flatten(value); } } else { throw new Error(`unsupported package manager: ${packageManager}`); } return Array.from(dependencies); } async function prepublish(options) { const { cwd, packageManager, manifest, preRelease } = options; if (!manifest.scripts) { return; } const scripts = []; if ("vscode:prepublish" in manifest.scripts) { scripts.push("vscode:prepublish"); } if ("vscode:prepublish:release" in manifest.scripts && !preRelease) { scripts.push("vscode:prepublish:release"); } if ("vscode:prepublish:prerelease" in manifest.scripts && preRelease) { scripts.push("vscode:prepublish:prerelease"); } if (scripts.length === 0) { return; } const results = await Promise.all( scripts.map((script) => runScript({ cwd, packageManager, script })) ); if (results.some((result) => !result)) { throw new Error("failed to run one or more scripts"); } } async function runScript(options) { const { cwd, packageManager, script } = options; try { const { stderr } = await new Promise((resolve2, reject) => { exec(`${packageManager} run ${script}`, { cwd }, (err, stdout, stderr2) => { if (err) { reject(err); } else { resolve2({ stdout, stderr: stderr2 }); } }); }); if (stderr.trim() !== "") { return false; } return true; } catch { return false; } } export { getExtensionDependencies, prepublish };