UNPKG

git-jira-hook

Version:
3 lines (2 loc) 10.4 kB
#!/usr/bin/env node "use strict";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("lodash.merge"),f=require("url"),l="undefined"!=typeof document?document.currentScript:null;function p(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 d(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 m(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 g=n(r.hideBin(process.argv)).options({config:{type:"string",default:""},debug:{type:"boolean",default:!1},projectId:{type:"string"}}).parseSync(),h=g._[0],b="",y="",v="",k="",w="\n",j=v+"⧗ "+b,T="✔ "+b,x="✖ "+b,C="⚠ "+b,E=k+"ⓘ "+b,R=k+"[debug] "+b;function S(e,t,n,r){console.log(function(e,t,n){void 0===n&&(n=!1);var r=n?w:"";switch(e){case"loading":r+=j;break;case"success":r+=T;break;case"error":r+=x;break;case"warn":r+=C;break;case"info":r+=E;break;case"debug":r+=R;break;default:r+=y+t+b}return n&&(r+=y),r+(t+b)}(e,t,r),function(e){return e?v+e+b:""}(n))}var I={loading:function(e,t,n){S("loading",e,t,n)},success:function(e,t,n){S("success",e,t,n),n&&process.exit()},error:function(e,t,n){S("error",e,t,n),n&&process.exit(1)},warn:function(e,t){S("warn",e,t)},info:function(e,t){S("info",e,t)},debug:function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];g.debug&&console.log.apply(console,m([R],e,!1))}};var q={modifyCommitMessage:function(e){i.writeFileSync(h,e)},getCommitMessage:function(){var e;try{return e=i.readFileSync(h,"utf8").trim(),I.debug("Commit message:",e),{firstLine:e.split("\n")[0],fullMessage:e}}catch(e){return I.error("Cannot read commit message file","",!0),{firstLine:"",fullMessage:""}}},getBranch:function(){var e=o();return I.debug("Current branch:",e),e}};var M,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))},$=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}},O=function(e,t){return("string"==typeof t?[t]:t).some((function(t){var n=new RegExp("^".concat(t,"(-)([0-9])+?$"));return!!e.match(n)}))},F=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)]},_=function(e,t){var n=new RegExp("^\\b(".concat(t.join("|"),")\\b\\/.+?$"));return!!e.match(n)},N=function(e,t){var n=new RegExp("^\\b(".concat(t.join("|"),")\\b$"));return!!e.match(n)},A=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:""}},B=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")},J={nullable:!0,type:"array",minItems:0,items:{type:"string"}},L={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:J,nonTicket:J}},branchTypes:{nullable:!0,type:"object",maxProperties:3,properties:{main:J,ticket:J,nonTicket:J}}}},U=new s({allErrors:!0,allowUnionTypes:!0}),D={projectId:null!==(M=g.projectId)&&void 0!==M?M:"",commitTypes:{ticket:["feat","feature","fix"],nonTicket:["chore","refactor"]},branchTypes:{main:["master"],ticket:["feat","feature","bugfix"],nonTicket:["release","support","chore"]}};function G(e){var t=U.validate(L,e);return U.errors&&function(e){for(var t=0;t<e.length;t++){var n=e[t];I.error("Config error:","".concat(n.instancePath," ").concat(n.message))}}(U.errors),t}function V(e){return e&&G(e)?u(D,e):(I.error("Configuration is not valid. Using default values."),D)}var W=f.fileURLToPath("undefined"==typeof document?require("url").pathToFileURL(__filename).href:l&&l.src||new URL("commit-msg.cjs",document.baseURI).href),z=a.dirname(W);function H(n){return p(this,void 0,void 0,(function(){var r,o,i;return d(this,(function(c){switch(c.label){case 0:return c.trys.push([0,2,,3]),r=a.relative(z,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)?(I.debug("Config is JS file exporting an object"),[2,o]):o&&"function"==typeof o?(I.debug("Config is JS file exporting a function"),[2,o()]):[3,3];case 2:return i=c.sent(),I.error("Error reading config js file"),console.error(i),[2,null];case 3:return[2]}var s}))}))}function K(t){I.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 I.error("Error reading config json file"),console.error(e),null}}function Q(e){return p(this,void 0,void 0,(function(){return d(this,(function(t){return".json"===a.extname(e)?[2,K(e)]:[2,H(e)]}))}))}var X="hooks.config.json",Y="hooks.config.js";function Z(e){return i.existsSync(e)}function ee(e){return a.join(c.path,e)}function te(){return p(this,void 0,void 0,(function(){var e;return d(this,(function(t){switch(t.label){case 0:return(e=function(){var e=g.config,t=ee(e);if(e&&Z(t))return t;I.debug("Searching for config file using default names");var n=ee(X),r=ee(Y);return Z(n)?n:Z(r)?r:void 0}())?(I.debug("Getting config on:",e),[4,Q(e)]):(I.info("Config file not found. Using default values"),[2,D]);case 1:return[2,V(t.sent())]}}))}))}te();var ne={getConfigConstants:te},re=P,oe=N,ie=$,ce=O,ae=F,se=_,ue=A,fe=B;!function(){p(this,void 0,void 0,(function(){var e,t,n,r,o,i,c,a,s,u,f,l,p,g,b,y,v,k;return d(this,(function(d){switch(d.label){case 0:return h||I.error("Commit message file not passed.","",!0),e=q.getCommitMessage(),t=e.firstLine,n=e.fullMessage,r=q.getBranch(),[4,ne.getConfigConstants()];case 1:return o=d.sent(),i=o.projectId,c=o.branchTypes,i||I.error("projectId not provided. Either add it on the config file or pass it as an argument","",!0),I.debug("Config values:",o),I.debug("Commit data: ",{projectId:i,fullMessage:n,firstLine:t,branch:r}),I.loading("Checking commit message"),re(t)&&I.success("No need to add ticket","",!0),oe(r,c.main)&&I.error("Cannot commit directly to the following branches",c.main.join(", "),!0),a=ie(t),s=a.hasFormat,u=a.ticket,f=a.commitType,I.debug("Format data: ",{hasFormat:s,ticket:u,commitType:f}),s||I.error("The commit message has an incorrect format",'e.g. "feat('.concat(i,'-0): Description"'),!0),l=ae(f,o.commitTypes.ticket,o.commitTypes.nonTicket),p=l[0],g=l[1],I.debug("Type data: ",{isTicketType:p,isNonTicketType:g}),g&&I.success("Non JIRA related commit. No need to add ticket","",!0),p||I.error("The commit message has an incorrect commit type","Commit types available are ".concat(m(m([],o.commitTypes.ticket,!0),o.commitTypes.nonTicket,!0).join(", ")),!0),u&&(ce(u,i)?I.success("Ticket already in place","",!0):I.error("The ticket in the commit message does not match the provided projectId ".concat(i),'e.g. "feat('.concat(i,'-0): Description"'),!0)),I.warn("Jira ticket is not on the commit message"),se(r,c.nonTicket)&&I.success("Working on a non JIRA related branch, no need to add ticket","",!0),b=ue(r,i,c.ticket),y=b.isValid,v=b.branchTicket,I.debug("Branch data: ",{isValid:y,branchTicket:v}),y||(I.error("Branch does not have a ticket. The following branch types require an assigned ticket",c.ticket.join(", ")),I.info("For a non-ticket branch, rename the branch prefix to one of the following",c.nonTicket.join(", ")),I.info("Branches may include an optional description after the ticket","".concat(c.ticket[0]||"feature","/").concat(i,"-description")),I.error("Ticket name not found on branch. Please add one","",!0)),I.loading("Adding ticket to commit message",v),k=fe(t,n,v,o.commitTypes.ticket),q.modifyCommitMessage(k),I.success("Success!",k,!0),[2]}}))}))}();