Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
async findPackageLocation(locator: Locator, opts: LinkOptions) {
const pnpPath = getPnpPath(opts.project);
if (!xfs.existsSync(pnpPath))
throw new UsageError(`The project in ${opts.project.cwd}/package.json doesn't seem to have been installed - running an install there might help`);
const physicalPath = npath.fromPortablePath(pnpPath);
const pnpFile = miscUtils.dynamicRequire(physicalPath);
delete require.cache[physicalPath];
const packageLocator = {name: structUtils.requirableIdent(locator), reference: locator.reference};
const packageInformation = pnpFile.getPackageInformation(packageLocator);
if (!packageInformation)
throw new UsageError(`Couldn't find ${structUtils.prettyLocator(opts.project.configuration, locator)} in the currently installed PnP map - running an install might help`);
return npath.toPortablePath(packageInformation.packageLocation);
}
const resolution = project.storedResolutions.get(dependency.descriptorHash);
if (!resolution)
throw new Error(`Assertion failed: The resolution should have been registered`);
const nextPkg = project.storedPackages.get(resolution);
if (!nextPkg)
throw new Error(`Assertion failed: The package should have been registered`);
if (nextPkg.identHash !== identHash)
continue;
if (node === null) {
node = {} as TreeNode;
const label = `${structUtils.prettyLocator(configuration, pkg)}`;
tree[label] = node;
}
const label = `${structUtils.prettyLocator(configuration, nextPkg)} (via ${structUtils.prettyRange(configuration, dependency.range)})`;
node[label] = {};
}
}
return tree;
}
let candidateWorkspaces = await Promise.all(project.workspaces.map(async workspace => {
return workspace.manifest.scripts.has(this.scriptName) ? workspace : null;
}));
let filteredWorkspaces = candidateWorkspaces.filter(workspace => {
return workspace !== null;
}) as Array;
if (filteredWorkspaces.length === 1) {
return await scriptUtils.executeWorkspaceScript(filteredWorkspaces[0], this.scriptName, this.args, {stdin: this.context.stdin, stdout: this.context.stdout, stderr: this.context.stderr});
}
}
if (this.topLevel) {
if (this.scriptName === `node-gyp`) {
throw new UsageError(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${structUtils.prettyLocator(configuration, locator)}). This typically happens because some package depends on "node-gyp" to build itself, but didn't list it in their dependencies. To fix that, please run "yarn add node-gyp" into your top-level workspace. You also can open an issue on the repository of the specified package to suggest them to use an optional peer dependency.`);
} else {
throw new UsageError(`Couldn't find a script name "${this.scriptName}" in the top-level (used by ${structUtils.prettyLocator(configuration, locator)}).`);
}
} else {
throw new UsageError(`Couldn't find a script named "${this.scriptName}".`);
}
}
}
async execute() {
const configuration = await Configuration.find(this.context.cwd, this.context.plugins);
const {project, locator} = await Project.find(configuration, this.context.cwd);
const binaries = await scriptUtils.getPackageAccessibleBinaries(locator, {project});
if (this.name) {
const binary = binaries.get(this.name);
if (!binary)
throw new UsageError(`Couldn't find a binary named "${this.name}" for package "${structUtils.prettyLocator(configuration, locator)}"`);
const [/*pkg*/, binaryFile] = binary;
this.context.stdout.write(`${binaryFile}\n`);
} else {
const keys = Array.from(binaries.keys());
const maxKeyLength = keys.reduce((max, key) => Math.max(max, key.length), 0);
if (this.verbose) {
for (const [name, [pkg]] of binaries) {
this.context.stdout.write(`${name.padEnd(maxKeyLength, ` `)} ${structUtils.prettyLocator(configuration, pkg)}\n`);
}
} else {
for (const name of binaries.keys()) {
this.context.stdout.write(`${name}\n`);
}
}
private getPackageInformation(locator: Locator) {
const key1 = structUtils.requirableIdent(locator);
const key2 = locator.reference;
const packageInformationStore = this.packageRegistry.get(key1);
if (!packageInformationStore)
throw new Error(`Assertion failed: The package information store should have been available (for ${structUtils.prettyIdent(this.opts.project.configuration, locator)})`);
const packageInformation = packageInformationStore.get(key2);
if (!packageInformation)
throw new Error(`Assertion failed: The package information should have been available (for ${structUtils.prettyLocator(this.opts.project.configuration, locator)})`);
return packageInformation;
}
async () => {
opts.report.reportInfoOnce(MessageName.FETCH_NOT_CACHED, `${structUtils.prettyLocator(opts.project.configuration, locator)} can't be found in the cache and will be fetched from the remote repository`);
return await this.cloneFromRemote(locator, opts);
},
);