From bf4c6120189e0b92f82c19a222764fbf9fbe2ce2 Mon Sep 17 00:00:00 2001 From: Jacob Gillespie Date: Mon, 15 Feb 2021 17:51:03 +0000 Subject: [PATCH] Require @changesets/cli resolving from cwd (#67) * Resolve @changesets/cli with resolve-from * Use require.resolve directly * Add documentation section to README * Add custom version command docs for Yarn 2 --- README.md | 13 +++++++++++-- dist/index.js | 2 +- src/run.ts | 17 ++++++++++------- 3 files changed, 22 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index e0f0010..d66b31f 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,6 @@ This action for [Changesets](https://github.com/atlassian/changesets) creates a ## Usage - ### Inputs - publish - The command to use to build and publish packages @@ -101,7 +100,6 @@ jobs: if: steps.changesets.outputs.published == 'true' # You can do something when a publish happens. run: my-slack-bot send-notification --message "A new version of ${GITHUB_REPOSITORY} was published!" - ``` By default the GitHub Action creates a `.npmrc` file with the following content: @@ -164,3 +162,14 @@ jobs: env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} ``` + +#### With Yarn 2 / Plug'n'Play + +If you are using [Yarn Plug'n'Play](https://yarnpkg.com/features/pnp), you should use a custom `version` command so that the action can resolve the `changeset` CLI: + +```yaml +- uses: changesets/action@master + with: + version: yarn changeset version + ... +``` diff --git a/dist/index.js b/dist/index.js index 72d30a0..1d50121 100644 --- a/dist/index.js +++ b/dist/index.js @@ -903,7 +903,7 @@ var e=require("./conversions"),n=require("./route"),r={},o=Object.keys(e);functi },{"fs-extra":"1591","@changesets/parse":"pjrD","@changesets/git":"hWLG","chalk":"hGPX","p-filter":"o7Ua","@changesets/logger":"z9Gu"}],"yOXS":[function(require,module,exports) { "use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const t=require("@changesets/pre"),r=e(require("@changesets/read"));async function s(e=process.cwd()){let s=await t.readPreState(e),a=void 0!==s&&"pre"===s.mode,i=await r.default(e);if(a){let e=new Set(s.changesets);i=i.filter(t=>!e.has(t.id))}return{preState:a?s:void 0,changesets:i}}exports.default=s; },{"@changesets/pre":"mAOc","@changesets/read":"X/D8"}],"gwbb":[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{try{let s=l.default.join(a.dir,"CHANGELOG.md"),c=await i.default.readFile(s,"utf8"),u=p.getChangelogEntry(c,a.packageJson.version);if(!u)throw new Error(`Could not find changelog entry for ${a.packageJson.name}@${a.packageJson.version}`);await e.repos.createRelease(t({tag_name:n,body:u.content,prerelease:a.packageJson.version.includes("-")},o.context.repo))}catch(r){if("ENOENT"!==r.code)throw r}};async function f({script:e,githubToken:t,cwd:a=process.cwd()}){let n=o.context.ref.replace("refs/heads/",""),r=o.getOctokit(t),[s,...i]=e.split(/\s+/),l=await p.execWithOutput(s,i,{cwd:a});await g.pullBranch(n),await g.push(n,{includeTags:!0});let{packages:u,tool:h}=await c.getPackages(a),f=[];if("root"!==h){let e=/New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/,t=new Map(u.map(e=>[e.packageJson.name,e]));for(let a of l.stdout.split("\n")){let n=a.match(e);if(null===n)continue;let r=n[1],s=t.get(r);if(void 0===s)throw new Error(`Package "${r}" not found.`+"This is probably a bug in the action, please open an issue");f.push(s)}await Promise.all(f.map(e=>d(r,{pkg:e,tagName:`${e.packageJson.name}@${e.packageJson.version}`})))}else{if(0===u.length)throw new Error("No package found.This is probably a bug in the action, please open an issue");let e=u[0],t=/New tag:/;for(let a of l.stdout.split("\n")){if(a.match(t)){f.push(e),await d(r,{pkg:e,tagName:`v${e.packageJson.version}`});break}}}return f.length?{published:!0,publishedPackages:f.map(e=>({name:e.packageJson.name,version:e.packageJson.version}))}:{published:!1}}async function w({script:e,githubToken:a,cwd:n=process.cwd(),prTitle:r="Version Packages",commitMessage:c="Version Packages",hasPublishScript:d=!1}){let f=`${o.context.repo.owner}/${o.context.repo.repo}`,w=o.context.ref.replace("refs/heads/",""),b=`changeset-release/${w}`,m=o.getOctokit(a),{preState:y}=await h.default(n);await g.switchToMaybeExistingBranch(b),await g.reset(o.context.sha);let k=await p.getVersionsByDirectory(n);if(e){let[t,...a]=e.split(/\s+/);await s.exec(t,a,{cwd:n})}else{let e=await require(l.default.join(n,"node_modules","@changesets","cli","package.json")),t=u.lt(e.version,"2.0.0")?"bump":"version";await s.exec("node",["./node_modules/@changesets/cli/bin.js",t],{cwd:n})}let v=`repo:${f}+state:open+head:${b}+base:${w}`,O=m.search.issuesAndPullRequests({q:v}),$=await p.getChangedPackages(n,k),P=(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 ${d?"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 ${w}, this PR will be updated.\n${y?`\n⚠️⚠️⚠️⚠️⚠️⚠️\n\n\`${w}\` 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 \`${w}\`.\n\n⚠️⚠️⚠️⚠️⚠️⚠️\n`:""}\n# Releases\n`+(await Promise.all($.map(async e=>{let t=await i.default.readFile(l.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 x=`${r}${y?` (${y.tag})`:""}`;if(!(await g.checkIfClean())){const e=`${c}${y?` (${y.tag})`:""}`;await g.commitAll(e)}await g.push(b,{force:!0});let j=await O;console.log(JSON.stringify(j.data,null,2)),0===j.data.items.length?(console.log("creating pull request"),await m.pulls.create(t({base:w,head:b,title:x,body:await P},o.context.repo))):(m.pulls.update(t({pull_number:j.data.items[0].number,title:x,body:await P},o.context.repo)),console.log("pull request found"))}exports.runPublish=f,exports.runVersion=w; +"use strict";function e(e,t){var a=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),a.push.apply(a,r)}return a}function t(t){for(var r=1;r{try{let s=l.default.join(a.dir,"CHANGELOG.md"),c=await i.default.readFile(s,"utf8"),u=p.getChangelogEntry(c,a.packageJson.version);if(!u)throw new Error(`Could not find changelog entry for ${a.packageJson.name}@${a.packageJson.version}`);await e.repos.createRelease(t({tag_name:r,body:u.content,prerelease:a.packageJson.version.includes("-")},o.context.repo))}catch(n){if("ENOENT"!==n.code)throw n}};async function f({script:e,githubToken:t,cwd:a=process.cwd()}){let r=o.context.ref.replace("refs/heads/",""),n=o.getOctokit(t),[s,...i]=e.split(/\s+/),l=await p.execWithOutput(s,i,{cwd:a});await g.pullBranch(r),await g.push(r,{includeTags:!0});let{packages:u,tool:h}=await c.getPackages(a),f=[];if("root"!==h){let e=/New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/,t=new Map(u.map(e=>[e.packageJson.name,e]));for(let a of l.stdout.split("\n")){let r=a.match(e);if(null===r)continue;let n=r[1],s=t.get(n);if(void 0===s)throw new Error(`Package "${n}" not found.`+"This is probably a bug in the action, please open an issue");f.push(s)}await Promise.all(f.map(e=>d(n,{pkg:e,tagName:`${e.packageJson.name}@${e.packageJson.version}`})))}else{if(0===u.length)throw new Error("No package found.This is probably a bug in the action, please open an issue");let e=u[0],t=/New tag:/;for(let a of l.stdout.split("\n")){if(a.match(t)){f.push(e),await d(n,{pkg:e,tagName:`v${e.packageJson.version}`});break}}}return f.length?{published:!0,publishedPackages:f.map(e=>({name:e.packageJson.name,version:e.packageJson.version}))}:{published:!1}}async function w({script:e,githubToken:a,cwd:r=process.cwd(),prTitle:n="Version Packages",commitMessage:c="Version Packages",hasPublishScript:d=!1}){let f=`${o.context.repo.owner}/${o.context.repo.repo}`,w=o.context.ref.replace("refs/heads/",""),b=`changeset-release/${w}`,m=o.getOctokit(a),{preState:y}=await h.default(r);await g.switchToMaybeExistingBranch(b),await g.reset(o.context.sha);let k=await p.getVersionsByDirectory(r);if(e){let[t,...a]=e.split(/\s+/);await s.exec(t,a,{cwd:r})}else{let e=await require(require.resolve("@changesets/cli/package.json",{paths:[r]})),t=u.lt(e.version,"2.0.0")?"bump":"version";await s.exec("node",[require.resolve("@changesets/cli/bin.js",{paths:[r]}),t],{cwd:r})}let v=`repo:${f}+state:open+head:${b}+base:${w}`,O=m.search.issuesAndPullRequests({q:v}),$=await p.getChangedPackages(r,k),P=(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 ${d?"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 ${w}, this PR will be updated.\n${y?`\n⚠️⚠️⚠️⚠️⚠️⚠️\n\n\`${w}\` 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 \`${w}\`.\n\n⚠️⚠️⚠️⚠️⚠️⚠️\n`:""}\n# Releases\n`+(await Promise.all($.map(async e=>{let t=await i.default.readFile(l.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 x=`${n}${y?` (${y.tag})`:""}`;if(!(await g.checkIfClean())){const e=`${c}${y?` (${y.tag})`:""}`;await g.commitAll(e)}await g.push(b,{force:!0});let j=await O;console.log(JSON.stringify(j.data,null,2)),0===j.data.items.length?(console.log("creating pull request"),await m.pulls.create(t({base:w,head:b,title:x,body:await P},o.context.repo))):(m.pulls.update(t({pull_number:j.data.items[0].number,title:x,body:await P},o.context.repo)),console.log("pull request found"))}exports.runPublish=f,exports.runVersion=w; },{"@actions/exec":"AjbX","@actions/github":"Jpqw","fs-extra":"qdgD","@manypkg/get-packages":"9z3N","semver":"y4rL","./utils":"UnXq","./gitUtils":"pH2w","./readChangesetState":"yOXS"}],"7QCb":[function(require,module,exports) { "use strict";var e=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var s in e)Object.hasOwnProperty.call(e,s)&&(t[s]=e[s]);return t.default=e,t},t=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const s=e(require("@actions/core")),i=t(require("fs-extra")),n=e(require("./gitUtils")),r=require("./run"),o=t(require("./readChangesetState")),u=e=>s.getInput(e)||void 0;(async()=>{let e=process.env.GITHUB_TOKEN;if(!e)return void s.setFailed("Please add the GITHUB_TOKEN to the changesets action");s.setOutput("published","false"),s.setOutput("publishedPackages","[]"),console.log("setting git user"),await n.setupUser(),console.log("setting GitHub credentials"),await i.default.writeFile(`${process.env.HOME}/.netrc`,`machine github.com\nlogin github-actions[bot]\npassword ${e}`);let{changesets:t}=await o.default(),a=s.getInput("publish"),l=0!==t.length,c=!!a;switch(!0){case!l&&!c:return void console.log("No changesets found");case!l&&c:{console.log("No changesets found, attempting to publish any unpublished packages to npm");let t=`${process.env.HOME}/.npmrc`;i.default.existsSync(t)?console.log("Found existing .npmrc file"):(console.log("No .npmrc file found, creating one"),i.default.writeFileSync(t,`//registry.npmjs.org/:_authToken=${process.env.NPM_TOKEN}`));const n=await r.runPublish({script:a,githubToken:e});return void(n.published&&(s.setOutput("published","true"),s.setOutput("publishedPackages",JSON.stringify(n.publishedPackages))))}case l:return void(await r.runVersion({script:u("version"),githubToken:e,prTitle:u("title"),commitMessage:u("commit"),hasPublishScript:c}))}})().catch(e=>{console.error(e),s.setFailed(e.message)}); },{"@actions/core":"RNev","fs-extra":"qdgD","./gitUtils":"pH2w","./run":"gwbb","./readChangesetState":"yOXS"}]},{},["7QCb"], null) \ No newline at end of file diff --git a/src/run.ts b/src/run.ts index a836351..73f2450 100644 --- a/src/run.ts +++ b/src/run.ts @@ -181,17 +181,20 @@ export async function runVersion({ let [versionCommand, ...versionArgs] = script.split(/\s+/); await exec(versionCommand, versionArgs, { cwd }); } else { - let changesetsCliPkgJson = await require(path.join( - cwd, - "node_modules", - "@changesets", - "cli", - "package.json" + let changesetsCliPkgJson = await require(require.resolve( + "@changesets/cli/package.json", + { paths: [cwd] } )); let cmd = semver.lt(changesetsCliPkgJson.version, "2.0.0") ? "bump" : "version"; - await exec("node", ["./node_modules/@changesets/cli/bin.js", cmd], { cwd }); + await exec( + "node", + [require.resolve("@changesets/cli/bin.js", { paths: [cwd] }), cmd], + { + cwd, + } + ); } let searchQuery = `repo:${repo}+state:open+head:${versionBranch}+base:${branch}`;