diff --git a/release.config.cjs b/release.config.cjs index 737c543f..b21ac394 100644 --- a/release.config.cjs +++ b/release.config.cjs @@ -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"); @@ -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", [ diff --git a/release/dependency.cjs b/release/dependency.cjs index 5a69deb4..3fc2f4f0 100644 --- a/release/dependency.cjs +++ b/release/dependency.cjs @@ -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 };