diff --git a/dist/index.js b/dist/index.js index 412648a..e55dc2d 100644 --- a/dist/index.js +++ b/dist/index.js @@ -49,4 +49,4 @@ super(e,{cause:n.cause}),this.name=`HttpError`,this.status=Number.parseInt(t),Nu /* v8 ignore next -- @preserve */ ()=>/* @__PURE__ */ new ArrayBuffer(0))}function lr(e){return e.type===`application/json`||e.type===`application/scim+json`}function ur(e){if(typeof e==`string`)return e;if(e instanceof ArrayBuffer)return`Unknown error`;if(`message`in e){let t=`documentation_url`in e?` - ${e.documentation_url}`:``;return Array.isArray(e.errors)?`${e.message}: ${e.errors.map(e=>JSON.stringify(e)).join(`, `)}${t}`:`${e.message}${t}`}return`Unknown error: ${JSON.stringify(e)}`}function dr(e,t){let n=e.defaults(t);return Object.assign(function(e,t){let r=n.merge(e,t);if(!r.request||!r.request.hook)return sr(n.parse(r));let i=(e,t)=>sr(n.parse(n.merge(e,t)));return Object.assign(i,{endpoint:n,defaults:dr.bind(null,n)}),r.request.hook(i,r)},{endpoint:n,defaults:dr.bind(null,n)})}var fr=dr(Rn,ir),pr=`0.0.0-development`;function mr(e){return`Request failed due to following response errors: `+e.errors.map(e=>` - ${e.message}`).join(` -`)}var hr=class extends Error{constructor(e,t,n){super(mr(n)),this.request=e,this.headers=t,this.response=n,this.errors=n.errors,this.data=n.data,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}name=`GraphqlResponseError`;errors;data},gr=[`method`,`baseUrl`,`url`,`headers`,`request`,`query`,`mediaType`,`operationName`],_r=[`query`,`method`,`url`],vr=/\/api\/v3\/?$/;function yr(e,t,n){if(n){if(typeof t==`string`&&`query`in n)return Promise.reject(/* @__PURE__ */ Error(`[@octokit/graphql] "query" cannot be used as variable name`));for(let e in n)if(_r.includes(e))return Promise.reject(/* @__PURE__ */ Error(`[@octokit/graphql] "${e}" cannot be used as variable name`))}let r=typeof t==`string`?Object.assign({query:t},n):t,i=Object.keys(r).reduce((e,t)=>gr.includes(t)?(e[t]=r[t],e):(e.variables||={},e.variables[t]=r[t],e),{}),a=r.baseUrl||e.endpoint.DEFAULTS.baseUrl;return vr.test(a)&&(i.url=a.replace(vr,`/api/graphql`)),e(i).then(e=>{if(e.data.errors){let t={};for(let n of Object.keys(e.headers))t[n]=e.headers[n];throw new hr(i,t,e.data)}return e.data.data})}function br(e,t){let n=e.defaults(t);return Object.assign((e,t)=>yr(n,e,t),{defaults:br.bind(null,n),endpoint:n.endpoint})}br(fr,{headers:{"user-agent":`octokit-graphql.js/${pr} ${on()}`},method:`POST`,url:`/graphql`});function xr(e){return br(e,{method:`POST`,url:`/graphql`})}var Sr=`(?:[a-zA-Z0-9_-]+)`,Cr=`\\.`,wr=RegExp(`^${Sr}${Cr}${Sr}${Cr}${Sr}$`),Tr=wr.test.bind(wr);async function Er(e){let t=Tr(e),n=e.startsWith(`v1.`)||e.startsWith(`ghs_`),r=e.startsWith(`ghu_`);return{type:`token`,token:e,tokenType:t?`app`:n?`installation`:r?`user-to-server`:`oauth`}}function Dr(e){return e.split(/\./).length===3?`bearer ${e}`:`token ${e}`}async function Or(e,t,n,r){let i=t.endpoint.merge(n,r);return i.headers.authorization=Dr(e),t(i)}var kr=function(e){if(!e)throw Error(`[@octokit/auth-token] No token passed to createTokenAuth`);if(typeof e!=`string`)throw Error(`[@octokit/auth-token] Token passed to createTokenAuth is not a string`);return e=e.replace(/^(token|bearer) +/i,``),Object.assign(Er.bind(null,e),{hook:Or.bind(null,e)})};const Ar=`7.0.6`,jr=()=>{},Mr=console.warn.bind(console),Nr=console.error.bind(console);function Pr(e={}){return typeof e.debug!=`function`&&(e.debug=jr),typeof e.info!=`function`&&(e.info=jr),typeof e.warn!=`function`&&(e.warn=Mr),typeof e.error!=`function`&&(e.error=Nr),e}const Fr=`octokit-core.js/${Ar} ${on()}`;var Ir=class{static VERSION=Ar;static defaults(e){return class extends this{constructor(...t){let n=t[0]||{};if(typeof e==`function`){super(e(n));return}super(Object.assign({},e,n,n.userAgent&&e.userAgent?{userAgent:`${n.userAgent} ${e.userAgent}`}:null))}}}static plugins=[];static plugin(...e){let t=this.plugins;return class extends this{static plugins=t.concat(e.filter(e=>!t.includes(e)))}}constructor(e={}){let t=new hn.Collection,n={baseUrl:fr.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},e.request,{hook:t.bind(null,`request`)}),mediaType:{previews:[],format:``}};if(n.headers[`user-agent`]=e.userAgent?`${e.userAgent} ${Fr}`:Fr,e.baseUrl&&(n.baseUrl=e.baseUrl),e.previews&&(n.mediaType.previews=e.previews),e.timeZone&&(n.headers[`time-zone`]=e.timeZone),this.request=fr.defaults(n),this.graphql=xr(this.request).defaults(n),this.log=Pr(e.log),this.hook=t,e.authStrategy){let{authStrategy:n,...r}=e,i=n(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:r},e.auth));t.wrap(`request`,i.hook),this.auth=i}else if(!e.auth)this.auth=async()=>({type:`unauthenticated`});else{let n=kr(e.auth);t.wrap(`request`,n.hook),this.auth=n}let r=this.constructor;for(let t=0;t({async next(){if(!s)return{done:!0};try{let e=Wr(await i({method:a,url:s,headers:o}));if(s=((e.headers.link||``).match(/<([^<>]+)>;\s*rel="next"/)||[])[1],!s&&`total_commits`in e.data){let t=new URL(e.url),n=t.searchParams,r=parseInt(n.get(`page`)||`1`,10);r*parseInt(n.get(`per_page`)||`250`,10){if(i.done)return t;let a=!1;function o(){a=!0}return t=t.concat(r?r(i.value,o):i.value.data),a?t:qr(e,t,n,r)})}Object.assign(Kr,{iterator:Gr});function Jr(e){return{paginate:Object.assign(Kr.bind(null,e),{iterator:Gr.bind(null,e)})}}Jr.VERSION=Ur,new Yt;const Yr=rn(),Xr={baseUrl:Yr,request:{agent:en(Yr),fetch:nn(Yr)}},Zr=Ir.plugin(Hr,Jr).defaults(Xr);function Qr(e,t){let n=Object.assign({},t||{}),r=$t(e,n);r&&(n.auth=r);let i=an(n.userAgent);return i&&(n.userAgent=i),n}const $r=new Yt;function ei(e,t,...n){return new(Zr.plugin(...n))(Qr(e,t))}function ti(e){return e.any!==void 0}function ni(e){return e.all!==void 0}function ri(e){return e.not!==void 0}function ii(e){return async t=>(await Promise.all(t.any.map(async t=>await e(t)))).some(e=>e)}function ai(e){return async t=>(await Promise.all(t.all.map(async t=>await e(t)))).every(e=>e)}function oi(e){return async t=>!await e(t.not)}function si(e){async function t(t){return si(e)(t)}return async n=>ti(n)?ii(t)(n):ni(n)?ai(t)(n):ri(n)?oi(t)(n):await e(n)}var ci=class{ruleClasses;constructor(e){this.ruleClasses=e}async check(e,t){if(!e||typeof e!=`object`||!e.type)throw Error(`Invalid rule object ${JSON.stringify(e)}`);let n=this.getRuleClass(e.type)?.fromObject(e);if(!n)throw Error(`Unsupported rule type: ${e.type}`);return await n.check(t)}getRuleClass(e){return this.ruleClasses.get(e)}},li=class{ruleClasses=/* @__PURE__ */ new Map;constructor(){}use(e){return this.ruleClasses.set(e.type,e),this}build(){return new ci(this.ruleClasses)}},ui=class{static type;static fromObject(e){throw Error(`fromObject method must be implemented`)}};function di(e){return Array.isArray(e)?e:[e]}function fi(e){return e?di(e):[]}async function pi(e,t){let n=t.includes(e),r=t.join(`, `);return Jt(n?`User ${e} has enough permission to bypass the action`:`User ${e} has not enough permission to bypass the action (not in ${r})`),n}async function mi(e,t,n,r){let i=e.repo.owner;return await Promise.all(r.map(async e=>{try{return(await gi(t,t.rest.teams.listMembersInOrg)({org:i,team_slug:e})).map(e=>e.login)}catch(t){throw Kt(`Error in get teamMembers ${e} in ${i}, check your token has org:read permission`),t}})).then(e=>{let t=e.some(e=>e.includes(n)),i=r.join(`, `);return Jt(t?`User ${n} has enough permission to bypass the action`:`User ${n} has not enough permission to bypass the action (not in ${i})`),t})}async function hi(e,t,n,r,i){return r.length===0&&i.length===0?(Jt(`No user or team need to check, bypass the action`),!0):await pi(n,r)||await mi(e,t,n,i)}function gi(e,t){return async n=>{let r=[];for await(let i of e.paginate.iterator(t,{...n,per_page:100}))r.push(...i.data);return r}}var _i=class e extends ui{static type=`labeled`;labels;userNames;userTeams;constructor(e,t,n){super(),this.labels=di(e),this.userNames=fi(t),this.userTeams=fi(n)}async check(e){let{githubToken:t,githubContext:n}=e,r=ei(t),{owner:i,repo:a}=n.repo,{number:o}=n.issue,s=await gi(r,r.rest.issues.listEvents)({owner:i,repo:a,issue_number:o}),c=(await gi(r,r.rest.issues.listLabelsOnIssue)({owner:i,repo:a,issue_number:o})).map(e=>e.name).filter(e=>this.labels.includes(e)),l=s.filter(e=>e.event===`labeled`).reverse();return Gt(`reversedLabeledEvents: ${JSON.stringify(l)}`),Gt(`currentLabels: ${JSON.stringify(c)}`),await Promise.all(c.map(async e=>{for(let t of l)if(`label`in t&&t.label.name===e){let e=t.actor.login;return await hi(n,r,e,this.userNames,this.userTeams)}let t=l.map(e=>`label`in e?e.label.name:null).filter(e=>e!==null);return Kt(`Label "${e}" not found in reversedLabeledEvents. Available labels in events: ${JSON.stringify(t)}`),!1})).then(e=>e.some(Boolean))}static fromObject(t){return new e(t.label,t.username,t[`user-team`])}};function vi(e){return new RegExp(e,`g`)}var yi=class e extends ui{static type=`commented`;commentPatterns;userNames;userTeams;constructor(e,t,n){super(),this.commentPatterns=di(e).map(vi),this.userNames=fi(t),this.userTeams=fi(n)}async check(e){let{githubToken:t,githubContext:n}=e,r=ei(t),{owner:i,repo:a}=n.repo,{number:o}=n.issue,s=(await gi(r,r.rest.issues.listComments)({owner:i,repo:a,issue_number:o})).map(e=>{if(!e.user){qt(`comment.user is undefined, comment: ${JSON.stringify(e)}`);return}if(!e.body){qt(`comment.body is undefined, comment: ${JSON.stringify(e)}`);return}return{content:e.body,actor:e.user.login}}).filter(e=>e!==void 0).filter(e=>this.commentPatterns.some(t=>t.test(e.content)));return Gt(`allCommentWithActors: ${JSON.stringify(s)}`),Gt(`messagePatterns: ${JSON.stringify(this.commentPatterns)}`),await Promise.all(s.map(async e=>{let t=e.actor;return await hi(n,r,t,this.userNames,this.userTeams)})).then(e=>e.some(e=>e))}static fromObject(t){return new e(t[`comment-pattern`],t.username,t[`user-team`])}},bi=class e extends ui{static type=`approved`;userNames;userTeams;constructor(e,t){super(),this.userNames=fi(e),this.userTeams=fi(t)}async check(e){let{githubToken:t,githubContext:n}=e,r=ei(t),{owner:i,repo:a}=n.repo,{number:o}=n.issue,s=(await gi(r,r.rest.pulls.listReviews)({owner:i,repo:a,pull_number:o})).map(e=>{if(!e.user){qt(`review.user is undefined, review: ${JSON.stringify(e)}`);return}return{state:e.state,actor:e.user.login}}).filter(e=>e!==void 0),c=/* @__PURE__ */ new Set,l=async e=>{let t=e.actor;return e.state===`CHANGES_REQUESTED`&&c.add(t),c.has(t)?(Jt(`User ${t} has requested changes`),!1):e.state===`APPROVED`&&await hi(n,r,t,this.userNames,this.userTeams)};for(let e of s.reverse())if(await l(e))return!0;return Gt(`No valid review found, all reviews: ${JSON.stringify(s)}`),!1}static fromObject(t){return new e(t.username,t[`user-team`])}};function xi(e,t){return async(...n)=>{for(let r=0;re.trim())}function wi(){let e=Ht(`type`);switch(e){case _i.type:return{type:_i.type,label:Ci(Ht(`label`),`|`),username:Ci(Ht(`username`),`|`),"user-team":Ci(Ht(`user-team`),`|`)};case yi.type:return{type:yi.type,"comment-pattern":Ci(Ht(`comment-pattern`),`|`),username:Ci(Ht(`username`),`|`),"user-team":Ci(Ht(`user-team`),`|`)};case bi.type:return{type:bi.type,username:Ci(Ht(`username`),`|`),"user-team":Ci(Ht(`user-team`),`|`)};case`composite`:return JSON.parse(Ht(`composite-rule`));default:throw Error(`Invalid rule type: ${e}`)}}function Ti(){let e=Ht(`non-pull-request-event-strategy`);if(Gt(`Checking non-pull-request event strategy: ${e}, eventName: ${$r.eventName}`),!Si.includes($r.eventName))switch(Gt(`This is not a pull_request related event`),e){case`always-skipped`:return Ut(`can-skip`,!0),!0;case`never-skipped`:return Ut(`can-skip`,!1),!0;case`always-failed`:throw Error(`This action only supports pull_request related events`);default:throw Error(`Invalid non-pull-request event strategy: ${e}`)}return!1}async function Ei(){try{if(Jt(`Starting the action...`),Ti()){Jt(`Non-pull-request event, skipping the check`);return}let e=Ht(`github-token`),t=wi();Gt(`rawRule: ${JSON.stringify(t)}`);async function n(t){return new li().use(_i).use(yi).use(bi).build().check(t,{githubToken:e,githubContext:$r})}let r=await xi(si(n),5)(t);Jt(`Setting can-skip output to ${r}`),Ut(`can-skip`,r)}catch(e){e instanceof Error&&Wt(e.message)}}Ei();export{}; \ No newline at end of file +`)}var hr=class extends Error{constructor(e,t,n){super(mr(n)),this.request=e,this.headers=t,this.response=n,this.errors=n.errors,this.data=n.data,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}name=`GraphqlResponseError`;errors;data},gr=[`method`,`baseUrl`,`url`,`headers`,`request`,`query`,`mediaType`,`operationName`],_r=[`query`,`method`,`url`],vr=/\/api\/v3\/?$/;function yr(e,t,n){if(n){if(typeof t==`string`&&`query`in n)return Promise.reject(/* @__PURE__ */ Error(`[@octokit/graphql] "query" cannot be used as variable name`));for(let e in n)if(_r.includes(e))return Promise.reject(/* @__PURE__ */ Error(`[@octokit/graphql] "${e}" cannot be used as variable name`))}let r=typeof t==`string`?Object.assign({query:t},n):t,i=Object.keys(r).reduce((e,t)=>gr.includes(t)?(e[t]=r[t],e):(e.variables||={},e.variables[t]=r[t],e),{}),a=r.baseUrl||e.endpoint.DEFAULTS.baseUrl;return vr.test(a)&&(i.url=a.replace(vr,`/api/graphql`)),e(i).then(e=>{if(e.data.errors){let t={};for(let n of Object.keys(e.headers))t[n]=e.headers[n];throw new hr(i,t,e.data)}return e.data.data})}function br(e,t){let n=e.defaults(t);return Object.assign((e,t)=>yr(n,e,t),{defaults:br.bind(null,n),endpoint:n.endpoint})}br(fr,{headers:{"user-agent":`octokit-graphql.js/${pr} ${on()}`},method:`POST`,url:`/graphql`});function xr(e){return br(e,{method:`POST`,url:`/graphql`})}var Sr=`(?:[a-zA-Z0-9_-]+)`,Cr=`\\.`,wr=RegExp(`^${Sr}${Cr}${Sr}${Cr}${Sr}$`),Tr=wr.test.bind(wr);async function Er(e){let t=Tr(e),n=e.startsWith(`v1.`)||e.startsWith(`ghs_`),r=e.startsWith(`ghu_`);return{type:`token`,token:e,tokenType:t?`app`:n?`installation`:r?`user-to-server`:`oauth`}}function Dr(e){return e.split(/\./).length===3?`bearer ${e}`:`token ${e}`}async function Or(e,t,n,r){let i=t.endpoint.merge(n,r);return i.headers.authorization=Dr(e),t(i)}var kr=function(e){if(!e)throw Error(`[@octokit/auth-token] No token passed to createTokenAuth`);if(typeof e!=`string`)throw Error(`[@octokit/auth-token] Token passed to createTokenAuth is not a string`);return e=e.replace(/^(token|bearer) +/i,``),Object.assign(Er.bind(null,e),{hook:Or.bind(null,e)})};const Ar=`7.0.6`,jr=()=>{},Mr=console.warn.bind(console),Nr=console.error.bind(console);function Pr(e={}){return typeof e.debug!=`function`&&(e.debug=jr),typeof e.info!=`function`&&(e.info=jr),typeof e.warn!=`function`&&(e.warn=Mr),typeof e.error!=`function`&&(e.error=Nr),e}const Fr=`octokit-core.js/${Ar} ${on()}`;var Ir=class{static VERSION=Ar;static defaults(e){return class extends this{constructor(...t){let n=t[0]||{};if(typeof e==`function`){super(e(n));return}super(Object.assign({},e,n,n.userAgent&&e.userAgent?{userAgent:`${n.userAgent} ${e.userAgent}`}:null))}}}static plugins=[];static plugin(...e){let t=this.plugins;return class extends this{static plugins=t.concat(e.filter(e=>!t.includes(e)))}}constructor(e={}){let t=new hn.Collection,n={baseUrl:fr.endpoint.DEFAULTS.baseUrl,headers:{},request:Object.assign({},e.request,{hook:t.bind(null,`request`)}),mediaType:{previews:[],format:``}};if(n.headers[`user-agent`]=e.userAgent?`${e.userAgent} ${Fr}`:Fr,e.baseUrl&&(n.baseUrl=e.baseUrl),e.previews&&(n.mediaType.previews=e.previews),e.timeZone&&(n.headers[`time-zone`]=e.timeZone),this.request=fr.defaults(n),this.graphql=xr(this.request).defaults(n),this.log=Pr(e.log),this.hook=t,e.authStrategy){let{authStrategy:n,...r}=e,i=n(Object.assign({request:this.request,log:this.log,octokit:this,octokitOptions:r},e.auth));t.wrap(`request`,i.hook),this.auth=i}else if(!e.auth)this.auth=async()=>({type:`unauthenticated`});else{let n=kr(e.auth);t.wrap(`request`,n.hook),this.auth=n}let r=this.constructor;for(let t=0;t({async next(){if(!s)return{done:!0};try{let e=Wr(await i({method:a,url:s,headers:o}));if(s=((e.headers.link||``).match(/<([^<>]+)>;\s*rel="next"/)||[])[1],!s&&`total_commits`in e.data){let t=new URL(e.url),n=t.searchParams,r=parseInt(n.get(`page`)||`1`,10);r*parseInt(n.get(`per_page`)||`250`,10){if(i.done)return t;let a=!1;function o(){a=!0}return t=t.concat(r?r(i.value,o):i.value.data),a?t:qr(e,t,n,r)})}Object.assign(Kr,{iterator:Gr});function Jr(e){return{paginate:Object.assign(Kr.bind(null,e),{iterator:Gr.bind(null,e)})}}Jr.VERSION=Ur,new Yt;const Yr=rn(),Xr={baseUrl:Yr,request:{agent:en(Yr),fetch:nn(Yr)}},Zr=Ir.plugin(Hr,Jr).defaults(Xr);function Qr(e,t){let n=Object.assign({},t||{}),r=$t(e,n);r&&(n.auth=r);let i=an(n.userAgent);return i&&(n.userAgent=i),n}const $r=new Yt;function ei(e,t,...n){return new(Zr.plugin(...n))(Qr(e,t))}function ti(e){return e.any!==void 0}function ni(e){return e.all!==void 0}function ri(e){return e.not!==void 0}function ii(e){return async t=>(await Promise.all(t.any.map(async t=>await e(t)))).some(e=>e)}function ai(e){return async t=>(await Promise.all(t.all.map(async t=>await e(t)))).every(e=>e)}function oi(e){return async t=>!await e(t.not)}function si(e){async function t(t){return si(e)(t)}return async n=>ti(n)?ii(t)(n):ni(n)?ai(t)(n):ri(n)?oi(t)(n):await e(n)}var ci=class{ruleClasses;constructor(e){this.ruleClasses=e}async check(e,t){if(!e||typeof e!=`object`||!e.type)throw Error(`Invalid rule object ${JSON.stringify(e)}`);let n=this.getRuleClass(e.type)?.fromObject(e);if(!n)throw Error(`Unsupported rule type: ${e.type}`);return await n.check(t)}getRuleClass(e){return this.ruleClasses.get(e)}},li=class{ruleClasses=/* @__PURE__ */ new Map;constructor(){}use(e){return this.ruleClasses.set(e.type,e),this}build(){return new ci(this.ruleClasses)}},ui=class{static type;static fromObject(e){throw Error(`fromObject method must be implemented`)}};function di(e){return Array.isArray(e)?e:[e]}function fi(e){return e?di(e):[]}async function pi(e,t){let n=t.includes(e),r=t.join(`, `);return Jt(n?`User ${e} has enough permission to bypass the action`:`User ${e} has not enough permission to bypass the action (not in ${r})`),n}async function mi(e,t,n,r){let i=e.repo.owner;return await Promise.all(r.map(async e=>{try{return(await gi(t,t.rest.teams.listMembersInOrg)({org:i,team_slug:e})).map(e=>e.login)}catch(t){throw Kt(`Error in get teamMembers ${e} in ${i}, check your token has org:read permission`),t}})).then(e=>{let t=e.some(e=>e.includes(n)),i=r.join(`, `);return Jt(t?`User ${n} has enough permission to bypass the action`:`User ${n} has not enough permission to bypass the action (not in ${i})`),t})}async function hi(e,t,n,r,i){return r.length===0&&i.length===0?(Jt(`No user or team need to check, bypass the action`),!0):await pi(n,r)||await mi(e,t,n,i)}function gi(e,t){return async n=>{let r=[];for await(let i of e.paginate.iterator(t,{...n,per_page:100}))r.push(...i.data);return r}}var _i=class e extends ui{static type=`labeled`;labels;userNames;userTeams;constructor(e,t,n){super(),this.labels=di(e),this.userNames=fi(t),this.userTeams=fi(n)}async check(e){let{githubToken:t,githubContext:n}=e,r=ei(t),{owner:i,repo:a}=n.repo,{number:o}=n.issue,s=await gi(r,r.rest.issues.listEvents)({owner:i,repo:a,issue_number:o}),c=(await gi(r,r.rest.issues.listLabelsOnIssue)({owner:i,repo:a,issue_number:o})).map(e=>e.name).filter(e=>this.labels.includes(e)),l=s.filter(e=>e.event===`labeled`).reverse();return Gt(`reversedLabeledEvents: ${JSON.stringify(l)}`),Gt(`currentLabels: ${JSON.stringify(c)}`),await Promise.all(c.map(async e=>{for(let t of l)if(`label`in t&&t.label.name===e){let e=t.actor.login;return await hi(n,r,e,this.userNames,this.userTeams)}let t=l.map(e=>`label`in e?e.label.name:null).filter(e=>e!==null);return Kt(`Label "${e}" not found in reversedLabeledEvents. Available labels in events: ${JSON.stringify(t)}`),!1})).then(e=>e.some(Boolean))}static fromObject(t){return new e(t.label,t.username,t[`user-team`])}};function vi(e){return new RegExp(e)}var yi=class e extends ui{static type=`commented`;commentPatterns;userNames;userTeams;constructor(e,t,n){super(),this.commentPatterns=di(e).map(vi),this.userNames=fi(t),this.userTeams=fi(n)}async check(e){let{githubToken:t,githubContext:n}=e,r=ei(t),{owner:i,repo:a}=n.repo,{number:o}=n.issue,s=(await gi(r,r.rest.issues.listComments)({owner:i,repo:a,issue_number:o})).map(e=>{if(!e.user){qt(`comment.user is undefined, comment: ${JSON.stringify(e)}`);return}if(!e.body){qt(`comment.body is undefined, comment: ${JSON.stringify(e)}`);return}return{content:e.body,actor:e.user.login}}).filter(e=>e!==void 0).filter(e=>this.commentPatterns.some(t=>t.test(e.content)));return Gt(`allCommentWithActors: ${JSON.stringify(s)}`),Gt(`messagePatterns: ${JSON.stringify(this.commentPatterns)}`),await Promise.all(s.map(async e=>{let t=e.actor;return await hi(n,r,t,this.userNames,this.userTeams)})).then(e=>e.some(e=>e))}static fromObject(t){return new e(t[`comment-pattern`],t.username,t[`user-team`])}},bi=class e extends ui{static type=`approved`;userNames;userTeams;constructor(e,t){super(),this.userNames=fi(e),this.userTeams=fi(t)}async check(e){let{githubToken:t,githubContext:n}=e,r=ei(t),{owner:i,repo:a}=n.repo,{number:o}=n.issue,s=(await gi(r,r.rest.pulls.listReviews)({owner:i,repo:a,pull_number:o})).map(e=>{if(!e.user){qt(`review.user is undefined, review: ${JSON.stringify(e)}`);return}return{state:e.state,actor:e.user.login}}).filter(e=>e!==void 0),c=/* @__PURE__ */ new Set,l=async e=>{let t=e.actor;return e.state===`CHANGES_REQUESTED`&&c.add(t),c.has(t)?(Jt(`User ${t} has requested changes`),!1):e.state===`APPROVED`&&await hi(n,r,t,this.userNames,this.userTeams)};for(let e of s.reverse())if(await l(e))return!0;return Gt(`No valid review found, all reviews: ${JSON.stringify(s)}`),!1}static fromObject(t){return new e(t.username,t[`user-team`])}};function xi(e,t){return async(...n)=>{for(let r=0;re.trim())}function wi(){let e=Ht(`type`);switch(e){case _i.type:return{type:_i.type,label:Ci(Ht(`label`),`|`),username:Ci(Ht(`username`),`|`),"user-team":Ci(Ht(`user-team`),`|`)};case yi.type:return{type:yi.type,"comment-pattern":Ci(Ht(`comment-pattern`),`|`),username:Ci(Ht(`username`),`|`),"user-team":Ci(Ht(`user-team`),`|`)};case bi.type:return{type:bi.type,username:Ci(Ht(`username`),`|`),"user-team":Ci(Ht(`user-team`),`|`)};case`composite`:return JSON.parse(Ht(`composite-rule`));default:throw Error(`Invalid rule type: ${e}`)}}function Ti(){let e=Ht(`non-pull-request-event-strategy`);if(Gt(`Checking non-pull-request event strategy: ${e}, eventName: ${$r.eventName}`),!Si.includes($r.eventName))switch(Gt(`This is not a pull_request related event`),e){case`always-skipped`:return Ut(`can-skip`,!0),!0;case`never-skipped`:return Ut(`can-skip`,!1),!0;case`always-failed`:throw Error(`This action only supports pull_request related events`);default:throw Error(`Invalid non-pull-request event strategy: ${e}`)}return!1}async function Ei(){try{if(Jt(`Starting the action...`),Ti()){Jt(`Non-pull-request event, skipping the check`);return}let e=Ht(`github-token`),t=wi();Gt(`rawRule: ${JSON.stringify(t)}`);async function n(t){return new li().use(_i).use(yi).use(bi).build().check(t,{githubToken:e,githubContext:$r})}let r=await xi(si(n),5)(t);Jt(`Setting can-skip output to ${r}`),Ut(`can-skip`,r)}catch(e){e instanceof Error&&Wt(e.message)}}Ei();export{}; \ No newline at end of file diff --git a/src/rules/comment.ts b/src/rules/comment.ts index 764b0e2..4cbc00c 100644 --- a/src/rules/comment.ts +++ b/src/rules/comment.ts @@ -15,7 +15,7 @@ interface CommentWithActor { } function compilePattern(pattern: string): RegExp { - return new RegExp(pattern, 'g') + return new RegExp(pattern) } export class CommentRule extends AbstractRule {