Skip to content

Commit

Permalink
Merge pull request #960 from spiltcoffee/release
Browse files Browse the repository at this point in the history
build: fix order of dependency updates for release
  • Loading branch information
spiltcoffee authored Jul 15, 2023
2 parents 8f73412 + 883cbd1 commit aef3e20
Show file tree
Hide file tree
Showing 2 changed files with 61 additions and 44 deletions.
46 changes: 34 additions & 12 deletions release.config.cjs
Original file line number Diff line number Diff line change
@@ -1,14 +1,40 @@
const path = require("path");
const { spawnSync } = require("child_process");

const pkgs = spawnSync("yarn", ["workspaces", "list", "--json"], {
shell: true,
encoding: "utf-8",
})
// ordered by dependency first, name second
const pkgs = [
{ name: "@postdfm/ast", pkgRoot: "packages/@postdfm/ast" },
{ name: "@postdfm/ast2dfm", pkgRoot: "packages/@postdfm/ast2dfm" },
{ name: "@postdfm/dfm2ast", pkgRoot: "packages/@postdfm/dfm2ast" },
{ name: "@postdfm/plugin", pkgRoot: "packages/@postdfm/plugin" },
{ name: "@postdfm/transform", pkgRoot: "packages/@postdfm/transform" },
{ name: "postdfm", pkgRoot: "packages/postdfm" },
];

const workspaces = spawnSync(
"yarn",
["workspaces", "list", "--json", "--no-private"],
{ shell: true, encoding: "utf-8" },
)
.stdout.split(/[\r\n]+/)
.filter(Boolean)
.map(JSON.parse)
.filter(({ location }) => location !== ".");
.map(({ name, location }) => ({ name, pkgRoot: location }));

function isPkgEqual(a) {
return (b) => a.name === b.name && a.pkgRoot === b.pkgRoot;
}

if (
!(
workspaces.every((workspace) => pkgs.some(isPkgEqual(workspace))) &&
pkgs.every((pkg) => workspaces.some(isPkgEqual(pkg)))
)
) {
throw new Error(
"Mismatch between public workspaces and packages in release configuration!",
);
}

const tarballDir = path.resolve(__dirname, "dist");

Expand All @@ -18,13 +44,9 @@ module.exports = {
plugins: [
"@semantic-release/commit-analyzer",
"@semantic-release/release-notes-generator",
["./release/dependency.cjs", { pkgs }],
...pkgs.map(({ location: pkgRoot }) => [
"@semantic-release/npm",
{
pkgRoot,
tarballDir,
},
...pkgs.flatMap((pkg) => [
["./release/dependency.cjs", { pkg, pkgs }],
["@semantic-release/npm", { pkgRoot: pkg.pkgRoot, tarballDir }],
]),
"./release/yarnlock.cjs",
[
Expand Down
59 changes: 27 additions & 32 deletions release/dependency.cjs
Original file line number Diff line number Diff line change
@@ -1,40 +1,35 @@
const path = require("path");
const fs = require("fs");

async function prepare(pluginConfig, { nextRelease: { version }, logger }) {
for (const pkg of pluginConfig.pkgs) {
const pkgJsonPath = path.join(pkg.location, "package.json");

const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath));

let found = false;

if (pkgJson.dependencies) {
pkgJson.dependencies = Object.entries(pkgJson.dependencies).reduce(
(dependencies, [depName, depVersion]) => {
if (pluginConfig.pkgs.some(({ name }) => name === depName)) {
found = true;
logger.log(`${pkg.name}: Updating ${depName} to ^${version}`);
dependencies[depName] = `^${version}`;
} else {
dependencies[depName] = depVersion;
}

return dependencies;
},
{},
);
}

if (!found) {
logger.log(`${pkg.name}: No dependencies to update`);
}

await fs.writeFileSync(
pkgJsonPath,
JSON.stringify(pkgJson, null, 2) + "\n",
async function prepare({ pkg, pkgs }, { nextRelease: { version }, logger }) {
const pkgJsonPath = path.join(pkg.pkgRoot, "package.json");

const pkgJson = JSON.parse(fs.readFileSync(pkgJsonPath));

let found = false;

if (pkgJson.dependencies) {
pkgJson.dependencies = Object.entries(pkgJson.dependencies).reduce(
(dependencies, [depName, depVersion]) => {
if (pkgs.some(({ name }) => name === depName)) {
found = true;
logger.log(`${pkg.name}: Updating ${depName} to ^${version}`);
dependencies[depName] = `^${version}`;
} else {
dependencies[depName] = depVersion;
}

return dependencies;
},
{},
);
}

if (!found) {
logger.log(`${pkg.name}: No dependencies to update`);
}

await fs.writeFileSync(pkgJsonPath, JSON.stringify(pkgJson, null, 2) + "\n");
}

module.exports = { prepare };

0 comments on commit aef3e20

Please sign in to comment.