@catladder/cli
Version:
Panter cli tool for cloud CI/CD and DevOps
6 lines (4 loc) • 7.07 MB
JavaScript
(()=>{var __webpack_modules__={48618:(e,t)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.BaseContext=void 0;class BaseContext{constructor(e){this.command=e;this.cache=new Map}get(e){if(!this.cache.has(e)){const t=this.command.inputs[e];if(!t){return Promise.reject(new Error(`Input "${e}" is not declared in command "${this.command.name}"`))}if(t.required===false){this.cache.set(e,this.resolveInput(e,t).catch((e=>{if((e===null||e===void 0?void 0:e.name)==="MissingInputError")return undefined;throw e})))}else{this.cache.set(e,this.resolveInput(e,t))}}return this.cache.get(e)}async promptDirect(e){return this.resolveInput(e.name,e)}}t.BaseContext=BaseContext},87396:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){if(n===undefined)n=i;var a=Object.getOwnPropertyDescriptor(t,i);if(!a||("get"in a?!t.__esModule:a.writable||a.configurable)){a={enumerable:true,get:function(){return t[i]}}}Object.defineProperty(e,n,a)}:function(e,t,i,n){if(n===undefined)n=i;e[n]=t[i]});var a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i in e)if(i!=="default"&&Object.prototype.hasOwnProperty.call(e,i))n(t,e,i);a(t,e);return t};Object.defineProperty(t,"__esModule",{value:true});t.createTerminalIO=t.createTerminalContext=void 0;const c=i(92284);const y=i(48618);async function resolveChoices(e,t){const i=await e(t);return i.map((e=>typeof e==="string"?{name:e,value:e}:e))}async function promptInteractive(e,t){const n=await Promise.resolve().then((()=>l(i(39662))));switch(e.type){case"string":{if(e.choices){const i=await resolveChoices(e.choices,t);return n.select({message:e.message,choices:i})}return n.input({message:e.message,default:e.default})}case"string[]":{if(e.choices){const i=await resolveChoices(e.choices,t);return n.checkbox({message:e.message,choices:i})}const i=await n.input({message:e.message});return i?i.split(",").map((e=>e.trim())):[]}case"number":return n.number({message:e.message,default:e.default});case"boolean":return n.confirm({message:e.message,default:e.default});default:throw new Error(`Unsupported input type: ${e.type}`)}}class TerminalContext extends y.BaseContext{constructor(e,t){super(e);this.options=t}log(e){console.log(e)}async confirm(e){var t;if(this.options.yes)return true;const n=(t=this.options.interactive)!==null&&t!==void 0?t:process.stdin.isTTY===true;if(!n)return true;const a=await Promise.resolve().then((()=>l(i(39662))));return a.confirm({message:e})}async resolveInput(e,t){const{cliOptions:i={},jsonInputs:n={},interactive:a}=this.options;const l=a!==null&&a!==void 0?a:process.stdin.isTTY===true;const validateAgainstChoices=async i=>{if(!("choices"in t)||!t.choices)return;const n=await resolveChoices(t.choices,this);const a=n.map((e=>e.value));if(Array.isArray(i)){const t=i.filter((e=>!a.includes(e)));if(t.length>0){throw new Error(`Invalid value(s) for "${e}": ${t.join(", ")}. Valid choices: ${a.join(", ")}`)}}else if(!a.includes(i)){throw new Error(`Invalid value for "${e}": "${i}". Valid choices: ${a.join(", ")}`)}};if(e in i&&i[e]!==undefined){await validateAgainstChoices(i[e]);return i[e]}if(e in n&&n[e]!==undefined){await validateAgainstChoices(n[e]);return n[e]}if("default"in t&&t.default!==undefined){return t.default}if(t.required===false){throw new c.MissingInputError(e,t.message)}if(l){return promptInteractive({...t,name:e},this)}throw new c.MissingInputError(e,t.message)}}function createTerminalContext(e,t={}){return new TerminalContext(e,t)}t.createTerminalContext=createTerminalContext;function createTerminalIO(e={}){return{log(e){console.log(e)},async confirm(t){var n;if(e.yes)return true;const a=(n=e.interactive)!==null&&n!==void 0?n:process.stdin.isTTY===true;if(!a)return true;const c=await Promise.resolve().then((()=>l(i(39662))));return c.confirm({message:t})},async promptDirect(t){var i;const n=(i=e.interactive)!==null&&i!==void 0?i:process.stdin.isTTY===true;if(n){return promptInteractive(t,null)}if("default"in t&&t.default!==undefined){return t.default}throw new c.MissingInputError(t.name,t.message)}}}t.createTerminalIO=createTerminalIO},38365:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.getProjectMongodbAllPodsSortedWithLabel=t.getMongoDbPodsWithReplInfo=t.podIsMaster=t.executeMongodbCommand=t.getMongodbShell=t.getProjectMongodbAllPods=void 0;const n=i(51748);const a=i(45198);const l=i(57414);const filterMongoDbs=e=>e.filter((e=>e.includes("mongodb")&&!e.includes("mongodb-backup")&&!e.includes("arbiter")));const getProjectMongodbAllPods=async e=>filterMongoDbs(await(0,a.getProjectPodNames)(e));t.getProjectMongodbAllPods=getProjectMongodbAllPods;const getMongodbShell=async(e,t)=>{const i=`kubectl exec -it ${t} --namespace ${e} mongo`;try{await(0,n.spawn)(i,{shell:true,stdio:"inherit",env:{...process.env,DEBUG:""}})}catch(e){}};t.getMongodbShell=getMongodbShell;const executeMongodbCommand=async(e,t,i)=>{const a=`kubectl exec -it ${t} --namespace ${e} -- mongo --quiet --eval "JSON.stringify(${i})"`;const{stdout:l}=await(0,n.exec)(a,{env:{...process.env,DEBUG:""}});return JSON.parse(l)};t.executeMongodbCommand=executeMongodbCommand;const podIsMaster=async(e,i)=>{try{const n=await(0,t.executeMongodbCommand)(e,i,"db.isMaster()");return n.ismaster}catch(e){return null}};t.podIsMaster=podIsMaster;const spaces=e=>" ".repeat(e);const getMongoDbPodsWithReplInfo=async e=>{const i=await(0,l.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)(i,e)}))))).sort(((e,t)=>e.isMaster?t.isMaster?0:-1:1))};t.getMongoDbPodsWithReplInfo=getMongoDbPodsWithReplInfo;const getProjectMongodbAllPodsSortedWithLabel=async e=>{const i=await(0,t.getMongoDbPodsWithReplInfo)(e);const n=Math.max(...i.map((e=>e.componentName.length)));return i.map((({podName:e,isMaster:t,componentName:i})=>({value:e,name:`[ ${i}${spaces(n-i.length)} ${t?" PRIMARY ":" secondary "}] ${e}`})))};t.getProjectMongodbAllPodsSortedWithLabel=getProjectMongodbAllPodsSortedWithLabel},58002:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.projectConfigSecrets=void 0;const n=i(60241);const a=i(63779);const l=i(64284);const c=i(50001);const y=i(82805);const w=i(4508);const j=i(51762);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(i){return[e,t]}})))])))])));const getSecretEnvVarKeysToConfigure=async(e,t)=>{const{secretEnvVarKeys:i,jobOnlyVars:n}=await(0,c.getEnvironment)(e,t);return[...n.build.secretEnvVarKeys,...n.deploy.secretEnvVarKeys,...i].filter((e=>!e.hidden)).map((e=>e.key))};const getEnvVarsToEdit=async(e,t,i)=>{const a=await getSecretEnvVarKeysToConfigure(t,i);const l=await(0,c.getEnvVarsResolved)(e,t,i);const y=await(0,c.getJobOnlyEnvVarsResolved)(e,t,i);const w={...l,...y};return Object.fromEntries(a.map((e=>{const a=w[e];const l=a==="$"+(0,n.getSecretVarName)(t,i,e);return[e,l?"🚨 FILL ME":a]})))};const doItFor=async(e,t)=>{let i=Object.fromEntries(await Promise.all(Object.entries(t).map((async([t,i])=>[t,Object.fromEntries(await Promise.all(i.map((async i=>[i,await getEnvVarsToEdit(e,i,t)]))))]))));let n=true;while(n){i=await(0,y.editAsFile)(resolveJson(i),(0,a.stripIndents)`
Please fill in all secrets for:
${Object.entries(t).map((([e,t])=>`- ${e}: ${t.join(", ")}`)).join("\n")}
`);n=false;for(const[a,c]of Object.entries(t)){for(const t of c){const c=i[a][t]?Object.keys(i[a][t]):[];const y=await getSecretEnvVarKeysToConfigure(t,a);const w=(0,l.difference)(c,y);const O=(0,l.difference)(y,c);if(w.length>0||O.length>0){e.log("");e.log(`😿 Oh no! There is something wrong with "${a}"`);e.log("");if(w.length>0){e.log("these secrets are not declared in the config");w.forEach((t=>e.log(t)));e.log("")}if(O.length>0){e.log("these secrets have not been provided:");O.forEach((t=>e.log(t)));e.log("")}await(0,j.delay)(1e3);const t=await e.confirm("Try again? 🤔");if(!t){throw new Error("abort")}n=true}}}}e.log("");e.log("upserting all variables, please wait...");e.log("");for(const[n,a]of Object.entries(t)){for(const t of a){e.log("upserting "+t+":"+n+"...\n");await(0,w.upsertAllVariables)(e,i[n][t],t,n);e.log("");e.log("✅ "+t+":"+n);e.log("--------------------------------\n")}}e.log("done! 😻");e.log("")};const projectConfigSecrets=async(e,t)=>{if(!t){const t=await(0,c.getAllComponentsWithAllEnvsHierarchical)();await doItFor(e,t)}else{const{env:i,componentName:n}=(0,c.parseChoice)(t);if(!n){const t=await(0,c.getProjectComponents)();await doItFor(e,Object.fromEntries(t.map((e=>[e,[i]]))))}if(n){await doItFor(e,{[n]:[i]})}}};t.projectConfigSecrets=projectConfigSecrets},80426:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupProject=void 0;const n=i(50001);const a=i(64775);const l=i(63516);const c=i(66992);const y=i(73861);const w=i(87105);const setupProject=async(e,t)=>{const i=await(0,n.getAllPipelineContexts)(t);e.log("will setup those contexts:");i.forEach((t=>{e.log(` - ${t.name}:${t.env}`)}));await(0,w.logSection)(e,"base setup",(async()=>{await(0,a.setupAccessTokens)(e);await(0,c.setupTopic)(e);await(0,y.setupAgents)(e)}));for(const t of i){await(0,l.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,i)=>{e.log("");e.log("==================================================================================");e.log("🐱 🔧 "+t+"...");e.log("");await i();e.log("");e.log("✅ "+t+" done!");e.log("");e.log("==================================================================================");e.log("")};t.logSection=logSection},64775:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupAccessTokens=void 0;const n=i(84022);const a=i(4508);const l="semantic-release";const setupAccessTokens=async e=>{const{id:t}=await(0,a.getProjectInfo)(e);const i=await(0,a.doGitlabRequest)(e,`projects/${t}/access_tokens`);const c=i.find((e=>e.name===l&&e.active===true));const y=(0,n.format)((0,n.add)(new Date,{years:1,days:-1}),"yyyy-MM-dd");const w=c?await(0,a.doGitlabRequest)(e,`projects/${t}/access_tokens/${c.id}/rotate`,{expires_at:y},"POST"):await(0,a.doGitlabRequest)(e,`projects/${t}/access_tokens`,{name:l,scopes:["api","read_repository"],access_level:40,expires_at:y},"POST");try{await(0,a.doGitlabRequest)(e,`projects/${t}/variables/GL_TOKEN`);await(0,a.doGitlabRequest)(e,`projects/${t}/variables/GL_TOKEN`,{value:w.token},"PUT")}catch(i){if(i.message!=="not found"){throw i}await(0,a.doGitlabRequest)(e,`projects/${t}/variables`,{key:"GL_TOKEN",value:w.token,masked:true},"POST")}e.log("Token configured for semantic release. Renew me again in a year!")};t.setupAccessTokens=setupAccessTokens},73861:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupAgents=void 0;const n=i(4508);const a=i(50001);const l=i(21111);const c=i(26694);const listTriggerTokens=async(e,t)=>await(0,n.doGitlabRequest)(e,`projects/${t}/triggers`);const deleteTriggerToken=async(e,t,i)=>{await(0,n.doGitlabRequest)(e,`projects/${t}/triggers/${i}`,undefined,"DELETE")};const createTriggerToken=async(e,t,i)=>await(0,n.doGitlabRequest)(e,`projects/${t}/triggers`,{description:i},"POST");const listWebhooks=async(e,t)=>await(0,n.doGitlabRequest)(e,`projects/${t}/hooks`);const createWebhook=async(e,t,i)=>await(0,n.doGitlabRequest)(e,`projects/${t}/hooks`,i,"POST");const updateWebhook=async(e,t,i,a)=>await(0,n.doGitlabRequest)(e,`projects/${t}/hooks/${i}`,a,"PUT");const setupAgentWebhook=async(e,t,i,n)=>{const a=`cl_agent_${i}_webhook`;const{gitRemoteHost:y}=await(0,l.getGitRemoteHostAndPath)();const w=await(0,c.getMainBranch)();const j=`https://${y}/api/v4/projects/${t}/ref/${w}/trigger/pipeline?token=${n}`;e.log(`Setting up webhook for agent: ${i}`);const O=await listWebhooks(e,t);const C=O.find((e=>e.name===a));const N=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 I={url:j,name:a,description:`Agent webhook for ${i} - 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:N};let B;if(C){e.log(`Updating existing webhook: ${a} (ID: ${C.id})`);B=await updateWebhook(e,t,C.id,I);e.log(`✅ Updated webhook: ${B.name}`)}else{e.log(`Creating new webhook: ${a}`);B=await createWebhook(e,t,I);e.log(`✅ Created webhook: ${B.name}`)}e.log(` Webhook ID: ${B.id}`);e.log(` Webhook URL: ${B.url}`);return B};const setupAgentTriggerToken=async(e,t,i)=>{const n=`cl_agent_${i}`;e.log(`Setting up trigger token for agent: ${i}`);const a=await listTriggerTokens(e,t);const l=a.filter((e=>e.description.startsWith(`cl_agent_${i}`)));for(const i of l){e.log(`Deleting existing trigger token: ${i.description} (ID: ${i.id})`);await deleteTriggerToken(e,t,i.id)}const c=`${n} - Agent trigger token for ${i}`;const y=await createTriggerToken(e,t,c);e.log(`✅ Created new trigger token: ${y.description}`);e.log(` Token ID: ${y.id}`);e.log(` Token: ${y.token}`);return y};const setupAgent=async(e,t,i)=>{const{id:a}=await(0,n.getProjectInfo)(e);e.log(`🤖 Setting up agent: ${t}`);const l=await setupAgentTriggerToken(e,a,t);await setupAgentWebhook(e,a,t,l.token);e.log(`✅ Agent ${t} setup complete!`)};const setupAgents=async e=>{var t;const i=await(0,a.getProjectConfig)();e.log("");e.log("🤖 Setting up agents...");const n=(t=i.agents)!==null&&t!==void 0?t:{};const l=Object.entries(n);if(l.length===0){e.log("No agents configured in project config");return}for(const[t,i]of l){if(i.type==="claude"&&i){await setupAgent(e,t,i)}}e.log("✅ All agents setup complete!");e.log("");e.log("🔧 Manual setup required:");e.log("Please configure these environment variables in GitLab CI/CD unless they are already set (by group or global):");e.log(" Go to Settings > CI/CD > Variables and add:");e.log(" - CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY (your Anthropic API key, mark as Protected & Masked)");e.log(" - AGENT_GITLAB_PERSONAL_ACCESS_TOKEN (token from agent.claude user, mark as Protected & Masked)")};t.setupAgents=setupAgents},51629:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupCloudRun=void 0;const n=i(60241);const a=i(41624);const l=i(59308);const c=i(96761);const y=i(35611);const w=i(4508);const setupCloudRun=async(e,t)=>{var i,j;if(!(0,n.isOfDeployType)((i=t.deploy)===null||i===void 0?void 0:i.config,"google-cloudrun")){throw new Error("deploy config is not of type 'google-cloudrun'")}const O=(j=t.deploy)===null||j===void 0?void 0:j.config;e.log("enable required services...");await(0,c.enableGCloudServices)(["run.googleapis.com","artifactregistry.googleapis.com","cloudscheduler.googleapis.com","cloudresourcemanager.googleapis.com",...O.cloudSql?["sqladmin.googleapis.com","sql-component.googleapis.com"]:[]],O);e.log("upsert artifacts registry...");await(0,a.upsertGcloudArtifactsRegistry)(O);e.log("upsert deploy service account...");await(0,y.upsertGcloudServiceAccountAndSaveSecret)(e,t,{projectId:O.projectId,displayName:"Catladder gcloud deploy",description:"This service account deploys to google cloud",name:"cl-d",roles:["roles/artifactregistry.repoAdmin","roles/run.admin","roles/iam.serviceAccountUser","roles/cloudscheduler.admin",...O.cloudSql?["roles/cloudsql.admin"]:[]]},n.GCLOUD_DEPLOY_CREDENTIALS_KEY);e.log("get service domain suffix... that might take a while initially");const C=await(0,l.getCloudRunDomainSuffix)(O);e.log("domain suffix: "+C);await(0,w.upsertAllVariables)(e,{[n.GCLOUD_RUN_CANONICAL_HOST_SUFFIX]:C},t.env,t.name,false,false)};t.setupCloudRun=setupCloudRun},63516:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupContext=void 0;const n=i(60241);const a=i(51629);const l=i(28719);const c=i(87105);const setupContext=async(e,t)=>{await(0,c.logSection)(e,"setting up "+t.env+":"+t.name,(async()=>{var i,c;if((0,n.isOfDeployType)((i=t.deploy)===null||i===void 0?void 0:i.config,"google-cloudrun")){await(0,a.setupCloudRun)(e,t)}const y=(c=t.deploy)===null||c===void 0?void 0:c.config;if((0,n.isOfDeployType)(y,"kubernetes")){await(0,l.setupKubernetes)(e,t)}}))};t.setupContext=setupContext},28719:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.setupKubernetes=void 0;const a=i(60241);const l=i(51748);const c=i(5581);const y=i(4508);const w=n(i(14363));const setupKubernetes=async(e,t)=>{var i;const n=(i=t.deploy)===null||i===void 0?void 0:i.config;if(!(0,a.isOfDeployType)(n,"kubernetes")){throw new Error("cannot run setupKubernetes on non-kubernetes deployments")}const{id:j}=await(0,y.getProjectInfo)(e);const O=await(0,y.doGitlabRequest)(e,`projects/${j}/deploy_tokens`);if(!O.find((e=>e.name==="gitlab-deploy-token"))){e.log("I will setup the 'GitLab Deploy Token', so Kubernetes can pull images from this project.");await(0,y.doGitlabRequest)(e,`projects/${j}/deploy_tokens`,{id:j,name:"gitlab-deploy-token",scopes:["read_registry"]},"POST")}const C=(0,a.getFullKubernetesClusterName)(n.cluster);e.log(`cluster: ${C}`);await(0,c.connectToCluster)(C);e.log("");e.log("ensuring namespace ...");const N=await(0,w.default)(t);e.log("Namespace "+N+" created / updated!");e.log("");e.log("ensuring service accounts...");const I=`cl-${t.name}-deploy`;const B=await(0,l.exec)(`TERM=dumb kubectl cluster-info | grep -E 'Kubernetes master|Kubernetes control plane' | awk '/http/ {print $NF}'`).then((e=>e.stdout.trim()));try{await(0,l.exec)(`kubectl delete serviceaccount --namespace ${N} ${I}`);await(0,l.exec)(`kubectl delete rolebinding --namespace ${N} ${I}`);await(0,l.exec)(`kubectl delete role --namespace ${N} ${I}`)}catch(e){}await(0,l.exec)(`kubectl create serviceaccount --namespace ${N} ${I}`);await(0,l.exec)(`cat <<EOF | kubectl apply -f -\nkind: Role\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n namespace: ${N}\n name: ${I}\nrules:\n- apiGroups: ["", "extensions", "apps", "networking.k8s.io", "batch", "autoscaling", "rbac.authorization.k8s.io","snapshot.storage.k8s.io"]\n resources: ["deployments", "replicasets", "statefulsets", "pods", "secrets", "configmaps", "services", "ingresses", "serviceaccounts", "roles", "rolebindings", "jobs", "cronjobs", "horizontalpodautoscalers", "persistentvolumeclaims", "volumesnapshots"]\n verbs: ["*"]\n---\nkind: RoleBinding\napiVersion: rbac.authorization.k8s.io/v1\nmetadata:\n name: ${I}\n namespace: ${N}\nsubjects:\n - kind: ServiceAccount\n name: ${I}\n namespace: ${N}\nroleRef:\n kind: Role\n name: ${I}\n apiGroup: rbac.authorization.k8s.io\nEOF\n`);const q=`${I}-secret`;await(0,l.exec)(`\nkubectl apply -f - <<EOF\napiVersion: v1\nkind: Secret\nmetadata:\n name: ${q}\n namespace: ${N}\n annotations:\n kubernetes.io/service-account.name: ${I}\ntype: kubernetes.io/service-account-token\nEOF\n `);const $=await(0,l.exec)(`kubectl get secret ${q} --namespace ${N} -o jsonpath="{['data']['ca\\.crt']}"`).then((e=>e.stdout.trim()));const H=await(0,l.exec)(`kubectl get secret ${q} --namespace ${N} -o jsonpath="{['data']['token']}" | base64 --decode`).then((e=>e.stdout.trim()));const K={KUBE_TOKEN:H,KUBE_CA_PEM:$,KUBE_URL:B};const W=Object.entries(K).filter((e=>!e[1]));if(W.length>0){throw new Error("could not setup credentials. Missing vars: "+W.map((e=>e[0])).join(", ")+". Check whether your local kubectl is still working for '"+C+"'")}e.log("service accounts created / updated!");e.log("");e.log("pusing secrets to gitlab...");await(0,y.upsertAllVariables)(e,K,t.env,t.name,false);e.log("done!")};t.setupKubernetes=setupKubernetes},66992:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.setupTopic=void 0;const n=i(4508);const a="catladder";const setupTopic=async e=>{const{id:t}=await(0,n.getProjectInfo)(e);const{topics:i}=await(0,n.doGitlabRequest)(e,`projects/${t}`);await(0,n.doGitlabRequest)(e,`projects/${t}`,{topics:[a,...i]},"PUT")};t.setupTopic=setupTopic},52468:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.allEnvsAndAllComponents=t.envAndComponents=t.allComponents=t.allEnvs=void 0;const n=i(60241);const a=i(50001);const allEnvs=async()=>{const e=await(0,a.getProjectConfig)();if(!e){return[]}return(0,n.getAllEnvsInAllComponents)(e)};t.allEnvs=allEnvs;const allComponents=async()=>{const e=await(0,a.getProjectConfig)();if(!e){return[]}return Object.keys(e.components)};t.allComponents=allComponents;const envAndComponents=async()=>{const e=await(0,a.getAllComponentsWithAllEnvsFlat)();return e.reduce(((e,{env:t,componentName:i})=>[...e,t+":"+i]),[])};t.envAndComponents=envAndComponents;const allEnvsAndAllComponents=async()=>[...await(0,t.allEnvs)(),...await(0,t.envAndComponents)()];t.allEnvsAndAllComponents=allEnvsAndAllComponents},2490:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.ensureCluster=void 0;const n=i(60241);const a=i(50001);const l=i(5581);async function ensureCluster(e,t){var i,c;const{env:y,componentName:w}=(0,a.parseChoice)(t);const j=await(0,a.getPipelineContextByChoice)(y,w);if(!(0,n.isOfDeployType)((i=j.deploy)===null||i===void 0?void 0:i.config,"kubernetes")){throw new Error("can't ensure cluster for non-kubernetes deployments")}const O=(0,n.getFullKubernetesClusterName)((c=j.deploy)===null||c===void 0?void 0:c.config.cluster);const C=await(0,l.getCurrentConnectedClusterName)();if(O!==C){e.log(`you are currently connected to cluster '${C}'`);e.log(`but the project requires cluster '${O}'`);const t=await e.confirm(`Do you want to connect to '${O}'?`);if(!t){e.log("abort")}else{await(0,l.connectToCluster)(O);e.log(`connected to cluster '${O}'`)}}}t.ensureCluster=ensureCluster},14363:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});const n=i(60241);const a=i(9584);const l=i(90390);async function default_1(e){var t,i,c,y,w;const j=(0,n.getKubernetesNamespace)(e.fullConfig,e.env);const O=new a.V1Namespace;const C={name:j,labels:{customerName:e.fullConfig.customerName,appName:e.fullConfig.appName,environment:e.env,components:Object.keys(e.fullConfig.components).join("_"),...(i=(t=e.fullConfig.meta)===null||t===void 0?void 0:t.labels)!==null&&i!==void 0?i:{}}};O.metadata=C;const N=(0,l.getk8sApi)();try{await N.readNamespace(j);await N.patchNamespace(j,O,undefined,undefined,undefined,undefined,{headers:{"content-type":"application/merge-patch+json"}})}catch(e){if(((y=(c=e.response)===null||c===void 0?void 0:c.body)===null||y===void 0?void 0:y.reason)==="NotFound"){await N.createNamespace(O)}else{console.error((w=e.response)===null||w===void 0?void 0:w.body);throw e}}return j}t["default"]=default_1},56410:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.getGoogleAuthUserNumber=void 0;const n=i(66261);const a="googleAuthUserNumber";const getGoogleAuthUserNumber=async e=>{if(!await(0,n.hasPreference)(a)){e.log("Please type in your google auth user number (0 if you have only one google account or maybe 1 if you have multiple)");const t=await e.promptDirect({type:"number",name:"authUserNumber",default:0,message:"Auth user "});await(0,n.setPreference)(a,t)}return(0,n.getPreference)(a)};t.getGoogleAuthUserNumber=getGoogleAuthUserNumber},48419:function(e,t,i){"use strict";var n=this&&this.__createBinding||(Object.create?function(e,t,i,n){if(n===undefined)n=i;var a=Object.getOwnPropertyDescriptor(t,i);if(!a||("get"in a?!t.__esModule:a.writable||a.configurable)){a={enumerable:true,get:function(){return t[i]}}}Object.defineProperty(e,n,a)}:function(e,t,i,n){if(n===undefined)n=i;e[n]=t[i]});var a=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:true,value:t})}:function(e,t){e["default"]=t});var l=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(e!=null)for(var i in e)if(i!=="default"&&Object.prototype.hasOwnProperty.call(e,i))n(t,e,i);a(t,e);return t};var c=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});const y=i(70395);const w=i(87396);const j=i(99407);const O=i(50001);const C=c(i(53568));const N=i(77090);const I=l(i(82432));const B=new y.Command;B.name("catladder").description("Panter CLI tool for cloud CI/CD and DevOps").version(C.default.version).option("-y, --yes","skip all confirmation prompts");const q=[];const $=new Map;function getOrCreateParent(e){if(e.length===0)return B;const t=e.join(" ");if($.has(t))return $.get(t);const i=getOrCreateParent(e.slice(0,-1));const n=i.command(e[e.length-1]);$.set(t,n);return n}function registerCommand(e){q.push(e);const t=[];const i=[];for(const[n,a]of Object.entries(e.inputs)){if(a.positional){t.push([n,a])}else{i.push([n,a])}}const n=e.name.split(" ");const a=n.slice(0,-1);const l=n[n.length-1];let c=l;for(const[e]of t){c+=` [${e}]`}const y=getOrCreateParent(a);const j=y.command(c).description(e.description);for(const[e,t]of i){const i=e.replace(/([A-Z])/g,"-$1").toLowerCase();const n=t.message.replace(/\s*🤔\s*$/,"").trim();if(t.type==="boolean"){j.option(`--${i}`,n);j.option(`--no-${i}`,`negate: ${n}`)}else{j.option(`--${i} <value>`,n)}}j.option("--inputs <json>","JSON object with input values");j.action((async(...n)=>{const a=n[n.length-2];const l={};t.forEach((([e],t)=>{if(n[t]!==undefined){l[e]=n[t]}}));for(const[e,t]of i){const i=e.replace(/([A-Z])/g,"-$1").toLowerCase();const n=i.replace(/-([a-z])/g,((e,t)=>t.toUpperCase()));if(a[n]!==undefined){let i=a[n];if(t.type==="number"&&typeof i==="string"){i=Number(i)}l[e]=i}}let c={};if(a.inputs){try{c=JSON.parse(a.inputs)}catch(e){console.error("Error: --inputs must be valid JSON");process.exit(1)}}const y=(0,w.createTerminalContext)(e,{cliOptions:l,jsonInputs:c,yes:B.opts().yes});try{await e.execute(y)}catch(e){if(e.name==="MissingInputError"){console.error(`\n${e.message}\n`);process.exit(1)}throw e}}))}async function registerAllCommands(){let e=[];try{e=await(0,O.getAllPipelineContexts)()}catch(e){}for(const t of Object.values(I)){if(t&&typeof t==="object"&&"name"in t&&"execute"in t){const i=t;if(i.isAvailable){if(!i.isAvailable(e))continue}registerCommand(i)}}}B.command("__complete",{hidden:true}).argument("[words]","words typed so far").argument("[cursor]","word at cursor").action((async(e,t)=>{const i=e?e.split(" ").filter(Boolean):[];const n=t!==null&&t!==void 0?t:"";try{const e=await(0,j.getCompletions)(q,i,n);for(const t of e){console.log(t)}}catch(e){}process.exit(0)}));const H=B.command("completion").description("shell completion setup");H.command("zsh").description("output zsh completion script").action((()=>{console.log((0,j.generateZshCompletionScript)())}));H.command("install").description("install shell completions into your .zshrc").action((async()=>{await(0,j.installCompletions)()}));H.command("uninstall").description("remove shell completions from your .zshrc").action((async()=>{await(0,j.uninstallCompletions)()}));process.on("exit",(()=>{(0,N.stopAllPortForwards)()}));process.on("uncaughtException",(e=>{var t;console.error((t=e.stack)!==null&&t!==void 0?t:`${e.name}: ${e.message}`);process.exit(1)}));process.on("unhandledRejection",(e=>{var t;if(e instanceof Error){console.error((t=e.stack)!==null&&t!==void 0?t:`${e.name}: ${e.message}`)}else{console.error(e)}process.exit(1)}));registerAllCommands().then((()=>B.parse()))},1377:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.hasCloudSql=t.hasDeployType=void 0;const n=i(60241);function hasDeployType(...e){return t=>t.some((t=>{var i;return(0,n.isOfDeployType)((i=t.deploy)===null||i===void 0?void 0:i.config,...e)}))}t.hasDeployType=hasDeployType;function hasCloudSql(){return e=>e.some((e=>{var t,i,a;const l=(t=e.deploy)===null||t===void 0?void 0:t.config;if((0,n.isOfDeployType)(l,"google-cloudrun"))return!!l.cloudSql;if((0,n.isOfDeployType)(l,"kubernetes"))return!!((a=(i=l.values)===null||i===void 0?void 0:i.cloudsql)===null||a===void 0?void 0:a.enabled);return false}))}t.hasCloudSql=hasCloudSql},11067:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandRestoreDb=void 0;const n=i(39489);const a=i(57151);const l=i(95540);t.commandRestoreDb=(0,n.defineCommand)({name:"cloudsql restore-db",description:"restore a db from one source to another target",group:"cloudSQL",inputs:{source:{type:"string",message:"Source instance (connection string or 'local')? 🤔 "},sourceLocalPort:{type:"number",message:"Local Port for source? 🤔 ",default:5432},sourceUsername:{type:"string",message:"Source Username? 🤔 ",default:"postgres"},sourcePassword:{type:"string",message:"Source Password? 🤔 "},sourceDbName:{type:"string",message:"Source DB name? 🤔 "},target:{type:"string",message:"Target INSTANCE (connection string or 'local')? 🤔 "},targetLocalPort:{type:"number",message:"Local Port for target? 🤔 ",default:5432},targetUsername:{type:"string",message:"Target Username? 🤔 ",default:"postgres"},targetPassword:{type:"string",message:"Target Password? 🤔 "},targetDbName:{type:"string",message:"Target DB name? 🤔 "}},execute:async e=>{const t=await e.get("source");let i;let n;let c;let y;if(t==="local"){c=await e.get("sourceLocalPort")}else{c=54399;i=await(0,l.startCloudSqlProxyInBackground)({instanceName:t,localPort:c})}const w=await e.get("sourceUsername");const j=await e.get("sourcePassword");const O=await e.get("sourceDbName");const C=await e.get("target");if(C==="local"){y=await e.get("targetLocalPort")}else{y=54499;n=await(0,l.startCloudSqlProxyInBackground)({instanceName:C,localPort:y})}const N=await e.get("targetUsername");const I=await e.get("targetPassword");const B=await e.get("targetDbName");const q=await e.confirm(`This will drop ${C}/${B} and replace it with ${t}/${O}. Continue? 🤔 `);if(!q){return}try{await(0,a.spawnCopyDb)({targetPassword:I,targetPort:y,targetUsername:N,sourceUsername:w,sourcePassword:j,sourcePort:c,sourceDbName:O,targetDbName:B})}finally{i===null||i===void 0?void 0:i.stop();n===null||n===void 0?void 0:n.stop()}}})},82677:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.commandDadjoke=void 0;const a=n(i(51479));const l=i(39489);t.commandDadjoke=(0,l.defineCommand)({name:"fun dadjoke",description:"something for jonas.",group:"fun",inputs:{},execute:async e=>{const t=await(0,a.default)("https://icanhazdadjoke.com/",{headers:{Accept:"text/plain"}});const i=await t.text();e.log("");e.log(i);e.log("")}})},64912:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandStarwars=void 0;const n=i(51748);const a=i(39489);t.commandStarwars=(0,a.defineCommand)({name:"fun starwars",description:"Long time ago... in a galaxy far far away...",group:"fun",inputs:{},execute:async()=>{await(0,n.spawn)("nc",["towel.blinkenlights.nl","23"],{stdio:["pipe","inherit","pipe"]})}})},70243:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandKubeCurrentContext=void 0;const n=i(39489);const a=i(5581);t.commandKubeCurrentContext=(0,n.defineCommand)({name:"k8s current-context",description:"show current kubernetes context",group:"general",inputs:{},execute:async e=>{e.log(await(0,a.getCurrentContext)())}})},24001:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandKubeGetShell=void 0;const n=i(39489);const a=i(90390);const l=i(45381);t.commandKubeGetShell=(0,n.defineCommand)({name:"k8s get-shell",description:"get a shell to a pod in the environment",group:"general",inputs:{namespace:{type:"string",message:"kubernetes namespace",positional:true},podName:{type:"string",message:"Which pod? 🤔",choices:async e=>{const t=await e.get("namespace");const i=(0,a.getk8sApi)();const n=await i.listNamespacedPod(t);return n.body.items.map((e=>e.metadata.name))}}},execute:async e=>{const t=await e.get("namespace");const i=await e.get("podName");await(0,l.getShell)(t,i)}})},33227:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandKubeListNamespaces=void 0;const n=i(39489);const a=i(90390);t.commandKubeListNamespaces=(0,n.defineCommand)({name:"k8s list-namespaces",description:"list all namespaces",group:"general",inputs:{},execute:async e=>{const t=(0,a.getk8sApi)();const i=await t.listNamespace();const n=i.body.items.map((e=>e.metadata.name));e.log(n.join("\n"))}})},27607:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandKubeListPods=void 0;const n=i(39489);const a=i(90390);t.commandKubeListPods=(0,n.defineCommand)({name:"k8s list-pods",description:"list all pods of namespace",group:"general",inputs:{namespace:{type:"string",message:"kubernetes namespace",positional:true}},execute:async e=>{const t=await e.get("namespace");const i=(0,a.getk8sApi)();const n=await i.listNamespacedPod(t);e.log(n.body.items.map((e=>e.metadata.name)).join("\n"))}})},37150:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandKubeListSecrets=void 0;const n=i(39489);const a=i(90390);t.commandKubeListSecrets=(0,n.defineCommand)({name:"k8s list-secrets",description:"show secrets",group:"general",inputs:{namespace:{type:"string",message:"kubernetes namespace",positional:true}},execute:async e=>{const t=await e.get("namespace");const i=(0,a.getk8sApi)();const n=await i.listNamespacedSecret(t);e.log(n.body.items.map((e=>e.metadata.name)).join("\n"))}})},13199:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandKubePortForward=void 0;const n=i(39489);const a=i(90390);const l=i(86070);t.commandKubePortForward=(0,n.defineCommand)({name:"k8s port-forward",description:"start port-forwarding",group:"general",inputs:{namespace:{type:"string",message:"kubernetes namespace",positional:true},podName:{type:"string",message:"Which pod? 🤔",choices:async e=>{const t=await e.get("namespace");const i=(0,a.getk8sApi)();const n=await i.listNamespacedPod(t);return n.body.items.map((e=>e.metadata.name))}},localPort:{type:"number",message:"Local port: "},remotePort:{type:"number",message:"Remote port: "}},execute:async e=>{const t=await e.get("namespace");const i=await e.get("podName");const n=await e.get("localPort");const a=await e.get("remotePort");return(0,l.startKubePortForward)(i,n,a,t)}})},87367:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandKubeStopPortforward=void 0;const n=i(39489);const a=i(77090);t.commandKubeStopPortforward=(0,n.defineCommand)({name:"k8s stop-portforward",description:"stop a running port forward",group:"general",inputs:{name:{type:"string",message:"port forward name",positional:true}},execute:async e=>{const t=await e.get("name");(0,a.stopPortForward)(t.trim())}})},82432:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandStarwars=t.commandDadjoke=t.commandSecurityAuditCreate=t.commandSecurityAuditEvaluate=t.commandSecurityAuditCiJob=t.commandRestoreDb=t.commandMongoDestroyMember=t.commandMongoPortForward=t.commandMongoGetShell=t.commandTriggerCronjobProject=t.commandDeleteProject=t.commandPauseProject=t.commandDeletePods=t.commandGetShell=t.commandListPods=t.commandNamespace=t.commandSecurityEvaluate=t.commandProjectRestoreDb=t.commandCiJobLog=t.commandCiJobOpen=t.commandSetup=t.commandGetMyTotalWorktime=t.commandRenewToken=t.commandTriggerCronjobGeneral=t.commandOpenLogs=t.commandSecretsClearBackups=t.commandConfigSecrets=t.commandCloudSqlProxy=t.commandOpenGit=t.commandOpenEnv=t.commandPortForward=t.commandEnvVars=t.commandKubePortForward=t.commandKubeGetShell=t.commandKubeStopPortforward=t.commandKubeListPods=t.commandKubeListSecrets=t.commandKubeListNamespaces=t.commandKubeCurrentContext=void 0;var n=i(70243);Object.defineProperty(t,"commandKubeCurrentContext",{enumerable:true,get:function(){return n.commandKubeCurrentContext}});var a=i(33227);Object.defineProperty(t,"commandKubeListNamespaces",{enumerable:true,get:function(){return a.commandKubeListNamespaces}});var l=i(37150);Object.defineProperty(t,"commandKubeListSecrets",{enumerable:true,get:function(){return l.commandKubeListSecrets}});var c=i(27607);Object.defineProperty(t,"commandKubeListPods",{enumerable:true,get:function(){return c.commandKubeListPods}});var y=i(87367);Object.defineProperty(t,"commandKubeStopPortforward",{enumerable:true,get:function(){return y.commandKubeStopPortforward}});var w=i(24001);Object.defineProperty(t,"commandKubeGetShell",{enumerable:true,get:function(){return w.commandKubeGetShell}});var j=i(13199);Object.defineProperty(t,"commandKubePortForward",{enumerable:true,get:function(){return j.commandKubePortForward}});var O=i(47838);Object.defineProperty(t,"commandEnvVars",{enumerable:true,get:function(){return O.commandEnvVars}});var C=i(89143);Object.defineProperty(t,"commandPortForward",{enumerable:true,get:function(){return C.commandPortForward}});var N=i(86780);Object.defineProperty(t,"commandOpenEnv",{enumerable:true,get:function(){return N.commandOpenEnv}});var I=i(4855);Object.defineProperty(t,"commandOpenGit",{enumerable:true,get:function(){return I.commandOpenGit}});var B=i(10878);Object.defineProperty(t,"commandCloudSqlProxy",{enumerable:true,get:function(){return B.commandCloudSqlProxy}});var q=i(40876);Object.defineProperty(t,"commandConfigSecrets",{enumerable:true,get:function(){return q.commandConfigSecrets}});var $=i(49558);Object.defineProperty(t,"commandSecretsClearBackups",{enumerable:true,get:function(){return $.commandSecretsClearBackups}});var H=i(98720);Object.defineProperty(t,"commandOpenLogs",{enumerable:true,get:function(){return H.commandOpenLogs}});var K=i(35815);Object.defineProperty(t,"commandTriggerCronjobGeneral",{enumerable:true,get:function(){return K.commandTriggerCronjobGeneral}});var W=i(87253);Object.defineProperty(t,"commandRenewToken",{enumerable:true,get:function(){return W.commandRenewToken}});var Q=i(80219);Object.defineProperty(t,"commandGetMyTotalWorktime",{enumerable:true,get:function(){return Q.commandGetMyTotalWorktime}});var Y=i(63806);Object.defineProperty(t,"commandSetup",{enumerable:true,get:function(){return Y.commandSetup}});var X=i(57076);Object.defineProperty(t,"commandCiJobOpen",{enumerable:true,get:function(){return X.commandCiJobOpen}});Object.defineProperty(t,"commandCiJobLog",{enumerable:true,get:function(){return X.commandCiJobLog}});var te=i(78148);Object.defineProperty(t,"commandProjectRestoreDb",{enumerable:true,get:function(){return te.commandProjectRestoreDb}});var re=i(92494);Object.defineProperty(t,"commandSecurityEvaluate",{enumerable:true,get:function(){return re.commandSecurityEvaluate}});var ie=i(72585);Object.defineProperty(t,"commandNamespace",{enumerable:true,get:function(){return ie.commandNamespace}});var ne=i(89432);Object.defineProperty(t,"commandListPods",{enumerable:true,get:function(){return ne.commandListPods}});var se=i(29469);Object.defineProperty(t,"commandGetShell",{enumerable:true,get:function(){return se.commandGetShell}});var ae=i(25487);Object.defineProperty(t,"commandDeletePods",{enumerable:true,get:function(){return ae.commandDeletePods}});var oe=i(75095);Object.defineProperty(t,"commandPauseProject",{enumerable:true,get:function(){return oe.commandPauseProject}});var le=i(62270);Object.defineProperty(t,"commandDeleteProject",{enumerable:true,get:function(){return le.commandDeleteProject}});var ce=i(35815);Object.defineProperty(t,"commandTriggerCronjobProject",{enumerable:true,get:function(){return ce.commandTriggerCronjobProject}});var ue=i(22796);Object.defineProperty(t,"commandMongoGetShell",{enumerable:true,get:function(){return ue.commandMongoGetShell}});var pe=i(41868);Object.defineProperty(t,"commandMongoPortForward",{enumerable:true,get:function(){return pe.commandMongoPortForward}});var de=i(64100);Object.defineProperty(t,"commandMongoDestroyMember",{enumerable:true,get:function(){return de.commandMongoDestroyMember}});var fe=i(11067);Object.defineProperty(t,"commandRestoreDb",{enumerable:true,get:function(){return fe.commandRestoreDb}});var he=i(45498);Object.defineProperty(t,"commandSecurityAuditCiJob",{enumerable:true,get:function(){return he.commandSecurityAuditCiJob}});var me=i(10986);Object.defineProperty(t,"commandSecurityAuditEvaluate",{enumerable:true,get:function(){return me.commandSecurityAuditEvaluate}});var ye=i(3049);Object.defineProperty(t,"commandSecurityAuditCreate",{enumerable:true,get:function(){return ye.commandSecurityAuditCreate}});var be=i(82677);Object.defineProperty(t,"commandDadjoke",{enumerable:true,get:function(){return be.commandDadjoke}});var ge=i(64912);Object.defineProperty(t,"commandStarwars",{enumerable:true,get:function(){return ge.commandStarwars}})},64100:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandMongoDestroyMember=void 0;const n=i(51748);const a=i(39489);const l=i(45198);const c=i(67253);const y=i(57414);const w=i(2490);const j=i(38365);const O=i(52468);const C=i(1377);const removeFinalizer=async(e,t,i)=>(0,n.exec)(`kubectl patch --namespace ${e} ${t} ${i} -p '{"metadata":{"finalizers":null}}'`);const deleteResource=async(e,t,i)=>(0,n.exec)(`kubectl delete --namespace ${e} ${t} ${i}`);const removeFinalizerAndDelete=async(e,t,i)=>Promise.all([removeFinalizer(e,t,i),await deleteResource(e,t,i)]);t.commandMongoDestroyMember=(0,a.defineCommand)({name:"project mongo destroy-member",description:"DESTROY a member of a replicaset in order to reinitialize it",group:"mongodb",isAvailable:(0,C.hasDeployType)("kubernetes"),inputs:{envComponent:{type:"string",message:"environment:component",positional:true,choices:async()=>(0,O.envAndComponents)()},podName:{type:"string",message:"Which pod? 🤔",choices:async e=>{const t=await e.get("envComponent");const i=await(0,j.getMongoDbPodsWithReplInfo)(t);const n=i.filter((e=>!e.isMaster));return n.map((e=>({name:`[ secondary ] ${e.podName}`,value:e.podName})))}}},execute:async e=>{const t=await e.get("envComponent");await(0,w.ensureCluster)(e,t);e.log("this command tries to delete a (secondary) member of the replicaset, it's persistent volume claim (pvc) and the volume");e.log("");e.log("this is useful, if you update the stateful set with new volume configuration (different size or storage class)");e.log("");e.log("Kubernetes will usually recreate the missing member with the updated config and mongodb will start synchronizing the new member.");e.log("");e.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)");e.log("");e.log("Deleting the volume and claim often stuck, just wait or cancel and restart.");e.log("");const i=await e.confirm("DO YOU UNDERSTAND?");if(!i){throw new Error("abort")}const n=await(0,y.getProjectNamespace)(t);const a=await(0,l.getProjectPvcs)(t);const j=await e.get("podName");const O=a.find((e=>e.metadata.name===`datadir-${j}`));if(!O){(0,c.logError)(e,`sorry, no pvc found for ${j}`);return}const C=await e.confirm("THIS WILL DESTROY THE POD, ITS VOLUME AND ALL ITS DATA 🙀🙀🙀!!! continue? 🤔");if(!C){throw new Error("abort")}e.log("destroying volume...");try{await removeFinalizerAndDelete(n,"pv",O.spec.volumeName)}catch(t){e.log(t.message)}e.log("destroying volume claim...");try{await removeFinalizerAndDelete(n,"pvc",O.metadata.name)}catch(t){e.log(t.message)}e.log("destroying pod...");await removeFinalizerAndDelete(n,"pod",j)}})},22796:(e,t,i)=>{"use strict";Object.defineProperty(t,"__esModule",{value:true});t.commandMongoGetShell=void 0;const n=i(39489);const a=i(57414);const l=i(2490);const c=i(38365);const y=i(52468);const w=i(1377);t.commandMongoGetShell=(0,n.defineCommand)({name:"project mongo get-shell",description:"get a shell to a mongodb in the environment",group:"mongodb",isAvailable:(0,w.hasDeployType)("kubernetes"),inputs:{envComponent:{type:"string",message:"environment:component",positional:true,choices:async()=>(0,y.envAndComponents)()},podName:{type:"string",message:"Which pod? 🤔",choices:async e=>(0,c.getProjectMongodbAllPodsSortedWithLabel)(await e.get("envComponent"))}},execute:async e=>{const t=await e.get("envComponent");await(0,l.ensureCluster)(e,t);const i=await(0,a.getProjectNamespace)(t);const n=await e.get("podName");return(0,c.getMongodbShell)(i,n)}})},41868:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.commandMongoPortForward=void 0;const a=i(39489);const l=i(50001);const c=i(86070);const y=i(57414);const w=i(2490);const j=i(38365);const O=n(i(77983));const C=i(52468);const N=i(1377);t.commandMongoPortForward=(0,a.defineCommand)({name:"project mongo port-forward",description:"port forward to a mongodb",group:"mongodb",isAvailable:(0,N.hasDeployType)("kubernetes"),inputs:{envComponent:{type:"string",message:"environment:component",positional:true,choices:async()=>(0,C.envAndComponents)()},podName:{type:"string",message:"Which pod? 🤔",choices:async e=>(0,j.getProjectMongodbAllPodsSortedWithLabel)(await e.get("envComponent"))},localPort:{type:"number",message:"Local port: ",default:3e4}},execute:async e=>{const t=await e.get("envComponent");await(0,w.ensureCluster)(e,t);const i=await(0,y.getProjectNamespace)(t);const n=await e.get("podName");const a=await e.get("localPort");const{env:j,componentName:C}=(0,l.parseChoice)(t);const N=await(0,l.getEnvVarsResolved)(e,j,C);const I=N===null||N===void 0?void 0:N.MONGODB_ROOT_PASSWORD;const B=`mongodb://root:${I}@localhost:${a}`;O.default.writeSync(B);e.log("");e.log("username: root");e.log(`password: ${I}`);e.log(`connection string: ${B}`);e.log("");e.log("👆 connection string has been copied to your clipboard!");e.log("");return(0,c.startKubePortForward)(n,a,27017,i)}})},10878:function(e,t,i){"use strict";var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:true});t.commandCloudSqlProxy=void 0;const a=i(60241);const l=n(i(77983));const c=i(39489);const y=i(50001);const w=i(95540);const j=i(67253);const O=i(52468);const C=i(1377);const getProxyInfoForKubernetes=async(e,t)=>{var i,n;if(!(0,a.isOfDeployType)((i=t.deploy)===null||i===void 0?void 0:i.config,"kubernetes")){throw new Error("unsupported")}const l=await(0,y.getEnvVarsResolved)(e,t.env,t.name);const c=(0,a.createKubernetesCloudsqlBaseValues)(t);const w=(n=(l===null||l===void 0?void 0:l.DB_PASSWORD)||(l===null||l===void 0?void 0:l.POSTGRESQL_PASSWORD))===null||n===void 0?void 0:n.toString();const j=c.cloudsql.fullDbName.toString();const O=c.cloudsql.instanceConnectionName;return{instanceName:O,DB_PASSWORD:w,DB_NAME:j,DB_USER:"postgres"}};const getProxyInfoForCloudRun=async(e,t)=>{var i,n,l,c,w,O;if(!(0,a.isOfDeployType)((i=t.deploy)===null||i===void 0?void 0:i.config,"google-cloudrun")||!((n=t.deploy)===null||n===void 0?void 0:n.config.cloudSql)){const i=(0,a.getDeployConfigType)((l=t.deploy)===null||l===void 0?void 0:l.config);const n=i==="google-cloudrun"?`DeployConfig is missing the cloudSql property`:`Unsupported DeployConfig type: ${i}`;(0,j.logError)(e,n);throw new Error(n)}const C=await(0,y.getEnvVarsResolved)(e,t.env,t.name);return{instanceName:(c=t.deploy)===null||c===void 0?void 0:c.config.cloudSql.instanceConnectionName,DB_PASSWORD:(w=C===null||C===void 0?void 0:C.DB_PASSWORD)===null||w===void 0?void 0:w.to