git-jira-hook
Version:
Git hook for Jira workflow
3 lines (2 loc) • 10.8 kB
JavaScript
;var e=require("@babel/runtime/helpers/typeof");function t(e){if("function"!=typeof WeakMap)return null;var n=new WeakMap,r=new WeakMap;return(t=function(e){return e?r:n})(e)}var n=require("yargs"),r=require("yargs/helpers"),o=require("current-git-branch"),i=require("fs"),c=require("app-root-path"),a=require("path"),s=require("ajv"),u=require("url"),f="undefined"!=typeof document?document.currentScript:null;function l(e,t,n,r){return new(n||(n=Promise))((function(o,i){function c(e){try{s(r.next(e))}catch(e){i(e)}}function a(e){try{s(r.throw(e))}catch(e){i(e)}}function s(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(c,a)}s((r=r.apply(e,t||[])).next())}))}function p(e,t){var n,r,o,i,c={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:a(0),throw:a(1),return:a(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function a(a){return function(s){return function(a){if(n)throw new TypeError("Generator is already executing.");for(;i&&(i=0,a[0]&&(c=0)),c;)try{if(n=1,r&&(o=2&a[0]?r.return:a[0]?r.throw||((o=r.return)&&o.call(r),0):r.next)&&!(o=o.call(r,a[1])).done)return o;switch(r=0,o&&(a=[2&a[0],o.value]),a[0]){case 0:case 1:o=a;break;case 4:return c.label++,{value:a[1],done:!1};case 5:c.label++,r=a[1],a=[0];continue;case 7:a=c.ops.pop(),c.trys.pop();continue;default:if(!(o=c.trys,(o=o.length>0&&o[o.length-1])||6!==a[0]&&2!==a[0])){c=0;continue}if(3===a[0]&&(!o||a[1]>o[0]&&a[1]<o[3])){c.label=a[1];break}if(6===a[0]&&c.label<o[1]){c.label=o[1],o=a;break}if(o&&c.label<o[2]){c.label=o[2],c.ops.push(a);break}o[2]&&c.ops.pop(),c.trys.pop();continue}a=t.call(e,c)}catch(e){a=[6,e],r=0}finally{n=o=0}if(5&a[0])throw a[1];return{value:a[0]?a[1]:void 0,done:!0}}([a,s])}}}function g(e,t,n){if(n||2===arguments.length)for(var r,o=0,i=t.length;o<i;o++)!r&&o in t||(r||(r=Array.prototype.slice.call(t,0,o)),r[o]=t[o]);return e.concat(r||Array.prototype.slice.call(t))}"function"==typeof SuppressedError&&SuppressedError;var d=n(r.hideBin(process.argv)).options({config:{type:"string",default:""},debug:{type:"boolean",default:!1},projectId:{type:"string"},branch:{type:"string",default:""},commitMessage:{type:"string",default:""}}).parseSync(),m=d._[0],h="[0m",b="[1m",y="[0;90m",v="[1;34m",k="\n",w=y+"⧗ "+h,j="[1;92m✔ "+h,T="[1;31m✖ "+h,x="[1;33m⚠ "+h,C=v+"ⓘ "+h,E=v+"[debug] "+h;function R(e,t,n,r){console.log(function(e,t,n){void 0===n&&(n=!1);var r=n?k:"";switch(e){case"loading":r+=w;break;case"success":r+=j;break;case"error":r+=T;break;case"warn":r+=x;break;case"info":r+=C;break;case"debug":r+=E;break;default:r+=b+t+h}return n&&(r+=b),r+(t+h)}(e,t,r),function(e){return e?y+e+h:""}(n))}var M={loading:function(e,t,n){R("loading",e,t,n)},success:function(e,t,n){R("success",e,t,n),n&&process.exit()},error:function(e,t,n){R("error",e,t,n),n&&process.exit(1)},warn:function(e,t){R("warn",e,t)},info:function(e,t){R("info",e,t)},debug:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];d.debug&&console.log.apply(console,g([E],e,!1))}};var S={modifyCommitMessage:function(e){i.writeFileSync(m,e)},getCommitMessage:function(){var e;try{return d.debug&&d.commitMessage?(M.debug("Passing arg commitMessage for debugging:",d.commitMessage),e=d.commitMessage):e=i.readFileSync(m,"utf8").trim(),M.debug("Commit message:",e),{firstLine:e.split("\n")[0],fullMessage:e}}catch(e){return M.error("Cannot read commit message file","",!0),{firstLine:"",fullMessage:""}}},getBranch:function(){var e=o();return d.debug&&d.branch?(M.debug("Passing arg branch for debugging:",d.branch),d.branch):(M.debug("Current branch:",e),e)}};var I,P=function(e){var t=new RegExp("^Merge(d)?.*?$"),n=new RegExp("^Revert.*?$"),r=new RegExp("^v??[0-9]*\\.[0-9]*\\.[0-9]*.*$"),o=new RegExp("^BREAKING CHANGE: .*$");return!!(e.match(t)||e.match(n)||e.match(r)||e.match(o))},q=function(e){var t=new RegExp("^([a-z]+?)(?:\\((.*?-[0-9]+?)+\\))?: .*?$"),n=e.match(t)||[],r=n[0],o=void 0!==r&&r,i=n[1],c=void 0===i?"":i,a=n[2];return{hasFormat:!!o,commitType:c,ticket:void 0===a?"":a}},$=function(e,t){return("string"==typeof t?[t]:t).some((function(t){var n=new RegExp("^".concat(t,"(-)([0-9])+?$"));return!!e.match(n)}))},O=function(e,t,n){var r=new RegExp("^\\b(".concat(t.join("|"),")\\b$")),o=new RegExp("^\\b(".concat(n.join("|"),")\\b$"));return[!!e.match(r),!!e.match(o)]},F=function(e,t){var n=new RegExp("^\\b(".concat(t.join("|"),")\\b\\/.+?$"));return!!e.match(n)},_=function(e,t){var n=new RegExp("^\\b(".concat(t.join("|"),")\\b$"));return!!e.match(n)},B=function(e,t,n){void 0===n&&(n=[]);for(var r="string"==typeof t?[t]:t,o=0;o<r.length;o+=1){var i=r[o],c=new RegExp("^(?:".concat(n.join("|"),")\\/(").concat(i,"-[0-9]+)(?:-(.*?))?$")),a=e.match(c)||[],s=a[0],u=void 0!==s&&s,f=a[1];if(u)return{isValid:!!u,branchTicket:void 0===f?"":f}}return{isValid:!1,branchTicket:""}},N=function(e,t,n,r){var o=new RegExp("^(".concat(r.join("|"),"): (.*?)$")),i=t.split("\n"),c=e.match(o)||[],a=c[1],s=c[2];return i[0]="".concat(a,"(").concat(n,"): ").concat(s),i.join("\n")},A={nullable:!0,type:"array",minItems:0,items:{type:"string"}},J={type:"object",required:["projectId"],additionalProperties:!1,properties:{projectId:{type:["string","array"],minItems:1,items:{type:"string"},oneOf:[{type:"string"},{type:"array",items:{type:"string"}}]},commitTypes:{nullable:!0,type:"object",maxProperties:2,properties:{ticket:A,nonTicket:A}},branchTypes:{nullable:!0,type:"object",maxProperties:3,properties:{main:A,ticket:A,nonTicket:A}}}},L=new s({allErrors:!0,allowUnionTypes:!0}),U={projectId:null!==(I=d.projectId)&&void 0!==I?I:"",commitTypes:{ticket:["feat","feature","fix"],nonTicket:["chore","refactor"]},branchTypes:{main:["master"],ticket:["feat","feature","bugfix"],nonTicket:["release","support","chore"]}};function D(e){var t=L.validate(J,e);return L.errors&&function(e){for(var t=0;t<e.length;t++){var n=e[t];M.error("Config error:","".concat(n.instancePath," ").concat(n.message))}}(L.errors),t}function G(e){return e&&D(e)?e:(M.error("Configuration is not valid. Using default values."),U)}var V=u.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:f&&f.src||new URL("commit-msg.cjs",document.baseURI).href),W=a.dirname(V);function z(n){return l(this,void 0,void 0,(function(){var r,o,i;return p(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),r=a.relative(W,n),[4,(s=r,new Promise((function(e){return e("".concat(s))})).then((function(n){return function(n,r){if(!r&&n&&n.__esModule)return n;if(null===n||"object"!=e(n)&&"function"!=typeof n)return{default:n};var o=t(r);if(o&&o.has(n))return o.get(n);var i={__proto__:null},c=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var a in n)if("default"!==a&&Object.prototype.hasOwnProperty.call(n,a)){var s=c?Object.getOwnPropertyDescriptor(n,a):null;s&&(s.get||s.set)?Object.defineProperty(i,a,s):i[a]=n[a]}return i.default=n,o&&o.set(n,i),i}(require(n))})))];case 1:return(o=c.sent().default)&&"object"===e(o)?(M.debug("Config is JS file exporting an object"),[2,o]):o&&"function"==typeof o?(M.debug("Config is JS file exporting a function"),[2,o()]):[3,3];case 2:return i=c.sent(),M.error("Error reading config js file"),console.error(i),[2,null];case 3:return[2]}var s}))}))}function H(t){M.debug("Config is JSON");try{var n=i.readFileSync(t,"utf8"),r=JSON.parse(n);if(r&&"object"===e(r))return r}catch(e){return M.error("Error reading config json file"),console.error(e),null}}function K(e){return l(this,void 0,void 0,(function(){return p(this,(function(t){return".json"===a.extname(e)?[2,H(e)]:[2,z(e)]}))}))}var Q="hooks.config.json",X="hooks.config.js";function Y(e){return i.existsSync(e)}function Z(e){return a.join(c.path,e)}function ee(){return l(this,void 0,void 0,(function(){var e;return p(this,(function(t){switch(t.label){case 0:return(e=function(){var e=d.config,t=Z(e);if(e&&Y(t))return t;M.debug("Searching for config file using default names");var n=Z(Q),r=Z(X);return Y(n)?n:Y(r)?r:void 0}())?(M.debug("Getting config on:",e),[4,K(e)]):(M.info("Config file not found. Using default values"),[2,U]);case 1:return[2,G(t.sent())]}}))}))}ee();var te={getConfigConstants:ee},ne=P,re=_,oe=q,ie=$,ce=O,ae=F,se=B,ue=N;!function(){l(this,void 0,void 0,(function(){var e,t,n,r,o,i,c,a,s,u,f,l,d,h,b,y,v,k,w,j;return p(this,(function(p){switch(p.label){case 0:return m||M.error("Commit message file not passed.","",!0),e=S.getCommitMessage(),t=e.firstLine,n=e.fullMessage,r=S.getBranch(),[4,te.getConfigConstants()];case 1:return o=p.sent(),i=o.projectId,c=o.branchTypes,i||M.error("projectId not provided. Either add it on the config file or pass it as an argument","",!0),M.debug("Config values:",o),M.debug("Commit data: ",{projectId:i,fullMessage:n,firstLine:t,branch:r}),M.loading("Checking commit message"),ne(t)&&M.success("No need to add ticket","",!0),re(r,c.main)&&M.error("Cannot commit directly to the following branches",c.main.join(", "),!0),a=ae(r,c.nonTicket),s=ae(r,c.ticket),a||s||M.error("Branch does not match any of the types on the config file","".concat(c.ticket.join(", "),", ").concat(c.nonTicket.join(", ")),!0),u=oe(t),f=u.hasFormat,l=u.ticket,d=u.commitType,M.debug("Format data: ",{hasFormat:f,ticket:l,commitType:d}),f||M.error("The commit message has an incorrect format",'e.g. "feat('.concat(i,'-0): Description"'),!0),h=ce(d,o.commitTypes.ticket,o.commitTypes.nonTicket),b=h[0],y=h[1],M.debug("Type data: ",{isTicketType:b,isNonTicketType:y}),y&&M.success("Non JIRA related commit. No need to add ticket","",!0),b||M.error("The commit message has an incorrect commit type","Commit types available are ".concat(g(g([],o.commitTypes.ticket,!0),o.commitTypes.nonTicket,!0).join(", ")),!0),l&&(ie(l,i)?M.success("Ticket already in place","",!0):M.error("The ticket in the commit message does not match the provided projectId ".concat(i),'e.g. "feat('.concat(i,'-0): Description"'),!0)),M.warn("Jira ticket is not on the commit message"),a&&M.success("Working on a non JIRA related branch, no need to add ticket","",!0),v=se(r,i,c.ticket),k=v.isValid,w=v.branchTicket,M.debug("Branch data: ",{isValid:k,branchTicket:w}),k||(M.error("Branch does not have a ticket. The following branch types require an assigned ticket",c.ticket.join(", ")),M.info("For a non-ticket branch, rename the branch prefix to one of the following",c.nonTicket.join(", ")),M.info("Branches may include an optional description after the ticket","".concat(c.ticket[0]||"feature","/").concat(i,"-description")),M.error("Ticket name not found on branch. Please add one","",!0)),M.loading("Adding ticket to commit message",w),j=ue(t,n,w,o.commitTypes.ticket),S.modifyCommitMessage(j),M.success("Success!",j,!0),[2]}}))}))}();