diff --git a/README.md b/README.md index d66b31f9..301a94c2 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,7 @@ This action for [Changesets](https://github.com/atlassian/changesets) creates a - version - The command to update version, edit CHANGELOG, read and delete changesets. Default to `changeset version` if not provided - commit - The commit message to use. Default to `Version Packages` - title - The pull request title. Default to `Version Packages` +- comment - Set the comment behavior on released Pull Requests/Issues. Default to `false` ### Outputs diff --git a/action.yml b/action.yml index 61200769..fd47ca6b 100644 --- a/action.yml +++ b/action.yml @@ -17,6 +17,9 @@ inputs: title: description: The pull request title. Default to `Version Packages` required: false + comment: + description: Set the comment behavior on released Pull Requests/Issues. Default to `false` + required: false outputs: published: description: A boolean value to indicate whether a publishing is happened or not diff --git a/dist/index.js b/dist/index.js index 5a01152e..3fdc38ff 100644 --- a/dist/index.js +++ b/dist/index.js @@ -659,7 +659,7 @@ var e,t,n=require("fs"),r=require("./polyfills.js"),o=require("./legacy-streams. },{"@babel/runtime/regenerator":"/fRJ","@babel/runtime/helpers/asyncToGenerator":"KfJe","@babel/runtime/helpers/classCallCheck":"wsKa","@babel/runtime/helpers/possibleConstructorReturn":"YBFR","@babel/runtime/helpers/getPrototypeOf":"ktv5","@babel/runtime/helpers/inherits":"zss1","@babel/runtime/helpers/wrapNativeSuper":"Pwnu","fs-extra":"qdgD","globby":"/xfT","read-yaml-file":"R9us","@manypkg/find-root":"4TiQ"}],"9z3N":[function(require,module,exports) { "use strict";"production"===process.env.NODE_ENV?module.exports=require("./get-packages.cjs.prod.js"):module.exports=require("./get-packages.cjs.dev.js"); },{"./get-packages.cjs.prod.js":"vf/d","./get-packages.cjs.dev.js":"vf/d"}],"UnXq":[function(require,module,exports) { -"use strict";function e(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function t(t){for(var n=1;n[e.dir,e.packageJson.version]))}async function l(e,t){let{packages:r}=await u.getPackages(e),n=new Set;for(let i of r){t.get(i.dir)!==i.packageJson.version&&n.add(i)}return[...n]}function d(e,t){let r,n,c=i.default().use(o.default).parse(e),u=exports.BumpLevels.dep,p=c.children;for(let i=0;i{i+=e.toString()},stderr:e=>{o+=e.toString()}}},n)),stdout:i,stderr:o}}function g(e,t){return e.private===t.private?t.highestLevel-e.highestLevel:e.private?1:-1}exports.BumpLevels={dep:0,patch:1,minor:2,major:3},exports.getVersionsByDirectory=p,exports.getChangedPackages=l,exports.getChangelogEntry=d,exports.execWithOutput=f,exports.sortTheThings=g; +"use strict";function e(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function t(t){for(var n=1;n[e.dir,e.packageJson.version]))}async function l(e,t){let{packages:r}=await u.getPackages(e),n=new Set;for(let i of r){t.get(i.dir)!==i.packageJson.version&&n.add(i)}return[...n]}function g(e,t){let r,n,c=i.default().use(s.default).parse(e),u=exports.BumpLevels.dep,p=c.children;for(let i=0;i{i+=e.toString()},stderr:e=>{s+=e.toString()}}},n)),stdout:i,stderr:s}}function f(e,t){return e.private===t.private?t.highestLevel-e.highestLevel:e.private?1:-1}exports.BumpLevels={dep:0,patch:1,minor:2,major:3},exports.getVersionsByDirectory=p,exports.getReleaseMessage=((e,t,r)=>`### 🦋 This work has been released in release versions: ${t.join(", ")}\n\nRelease links:\n${e.map(e=>`- ${e}
`)}\n\nChangesets summary:\n${r.map(e=>`- ${e}
`)}\n`),exports.getChangedPackages=l,exports.getChangelogEntry=g,exports.execWithOutput=d,exports.sortTheThings=f; },{"unified":"0GHJ","remark-parse":"VtFD","remark-stringify":"KZSx","mdast-util-to-string":"jPGb","@actions/exec":"AjbX","@manypkg/get-packages":"9z3N"}],"pH2w":[function(require,module,exports) { "use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=require("@actions/exec"),t=require("./utils");exports.setupUser=(async()=>{await e.exec("git",["config","--global","user.name",'"github-actions[bot]"']),await e.exec("git",["config","--global","user.email",'"github-actions[bot]@users.noreply.github.com"'])}),exports.pullBranch=(async t=>{await e.exec("git",["pull","origin",t])}),exports.push=(async(t,{force:i}={})=>{await e.exec("git",["push","origin",`HEAD:${t}`,i&&"--force"].filter(Boolean))}),exports.pushTags=(async()=>{await e.exec("git",["push","origin","--tags"])}),exports.switchToMaybeExistingBranch=(async i=>{let{stderr:a}=await t.execWithOutput("git",["checkout",i],{ignoreReturnCode:!0});!a.toString().includes(`Switched to a new branch '${i}'`)&&await e.exec("git",["checkout","-b",i])}),exports.reset=(async(t,i="hard")=>{await e.exec("git",["reset",`--${i}`,t])}),exports.commitAll=(async t=>{await e.exec("git",["add","."]),await e.exec("git",["commit","-m",t])}),exports.checkIfClean=(async()=>{const{stdout:e}=await t.execWithOutput("git",["status","--porcelain"]);return!e.length}); },{"@actions/exec":"AjbX","./utils":"UnXq"}],"Od13":[function(require,module,exports) { @@ -902,8 +902,22 @@ var e=require("./conversions"),n=require("./route"),r={},o=Object.keys(e);functi "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"}],"zg8f":[function(require,module,exports) { "use strict";const e=require("path"),t=require("module"),r=require("fs"),o=(o,i,n)=>{if("string"!=typeof o)throw new TypeError(`Expected \`fromDir\` to be of type \`string\`, got \`${typeof o}\``);if("string"!=typeof i)throw new TypeError(`Expected \`moduleId\` to be of type \`string\`, got \`${typeof i}\``);try{o=r.realpathSync(o)}catch(f){if("ENOENT"!==f.code){if(n)return;throw f}o=e.resolve(o)}const s=e.join(o,"noop.js"),p=()=>t._resolveFilename(i,{id:s,filename:s,paths:t._nodeModulePaths(o)});if(n)try{return p()}catch(f){return}return p()};module.exports=((e,t)=>o(e,t)),module.exports.silent=((e,t)=>o(e,t,!0)); -},{}],"gwbb":[function(require,module,exports) { -"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 o=l.default.join(a.dir,"CHANGELOG.md"),c=await i.default.readFile(o,"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({name:r,tag_name:r,body:u.content,prerelease:a.packageJson.version.includes("-")},s.context.repo))}catch(n){if("ENOENT"!==n.code)throw n}};async function w({script:e,githubToken:t,cwd:a=process.cwd()}){let r=s.getOctokit(t),[n,...o]=e.split(/\s+/),i=await p.execWithOutput(n,o,{cwd:a});await g.pushTags();let{packages:l,tool:u}=await c.getPackages(a),h=[];if("root"!==u){let e=/New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/,t=new Map(l.map(e=>[e.packageJson.name,e]));for(let a of i.stdout.split("\n")){let r=a.match(e);if(null===r)continue;let n=r[1],o=t.get(n);if(void 0===o)throw new Error(`Package "${n}" not found.`+"This is probably a bug in the action, please open an issue");h.push(o)}await Promise.all(h.map(e=>f(r,{pkg:e,tagName:`${e.packageJson.name}@${e.packageJson.version}`})))}else{if(0===l.length)throw new Error("No package found.This is probably a bug in the action, please open an issue");let e=l[0],t=/New tag:/;for(let a of i.stdout.split("\n")){if(a.match(t)){h.push(e),await f(r,{pkg:e,tagName:`v${e.packageJson.version}`});break}}}return h.length?{published:!0,publishedPackages:h.map(e=>({name:e.packageJson.name,version:e.packageJson.version}))}:{published:!1}}exports.runPublish=w;const b=e=>{try{return require(d.default(e,"@changesets/cli/package.json"))}catch(t){if(t&&"MODULE_NOT_FOUND"===t.code)throw new Error(`Have you forgotten to install \`@changesets/cli\` in "${e}"?`);throw t}};async function m({script:e,githubToken:a,cwd:r=process.cwd(),prTitle:n="Version Packages",commitMessage:c="Version Packages",hasPublishScript:f=!1}){let w=`${s.context.repo.owner}/${s.context.repo.repo}`,m=s.context.ref.replace("refs/heads/",""),y=`changeset-release/${m}`,k=s.getOctokit(a),{preState:O}=await h.default(r);await g.switchToMaybeExistingBranch(y),await g.reset(s.context.sha);let v=await p.getVersionsByDirectory(r);if(e){let[t,...a]=e.split(/\s+/);await o.exec(t,a,{cwd:r})}else{let e=b(r),t=u.lt(e.version,"2.0.0")?"bump":"version";await o.exec("node",[d.default(r,"@changesets/cli/bin.js"),t],{cwd:r})}let $=`repo:${w}+state:open+head:${y}+base:${m}`,P=k.search.issuesAndPullRequests({q:$}),j=await p.getChangedPackages(r,v),x=(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 ${f?"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 ${m}, this PR will be updated.\n${O?`\n⚠️⚠️⚠️⚠️⚠️⚠️\n\n\`${m}\` 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 \`${m}\`.\n\n⚠️⚠️⚠️⚠️⚠️⚠️\n`:""}\n# Releases\n`+(await Promise.all(j.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 q=`${n}${O?` (${O.tag})`:""}`;if(!(await g.checkIfClean())){const e=`${c}${O?` (${O.tag})`:""}`;await g.commitAll(e)}await g.push(y,{force:!0});let J=await P;console.log(JSON.stringify(J.data,null,2)),0===J.data.items.length?(console.log("creating pull request"),await k.pulls.create(t({base:m,head:y,title:q,body:await x},s.context.repo))):(k.pulls.update(t({pull_number:J.data.items[0].number,title:q,body:await x},s.context.repo)),console.log("pull request found"))}exports.runVersion=m; -},{"@actions/exec":"AjbX","@actions/github":"Jpqw","fs-extra":"qdgD","@manypkg/get-packages":"9z3N","semver":"y4rL","./utils":"UnXq","./gitUtils":"pH2w","./readChangesetState":"yOXS","resolve-from":"zg8f"}],"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)}); +},{}],"mn8A":[function(require,module,exports) { +var t=1/0,e="[object Symbol]",o=/[\\^$.*+?()[\]{}|]/g,r=RegExp(o.source),n="object"==typeof global&&global&&global.Object===Object&&global,l="object"==typeof self&&self&&self.Object===Object&&self,c=n||l||Function("return this")(),u=Object.prototype,b=u.toString,f=c.Symbol,i=f?f.prototype:void 0,p=i?i.toString:void 0;function s(e){if("string"==typeof e)return e;if(a(e))return p?p.call(e):"";var o=e+"";return"0"==o&&1/e==-t?"-0":o}function y(t){return!!t&&"object"==typeof t}function a(t){return"symbol"==typeof t||y(t)&&b.call(t)==e}function g(t){return null==t?"":s(t)}function j(t){return(t=g(t))&&r.test(t)?t.replace(o,"\\$&"):t}module.exports=j; +},{}],"5A/S":[function(require,module,exports) { +var t=1/0,e="[object Symbol]",n="\\ud800-\\udfff",u="\\u0300-\\u036f\\ufe20-\\ufe23",r="\\u20d0-\\u20f0",o="\\ufe0e\\ufe0f",f="["+n+"]",c="["+u+r+"]",i="\\ud83c[\\udffb-\\udfff]",l="(?:"+c+"|"+i+")",d="[^"+n+"]",a="(?:\\ud83c[\\udde6-\\uddff]){2}",b="[\\ud800-\\udbff][\\udc00-\\udfff]",p="\\u200d",s=l+"?",g="["+o+"]?",j="(?:"+p+"(?:"+[d,a,b].join("|")+")"+g+s+")*",v=g+s+j,y="(?:"+[d+c+"?",c,a,b,f].join("|")+")",h=RegExp(i+"(?="+i+")|"+y+v,"g"),m=RegExp("["+p+n+u+r+o+"]"),O="object"==typeof global&&global&&global.Object===Object&&global,S="object"==typeof self&&self&&self.Object===Object&&self,x=O||S||Function("return this")();function A(t){return t.split("")}function C(t){return m.test(t)}function E(t){return C(t)?R(t):A(t)}function R(t){return t.match(h)||[]}var w=Object.prototype,F=w.toString,L=x.Symbol,U=L?L.prototype:void 0,k=U?U.toString:void 0;function q(t,e,n){var u=-1,r=t.length;e<0&&(e=-e>r?0:r+e),(n=n>r?r:n)<0&&(n+=r),r=e>n?0:n-e>>>0,e>>>=0;for(var o=Array(r);++u=u?t:q(t,e,n)}function D(t){return function(e){var n=C(e=I(e))?E(e):void 0,u=n?n[0]:e.charAt(0),r=n?B(n,1).join(""):e.slice(1);return u[t]()+r}}function G(t){return!!t&&"object"==typeof t}function H(t){return"symbol"==typeof t||G(t)&&F.call(t)==e}function I(t){return null==t?"":z(t)}function J(t){return K(I(t).toLowerCase())}var K=D("toUpperCase");module.exports=J; +},{}],"eMen":[function(require,module,exports) { +var t="[object String]",r=Object.prototype,o=r.toString,e=Array.isArray;function n(t){return!!t&&"object"==typeof t}function c(r){return"string"==typeof r||!e(r)&&n(r)&&o.call(r)==t}module.exports=c; +},{}],"hT6N":[function(require,module,exports) { +var t="[object Object]";function n(t){var n=!1;if(null!=t&&"function"!=typeof t.toString)try{n=!!(t+"")}catch(r){}return n}function r(t,n){return function(r){return t(n(r))}}var o=Function.prototype,c=Object.prototype,e=o.toString,u=c.hasOwnProperty,f=e.call(Object),i=c.toString,l=r(Object.getPrototypeOf,Object);function a(t){return!!t&&"object"==typeof t}function p(r){if(!a(r)||i.call(r)!=t||n(r))return!1;var o=l(r);if(null===o)return!0;var c=u.call(o,"constructor")&&o.constructor;return"function"==typeof c&&c instanceof c&&e.call(c)==f}module.exports=p; +},{}],"Z9rv":[function(require,module,exports) { +var t=200,r="Expected a function",n="__lodash_hash_undefined__",e=1,o=2,u=1/0,i=9007199254740991,a="[object Arguments]",c="[object Array]",f="[object Boolean]",l="[object Date]",s="[object Error]",p="[object Function]",h="[object GeneratorFunction]",v="[object Map]",_="[object Number]",y="[object Object]",d="[object Promise]",b="[object RegExp]",g="[object Set]",j="[object String]",w="[object Symbol]",m="[object WeakMap]",A="[object ArrayBuffer]",O="[object DataView]",S="[object Float32Array]",k="[object Float64Array]",x="[object Int8Array]",$="[object Int16Array]",E="[object Int32Array]",F="[object Uint8Array]",I="[object Uint8ClampedArray]",P="[object Uint16Array]",T="[object Uint32Array]",U=/\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,z=/^\w*$/,C=/^\./,L=/[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g,M=/[\\^$.*+?()[\]{}|]/g,B=/\\(\\)?/g,D=/^\[object .+?Constructor\]$/,R=/^(?:0|[1-9]\d*)$/,V={};V[S]=V[k]=V[x]=V[$]=V[E]=V[F]=V[I]=V[P]=V[T]=!0,V[a]=V[c]=V[A]=V[f]=V[O]=V[l]=V[s]=V[p]=V[v]=V[_]=V[y]=V[b]=V[g]=V[j]=V[m]=!1;var W="object"==typeof global&&global&&global.Object===Object&&global,G="object"==typeof self&&self&&self.Object===Object&&self,N=W||G||Function("return this")(),q="object"==typeof exports&&exports&&!exports.nodeType&&exports,H=q&&"object"==typeof module&&module&&!module.nodeType&&module,J=H&&H.exports===q,K=J&&W.process,Q=function(){try{return K&&K.binding("util")}catch(t){}}(),X=Q&&Q.isTypedArray;function Y(t,r){return!!(t?t.length:0)&&nt(t,r,0)>-1}function Z(t,r,n){for(var e=-1,o=t?t.length:0;++e-1}function Yt(t,r){var n=this.__data__,e=_r(n,t);return e<0?n.push([t,r]):n[e][1]=r,this}function Zt(t){var r=-1,n=t?t.length:0;for(this.clear();++r=t){var l=n?null:Pr(r);if(l)return pt(l);a=!1,u=at,f=new ur}else f=n?[]:c;t:for(;++of))return!1;var s=a.get(t);if(s&&a.get(r))return s==r;var p=-1,h=!0,v=i&e?new ur:void 0;for(a.set(t,r),a.set(r,t);++p-1&&t%1==0&&t-1&&t%1==0&&t<=i}function an(t){var r=typeof t;return!!t&&("object"==r||"function"==r)}function cn(t){return!!t&&"object"==typeof t}function fn(t){return"symbol"==typeof t||cn(t)&&jt.call(t)==w}var ln=X?it(X):Ar;function sn(t){return null==t?"":Er(t)}function pn(t,r,n){var e=null==t?void 0:yr(t,r);return void 0===e?n:e}function hn(t,r){return null!=t&&Dr(t,r,br)}function vn(t){return nn(t)?vr(t):Sr(t)}function _n(t){return t}function yn(){}function dn(t){return Vr(t)?ot(Kr(t)):$r(t)}module.exports=Xr; +},{}],"vKNE":[function(require,module,exports) { +module.exports={github:{actions:{close:["close","closes","closed","fix","fixes","fixed","resolve","resolves","resolved"],block:[],require:[],parentOf:[],childOf:[],duplicate:["Duplicate of"]},delimiters:[":"],mentionsPrefixes:["@"],issuePrefixes:["#","gh-"],hosts:["https://github.com"],issueURLSegments:["issues","pull"]},bitbucket:{actions:{close:["close","closes","closed","closing","fix","fixes","fixed","fixing","resolve","resolves","resolved","resolving"],block:[],require:[],parentOf:[],childOf:[],duplicate:[]},delimiters:[],mentionsPrefixes:["@"],issuePrefixes:["#"],hosts:[],issueURLSegments:[]},gitlab:{actions:{close:["close","closes","closed","closing","fix","fixes","fixed","fixing","resolve","resolves","resolved","resolving","implement","implements","implemented","implementing"],block:[],require:[],parentOf:[],childOf:[],duplicate:["/duplicate"]},delimiters:[],mentionsPrefixes:["@"],issuePrefixes:["#","!"],hosts:["https://gitlab.com"],issueURLSegments:["issues","merge_requests"]},default:{actions:{close:["close","closes","closed","closing","fix","fixes","fixed","fixing","resolve","resolves","resolved","resolving","implement","implements","implemented","implementing"],duplicate:["Duplicate of","/duplicate"]},delimiters:[":"],mentionsPrefixes:["@"],issuePrefixes:["#","gh-"],hosts:["https://github.com","https://gitlab.com"],issueURLSegments:["issues","pull","merge_requests"]}}; +},{}],"FuPV":[function(require,module,exports) { +function e(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function t(t){for(var n=1;n)+?)[\S\s])*(<\/code>)+?/gim,h=/^\/?([^/]+(?:\/[^/]+)*)\/?$/,b=/\/?$/;function g(e){return e.split("").reverse().join("")}function w(e){return e.filter(Boolean).map(n).join("|")}function y(e){return e.replace(h,"/$1/")}function m(e){return e.replace(b,"/")}function O(e,t){return e.findIndex(e=>e.toUpperCase()===t.toUpperCase())>-1}function d({mentionsPrefixes:e}){return`((?:(?:[^\\w\\n\\v\\r]|^)+(?:${w(e)})[\\w-\\.]+[^\\W])+)`}function j({actions:e,delimiters:t,issuePrefixes:r,issueURLSegments:n,hosts:o}){return`(?:(?:[^\\w\\n\\v\\r]|^)+(${w([].concat(...Object.keys(e).map(t=>e[t])))}))?(?:[^\\w\\n\\v\\r]|^|(?: |\\t)*(?:${w([" ","\t",...t])})(?: |\\t)*)${o.length>0?`(?:${w(o)})?`:""}((?:(?:[\\w-\\.]+)\\/)+(?:[\\w-\\.]+))?(${w([...r,...n])})(\\d+)(?!\\w)`}function x(e){return new RegExp(e.mentionsPrefixes.length>0?`(?:${j(e)}|${d(e)})`:d(e),"gim")}function P({mentionsPrefixes:e}){return new RegExp(`(${w(e)})([\\w-\\.]+)`,"gim")}function $(e,t,r,{actions:n,issuePrefixes:s,hosts:i}){let c;const a={actions:Object.keys(n).reduce((e,t)=>n[t].length>0?Object.assign(e,{[t]:[]}):e,{}),refs:[],mentions:[]};let u=g(g(e.replace(f,"")).replace(p,""));for(;t.test(u);)u=u.replace(l,"");for(;null!==(c=t.exec(u));){let[e,t,u,f,p,l]=c;f=f&&s.some(e=>e.toUpperCase()===f.toUpperCase())?f:void 0,e=c[0].slice(c[0].indexOf(c[1]||i.find(e=>c[0].toUpperCase().includes(e.toUpperCase()))||c[2]||c[3])),t=o(c[1]);const h=Object.keys(n).filter(e=>O(n[e],t));if(h.length>0)for(const r of h)a.actions[r].push({raw:e,action:t,slug:u,prefix:f,issue:p});else if(p)a.refs.push({raw:e,slug:u,prefix:f,issue:p});else if(l){let e;for(;null!==(e=r.exec(l));){const[t,r,n]=e;a.mentions.push({raw:t.trim(),prefix:r,user:n})}}}return a}function T(e,t){return new TypeError(`The ${[e,t].filter(Boolean).join(".")} property must be a String or an array of Strings`)}function v(e,t){for(const r of Object.keys(e))if(t||"actions"!==r){if(e[r]){if(s(e[r]))e[r]=[e[r]];else if(!Array.isArray(e[r]))throw T(t,r)}else e[r]=[];if(0!==e[r].length&&!e[r].every(e=>s(e)))throw T(t,r);e[r]=e[r].filter(Boolean)}else v(e[r],r)}module.exports=((e="default",r={})=>{if(!s(e)&&!i(e))throw new TypeError("The options argument must be a String or an Object");if(i(e)&&u.call(e,"actions")&&!i(e.actions))throw new TypeError("The options.actions property must be an Object");if(s(e)&&!O(Object.keys(a),e))throw new TypeError(`The supported configuration are [${Object.keys(a).join(", ")}], got '${e}'`);if(!i(r))throw new TypeError("The overrides argument must be an Object");if(u.call(r,"actions")&&!i(r.actions))throw new TypeError("The overrides.actions property must be an Object");e=s(e)?a[e.toLowerCase()]:e;const n=t({},a.default,{},e,{},r,{actions:t({},a.default.actions,{},e.actions,{},r.actions)});v(n),n.hosts=n.hosts.map(m),n.issueURLSegments=n.issueURLSegments.map(y);const o=x(n),f=P(n);return e=>{if(!s(e))throw new TypeError("The issue text must be a String");const t=$(e,o,f,n);return Reflect.defineProperty(t,"allRefs",{get(){return c(this.refs.concat(...Object.keys(this.actions).map(e=>this.actions[e])),"raw")}}),t}}); +},{"lodash.escaperegexp":"mn8A","lodash.capitalize":"5A/S","lodash.isstring":"eMen","lodash.isplainobject":"hT6N","lodash.uniqby":"Z9rv","./lib/hosts-config":"vKNE"}],"gwbb":[function(require,module,exports) { +"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 l=c.default.join(a.dir,"CHANGELOG.md"),u=await i.default.readFile(l,"utf8"),g=p.getChangelogEntry(u,a.packageJson.version);if(!g)throw new Error(`Could not find changelog entry for ${a.packageJson.name}@${a.packageJson.version}`);const{data:{html_url:h}}=await e.repos.createRelease(t({tag_name:r,body:g.content,prerelease:a.packageJson.version.includes("-")},o.context.repo));if(s)return await b(e,{tagName:r,htmlUrl:h})}catch(n){if("ENOENT"!==n.code)throw n}},w=(e,t)=>t.reduce((t,a)=>{const r=t[t.length-1];return r&&r.length+a.length<=250?t[t.length-1]=`${r}+hash:${a}`:t.push(`${e}+hash:${a}`),t},[]),b=async(e,{tagName:a,htmlUrl:r})=>{const s=o.context.repo;let n=0,i=!1,l="";for(;!i;)await e.repos.listTags(t({},s,{per_page:100,page:n})).then(({data:e})=>{const t=e.find(e=>e.name===a);t&&(i=!0,l=t.commit.sha),n+=1}).catch(e=>console.warn(e));const c=await e.repos.listCommits(t({},s,{sha:l})).then(({data:e})=>e),u=c.map(({sha:e})=>e),p=w(`repo:${s.owner}/${s.repo}+type:pr+is:merged`,u).map(async t=>(await e.search.issuesAndPullRequests({q:t})).data.items),g=await(await Promise.all(p)).flat(),h=g.map(e=>e.number),m=g.filter((e,t)=>h.indexOf(e.number)===t),f=await m.filter(async({number:t})=>(await e.pulls.listCommits({owner:s.owner,repo:s.repo,pull_number:t})).data.find(({sha:e})=>u.includes(e))||u.includes((await e.pulls.get({owner:s.owner,repo:s.repo,pull_number:t})).data.merge_commit_sha)),b=d.default("github"),y=[...f.map(e=>e.body),...c.map(({commit:e})=>e.message)].reduce((e,t)=>t?e.concat(b(t).actions.close.filter(e=>null===e.slug||void 0===e.slug||e.slug===`${s.owner}/${s.repo}`).map(e=>({number:Number.parseInt(e.issue,10)}))):e,[]);return[...new Set([...f,...y].map(({number:e})=>e))].map(e=>({issue_number:e,htmlUrl:r,tagName:a}))};async function y({script:e,githubToken:t,comment:a,cwd:r=process.cwd()}){let s=o.getOctokit(t),[n,...i]=e.split(/\s+/),{changesets:c}=await h.default(r);const u=c.map(({summary:e})=>e),{owner:m,repo:d}=o.context.repo;let w=await p.execWithOutput(n,i,{cwd:r});await g.pushTags();let{packages:b,tool:y}=await l.getPackages(r),k=[];if("root"!==y){let e=/New tag:\s+(@[^/]+\/[^@]+|[^/]+)@([^\s]+)/,t=new Map(b.map(e=>[e.packageJson.name,e]));for(let a of w.stdout.split("\n")){let r=a.match(e);if(null===r)continue;let s=r[1],n=t.get(s);if(void 0===n)throw new Error(`Package "${s}" not found.`+"This is probably a bug in the action, please open an issue");k.push(n)}const r=await Promise.all(k.map(e=>f(s,{pkg:e,tagName:`${e.packageJson.name}@${e.packageJson.version}`,comment:a}))).then(e=>e.reduce((e,t)=>{if(t)for(const a of t)e[a.issue_number]=[...e[a.issue_number],a];return e},{}));for(const a of Object.values(r)){const e=a.map(e=>e.tagName),t=a.map(e=>e.htmlUrl),{issue_number:r}=a[0];s.issues.createComment({owner:m,repo:d,issue_number:r,body:p.getReleaseMessage(t,e,u)})}}else{if(0===b.length)throw new Error("No package found.This is probably a bug in the action, please open an issue");let e=b[0],t=/New tag:/;for(let r of w.stdout.split("\n")){if(r.match(t)){k.push(e);const t=await f(s,{pkg:e,tagName:`v${e.packageJson.version}`,comment:a});if(t)for(const e of t)s.issues.createComment({owner:m,repo:d,issue_number:e.issue_number,body:p.getReleaseMessage([e.htmlUrl],[e.tagName],u)});break}}}return k.length?{published:!0,publishedPackages:k.map(e=>({name:e.packageJson.name,version:e.packageJson.version}))}:{published:!1}}exports.runPublish=y;const k=e=>{try{return require(m.default(e,"@changesets/cli/package.json"))}catch(t){if(t&&"MODULE_NOT_FOUND"===t.code)throw new Error(`Have you forgotten to install \`@changesets/cli\` in "${e}"?`);throw t}};async function $({script:e,githubToken:a,cwd:r=process.cwd(),prTitle:s="Version Packages",commitMessage:l="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}`,y=o.getOctokit(a),{preState:$}=await h.default(r);await g.switchToMaybeExistingBranch(b),await g.reset(o.context.sha);let O=await p.getVersionsByDirectory(r);if(e){let[t,...a]=e.split(/\s+/);await n.exec(t,a,{cwd:r})}else{let e=k(r),t=u.lt(e.version,"2.0.0")?"bump":"version";await n.exec("node",[m.default(r,"@changesets/cli/bin.js"),t],{cwd:r})}let v=`repo:${f}+state:open+head:${b}+base:${w}`,_=y.search.issuesAndPullRequests({q:v}),P=await p.getChangedPackages(r,O),x=(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${$?`\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(P.map(async e=>{let t=await i.default.readFile(c.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 j=`${s}${$?` (${$.tag})`:""}`;if(!(await g.checkIfClean())){const e=`${l}${$?` (${$.tag})`:""}`;await g.commitAll(e)}await g.push(b,{force:!0});let N=await _;console.log(JSON.stringify(N.data,null,2)),0===N.data.items.length?(console.log("creating pull request"),await y.pulls.create(t({base:w,head:b,title:j,body:await x},o.context.repo))):(y.pulls.update(t({pull_number:N.data.items[0].number,title:j,body:await x},o.context.repo)),console.log("pull request found"))}exports.runVersion=$; +},{"@actions/exec":"AjbX","@actions/github":"Jpqw","fs-extra":"qdgD","@manypkg/get-packages":"9z3N","semver":"y4rL","./utils":"UnXq","./gitUtils":"pH2w","./readChangesetState":"yOXS","resolve-from":"zg8f","issue-parser":"FuPV"}],"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")),o=require("./run"),r=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 r.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 o.runPublish({script:a,comment:Boolean(u("comment"))&&l,githubToken:e});return void(n.published&&(s.setOutput("published","true"),s.setOutput("publishedPackages",JSON.stringify(n.publishedPackages))))}case l:return void(await o.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/package.json b/package.json index 053cb2b4..be5f17c6 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "devDependencies": { "@changesets/cli": "^2.9.1", "@changesets/write": "^0.1.3", + "@types/issue-parser": "^3.0.0", "fixturez": "^1.1.0", "parcel": "^1.12.3", "prettier": "^2.0.5", @@ -33,6 +34,7 @@ "babel-jest": "^24.9.0", "fs-extra": "^8.1.0", "husky": "^3.0.3", + "issue-parser": "^6.0.0", "jest": "^24.9.0", "mdast-util-to-string": "^1.0.6", "remark-parse": "^7.0.1", diff --git a/src/index.ts b/src/index.ts index 6020610b..32c9699e 100644 --- a/src/index.ts +++ b/src/index.ts @@ -54,6 +54,7 @@ const getOptionalInput = (name: string) => core.getInput(name) || undefined; const result = await runPublish({ script: publishScript, + comment: Boolean(getOptionalInput("comment")) && hasChangesets, githubToken, }); diff --git a/src/run.ts b/src/run.ts index ae03d09e..1a37c37f 100644 --- a/src/run.ts +++ b/src/run.ts @@ -10,15 +10,23 @@ import { getChangedPackages, sortTheThings, getVersionsByDirectory, + getReleaseMessage, } from "./utils"; import * as gitUtils from "./gitUtils"; import readChangesetState from "./readChangesetState"; import resolveFrom from "resolve-from"; +import issueParser from "issue-parser"; + +type ReleaseComment = { + issue_number: number; + htmlUrl: string; + tagName: string; +}; const createRelease = async ( octokit: ReturnType, - { pkg, tagName }: { pkg: Package; tagName: string } -) => { + { pkg, tagName, comment }: { pkg: Package; tagName: string; comment: boolean } +): Promise => { try { let changelogFileName = path.join(pkg.dir, "CHANGELOG.md"); @@ -33,13 +41,20 @@ const createRelease = async ( ); } - await octokit.repos.createRelease({ - name: tagName, + const { + data: { html_url: htmlUrl }, + } = await octokit.repos.createRelease({ tag_name: tagName, body: changelogEntry.content, prerelease: pkg.packageJson.version.includes("-"), ...github.context.repo, }); + if (comment) { + return await createReleaseComments(octokit, { + tagName, + htmlUrl, + }); + } } catch (err) { // if we can't find a changelog, the user has probably disabled changelogs if (err.code !== "ENOENT") { @@ -48,10 +63,149 @@ const createRelease = async ( } }; +const getSearchQueries = (base: string, commits: string[]) => { + return commits.reduce((searches, commit) => { + const lastSearch = searches[searches.length - 1]; + + if (lastSearch && lastSearch.length + commit.length <= 256 - 6) { + searches[searches.length - 1] = `${lastSearch}+hash:${commit}`; + } else { + searches.push(`${base}+hash:${commit}`); + } + + return searches; + }, [] as string[]); +}; + +/* Comment on released Pull Requests/Issues */ +const createReleaseComments = async ( + octokit: ReturnType, + { tagName, htmlUrl }: { tagName: string; htmlUrl: string } +) => { + /* + Here are the following steps to retrieve the released PRs and issues. + + 1. Retrieve the tag associated with the release + 2. Take the commit sha associated with the tag + 3. Retrieve all the commits starting from the tag commit sha + 4. Retrieve the PRs with commits sha matching the release commits + 5. Map through the list of commits and the list of PRs to + find commit message or PRs body that closes an issue and + get the issue number. + 6. Create a comment for each issue and PR + */ + + const repo = github.context.repo; + + let tagPage = 0; + let tagFound = false; + let tagCommitSha = ""; + + /* 1 */ + while (!tagFound) { + await octokit.repos + .listTags({ + ...repo, + per_page: 100, + page: tagPage, + }) + .then(({ data }) => { + const tag = data.find((el) => el.name === tagName); + if (tag) { + tagFound = true; + /* 2 */ + tagCommitSha = tag.commit.sha; + } + tagPage += 1; + }) + .catch((err) => console.warn(err)); + } + + /* 3 */ + const commits = await octokit.repos + .listCommits({ + ...repo, + sha: tagCommitSha, + }) + .then(({ data }) => data); + + const shas = commits.map(({ sha }) => sha); + + /* Build a seach query to retrieve pulls with commit hashes. + * example: repo:/+type:pr+is:merged+hash:+hash:... + */ + const searchQueries = getSearchQueries( + `repo:${repo.owner}/${repo.repo}+type:pr+is:merged`, + shas + ).map( + async (q) => (await octokit.search.issuesAndPullRequests({ q })).data.items + ); + + const queries = await (await Promise.all(searchQueries)).flat(); + + const queriesSet = queries.map((el) => el.number); + + const filteredQueries = queries.filter( + (el, i) => queriesSet.indexOf(el.number) === i + ); + + /* 4 */ + const pulls = await filteredQueries.filter( + async ({ number }) => + ( + await octokit.pulls.listCommits({ + owner: repo.owner, + repo: repo.repo, + pull_number: number, + }) + ).data.find(({ sha }) => shas.includes(sha)) || + shas.includes( + ( + await octokit.pulls.get({ + owner: repo.owner, + repo: repo.repo, + pull_number: number, + }) + ).data.merge_commit_sha + ) + ); + + const parser = issueParser("github"); + + /* 5 */ + const issues = [ + ...pulls.map((pr) => pr.body), + ...commits.map(({ commit }) => commit.message), + ].reduce((issues, message) => { + return message + ? issues.concat( + parser(message) + .actions.close.filter( + (action) => + action.slug === null || + action.slug === undefined || + action.slug === `${repo.owner}/${repo.repo}` + ) + .map((action) => ({ number: Number.parseInt(action.issue, 10) })) + ) + : issues; + }, [] as { number: number }[]); + + /* 6 */ + return [...new Set([...pulls, ...issues].map(({ number }) => number))].map( + (number) => ({ + issue_number: number, + htmlUrl, + tagName, + }) + ); +}; + type PublishOptions = { script: string; githubToken: string; cwd?: string; + comment: boolean; }; type PublishedPackage = { name: string; version: string }; @@ -68,10 +222,16 @@ type PublishResult = export async function runPublish({ script, githubToken, + comment, cwd = process.cwd(), }: PublishOptions): Promise { let octokit = github.getOctokit(githubToken); let [publishCommand, ...publishArgs] = script.split(/\s+/); + let { changesets } = await readChangesetState(cwd); + + const changesetsSummaries = changesets.map(({ summary }) => summary); + + const { owner, repo } = github.context.repo; let changesetPublishOutput = await execWithOutput( publishCommand, @@ -104,14 +264,40 @@ export async function runPublish({ releasedPackages.push(pkg); } - await Promise.all( + const issueComments = await Promise.all( releasedPackages.map((pkg) => createRelease(octokit, { pkg, tagName: `${pkg.packageJson.name}@${pkg.packageJson.version}`, + comment, }) ) + ).then((releasesComments) => + releasesComments.reduce((acc, releaseComments) => { + if (releaseComments) { + for (const releaseComment of releaseComments) { + acc[releaseComment.issue_number] = [ + ...acc[releaseComment.issue_number], + releaseComment, + ]; + } + } + return acc; + }, {} as { [key: number]: ReleaseComment[] }) ); + for (const comments of Object.values(issueComments)) { + const tagNames = comments.map((comment) => comment.tagName); + const htmlUrls = comments.map((comment) => comment.htmlUrl); + + const { issue_number } = comments[0]; + + octokit.issues.createComment({ + owner, + repo, + issue_number, + body: getReleaseMessage(htmlUrls, tagNames, changesetsSummaries), + }); + } } else { if (packages.length === 0) { throw new Error( @@ -127,10 +313,25 @@ export async function runPublish({ if (match) { releasedPackages.push(pkg); - await createRelease(octokit, { + const comments = await createRelease(octokit, { pkg, tagName: `v${pkg.packageJson.version}`, + comment, }); + if (comments) { + for (const comment of comments) { + octokit.issues.createComment({ + owner, + repo, + issue_number: comment.issue_number, + body: getReleaseMessage( + [comment.htmlUrl], + [comment.tagName], + changesetsSummaries + ), + }); + } + } break; } } diff --git a/src/utils.ts b/src/utils.ts index c9664375..5c365958 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -18,6 +18,21 @@ export async function getVersionsByDirectory(cwd: string) { return new Map(packages.map((x) => [x.dir, x.packageJson.version])); } +export const getReleaseMessage = ( + htmlUrls: string[], + tagNames: string[], + changesetsSummaries: string[] +) => `### 🦋 This work has been released in release versions: ${tagNames.join( + ", " +)} + +Release links: +${htmlUrls.map((htmlUrl) => `- ${htmlUrl}
`)} + +Changesets summary: +${changesetsSummaries.map((changesetSummary) => `- ${changesetSummary}
`)} +`; + export async function getChangedPackages( cwd: string, previousVersions: Map diff --git a/yarn.lock b/yarn.lock index cbc08de2..ccdfb342 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2244,6 +2244,11 @@ dependencies: "@types/node" "*" +"@types/issue-parser@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/issue-parser/-/issue-parser-3.0.0.tgz#154dcdea73c3447b0e30d8ab3dfe2661a531884b" + integrity sha512-wDi9vfrRlosge6GIjC8ToxeiyG7qYSNWRwZIxav0uPIn7LfGdo6RsKztAAFReXipFM5vDIYGgBiAEXcZ/EIniw== + "@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": version "2.0.1" resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff" @@ -5289,6 +5294,17 @@ isstream@~0.1.2: resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo= +issue-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/issue-parser/-/issue-parser-6.0.0.tgz#b1edd06315d4f2044a9755daf85fdafde9b4014a" + integrity sha512-zKa/Dxq2lGsBIXQ7CUZWTHfvxPC2ej0KfO7fIPqLlHB9J2hJ7rGhZ5rilhuufylr4RXYPzJUeFjKxz305OsNlA== + dependencies: + lodash.capitalize "^4.2.1" + lodash.escaperegexp "^4.1.2" + lodash.isplainobject "^4.0.6" + lodash.isstring "^4.0.1" + lodash.uniqby "^4.7.0" + istanbul-lib-coverage@^2.0.2, istanbul-lib-coverage@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz#675f0ab69503fad4b1d849f736baaca803344f49" @@ -5957,6 +5973,11 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +lodash.capitalize@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9" + integrity sha1-+CbJtOKoUR2E46yinbBeGk87cqk= + lodash.clone@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.clone/-/lodash.clone-4.5.0.tgz#195870450f5a13192478df4bc3d23d2dea1907b6" @@ -5967,6 +5988,21 @@ lodash.debounce@^4.0.8: resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168= +lodash.escaperegexp@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" + integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c= + +lodash.isplainobject@^4.0.6: + version "4.0.6" + resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb" + integrity sha1-fFJqUtibRcRcxpC4gWO+BJf1UMs= + +lodash.isstring@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" + integrity sha1-1SfftUVuynzJu5XV2ur4i6VKVFE= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -5987,6 +6023,11 @@ lodash.uniq@^4.5.0: resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.yarnpkg.com/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz#d99c07a669e9e6d24e1362dfe266c67616af1302" + integrity sha1-2ZwHpmnp5tJOE2Lf4mbGdhavEwI= + lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.4: version "4.17.15" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548"