in packages/server/src/lib/write-package.ts [233:310]
async function enforceMatchingRelease(
repoName: string,
token: string,
lastPackument: Packument | undefined,
drainedBody: Buffer,
monorepo?: boolean
) {
try {
const maybePackument = JSON.parse(drainedBody + '');
if (
typeof maybePackument !== 'object' ||
maybePackument['dist-tags'] === undefined
) {
throw new WombatServerError(
'Release-backed tokens should be used exclusively for publication.',
400
);
}
// Check whether the publish document contains either a
// "latest" or "next" tag:
const newPackument = maybePackument as Packument;
let newVersionPackument =
newPackument.versions[newPackument['dist-tags'].latest || ''];
if (!newVersionPackument) {
newVersionPackument =
newPackument.versions[newPackument['dist-tags'].next || ''];
}
if (!newVersionPackument) {
throw new WombatServerError(
'No "latest" or "next" version found in packument.',
400
);
}
let newVersion = newVersionPackument.version;
// If this is not the first package publication, we infer the version being
// published by comparing the new and old packument:
if (lastPackument) {
console.info(
`${newPackument.name} has been published before, comparing versions`
);
const versions = newVersions(lastPackument, newPackument);
if (versions.length !== 1) {
throw new WombatServerError(
'No new versions found in packument. Release-backed tokens should be used exclusively for publication.',
400
);
} else {
newVersion = versions[0];
}
}
let prefix;
const tags = [];
if (monorepo) {
const splitName = newPackument.name.split('/');
prefix = splitName.length === 1 ? splitName[0] : splitName[1];
// release-please-style monorepo tags: package-v2.0.1
tags.push(`${prefix}-v${newVersion}`);
// lerna-style monorepo tags: @scope/package@2.0.1
tags.push(`${newPackument.name}@${newVersion}`);
} else {
tags.push(`v${newVersion}`);
}
const release = await github.getRelease(repoName, token, tags);
if (!release) {
const msg = `matching release v${newVersion} not found for ${repoName}. Did not find any tags matching: ${tags.join()}`;
throw new WombatServerError(msg, 400);
}
} catch (err) {
if (err instanceof WombatServerError) {
throw err;
}
if (err instanceof Error) {
throw new WombatServerError(err.message || 'unknown error', 500);
}
throw new WombatServerError('unknown error', 500);
}
}