waka-pm
Version:
a pnpm supplement for enforcing consistent versions across all workspaces
159 lines • 6.18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.installFn = void 0;
const ext_config_1 = require("../ext-config");
const file_1 = require("../file");
const npmjs_1 = require("../npmjs");
const package_1 = require("../package");
const schema_1 = require("../schema");
function parsePackageAndVersion(packageName) {
if (packageName.lastIndexOf('@') > 0) {
const name = packageName.substring(0, packageName.lastIndexOf('@'));
const version = packageName.substring(packageName.lastIndexOf('@') + 1);
return { name, version };
}
return { name: packageName, version: null };
}
function lookupDefaultVersion(packageName, requestedVersion, wakaRoot) {
let version = wakaRoot.getRegisteredDepVersion(packageName);
if (!version) {
console.log('version not found in registry -- looking up in npmjs');
version = (0, npmjs_1.getLatestVersion)(packageName + '@' + (requestedVersion ?? 'latest'));
if (!version) {
throw new Error(`Package ${packageName} not found in npmjs registry.`);
}
}
return version;
}
function getDepType(opts) {
const { saveDev, savePeer, saveOpt } = opts;
if (saveDev) {
return 'devDependencies';
}
else if (savePeer) {
return 'peerDependencies';
}
else if (saveOpt) {
return 'optionalDependencies';
}
return 'dependencies';
}
function updatePackage({ wakaRoot, wakaPackage, depType, packageName, version, noRegister, }) {
if (!noRegister) {
wakaPackage.setDependencyVersion(packageName, schema_1.ROOT_REGISTRY_VERSION, depType);
wakaRoot.setRegisteredDependencyVersion(packageName, version);
}
else {
// if we have been told not to register or
// the registry already has a version of this dependency, then don't register
// just add the version to the package
wakaPackage.setDependencyVersion(packageName, version, depType);
}
return { wakaRoot, wakaPackage };
}
async function installFn(repoRootDir, opts) {
const { workspace, packageName } = opts;
let workspaceDir = await (0, package_1.parseWorkspaceDir)(repoRootDir, file_1.cwd, workspace);
const depType = getDepType(opts);
const wakaRoot = await (0, package_1.getWakaRootDocument)(repoRootDir);
const extConfig = await (0, ext_config_1.getExternalConfig)(repoRootDir, opts);
await extConfig?.installPreEvaluate({
workspaceDir,
depType,
wakaRoot,
installPackageAndVersion: packageName,
});
let targetIsRoot = false;
if ((0, file_1.isMonoRepoRoot)(workspaceDir)) {
targetIsRoot = true;
workspaceDir = repoRootDir;
}
const parsedPackage = parsePackageAndVersion(packageName);
if (wakaRoot.hasRegisteredDep(parsedPackage.name) &&
!opts.noRegister &&
parsedPackage.version &&
wakaRoot.getRegisteredDepVersion(parsedPackage.name) !==
parsedPackage.version) {
throw new Error(`Package ${parsedPackage.name} already registered in root.
Use --no-register to install this different version to this workspace.
Otherwise, run again without a version to install the root-version`);
}
if (!parsedPackage.version) {
console.log('no version specified -- looking up version');
parsedPackage.version = lookupDefaultVersion(parsedPackage.name, parsedPackage.version, wakaRoot);
}
if (!opts.noRegister) {
console.log('registering to root registry');
wakaRoot.setRegisteredDependencyVersion(parsedPackage.name, parsedPackage.version);
}
else {
console.log('not registering to root registry');
}
const wakaRootFile = await (0, package_1.getWakaRootFile)(repoRootDir);
if (targetIsRoot) {
console.log('installing to root');
const { wakaRoot: newWakaRoot } = updatePackage({
wakaRoot,
wakaPackage: wakaRoot,
depType,
packageName: parsedPackage.name,
version: parsedPackage.version,
noRegister: opts.noRegister ?? false,
});
await extConfig?.installPreWrite({
wakaRootFile,
workspaceDir,
depType,
wakaRoot: newWakaRoot,
parsedPackageInfo: parsedPackage,
});
console.log(`writing to ${wakaRootFile}`);
await (0, package_1.writeWakaRootDocument)(wakaRootFile, newWakaRoot);
await extConfig?.installPostWrite({
wakaRootFile,
workspaceDir,
depType,
wakaRoot: newWakaRoot,
parsedPackageInfo: parsedPackage,
});
}
else {
console.log('installing to package');
const wakaPackageFile = await (0, package_1.getWakaPackageFile)(workspaceDir, {
ensureExists: true,
});
const wakaPackage = await (0, package_1.getWakaPackageDocument)(workspaceDir);
const { wakaRoot: newWakaRoot, wakaPackage: newWakaPackage } = updatePackage({
wakaRoot,
wakaPackage,
depType,
packageName: parsedPackage.name,
version: parsedPackage.version,
noRegister: opts.noRegister ?? false,
});
await extConfig?.installPreWrite({
wakaRootFile,
wakaPackageFile,
workspaceDir,
depType,
wakaRoot: newWakaRoot,
wakaPackage: newWakaPackage,
parsedPackageInfo: parsedPackage,
});
console.log(`writing to ${wakaPackageFile}`);
await (0, package_1.writeWakaPackageDocument)(wakaPackageFile, newWakaPackage);
console.log(`writing to ${wakaRootFile}`);
await (0, package_1.writeWakaRootDocument)(wakaRootFile, newWakaRoot);
await extConfig?.installPostWrite({
wakaRootFile,
wakaPackageFile,
workspaceDir,
depType,
wakaRoot: newWakaRoot,
wakaPackage: newWakaPackage,
parsedPackageInfo: parsedPackage,
});
}
}
exports.installFn = installFn;
//# sourceMappingURL=install.js.map