436a9631fc
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
93 lines
4.4 KiB
JavaScript
93 lines
4.4 KiB
JavaScript
"use strict";
|
||
Object.defineProperty(exports, "__esModule", { value: true });
|
||
exports.YarnBerryNodeModulesCollector = void 0;
|
||
const builder_util_1 = require("builder-util");
|
||
const lazy_val_1 = require("lazy-val");
|
||
const npmNodeModulesCollector_1 = require("./npmNodeModulesCollector");
|
||
const packageManager_1 = require("./packageManager");
|
||
// Only Yarn v1 uses CLI. We should use pnp.cjs for PnP, but we can't access the files due to virtual file paths within zipped modules.
|
||
// We fallback to npm node module collection (since Yarn Berry could have npm-like structure OR pnpm-like structure, depending on `nmHoistingLimits` configuration).
|
||
// In the latter case, we still can't assume `pnpm` is installed, so we still try to use npm collection as a best-effort attempt.
|
||
// If those fail, such as if using corepack, we attempt to manually build the tree.
|
||
class YarnBerryNodeModulesCollector extends npmNodeModulesCollector_1.NpmNodeModulesCollector {
|
||
constructor() {
|
||
super(...arguments);
|
||
this.installOptions = {
|
||
manager: packageManager_1.PM.YARN_BERRY,
|
||
lockfile: "yarn.lock",
|
||
};
|
||
this.yarnSetupInfo = new lazy_val_1.Lazy(async () => this.detectYarnSetup(this.rootDir));
|
||
this.isHoisted = new lazy_val_1.Lazy(async () => this.yarnSetupInfo.value.then(info => info.isHoisted));
|
||
}
|
||
async getDependenciesTree(_pm) {
|
||
const isPnp = await this.yarnSetupInfo.value.then(info => !!info.isPnP);
|
||
if (isPnp) {
|
||
builder_util_1.log.warn(null, "Yarn PnP extraction not supported directly due to virtual file paths (<package_name>.zip/<file_path>), utilizing NPM node module collector");
|
||
}
|
||
return super.getDependenciesTree(packageManager_1.PM.NPM);
|
||
}
|
||
isProdDependency(packageName, tree) {
|
||
var _a, _b;
|
||
return super.isProdDependency(packageName, tree) || ((_a = tree.dependencies) === null || _a === void 0 ? void 0 : _a[packageName]) != null || ((_b = tree.optionalDependencies) === null || _b === void 0 ? void 0 : _b[packageName]) != null;
|
||
}
|
||
async detectYarnSetup(rootDir) {
|
||
var _a, _b, _c, _d;
|
||
let yarnVersion = null;
|
||
let nodeLinker = null;
|
||
let nmHoistingLimits = null;
|
||
const output = await this.asyncExec("yarn", ["config", "--json"], rootDir);
|
||
if (!output.stdout) {
|
||
builder_util_1.log.debug(null, "Yarn config returned no output, assuming default Yarn v1 behavior (hoisted, non-PnP)");
|
||
return {
|
||
yarnVersion,
|
||
nodeLinker,
|
||
nmHoistingLimits,
|
||
isPnP: false,
|
||
isHoisted: true,
|
||
};
|
||
}
|
||
// Yarn 1: multi-line stream with type:"inspect" (not used in this file anyways)
|
||
// Yarn 2–3: multi-line stream with type:"inspect"
|
||
// Yarn 4: single JSON object, no "type"
|
||
const lines = output.stdout
|
||
.split("\n")
|
||
.map(l => l.trim())
|
||
.filter(Boolean);
|
||
let data = null;
|
||
for (const line of lines) {
|
||
try {
|
||
const parsed = JSON.parse(line);
|
||
// Yarn 4: direct object
|
||
if (parsed.rc || parsed.manifest) {
|
||
data = parsed;
|
||
break;
|
||
}
|
||
// Yarn 1–3: inspect event
|
||
if (parsed.type === "inspect") {
|
||
data = parsed.data;
|
||
break;
|
||
}
|
||
}
|
||
catch {
|
||
// ignore non-JSON lines
|
||
}
|
||
}
|
||
if (data) {
|
||
const rc = data.rc || data; // Yarn 4: rc in root; Yarn 2–3: rc inside data
|
||
yarnVersion = (_b = (_a = data.manifest) === null || _a === void 0 ? void 0 : _a.version) !== null && _b !== void 0 ? _b : null;
|
||
nodeLinker = (_c = rc.nodeLinker) !== null && _c !== void 0 ? _c : null;
|
||
nmHoistingLimits = (_d = rc.nmHoistingLimits) !== null && _d !== void 0 ? _d : null;
|
||
}
|
||
const isPnP = nodeLinker === "pnp";
|
||
const isHoisted = !isPnP && (nmHoistingLimits === "dependencies" || nmHoistingLimits === "workspaces");
|
||
return {
|
||
yarnVersion,
|
||
nodeLinker,
|
||
nmHoistingLimits,
|
||
isPnP,
|
||
isHoisted,
|
||
};
|
||
}
|
||
}
|
||
exports.YarnBerryNodeModulesCollector = YarnBerryNodeModulesCollector;
|
||
//# sourceMappingURL=yarnBerryNodeModulesCollector.js.map
|