UNPKG

matron

Version:

> A Domain Specific Language à-la Dockerfile with a CLI to scaffold your projects.

3 lines 11.8 kB
#!/usr/bin/env node !function(e,t){for(var n in t)e[n]=t[n]}(exports,function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="",n(n.s=15)}([function(e,t){e.exports=require("path")},function(e,t){e.exports=require("fs")},function(e,t){e.exports=require("xstate")},function(e,t){e.exports=require("chalk")},function(e,t){e.exports=require("@reduxjs/toolkit")},function(e,t){e.exports=require("fs-extra")},function(e,t){e.exports=require("yargs")},function(e,t){e.exports=require("morphism")},function(e,t){e.exports=require("uuid/v4")},function(e,t){e.exports=require("js-yaml")},function(e,t){e.exports=require("ajv")},function(e){e.exports=JSON.parse('{"$ref":"#/definitions/MatronDocument","$schema":"http://json-schema.org/draft-07/schema#","definitions":{"MatronDocument":{"additionalProperties":false,"properties":{"jobs":{"$ref":"#/definitions/MatronDocumentJobs"}},"required":["jobs"],"type":"object"},"MatronDocumentJob":{"additionalProperties":false,"properties":{"name":{"type":"string"},"steps":{"items":{"$ref":"#/definitions/MatronDocumentJobStep"},"type":"array"}},"required":["steps"],"type":"object"},"MatronDocumentJobStep":{"additionalProperties":false,"properties":{"COPY":{"type":"string"},"MERGE_JSON":{"type":"string"},"RUN":{"type":"string"},"WORKDIR":{"type":"string"}},"type":"object"},"MatronDocumentJobs":{"additionalProperties":{"$ref":"#/definitions/MatronDocumentJob"},"type":"object"}}}')},function(e,t){e.exports=require("cross-spawn")},function(e,t){e.exports=require("deepmerge")},function(e,t){e.exports=require("dotenv-flow")},function(e,t,n){"use strict";n.r(t);var r=n(6),o=n.n(r),a=n(3),i=n.n(a),s=n(2),c=n(4),l=n(9),d=n.n(l),u=n(1),m=n.n(u),f=n(7),p=n(10),b=n.n(p),h=n(11);const y=Object(f.morphism)(Object(f.createSchema)({cmd:e=>Object.keys(e)[0],args:e=>{const t=Object.values(e)[0];if(t){return t.split(" ")}return[]}}));function g(e){const t=function(e){try{return d.a.safeLoad(e)}catch(e){throw e}}(e);return function(e){const t=(new b.a).compile(h);if(!t(e))throw new E(t.errors)}(t),Object.entries(t.jobs).map(([e,t])=>({key:e,name:t.name,steps:y(t.steps)}))}class E extends Error{constructor(e){super(`\nUnable to validate the Matron file.\n Errors: ${JSON.stringify(e,null,2)}\n `)}}function j(e){const t=e.args.join(" "),n=function(e){const t=/\${(?<param>\w+)}/gm,n=[];let r;for(;null!==(r=t.exec(e));)r.index===t.lastIndex&&t.lastIndex++,r.groups&&r.groups.param&&n.push(r.groups.param);return n}(t).reduce((e,t)=>{const n=process.env[t];if(void 0===n)throw new Error(`Parameter ${t} is not defined.`);return e.replace(`\${${t}}`,n)},t);return{cmd:e.cmd,args:n.split(" ")}}var v=n(12),x=n.n(v),O=n(8),P=n.n(O),F=n(13),R=n.n(F),w=n(0),S=n.n(w),I=n(5),M=n.n(I);let T;!function(e){e.COPY="COPY",e.RUN="RUN",e.WORKDIR="WORKDIR",e.MERGE_JSON="MERGE_JSON"}(T||(T={}));const{log:$}=s.actions;var C;!function(e){e.SET_WORKDIR="SET_WORKDIR",e.START_PARSE="START_PARSE",e.START_EXECUTE="START_EXECUTE",e.EXECUTE_COMMAND="EXECUTE_COMMAND",e.EXECUTE_JOB="EXECUTE_JOB",e.EXECUTE_COMMANDS="EXECUTE_COMMANDS"}(C||(C={}));Object(c.createAction)(C.SET_WORKDIR);const _=Object(c.createAction)(C.START_PARSE),A=(Object(c.createAction)(C.START_EXECUTE),Object(c.createAction)(C.EXECUTE_COMMAND),Object(c.createAction)(C.EXECUTE_JOB));function J(e){const t={executionPath:"./"};Object.assign(t,e);const n=Object(s.createMachine)({id:"matron",strict:!0,initial:"idle",context:{config:{...t,matronFile:{path:"",text:""}},jobs:{byId:{},allIds:[]},commands:{byId:{},allIds:[]}},states:{idle:{on:{START_PARSE:{target:"parse",actions:Object(s.assign)({config:(e,t)=>({...e.config,matronFile:{...e.config.matronFile,path:t.payload.matronFilePath}})})}}},parse:{initial:"loadingMatronFile",entry:$(()=>"Parsing Matron file"),states:{loadingMatronFile:{invoke:{id:"loadingMatronFile",src:e=>{return t=e.config.matronFile.path,Promise.resolve(Object(u.readFileSync)(t,"utf8"));var t},onDone:{target:"extractJobs",actions:Object(s.assign)({config:(e,t)=>({...e.config,matronFile:{...e.config.matronFile,text:t.data}})})}}},extractJobs:{invoke:{id:"extractJobs",src:e=>{const t=g(e.config.matronFile.text),n={};try{const e=t.map(e=>{const t=P()();return n[t]=e.steps.map(e=>({id:P()(),rawCommand:e,evaluatedCommand:j(e),executed:!1})),{id:t,key:e.key,name:e.name,commands:n[t].map(e=>e.id),executed:!1}});return Promise.resolve({jobItems:e,commandItemsByJobId:n})}catch(e){return Promise.reject(e)}},onDone:{target:"#matron.execute",actions:Object(s.assign)({jobs:(e,t)=>{const{jobItems:n}=t.data;return{byId:{...e.jobs.byId,...n.reduce((e,t)=>(e[t.id]=t,e),{})},allIds:[...e.jobs.allIds,...n.map(e=>e.id)]}},commands:(e,t)=>{const{commandItemsByJobId:n}=t.data,r=Object.values(n).reduce((e,t)=>(e.push(...t),e),[]);return{byId:{...e.commands.byId,...r.reduce((e,t)=>(e[t.id]=t,e),{})},allIds:[...e.commands.allIds,...r.map(e=>e.id)]}}})}}}}},execute:{entry:[$(()=>"Executing Jobs")],on:{EXECUTE_JOB:{actions:[$((e,t)=>{const{payload:{jobItem:n}}=t;return n.name?n.name:`Running Job ${n.key}`}),(e,t)=>{const{payload:{jobItem:n}}=t;n.commands.map(t=>e.commands.byId[t]).forEach(t=>{switch(t.evaluatedCommand.cmd){case T.RUN:{const n=function(e){return{cmd:e.args[0],args:e.args.slice(1)}}(t.evaluatedCommand);x.a.sync(n.cmd,n.args,{stdio:"inherit",cwd:e.config.executionPath})}break;case T.WORKDIR:e.config.executionPath=t.evaluatedCommand.args[0];break;case T.MERGE_JSON:{const n=S.a.join(S.a.dirname(e.config.matronFile.path),t.evaluatedCommand.args[0]),r=S.a.join(process.cwd(),e.config.executionPath,t.evaluatedCommand.args[1]),o=JSON.parse(m.a.readFileSync(n,"utf8")),a=JSON.parse(m.a.readFileSync(r,"utf8")),i=R()(o,a);m.a.writeFileSync(r,JSON.stringify(i,null,2))}break;case T.COPY:{const n=S.a.join(S.a.dirname(e.config.matronFile.path),t.evaluatedCommand.args[0]),r=S.a.join(process.cwd(),e.config.executionPath,t.evaluatedCommand.args[1]);M.a.copySync(n,r)}}})},Object(s.assign)({jobs:(e,t)=>{const{payload:{jobItem:n}}=t;return{byId:{...e.jobs.byId,[n.id]:{...e.jobs.byId[n.id],executed:!0}},allIds:e.jobs.allIds}},commands:(e,t)=>{const{payload:{jobItem:n}}=t,r=n.commands.map(t=>e.commands.byId[t]);return{byId:{...e.commands.byId,...r.reduce((e,t)=>(e[t.id]={...t,executed:!0},e),{})},allIds:e.commands.allIds}}})]}}},final:{}},on:{SET_WORKDIR:{actions:Object(s.assign)({config:(e,t)=>({...e.config,executionPath:t.payload.path})})}}});return Object(s.interpret)(n).start()}var D,N=n(14),U=n.n(N);function q(e,...t){const n=e.reduce((e,n,r)=>(e+=n,e+=void 0!==t[r]?t[r]:""),"");return i.a.hex(D.Red).bold(n)}!function(e){e.Blue="#4285f4",e.Green="#34a853",e.Yellow="#fbbc05",e.Red="#ea4335"}(D||(D={}));class k extends Error{constructor(e){super(q`${e}`),this.name="GenericError"}}class X extends Error{constructor(e){super(q`Unable to locate a 'matron.yml' file at ${e}`),this.name="MatronFileMissingError"}}class W extends Error{constructor(...e){super(q`Arguments ${e.join(", ")} can't be use jointly. You might choose between one of them.`),this.name="ArgsConflictError"}}class K extends Error{constructor(...e){super(q`${`\nOne argument below is required: ${e.reduce((e,t)=>e+=`\n - ${t}`,"")}\n`}`),this.name="RequiredArgsError"}}class B extends Error{constructor(e,t){super(q`Path ${e} provided to '${t}' is not a folder.`),this.name="NotAFolderError"}}class G extends Error{constructor(e,t){super(q`Folder ${e} provided to '${t}' does not exists.`),this.name="FolderNotExistsError"}}class Y extends Error{constructor(e,t){super(q`Path ${e} provided to '${t}' is not a file.`),this.name="NotAFileError"}}class H extends Error{constructor(e,t){super(q`File ${e} provided to '${t}' does not exists.`),this.name="FileNotExistsError"}}function L(e){const{matronFileRelativePath:t,dotEnvFolderRelativePath:n,templateFolderRelativePath:r}=e;let o;if(function(e){const{matronFileRelativePath:t,templateFolderRelativePath:n}=e;if(t&&n)throw new W("matronFileRelativePath","templateFolderRelativePath");if(t||n)return!0;throw new K("matronFileRelativePath","templateFolderRelativePath")}({matronFileRelativePath:t,templateFolderRelativePath:r})){if(r){const e=z(r);if(!M.a.existsSync(S.a.join(e,"./matron.yml")))throw new X(e);o=S.a.join(e,"./matron.yml"),Q(e)}if(t&&(o=z(t),n)){Q(z(n))}if(!o)throw new k(`\nUnable to find a matron.yml file with the following parameters:\n - matronFileRelativePath: ${t}\n - dotEnvFolderRelativePath: ${n}\n - templateFolderRelativePath: ${r}\n `);{const e=J({});e.subscribe(t=>{if("execute"===t.value){const n=t.context.jobs,r=Object.values(n.byId).filter(e=>!e.executed);r.length>0&&e.send(A({jobItem:r[0]}))}}),e.send(_({matronFilePath:o}))}}}function z(e){return S.a.join(process.cwd(),e)}function Q(e){const t=U.a.config({path:e});if(t.error)throw t.error}let V;!function(e){e.ProjectPath="project",e.Template="template",e.MatronFile="matron-file",e.EnvFolder="env-folder"}(V||(V={}));function Z(e){const t=e[V.MatronFile],n=e[V.Template];if(t&&n)throw new W(V.MatronFile,V.Template);if(t||n)return!0;throw new K(V.MatronFile,V.Template)}function ee(e){const t=e[V.EnvFolder];if(t){const e=S.a.join(process.cwd(),t);if(Object(u.existsSync)(e)){if(Object(u.lstatSync)(e).isDirectory())return!0;throw new B(e,`--${V.EnvFolder}`)}throw new G(e,`--${V.EnvFolder}`)}return!0}function te(e){const t=e[V.MatronFile];if(t){const e=S.a.join(process.cwd(),t);if(Object(u.existsSync)(e)){if(Object(u.lstatSync)(e).isFile())return!0;throw new Y(e,`--${V.MatronFile}`)}throw new H(e,`--${V.MatronFile}`)}return!0}function ne(e){const t=e[V.ProjectPath];if(t&&process.env.PROJECT_PATH)throw new k(`PROJECT_PATH environment variable can't be used jointly with --${V.ProjectPath}.`);if(t){const e=S.a.join(process.cwd(),t);if(Object(u.existsSync)(e)){if(Object(u.lstatSync)(e).isDirectory())return!0;throw new B(e,`--${V.ProjectPath}`)}}return!0}const re={command:"create",describe:"Scaffold a new project",builder:e=>e.usage(`\nUsage\n ${i.a.green("matron")} create --matron-file=./matron.yml\n ${i.a.green("matron")} create --matron-file=./matron.yml --env-folder ./dotenv/folder\n `).options({[V.ProjectPath]:{alias:"p",describe:"Name or Path of the project to create.",type:"string"},[V.Template]:{alias:"t",describe:"Folder containing at least a matron.yml file.",type:"string"},[V.MatronFile]:{alias:"f",describe:"Matron file path.",type:"string"},[V.EnvFolder]:{describe:".env files folder.",type:"string"}}).check(Z).check(ee).check(te).check(ne).version(!1),handler:e=>{const t=e[V.MatronFile],n=e[V.EnvFolder],r=e[V.Template],o=e[V.ProjectPath];o&&(process.env.PROJECT_PATH=o),L({dotEnvFolderRelativePath:n,templateFolderRelativePath:r,matronFileRelativePath:t})}},oe=`\nUsage\n ${i.a.green("matron")} create --matron-file=./matron.yml\n ${i.a.green("matron")} create --matron-file=./matron.yml --env-folder ./dotenv/folder\n `;o.a.usage(oe).help().wrap(o.a.terminalWidth()).showHelpOnFail(!0).command(re).demandCommand().recommendCommands().strict().argv}])); //# sourceMappingURL=matron.map