diff --git a/dist/index.js b/dist/index.js index 99fac39..0923575 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1441,5 +1441,5 @@ var e=require("./conversions"),n=require("./route"),r={},o=Object.keys(e);functi },{"chalk":"ug4C"}],"PCsh":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var e=c(require("@babel/runtime/helpers/esm/defineProperty")),r=l(require("fs-extra")),t=c(require("path")),n=c(require("@changesets/parse")),a=require("@changesets/git"),i=c(require("chalk")),o=c(require("p-filter")),s=require("@changesets/logger");function l(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)if(Object.prototype.hasOwnProperty.call(e,t)){var n=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(e,t):{};n.get||n.set?Object.defineProperty(r,t,n):r[t]=e[t]}return r.default=e,r}function c(e){return e&&e.__esModule?e:{default:e}}let u=i.default.red("===============================IMPORTANT!==============================="),d=i.default.red("----------------------------------------------------------------------");async function f(e,n){const a=(await(0,o.default)(n,async n=>(await(0,r.lstat)(t.default.join(e,n))).isDirectory())).map(async n=>{const a=t.default.join(e,n,"changes.json"),[i,o]=await Promise.all([(0,r.readFile)(t.default.join(e,n,"changes.md"),"utf-8"),(0,r.readJson)(a)]);return{releases:o.releases,summary:i,id:n}});return Promise.all(a)}async function p(e,r){let t=await f(e,r);return 0===t.length?[]:((0,s.warn)(u),(0,s.warn)("There were old changesets from version 1 found"),(0,s.warn)("Theses are being applied now but the dependents graph may have changed"),(0,s.warn)("Make sure you validate all your dependencies"),(0,s.warn)("In a future major version, we will no longer apply these old changesets, and will instead throw here"),(0,s.warn)(d),t)}function h(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter(function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable})),t.push.apply(t,n)}return t}function w(r){for(var t=1;te.split("/")[1]);return e.filter(e=>n.includes(e))}async function g(e,a){let i,o=t.default.join(e,".changeset");try{i=await r.default.readdir(o)}catch(c){if("ENOENT"===c.code)throw new Error("There is no .changeset directory in this project");throw c}void 0!==a&&(i=await y(i,o,a));let s=p(o,i);const l=i.filter(e=>e.endsWith(".md")&&"README.md"!==e).map(async e=>{const a=await r.default.readFile(t.default.join(o,e),"utf-8");return w({},(0,n.default)(a),{id:e.replace(".md","")})});return[...await s,...await Promise.all(l)]}var O=g;exports.default=O; },{"@babel/runtime/helpers/esm/defineProperty":"9iDM","fs-extra":"rdZu","@changesets/parse":"boSt","@changesets/git":"It5m","chalk":"ug4C","p-filter":"PNks","@changesets/logger":"cocj"}],"7QCb":[function(require,module,exports) { -"use strict";function e(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),a.push.apply(a,n)}return a}function t(t){for(var n=1;n{let e=process.env.GITHUB_TOKEN;if(!e)return void s.setFailed("Please add the GITHUB_TOKEN to the changesets action");let a=`${r.context.repo.owner}/${r.context.repo.repo}`,n=r.context.ref.replace("refs/heads/",""),i=await h.readPreState(process.cwd()),f=void 0!==i&&"pre"===i.mode;const b=new r.GitHub(e);console.log("setting git user"),await o.exec("git",["config","--global","user.name",'"github-actions[bot]"']),await o.exec("git",["config","--global","user.email",'"github-actions[bot]@users.noreply.github.com"']),console.log("setting GitHub credentials"),await c.default.writeFile(`${process.env.HOME}/.netrc`,`machine github.com\nlogin github-actions[bot]\npassword ${e}`);let m=await d.default(process.cwd());if(f){let e=new Set(i.changesets);m=m.filter(t=>!e.has(t.id))}let w=0!==m.length,y={publishScript:s.getInput("publish"),versionScript:s.getInput("version"),commit:s.getInput("commit")||"Version Packages",prTitle:s.getInput("title")||"Version Packages"};if(s.setOutput("published","false"),s.setOutput("publishedPackages","[]"),w||y.publishScript){if(!w&&y.publishScript){console.log("No changesets found, attempting to publish any unpublished packages to npm");let{packages:e}=await l.getPackages(process.cwd()),a=new Map(e.map(e=>[e.packageJson.name,e])),i=`${process.env.HOME}/.npmrc`;c.default.existsSync(i)?console.log("Found existing .npmrc file"):(console.log("No .npmrc file found, creating one"),c.default.writeFileSync(i,`//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}`));let[g,...h]=y.publishScript.split(/\s+/),d=await p.execWithOutput(g,h);await o.exec("git",["pull","origin",n]),await o.exec("git",["push","origin",`HEAD:${n}`,"--tags"]);let f=/New tag:\s+(@[^\/]+\/[^@]+|[^\/]+)@([^\s]+)/,m=[];for(let t of d.stdout.split("\n")){let e=t.match(f);if(null===e)continue;let n=e[1],i=a.get(n);if(void 0===i)return s.setFailed(`Package "${n}" not found.`+"This is probably a bug in the action, please open an issue");m.push(i)}return await Promise.all(m.map(async e=>{try{let n=u.default.join(e.dir,"CHANGELOG.md"),i=await c.default.readFile(n,"utf8"),o=p.getChangelogEntry(i,e.packageJson.version);if(!o)return s.setFailed(`Could not find changelog entry for ${e.packageJson.name}@${e.packageJson.version}`);await b.repos.createRelease(t({tag_name:`${e.packageJson.name}@${e.packageJson.version}`,body:o.content,prerelease:e.packageJson.version.includes("-")},r.context.repo))}catch(a){if("ENOENT"!==a.code)throw a}})),void(m.length&&(s.setOutput("published","true"),s.setOutput("publishedPackages",JSON.stringify(m.map(e=>({name:e.packageJson.name,version:e.packageJson.version}))))))}if(w){let e=`changeset-release/${n}`,{stderr:s}=await p.execWithOutput("git",["checkout",e],{ignoreReturnCode:!0});if(!s.toString().includes(`Switched to a new branch '${e}'`)&&await o.exec("git",["checkout","-b",e]),await o.exec("git",["reset","--hard",r.context.sha]),y.versionScript){let[e,...t]=y.versionScript.split(/\s+/);await o.exec(e,t)}else{let e=await c.default.readJson(u.default.join("node_modules","@changesets","cli","package.json")),t=g.lt(e.version,"2.0.0")?"bump":"version";await o.exec("node",["./node_modules/@changesets/cli/bin.js",t])}let l=`repo:${a}+state:open+head:${e}+base:${n}`,h=b.search.issuesAndPullRequests({q:l}),d=await p.getChangedPackages(process.cwd()),m=(async()=>`This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and ${y.publishScript?"the packages will be published to npm automatically":"publish to npm yourself or [setup this action to publish automatically](https://github.com/changesets/action#with-publishing)"}. If you're not ready to do a release yet, that's fine, whenever you add more changesets to ${n}, this PR will be updated.\n${f?`\n⚠️⚠️⚠️⚠️⚠️⚠️\n\n\`${n}\` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run \`changeset pre exit\` on \`${n}\`.\n\n⚠️⚠️⚠️⚠️⚠️⚠️\n`:""}\n# Releases\n`+(await Promise.all(d.map(async e=>{let t=await c.default.readFile(u.default.join(e.dir,"CHANGELOG.md"),"utf8"),a=p.getChangelogEntry(t,e.packageJson.version);return{highestLevel:a.highestLevel,private:!!e.packageJson.private,content:`## ${e.packageJson.name}@${e.packageJson.version}\n\n`+a.content}}))).filter(e=>e).sort(p.sortTheThings).map(e=>e.content).join("\n "))();const w=`${y.prTitle}${f?` (${i.tag})`:""}`,v=`${y.commit}${f?` (${i.tag})`:""}`;await o.exec("git",["add","."]),await o.exec("git",["commit","-m",v]),await o.exec("git",["push","origin",e,"--force"]);let O=await h;console.log(JSON.stringify(O.data,null,2)),0===O.data.items.length?(console.log("creating pull request"),await b.pulls.create(t({base:n,head:e,title:w,body:await m},r.context.repo))):(b.pulls.update(t({pull_number:O.data.items[0].number,title:w,body:await m},r.context.repo)),console.log("pull request found"))}}else console.log("No changesets found")})().catch(e=>{console.error(e),s.setFailed(e.message)}); +"use strict";function e(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),a.push.apply(a,n)}return a}function t(t){for(var n=1;n{try{let o=u.default.join(a.dir,"CHANGELOG.md"),l=await c.default.readFile(o,"utf8"),g=p.getChangelogEntry(l,a.packageJson.version);if(!g)return i.setFailed(`Could not find changelog entry for ${a.packageJson.name}@${a.packageJson.version}`);await e.repos.createRelease(t({tag_name:n,body:g.content,prerelease:a.packageJson.version.includes("-")},r.context.repo))}catch(s){if("ENOENT"!==s.code)throw s}};(async()=>{let e=process.env.GITHUB_TOKEN;if(!e)return void i.setFailed("Please add the GITHUB_TOKEN to the changesets action");let a=`${r.context.repo.owner}/${r.context.repo.repo}`,n=r.context.ref.replace("refs/heads/",""),s=await h.readPreState(process.cwd()),b=void 0!==s&&"pre"===s.mode;const m=new r.GitHub(e);console.log("setting git user"),await o.exec("git",["config","--global","user.name",'"github-actions[bot]"']),await o.exec("git",["config","--global","user.email",'"github-actions[bot]@users.noreply.github.com"']),console.log("setting GitHub credentials"),await c.default.writeFile(`${process.env.HOME}/.netrc`,`machine github.com\nlogin github-actions[bot]\npassword ${e}`);let w=await d.default(process.cwd());if(b){let e=new Set(s.changesets);w=w.filter(t=>!e.has(t.id))}let y=0!==w.length,v={publishScript:i.getInput("publish"),versionScript:i.getInput("version"),commit:i.getInput("commit")||"Version Packages",prTitle:i.getInput("title")||"Version Packages"};if(i.setOutput("published","false"),i.setOutput("publishedPackages","[]"),y||v.publishScript)if(y||!v.publishScript){if(y){let e=`changeset-release/${n}`,{stderr:i}=await p.execWithOutput("git",["checkout",e],{ignoreReturnCode:!0});if(!i.toString().includes(`Switched to a new branch '${e}'`)&&await o.exec("git",["checkout","-b",e]),await o.exec("git",["reset","--hard",r.context.sha]),v.versionScript){let[e,...t]=v.versionScript.split(/\s+/);await o.exec(e,t)}else{let e=await c.default.readJson(u.default.join("node_modules","@changesets","cli","package.json")),t=g.lt(e.version,"2.0.0")?"bump":"version";await o.exec("node",["./node_modules/@changesets/cli/bin.js",t])}let l=`repo:${a}+state:open+head:${e}+base:${n}`,h=m.search.issuesAndPullRequests({q:l}),d=await p.getChangedPackages(process.cwd()),f=(async()=>`This PR was opened by the [Changesets release](https://github.com/changesets/action) GitHub action. When you're ready to do a release, you can merge this and ${v.publishScript?"the packages will be published to npm automatically":"publish to npm yourself or [setup this action to publish automatically](https://github.com/changesets/action#with-publishing)"}. If you're not ready to do a release yet, that's fine, whenever you add more changesets to ${n}, this PR will be updated.\n${b?`\n⚠️⚠️⚠️⚠️⚠️⚠️\n\n\`${n}\` is currently in **pre mode** so this branch has prereleases rather than normal releases. If you want to exit prereleases, run \`changeset pre exit\` on \`${n}\`.\n\n⚠️⚠️⚠️⚠️⚠️⚠️\n`:""}\n# Releases\n`+(await Promise.all(d.map(async e=>{let t=await c.default.readFile(u.default.join(e.dir,"CHANGELOG.md"),"utf8"),a=p.getChangelogEntry(t,e.packageJson.version);return{highestLevel:a.highestLevel,private:!!e.packageJson.private,content:`## ${e.packageJson.name}@${e.packageJson.version}\n\n`+a.content}}))).filter(e=>e).sort(p.sortTheThings).map(e=>e.content).join("\n "))();const w=`${v.prTitle}${b?` (${s.tag})`:""}`,y=`${v.commit}${b?` (${s.tag})`:""}`;await o.exec("git",["add","."]),await o.exec("git",["commit","-m",y]),await o.exec("git",["push","origin",e,"--force"]);let k=await h;console.log(JSON.stringify(k.data,null,2)),0===k.data.items.length?(console.log("creating pull request"),await m.pulls.create(t({base:n,head:e,title:w,body:await f},r.context.repo))):(m.pulls.update(t({pull_number:k.data.items[0].number,title:w,body:await f},r.context.repo)),console.log("pull request found"))}}else{console.log("No changesets found, attempting to publish any unpublished packages to npm");let e=`${process.env.HOME}/.npmrc`;c.default.existsSync(e)?console.log("Found existing .npmrc file"):(console.log("No .npmrc file found, creating one"),c.default.writeFileSync(e,`//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}`));let[t,...a]=v.publishScript.split(/\s+/),s=await p.execWithOutput(t,a);await o.exec("git",["pull","origin",n]),await o.exec("git",["push","origin",`HEAD:${n}`,"--tags"]);let{packages:r,tool:u}=await l.getPackages(process.cwd()),g=[];if("root"!==u){let e=/New tag:\s+(@[^\/]+\/[^@]+|[^\/]+)@([^\s]+)/,t=new Map(r.map(e=>[e.packageJson.name,e]));for(let a of s.stdout.split("\n")){let n=a.match(e);if(null===n)continue;let s=n[1],o=t.get(s);if(void 0===o)return i.setFailed(`Package "${s}" not found.`+"This is probably a bug in the action, please open an issue");g.push(o)}await Promise.all(g.map(e=>f(m,{pkg:e,tagName:`${e.packageJson.name}@${e.packageJson.version}`})))}else{if(0===r.length)return i.setFailed("No package found.This is probably a bug in the action, please open an issue");const e=r[0];g.push(e),await f(m,{pkg:e,tagName:`v${e.packageJson.version}`})}g.length&&(i.setOutput("published","true"),i.setOutput("publishedPackages",JSON.stringify(g.map(e=>({name:e.packageJson.name,version:e.packageJson.version})))))}else console.log("No changesets found")})().catch(e=>{console.error(e),i.setFailed(e.message)}); },{"@actions/core":"4FTV","@actions/exec":"utFe","@actions/github":"8Dol","fs-extra":"JTJ9","@manypkg/get-packages":"2/T/","./utils":"UnXq","semver":"aric","@changesets/pre":"jEAA","@changesets/read":"PCsh"}]},{},["7QCb"], null) \ No newline at end of file diff --git a/index.ts b/index.ts index 39f7d20..f4877e0 100644 --- a/index.ts +++ b/index.ts @@ -14,6 +14,38 @@ import * as semver from "semver"; import { readPreState } from "@changesets/pre"; import readChangesets from "@changesets/read"; +const createRelease = async ( + octokit: github.GitHub, + { pkg, tagName }: { pkg: Package; tagName: string } +) => { + try { + let changelogFileName = path.join(pkg.dir, "CHANGELOG.md"); + + let changelog = await fs.readFile(changelogFileName, "utf8"); + + let changelogEntry = getChangelogEntry(changelog, pkg.packageJson.version); + if (!changelogEntry) { + // we can find a changelog but not the entry for this version + // if this is true, something has probably gone wrong + return core.setFailed( + `Could not find changelog entry for ${pkg.packageJson.name}@${pkg.packageJson.version}` + ); + } + + await octokit.repos.createRelease({ + tag_name: tagName, + body: changelogEntry.content, + prerelease: pkg.packageJson.version.includes("-"), + ...github.context.repo + }); + } catch (err) { + // if we can't find a changelog, the user has probably disabled changelogs + if (err.code !== "ENOENT") { + throw err; + } + } +}; + (async () => { let githubToken = process.env.GITHUB_TOKEN; @@ -75,9 +107,6 @@ import readChangesets from "@changesets/read"; console.log( "No changesets found, attempting to publish any unpublished packages to npm" ); - let { packages } = await getPackages(process.cwd()); - let packagesByName = new Map(packages.map(x => [x.packageJson.name, x])); - let npmrcPath = `${process.env.HOME}/.npmrc`; if (fs.existsSync(npmrcPath)) { console.log("Found existing .npmrc file"); @@ -100,60 +129,52 @@ import readChangesets from "@changesets/read"; await exec("git", ["push", "origin", `HEAD:${branch}`, "--tags"]); - let newTagRegex = /New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/; - + let { packages, tool } = await getPackages(process.cwd()); let releasedPackages: Package[] = []; - for (let line of changesetPublishOutput.stdout.split("\n")) { - let match = line.match(newTagRegex); - if (match === null) { - continue; + if (tool !== "root") { + let newTagRegex = /New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/; + let packagesByName = new Map(packages.map(x => [x.packageJson.name, x])); + + for (let line of changesetPublishOutput.stdout.split("\n")) { + let match = line.match(newTagRegex); + if (match === null) { + continue; + } + let pkgName = match[1]; + let pkg = packagesByName.get(pkgName); + if (pkg === undefined) { + return core.setFailed( + `Package "${pkgName}" not found.` + + "This is probably a bug in the action, please open an issue" + ); + } + releasedPackages.push(pkg); } - let pkgName = match[1]; - let pkg = packagesByName.get(pkgName); - if (pkg === undefined) { + + await Promise.all( + releasedPackages.map(pkg => + createRelease(octokit, { + pkg, + tagName: `${pkg.packageJson.name}@${pkg.packageJson.version}` + }) + ) + ); + } else { + if (packages.length === 0) { return core.setFailed( - `Package "${pkgName}" not found.` + + `No package found.` + "This is probably a bug in the action, please open an issue" ); } + const pkg = packages[0]; releasedPackages.push(pkg); + await createRelease(octokit, { + pkg, + tagName: `v${pkg.packageJson.version}` + }); } - await Promise.all( - releasedPackages.map(async pkg => { - try { - let changelogFileName = path.join(pkg.dir, "CHANGELOG.md"); - - let changelog = await fs.readFile(changelogFileName, "utf8"); - - let changelogEntry = getChangelogEntry( - changelog, - pkg.packageJson.version - ); - if (!changelogEntry) { - // we can find a changelog but not the entry for this version - // if this is true, something has probably gone wrong - return core.setFailed( - `Could not find changelog entry for ${pkg.packageJson.name}@${pkg.packageJson.version}` - ); - } - - await octokit.repos.createRelease({ - tag_name: `${pkg.packageJson.name}@${pkg.packageJson.version}`, - body: changelogEntry.content, - prerelease: pkg.packageJson.version.includes("-"), - ...github.context.repo - }); - } catch (err) { - // if we can't find a changelog, the user has probably disabled changelogs - if (err.code !== "ENOENT") { - throw err; - } - } - }) - ); - if (releasedPackages.length) { core.setOutput("published", "true"); core.setOutput(