@autofleet/cli 2.5.9 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,4 @@
1
- var T=(t,e)=>(e=Symbol[t])?e:Symbol.for("Symbol."+t),h=t=>{throw TypeError(t)};var I=(t,e,n)=>{if(e!=null){typeof e!="object"&&typeof e!="function"&&h("Object expected");var s,i;n&&(s=e[T("asyncDispose")]),s===void 0&&(s=e[T("dispose")],n&&(i=s)),typeof s!="function"&&h("Object not disposable"),i&&(s=function(){try{i.call(this)}catch(a){return Promise.reject(a)}}),t.push([n,s,e])}else n&&t.push([n]);return e},k=(t,e,n)=>{var s=typeof SuppressedError=="function"?SuppressedError:function(r,l,p,o){return o=Error(p),o.name="SuppressedError",o.error=r,o.suppressed=l,o},i=r=>e=n?new s(r,e,"An error was suppressed during disposal"):(n=!0,r),a=r=>{for(;r=t.pop();)try{var l=r[1]&&r[1].call(r[2]);if(r[0])return Promise.resolve(l).then(a,p=>(i(p),a()))}catch(p){i(p)}if(n)throw e};return a()};import{parseArgs as j}from"node:util";var b="2.5.9";var A={help:{type:"boolean",short:"h",default:!1,description:"Show help (prints this message)"},version:{type:"boolean",short:"v",default:!1,description:"Show version number"}};function _(t){t.options={...A,...t.options};let e=j(t),{values:n}=e;n.version&&(console.log(b),process.exit(0));let s=t.commands?`
1
+ var T=(t,e)=>(e=Symbol[t])?e:Symbol.for("Symbol."+t),h=t=>{throw TypeError(t)};var I=(t,e,n)=>{if(e!=null){typeof e!="object"&&typeof e!="function"&&h("Object expected");var s,i;n&&(s=e[T("asyncDispose")]),s===void 0&&(s=e[T("dispose")],n&&(i=s)),typeof s!="function"&&h("Object not disposable"),i&&(s=function(){try{i.call(this)}catch(a){return Promise.reject(a)}}),t.push([n,s,e])}else n&&t.push([n]);return e},k=(t,e,n)=>{var s=typeof SuppressedError=="function"?SuppressedError:function(r,l,p,o){return o=Error(p),o.name="SuppressedError",o.error=r,o.suppressed=l,o},i=r=>e=n?new s(r,e,"An error was suppressed during disposal"):(n=!0,r),a=r=>{for(;r=t.pop();)try{var l=r[1]&&r[1].call(r[2]);if(r[0])return Promise.resolve(l).then(a,p=>(i(p),a()))}catch(p){i(p)}if(n)throw e};return a()};import{parseArgs as j}from"node:util";var b="2.6.0";var A={help:{type:"boolean",short:"h",default:!1,description:"Show help (prints this message)"},version:{type:"boolean",short:"v",default:!1,description:"Show version number"}};function _(t){t.options={...A,...t.options};let e=j(t),{values:n}=e;n.version&&(console.log(b),process.exit(0));let s=t.commands?`
2
2
 
3
3
  Commands:
4
4
  ${Object.entries(t.commands).map(([r,l])=>`${r.padEnd(30," ")} ${l}`).join(`
@@ -11,4 +11,4 @@ Options:
11
11
  `;return n.help&&(console.log(a),process.exit(0)),{...e,help:a}}import{spawn as O}from"node:child_process";var R=()=>{if(Promise.withResolvers)return Promise.withResolvers();let t,e;return{promise:new Promise((s,i)=>{t=i,e=s}),reject:t,resolve:e}},w=async(t,e,{print:n=!0,env:s={}}={})=>{typeof e=="boolean"&&(n=e,e=void 0);let i=new Error,a=i.stack?i.stack.replace(/^.*/," ..."):null,{promise:r,reject:l,resolve:p}=R(),o=O(t,e,{env:Object.assign(s,process.env)});n&&(o.stdout.pipe(process.stdout),o.stderr.pipe(process.stderr));let d="",u="";o.stdout?.on("data",c=>{d+=c}),o.stderr?.on("data",c=>{u+=c});let g=n?"exit":"close";function v(c){o.removeListener(g,P),Object.assign(c,{pid:o.pid,stdout:d,stderr:u,status:null,signal:null}),l(c)}function P(c,f){o.removeListener("error",v);let y={pid:o.pid,stdout:d,stderr:u,status:c,signal:f};if(c!==0){let x=typeof e!="boolean"&&` ${e?.join(" ")}`||"",m=f?new Error(`${t}${x} exited with signal: ${f}`):new Error(`${t}${x} exited with non-zero code: ${c}`);m.stack&&a&&(m.stack+=`
12
12
  ${a}`),Object.assign(m,y),l(m)}else p(y)}return o.once(g,P),o.once("error",v),r};import E from"node:fs";var C="SERVICE_HOST",$={dev1:["dev-cluster-2","europe-west1","dev1-experiment-manager"],e2eManager:["e2e-cluster-2","europe-west1","e2e-project-1"],expManager:["af-experiment-manager","europe-west1"],staging:["autofleet-staging","europe-west1-b"]},H=Object.keys($),J=({newFilePath:t,filePath:e,linesToReplace:n})=>{let s=E.readFileSync(e,"utf8");for(let{find:i,replace:a}of n)s=s.replace(i,a);E.writeFileSync(t,s)},L=async t=>{let e=$[t];if(!e)throw new Error(`Cluster name ${t} does not exist!`);let[n,s,i]=e;await w("gcloud",["container","clusters","get-credentials",n,"--region",s,"--project",i||n],{print:!1})},V=async({clusterName:t,variationId:e})=>(await L(t),`--namespace=${e}`),X=t=>{let e=t.split(`
13
13
  `).filter(Boolean);e.shift();let n=e.map(s=>{let[i,a,r,l,p,o]=s.split(/(\s+)/).map(g=>g.trim()).filter(Boolean);return`${i.replace(/-/g,"_").toUpperCase()}_${C}=${l}`});return n=n.filter(s=>!s.includes("none")&&!s.includes("undefined")),n},K=(t,e)=>(t instanceof Error||(t=new Error(t)),console.error(t),e&&console.log(e),process.exit(1));export{I as a,k as b,_ as c,w as d,H as e,J as f,L as g,V as h,X as i,K as j};
14
- //# sourceMappingURL=chunk-QXLOELXG.js.map
14
+ //# sourceMappingURL=chunk-RBW2OJOG.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../bin/utils/parser.ts","../package.json","../bin/utils/asyncSpawn.ts","../bin/utils/index.ts"],"sourcesContent":["import { parseArgs as nativeParseArgs, ParseArgsConfig } from 'node:util';\nimport { version } from '../../package.json';\n\ntype ParseArgsOptionConfig = NonNullable<ParseArgsConfig['options']>[string] & { description: string };\ntype ParseArgsParams = Omit<ParseArgsConfig, 'options'> & { binName: string; options: Record<string, ParseArgsOptionConfig>; commands?: Record<string, string> };\n\nconst GLOBAL_OPTIONS = {\n help: {\n type: 'boolean',\n short: 'h',\n default: false,\n description: 'Show help (prints this message)',\n },\n version: {\n type: 'boolean',\n short: 'v',\n default: false,\n description: 'Show version number',\n },\n} satisfies ParseArgsParams['options'];\n\ntype Expanded<T extends ParseArgsParams> = T & { options: T['options'] & typeof GLOBAL_OPTIONS };\ntype Parsed<T extends ParseArgsParams> = ReturnType<typeof nativeParseArgs<Expanded<T>>> & { help: string };\n\nexport default function parseArgs<T extends ParseArgsParams = ParseArgsParams>(params: T): Parsed<T> {\n params.options = { ...GLOBAL_OPTIONS, ...params.options };\n const data = nativeParseArgs(params as Expanded<T>);\n const { values } = data;\n if ((values as { version: boolean }).version) {\n console.log(version);\n process.exit(0);\n }\n\n const commands = !params.commands ? '' : `\n\nCommands:\n ${Object.entries(params.commands).map(([command, example]) => `${command.padEnd(30, ' ')} ${example}`).join('\\n ')}\n`;\n\n const longestDescriptionLength = Math.max.apply(null, Object.values(params.options).map(({ description }) => description.length));\n\n const help = `\n${params.binName} ${commands ? '[command] ' : ''}<options>${commands}\nOptions:\n ${Object.entries(params.options).map(([option, { description, type, short }]) => {\n const key = short ? `--${option}, -${short}` : `--${option}`;\n return `${key.padEnd(30, ' ')} ${description.padEnd(longestDescriptionLength + 10, ' ')} [${type}]`;\n }).join('\\n ')}\n`;\n\n if ((values as { help: boolean }).help) {\n console.log(help);\n process.exit(0);\n }\n\n return { ...data, help };\n}\n","{\n \"name\": \"@autofleet/cli\",\n \"version\": \"2.5.9\",\n \"description\": \"\",\n \"main\": \"dist/index.js\",\n \"scripts\": {\n \"start\": \"tsx bin/index.ts\",\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\",\n \"linter\": \"eslint .\",\n \"test\": \"vitest\",\n \"coverage\": \"vitest --coverage\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.13.0\",\n \"@stylistic/eslint-plugin\": \"^2.9.0\",\n \"@types/eslint__js\": \"^8.42.3\",\n \"@types/node\": \"^22.7.8\",\n \"@vitest/coverage-v8\": \"^2.1.3\",\n \"eslint\": \"^9.13.0\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.19.1\",\n \"typescript\": \"^5.6.3\",\n \"typescript-eslint\": \"^8.11.0\",\n \"vitest\": \"^2.1.3\"\n },\n \"bin\": {\n \"autofleet\": \"./dist/index.js\",\n \"autofleet-e2e\": \"./dist/e2e.js\",\n \"git-autofleet\": \"./dist/git-autofleet.js\"\n },\n \"engines\": {\n \"node\": \">= 18.3.0\"\n },\n \"type\": \"module\",\n \"author\": \"Autofleet\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@inquirer/prompts\": \"^5.0.2\",\n \"p-retry\": \"^6.2.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-linux-x64-gnu\": \"*\"\n }\n}\n","import { spawn } from 'node:child_process';\n\ndeclare global {\n interface PromiseWithResolvers<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n interface PromiseConstructor {\n /**\n * Creates a new Promise and returns it in an object, along with its resolve and reject functions.\n * @returns An object with the properties `promise`, `resolve`, and `reject`.\n *\n * ```ts\n * const { promise, resolve, reject } = Promise.withResolvers<T>();\n * ```\n */\n withResolvers<T>(): PromiseWithResolvers<T>;\n }\n}\n\ninterface SpawnResult {\n pid?: number;\n stdout: string;\n stderr: string;\n status: number | null;\n signal: string | null;\n}\n\nconst createDeferredPromise = <T>() => {\n if (Promise.withResolvers) {\n return Promise.withResolvers<T>();\n }\n let reject!: PromiseWithResolvers<T>['reject'];\n let resolve!: PromiseWithResolvers<T>['resolve'];\n const promise = new Promise<T>((res, rej) => {\n reject = rej;\n resolve = res;\n });\n return { promise, reject, resolve };\n};\n\nexport default async (command: string, args?: boolean | readonly string[], { print = true, env = {} }: { print?: boolean; env?: NodeJS.ProcessEnv } = {}) => {\n if (typeof args === 'boolean') {\n print = args;\n args = undefined;\n }\n const stubError = new Error();\n const callerStack = stubError.stack ? stubError.stack.replace(/^.*/, ' ...') : null;\n const { promise, reject, resolve } = createDeferredPromise<SpawnResult>();\n const child = spawn(command, args, { env: Object.assign(env, process.env) });\n if (print) {\n child.stdout.pipe(process.stdout);\n child.stderr.pipe(process.stderr);\n }\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => {\n stdout += data;\n });\n child.stderr?.on('data', (data) => {\n stderr += data;\n });\n const completionEventName = print ? 'exit' : 'close';\n function errorListener(error: Error) {\n child.removeListener(completionEventName, completionListener);\n Object.assign(error, {\n pid: child.pid,\n stdout,\n stderr,\n status: null,\n signal: null,\n });\n reject(error);\n }\n function completionListener(code: number | null, signal: string | null) {\n child.removeListener('error', errorListener);\n const result: SpawnResult = {\n pid: child.pid,\n stdout,\n stderr,\n status: code,\n signal,\n };\n if (code !== 0) {\n const argumentString = (typeof args !== 'boolean' && ` ${args?.join(' ')}`) || '';\n const error = signal\n ? new Error(`${command}${argumentString} exited with signal: ${signal}`)\n : new Error(`${command}${argumentString} exited with non-zero code: ${code}`);\n if (error.stack && callerStack) {\n error.stack += `\\n${callerStack}`;\n }\n Object.assign(error, result);\n reject(error);\n } else {\n resolve(result);\n }\n }\n\n child.once(completionEventName, completionListener);\n child.once('error', errorListener);\n return promise;\n};\n","#!/usr/bin/env node\nimport fs from 'node:fs';\nimport asyncSpawn from './asyncSpawn.js';\n\nconst IP_LINE_SUFFIX = 'SERVICE_HOST';\nconst CLUSTER_TO_CMD_MAP = {\n dev1: ['dev-cluster-2', 'europe-west1', 'dev1-experiment-manager'],\n e2eManager: ['e2e-cluster-2', 'europe-west1', 'e2e-project-1'],\n expManager: ['af-experiment-manager', 'europe-west1'],\n staging: ['autofleet-staging', 'europe-west1-b'],\n};\nexport const SUPPORTED_CLUSTERS = Object.keys(CLUSTER_TO_CMD_MAP) as (keyof typeof CLUSTER_TO_CMD_MAP)[];\n\nexport const replaceInFile = ({ newFilePath, filePath, linesToReplace }: { newFilePath: string; filePath: string; linesToReplace: { find: string; replace: string }[] }) => {\n let fileAsString = fs.readFileSync(filePath, 'utf8');\n for (const { find, replace } of linesToReplace) {\n fileAsString = fileAsString.replace(find, replace);\n }\n fs.writeFileSync(newFilePath, fileAsString);\n};\nexport const connectToCluster = async (clusterName: string) => {\n const command = CLUSTER_TO_CMD_MAP[clusterName as keyof typeof CLUSTER_TO_CMD_MAP];\n if (!command) {\n throw new Error(`Cluster name ${clusterName} does not exist!`);\n }\n const [name, region, project] = command;\n await asyncSpawn('gcloud', ['container', 'clusters', 'get-credentials', name, '--region', region, '--project', project || name], { print: false });\n};\nexport const connectAndGetPrefix = async ({ clusterName, variationId }: { clusterName: string; variationId: string }) => {\n await connectToCluster(clusterName);\n return `--namespace=${variationId}`;\n};\nexport const parseIps = (ips: string) => {\n const ipLines = ips.split('\\n').filter(Boolean);\n ipLines.shift();\n\n let formattedIps = ipLines.map((ipLine) => {\n const [name, _type, _clusterIp, externalIp, _port, _age] = ipLine.split(/(\\s+)/).map(s => s.trim()).filter(Boolean);\n const serviceName = name.replace(/-/g, '_').toUpperCase();\n const formattedLine = `${serviceName}_${IP_LINE_SUFFIX}=${externalIp}`;\n return formattedLine;\n });\n formattedIps = formattedIps.filter(formattedIp => !formattedIp.includes('none') && !formattedIp.includes('undefined'));\n return formattedIps;\n};\n\nexport const endWithError = (error: string | Error, helpText?: string): never => {\n if (!(error instanceof Error)) {\n error = new Error(error);\n }\n console.error(error);\n if (helpText) {\n console.log(helpText);\n }\n return process.exit(1);\n};\n"],"mappings":"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","names":["nativeParseArgs","version","GLOBAL_OPTIONS","parseArgs","params","data","nativeParseArgs","values","version","commands","command","example","longestDescriptionLength","description","help","option","type","short","spawn","createDeferredPromise","reject","resolve","res","rej","asyncSpawn_default","command","args","print","env","stubError","callerStack","promise","child","stdout","stderr","data","completionEventName","errorListener","error","completionListener","code","signal","result","argumentString","fs","IP_LINE_SUFFIX","CLUSTER_TO_CMD_MAP","SUPPORTED_CLUSTERS","replaceInFile","newFilePath","filePath","linesToReplace","fileAsString","fs","find","replace","connectToCluster","clusterName","command","name","region","project","asyncSpawn_default","connectAndGetPrefix","variationId","parseIps","ips","ipLines","formattedIps","ipLine","_type","_clusterIp","externalIp","_port","_age","s","formattedIp","endWithError","error","helpText"]}
1
+ {"version":3,"sources":["../bin/utils/parser.ts","../package.json","../bin/utils/asyncSpawn.ts","../bin/utils/index.ts"],"sourcesContent":["import { parseArgs as nativeParseArgs, ParseArgsConfig } from 'node:util';\nimport { version } from '../../package.json';\n\ntype ParseArgsOptionConfig = NonNullable<ParseArgsConfig['options']>[string] & { description: string };\ntype ParseArgsParams = Omit<ParseArgsConfig, 'options'> & { binName: string; options: Record<string, ParseArgsOptionConfig>; commands?: Record<string, string> };\n\nconst GLOBAL_OPTIONS = {\n help: {\n type: 'boolean',\n short: 'h',\n default: false,\n description: 'Show help (prints this message)',\n },\n version: {\n type: 'boolean',\n short: 'v',\n default: false,\n description: 'Show version number',\n },\n} satisfies ParseArgsParams['options'];\n\ntype Expanded<T extends ParseArgsParams> = T & { options: T['options'] & typeof GLOBAL_OPTIONS };\ntype Parsed<T extends ParseArgsParams> = ReturnType<typeof nativeParseArgs<Expanded<T>>> & { help: string };\n\nexport default function parseArgs<T extends ParseArgsParams = ParseArgsParams>(params: T): Parsed<T> {\n params.options = { ...GLOBAL_OPTIONS, ...params.options };\n const data = nativeParseArgs(params as Expanded<T>);\n const { values } = data;\n if ((values as { version: boolean }).version) {\n console.log(version);\n process.exit(0);\n }\n\n const commands = !params.commands ? '' : `\n\nCommands:\n ${Object.entries(params.commands).map(([command, example]) => `${command.padEnd(30, ' ')} ${example}`).join('\\n ')}\n`;\n\n const longestDescriptionLength = Math.max.apply(null, Object.values(params.options).map(({ description }) => description.length));\n\n const help = `\n${params.binName} ${commands ? '[command] ' : ''}<options>${commands}\nOptions:\n ${Object.entries(params.options).map(([option, { description, type, short }]) => {\n const key = short ? `--${option}, -${short}` : `--${option}`;\n return `${key.padEnd(30, ' ')} ${description.padEnd(longestDescriptionLength + 10, ' ')} [${type}]`;\n }).join('\\n ')}\n`;\n\n if ((values as { help: boolean }).help) {\n console.log(help);\n process.exit(0);\n }\n\n return { ...data, help };\n}\n","{\n \"name\": \"@autofleet/cli\",\n \"version\": \"2.6.0\",\n \"description\": \"\",\n \"main\": \"dist/index.js\",\n \"scripts\": {\n \"start\": \"tsx bin/index.ts\",\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\",\n \"linter\": \"eslint .\",\n \"test\": \"vitest\",\n \"coverage\": \"vitest --coverage\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.13.0\",\n \"@stylistic/eslint-plugin\": \"^2.9.0\",\n \"@types/eslint__js\": \"^8.42.3\",\n \"@types/node\": \"^22.7.8\",\n \"@vitest/coverage-v8\": \"^2.1.3\",\n \"eslint\": \"^9.13.0\",\n \"eslint-plugin-import\": \"^2.31.0\",\n \"tsup\": \"^8.3.0\",\n \"tsx\": \"^4.19.1\",\n \"typescript\": \"^5.6.3\",\n \"typescript-eslint\": \"^8.11.0\",\n \"vitest\": \"^2.1.3\"\n },\n \"bin\": {\n \"autofleet\": \"./dist/index.js\",\n \"autofleet-e2e\": \"./dist/e2e.js\",\n \"git-autofleet\": \"./dist/git-autofleet.js\"\n },\n \"engines\": {\n \"node\": \">= 18.3.0\"\n },\n \"type\": \"module\",\n \"author\": \"Autofleet\",\n \"license\": \"ISC\",\n \"dependencies\": {\n \"@inquirer/prompts\": \"^5.0.2\",\n \"p-retry\": \"^6.2.0\"\n },\n \"optionalDependencies\": {\n \"@rollup/rollup-linux-x64-gnu\": \"*\"\n }\n}\n","import { spawn } from 'node:child_process';\n\ndeclare global {\n interface PromiseWithResolvers<T> {\n promise: Promise<T>;\n resolve: (value: T | PromiseLike<T>) => void;\n reject: (reason?: any) => void; // eslint-disable-line @typescript-eslint/no-explicit-any\n }\n interface PromiseConstructor {\n /**\n * Creates a new Promise and returns it in an object, along with its resolve and reject functions.\n * @returns An object with the properties `promise`, `resolve`, and `reject`.\n *\n * ```ts\n * const { promise, resolve, reject } = Promise.withResolvers<T>();\n * ```\n */\n withResolvers<T>(): PromiseWithResolvers<T>;\n }\n}\n\ninterface SpawnResult {\n pid?: number;\n stdout: string;\n stderr: string;\n status: number | null;\n signal: string | null;\n}\n\nconst createDeferredPromise = <T>() => {\n if (Promise.withResolvers) {\n return Promise.withResolvers<T>();\n }\n let reject!: PromiseWithResolvers<T>['reject'];\n let resolve!: PromiseWithResolvers<T>['resolve'];\n const promise = new Promise<T>((res, rej) => {\n reject = rej;\n resolve = res;\n });\n return { promise, reject, resolve };\n};\n\nexport default async (command: string, args?: boolean | readonly string[], { print = true, env = {} }: { print?: boolean; env?: NodeJS.ProcessEnv } = {}) => {\n if (typeof args === 'boolean') {\n print = args;\n args = undefined;\n }\n const stubError = new Error();\n const callerStack = stubError.stack ? stubError.stack.replace(/^.*/, ' ...') : null;\n const { promise, reject, resolve } = createDeferredPromise<SpawnResult>();\n const child = spawn(command, args, { env: Object.assign(env, process.env) });\n if (print) {\n child.stdout.pipe(process.stdout);\n child.stderr.pipe(process.stderr);\n }\n let stdout = '';\n let stderr = '';\n child.stdout?.on('data', (data) => {\n stdout += data;\n });\n child.stderr?.on('data', (data) => {\n stderr += data;\n });\n const completionEventName = print ? 'exit' : 'close';\n function errorListener(error: Error) {\n child.removeListener(completionEventName, completionListener);\n Object.assign(error, {\n pid: child.pid,\n stdout,\n stderr,\n status: null,\n signal: null,\n });\n reject(error);\n }\n function completionListener(code: number | null, signal: string | null) {\n child.removeListener('error', errorListener);\n const result: SpawnResult = {\n pid: child.pid,\n stdout,\n stderr,\n status: code,\n signal,\n };\n if (code !== 0) {\n const argumentString = (typeof args !== 'boolean' && ` ${args?.join(' ')}`) || '';\n const error = signal\n ? new Error(`${command}${argumentString} exited with signal: ${signal}`)\n : new Error(`${command}${argumentString} exited with non-zero code: ${code}`);\n if (error.stack && callerStack) {\n error.stack += `\\n${callerStack}`;\n }\n Object.assign(error, result);\n reject(error);\n } else {\n resolve(result);\n }\n }\n\n child.once(completionEventName, completionListener);\n child.once('error', errorListener);\n return promise;\n};\n","#!/usr/bin/env node\nimport fs from 'node:fs';\nimport asyncSpawn from './asyncSpawn.js';\n\nconst IP_LINE_SUFFIX = 'SERVICE_HOST';\nconst CLUSTER_TO_CMD_MAP = {\n dev1: ['dev-cluster-2', 'europe-west1', 'dev1-experiment-manager'],\n e2eManager: ['e2e-cluster-2', 'europe-west1', 'e2e-project-1'],\n expManager: ['af-experiment-manager', 'europe-west1'],\n staging: ['autofleet-staging', 'europe-west1-b'],\n};\nexport const SUPPORTED_CLUSTERS = Object.keys(CLUSTER_TO_CMD_MAP) as (keyof typeof CLUSTER_TO_CMD_MAP)[];\n\nexport const replaceInFile = ({ newFilePath, filePath, linesToReplace }: { newFilePath: string; filePath: string; linesToReplace: { find: string; replace: string }[] }) => {\n let fileAsString = fs.readFileSync(filePath, 'utf8');\n for (const { find, replace } of linesToReplace) {\n fileAsString = fileAsString.replace(find, replace);\n }\n fs.writeFileSync(newFilePath, fileAsString);\n};\nexport const connectToCluster = async (clusterName: string) => {\n const command = CLUSTER_TO_CMD_MAP[clusterName as keyof typeof CLUSTER_TO_CMD_MAP];\n if (!command) {\n throw new Error(`Cluster name ${clusterName} does not exist!`);\n }\n const [name, region, project] = command;\n await asyncSpawn('gcloud', ['container', 'clusters', 'get-credentials', name, '--region', region, '--project', project || name], { print: false });\n};\nexport const connectAndGetPrefix = async ({ clusterName, variationId }: { clusterName: string; variationId: string }) => {\n await connectToCluster(clusterName);\n return `--namespace=${variationId}`;\n};\nexport const parseIps = (ips: string) => {\n const ipLines = ips.split('\\n').filter(Boolean);\n ipLines.shift();\n\n let formattedIps = ipLines.map((ipLine) => {\n const [name, _type, _clusterIp, externalIp, _port, _age] = ipLine.split(/(\\s+)/).map(s => s.trim()).filter(Boolean);\n const serviceName = name.replace(/-/g, '_').toUpperCase();\n const formattedLine = `${serviceName}_${IP_LINE_SUFFIX}=${externalIp}`;\n return formattedLine;\n });\n formattedIps = formattedIps.filter(formattedIp => !formattedIp.includes('none') && !formattedIp.includes('undefined'));\n return formattedIps;\n};\n\nexport const endWithError = (error: string | Error, helpText?: string): never => {\n if (!(error instanceof Error)) {\n error = new Error(error);\n }\n console.error(error);\n if (helpText) {\n console.log(helpText);\n }\n return process.exit(1);\n};\n"],"mappings":"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","names":["nativeParseArgs","version","GLOBAL_OPTIONS","parseArgs","params","data","nativeParseArgs","values","version","commands","command","example","longestDescriptionLength","description","help","option","type","short","spawn","createDeferredPromise","reject","resolve","res","rej","asyncSpawn_default","command","args","print","env","stubError","callerStack","promise","child","stdout","stderr","data","completionEventName","errorListener","error","completionListener","code","signal","result","argumentString","fs","IP_LINE_SUFFIX","CLUSTER_TO_CMD_MAP","SUPPORTED_CLUSTERS","replaceInFile","newFilePath","filePath","linesToReplace","fileAsString","fs","find","replace","connectToCluster","clusterName","command","name","region","project","asyncSpawn_default","connectAndGetPrefix","variationId","parseIps","ips","ipLines","formattedIps","ipLine","_type","_clusterIp","externalIp","_port","_age","s","formattedIp","endWithError","error","helpText"]}
@@ -1,2 +1,2 @@
1
- import{a as m,b as d,d as s,e as y,j as u}from"./chunk-QXLOELXG.js";var L=async()=>{let{stdout:e}=await s("git",["branch","--show-current"],{print:!1});return e.trim()},g=async()=>{let{stdout:e}=await s("git",["rev-parse","--show-toplevel"],{print:!1});return e.trim()},R=async e=>{let{stdout:t}=await s("git",["diff","origin/master..",e],{print:!1});return t};import{confirm as P,input as l,select as v}from"@inquirer/prompts";import{sep as S}from"path";Symbol.dispose??=Symbol.for("nodejs.dispose");Symbol.asyncDispose??=Symbol.for("nodejs.asyncDispose");var f,E=()=>f?.();function b(){return process.once("beforeExit",E),{[Symbol.dispose](){process.off("beforeExit",E),f=void 0}}}async function n(e,...t){try{var r=[];try{let a=m(r,b());let p=e(...t);f=p.cancel;return await p}catch(o){var c=o,i=!0}finally{d(r,c,i)}}catch(a){a instanceof Error&&["CancelPromptError","ExitPromptError"].includes(a.constructor.name)&&u("Cancelled! \u{1F44B}"),u(a)}}function w(...e){return n(v,...e)}var x=e=>e.charAt(0).toUpperCase()+e.slice(1).split(/(?=[A-Z])/).join(" ");function T(){return w({message:"Which environment do you want to use?",choices:y.map(e=>({name:x(e),value:e})),default:"expManager"})}async function V(){let t=(await g()).split(S).pop();return n(l,{message:"Enter the service name:",default:t})}function C(){return n(l,{message:"Enter your simulator id:"})}async function h(e="8080",t=!1){return n(l,{message:`Enter the ${t?"local ":""}port:`,default:e,validate(r){return/^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/.test(r)?!0:"Please enter a valid port number"}})}async function A(e="5432"){return h(e,!0)}var _={cluster:T,variationId:C,service:V,port:(e="8080")=>h(e),"local-port":A};async function D(e,t){for(let r of t){let o=typeof r=="object"?r.option:r,c=typeof r=="object"?r.defaultVal:void 0;if(typeof o!="string")throw new Error(`Invalid option ${String(o)}`);let i=_[o];if(!i)throw new Error(`No value getter for ${String(o)}`);e[o]??=await i(c)}return e}async function W(e,t=!0){return n(P,{message:e,default:t})}export{L as a,g as b,R as c,w as d,C as e,A as f,D as g,W as h};
2
- //# sourceMappingURL=chunk-IUE3SRHF.js.map
1
+ import{a as m,b as d,d as s,e as y,j as u}from"./chunk-RBW2OJOG.js";var L=async()=>{let{stdout:e}=await s("git",["branch","--show-current"],{print:!1});return e.trim()},g=async()=>{let{stdout:e}=await s("git",["rev-parse","--show-toplevel"],{print:!1});return e.trim()},R=async e=>{let{stdout:t}=await s("git",["diff","origin/master..",e],{print:!1});return t};import{confirm as P,input as l,select as v}from"@inquirer/prompts";import{sep as S}from"path";Symbol.dispose??=Symbol.for("nodejs.dispose");Symbol.asyncDispose??=Symbol.for("nodejs.asyncDispose");var f,E=()=>f?.();function b(){return process.once("beforeExit",E),{[Symbol.dispose](){process.off("beforeExit",E),f=void 0}}}async function n(e,...t){try{var r=[];try{let a=m(r,b());let p=e(...t);f=p.cancel;return await p}catch(o){var c=o,i=!0}finally{d(r,c,i)}}catch(a){a instanceof Error&&["CancelPromptError","ExitPromptError"].includes(a.constructor.name)&&u("Cancelled! \u{1F44B}"),u(a)}}function w(...e){return n(v,...e)}var x=e=>e.charAt(0).toUpperCase()+e.slice(1).split(/(?=[A-Z])/).join(" ");function T(){return w({message:"Which environment do you want to use?",choices:y.map(e=>({name:x(e),value:e})),default:"expManager"})}async function V(){let t=(await g()).split(S).pop();return n(l,{message:"Enter the service name:",default:t})}function C(){return n(l,{message:"Enter your simulator id:"})}async function h(e="8080",t=!1){return n(l,{message:`Enter the ${t?"local ":""}port:`,default:e,validate(r){return/^([1-9][0-9]{0,3}|[1-5][0-9]{4}|6[0-4][0-9]{3}|65[0-4][0-9]{2}|655[0-2][0-9]|6553[0-5])$/.test(r)?!0:"Please enter a valid port number"}})}async function A(e="5432"){return h(e,!0)}var _={cluster:T,variationId:C,service:V,port:(e="8080")=>h(e),"local-port":A};async function D(e,t){for(let r of t){let o=typeof r=="object"?r.option:r,c=typeof r=="object"?r.defaultVal:void 0;if(typeof o!="string")throw new Error(`Invalid option ${String(o)}`);let i=_[o];if(!i)throw new Error(`No value getter for ${String(o)}`);e[o]??=await i(c)}return e}async function W(e,t=!0){return n(P,{message:e,default:t})}export{L as a,g as b,R as c,w as d,C as e,A as f,D as g,W as h};
2
+ //# sourceMappingURL=chunk-RME4OYT7.js.map
package/dist/e2e.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{c as p,d as t,f as m,h as d,i as h,j as s}from"./chunk-QXLOELXG.js";import u from"node:path";import y from"p-retry";var E=["identity-ms","vehicle-ms","ride-ms","vehicle-live-data-ms","pricing-ms","payment-ms","route-plan-ms","task-ms","audit-ms","pgweb","queue-ms","placement-ms","demand-prediction-ms","control-center-ms","setting-ms","api-gateway-ms"],f={start:'--e2eBranch=<branchName> --branches="{\\"ride-ms\\": \\"AUT-7070\\"}"',getIpsForEnv:"--variationId=<yourVariationUuid> --cluster=<dev1/e2eManager>"},_=e=>Object.keys(f).includes(e),{positionals:g,values:o,help:c}=p({strict:!0,binName:"autofleet-e2e",allowPositionals:!0,options:{e2eBranch:{type:"string",default:"master",description:"Name of e2e branch"},branches:{type:"string",default:"",description:'"ride-ms": "AUT-7070"'},cluster:{type:"string",short:"c",description:"The cluster name. One of dev1, e2eManager, expManager"},variationId:{type:"string",short:"i",description:"The variation id"}},commands:f});g.length||(console.log(c),process.exit(0));var[a]=g;if(!_(a))throw s(new Error(`Command ${a} does not exist`),c),new Error("Typescript is not clever enough to understand that endWithError will exit the process");if(a==="start"){let i=(o.branches?.replace("{"," ")||"").replace(/[^a-z0-9]/gi,""),r=`${u.resolve()}/bin/utils/e2e.sh`,l=`${u.resolve()}/e2e.sh`;m({newFilePath:l,filePath:r,linesToReplace:[{find:"$E2E_BRANCH_PLACE_HOLDER$",replace:o.e2eBranch},{find:"$BRANCHES_PLACE_HOLDER$",replace:o.branches},{find:"$NAME_PLACE_HOLDER$",replace:i}]}),await t("chmod",[`+x ${l} && ${l}`]),console.log("finished e2e")}var{cluster:w,variationId:v}=o;if(!w)throw s(new Error("cluster required"),c),new Error("Typescript is not clever enough to understand that endWithError will exit the process");if(!v)throw s(new Error("variationId required"),c),new Error("Typescript is not clever enough to understand that endWithError will exit the process");var n;try{n=await d({clusterName:w,variationId:v})}catch(e){s(e)}a==="getIpsForEnv"&&(await Promise.all(E.map(e=>t("kubectl",["annotate",n,"service",e,"cloud.google.com/load-balancer-type-"],{print:!1}))),await Promise.all(E.map(e=>t("kubectl",["patch","svc",n,e,"-p",'{"spec": {"type": "LoadBalancer"}}'],{print:!1}))),console.log("exposed services successfully. the services are now creating public ips."),await y(async()=>{let{stdout:e}=await t("kubectl",[n,"get","services"],{print:!1}),i=h(e);if(i.some(r=>r.includes("<pending>")))throw new Error("Some services are still pending");i.forEach(r=>console.log(r))},{retries:10,factor:1,maxTimeout:5e3,randomize:!0}),process.exit(0));
2
+ import{c as p,d as t,f as m,h as d,i as h,j as s}from"./chunk-RBW2OJOG.js";import u from"node:path";import y from"p-retry";var E=["identity-ms","vehicle-ms","ride-ms","vehicle-live-data-ms","pricing-ms","payment-ms","route-plan-ms","task-ms","audit-ms","pgweb","queue-ms","placement-ms","demand-prediction-ms","control-center-ms","setting-ms","api-gateway-ms"],f={start:'--e2eBranch=<branchName> --branches="{\\"ride-ms\\": \\"AUT-7070\\"}"',getIpsForEnv:"--variationId=<yourVariationUuid> --cluster=<dev1/e2eManager>"},_=e=>Object.keys(f).includes(e),{positionals:g,values:o,help:c}=p({strict:!0,binName:"autofleet-e2e",allowPositionals:!0,options:{e2eBranch:{type:"string",default:"master",description:"Name of e2e branch"},branches:{type:"string",default:"",description:'"ride-ms": "AUT-7070"'},cluster:{type:"string",short:"c",description:"The cluster name. One of dev1, e2eManager, expManager"},variationId:{type:"string",short:"i",description:"The variation id"}},commands:f});g.length||(console.log(c),process.exit(0));var[a]=g;if(!_(a))throw s(new Error(`Command ${a} does not exist`),c),new Error("Typescript is not clever enough to understand that endWithError will exit the process");if(a==="start"){let i=(o.branches?.replace("{"," ")||"").replace(/[^a-z0-9]/gi,""),r=`${u.resolve()}/bin/utils/e2e.sh`,l=`${u.resolve()}/e2e.sh`;m({newFilePath:l,filePath:r,linesToReplace:[{find:"$E2E_BRANCH_PLACE_HOLDER$",replace:o.e2eBranch},{find:"$BRANCHES_PLACE_HOLDER$",replace:o.branches},{find:"$NAME_PLACE_HOLDER$",replace:i}]}),await t("chmod",[`+x ${l} && ${l}`]),console.log("finished e2e")}var{cluster:w,variationId:v}=o;if(!w)throw s(new Error("cluster required"),c),new Error("Typescript is not clever enough to understand that endWithError will exit the process");if(!v)throw s(new Error("variationId required"),c),new Error("Typescript is not clever enough to understand that endWithError will exit the process");var n;try{n=await d({clusterName:w,variationId:v})}catch(e){s(e)}a==="getIpsForEnv"&&(await Promise.all(E.map(e=>t("kubectl",["annotate",n,"service",e,"cloud.google.com/load-balancer-type-"],{print:!1}))),await Promise.all(E.map(e=>t("kubectl",["patch","svc",n,e,"-p",'{"spec": {"type": "LoadBalancer"}}'],{print:!1}))),console.log("exposed services successfully. the services are now creating public ips."),await y(async()=>{let{stdout:e}=await t("kubectl",[n,"get","services"],{print:!1}),i=h(e);if(i.some(r=>r.includes("<pending>")))throw new Error("Some services are still pending");i.forEach(r=>console.log(r))},{retries:10,factor:1,maxTimeout:5e3,randomize:!0}),process.exit(0));
3
3
  //# sourceMappingURL=e2e.js.map
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as l,b as u,c as w,d as b,h as d}from"./chunk-IUE3SRHF.js";import{c as g,d as r,j as n}from"./chunk-QXLOELXG.js";import{basename as P}from"node:path";import{randomUUID as V}from"node:crypto";var m=["premajor","preminor","prepatch","prerelease"],h=["major","minor","patch",...m],v={bumpVersion:`[${h.join("|")}]`,openPR:"Opens github UI for creating a PR from the current branch.",releaseBeta:"Bumps version if needed, and publishes a beta release to NPM."},j=e=>Object.keys(v).includes(e),y=async(e,t="")=>{let{stdout:o}=await r("npm",["version",e,"--no-git-tag-version","--preid",t],{print:!1});return await r("git",["add","package*"],{print:!1}),await r("git",["commit","-m",`${e} version: ${o}`],{print:!1}),console.log(`Created commit for version bump: ${e}. Version is now ${o}`),o},x=async()=>{let e=await u(),{default:{version:t}}=await import(`${e}/package.json`,{assert:{type:"json"},with:{type:"json"}});return t.replace(/\d+\.\d+\.\d+(?:-beta-([\w]+)?\.\d+)?/,"$1")},{positionals:$,help:p}=g({strict:!0,binName:"git autofleet",allowPositionals:!0,options:{},commands:v});$.length||(console.log(p),process.exit(0));var[s,a]=$;if(!j(s))throw n(new Error(`Command ${s} does not exist`),p),new Error("Typescript is not clever enough to understand that endWithError will exit the process");if(s==="openPR"){let[e,t]=await Promise.all([u(),l()]),c=`https://github.com/Autofleet/${P(e)}/compare/${t}?expand=1`;await r("open",[c],{print:!1}),process.exit(0)}if(s==="bumpVersion"){let e=a||await b({message:"Which version type do you want to bump?",choices:(s==="bumpVersion"?h:m).map(o=>({name:o,value:o}))});if(!e)throw n(new Error(`Must explicitly define version type.
2
+ import{a as l,b as u,c as w,d as b,h as d}from"./chunk-RME4OYT7.js";import{c as g,d as r,j as n}from"./chunk-RBW2OJOG.js";import{basename as P}from"node:path";import{randomUUID as V}from"node:crypto";var m=["premajor","preminor","prepatch","prerelease"],h=["major","minor","patch",...m],v={bumpVersion:`[${h.join("|")}]`,openPR:"Opens github UI for creating a PR from the current branch.",releaseBeta:"Bumps version if needed, and publishes a beta release to NPM."},j=e=>Object.keys(v).includes(e),y=async(e,t="")=>{let{stdout:o}=await r("npm",["version",e,"--no-git-tag-version","--preid",t],{print:!1});return await r("git",["add","package*"],{print:!1}),await r("git",["commit","-m",`${e} version: ${o}`],{print:!1}),console.log(`Created commit for version bump: ${e}. Version is now ${o}`),o},x=async()=>{let e=await u(),{default:{version:t}}=await import(`${e}/package.json`,{assert:{type:"json"},with:{type:"json"}});return t.replace(/\d+\.\d+\.\d+(?:-beta-([\w]+)?\.\d+)?/,"$1")},{positionals:$,help:p}=g({strict:!0,binName:"git autofleet",allowPositionals:!0,options:{},commands:v});$.length||(console.log(p),process.exit(0));var[s,a]=$;if(!j(s))throw n(new Error(`Command ${s} does not exist`),p),new Error("Typescript is not clever enough to understand that endWithError will exit the process");if(s==="openPR"){let[e,t]=await Promise.all([u(),l()]),c=`https://github.com/Autofleet/${P(e)}/compare/${t}?expand=1`;await r("open",[c],{print:!1}),process.exit(0)}if(s==="bumpVersion"){let e=a||await b({message:"Which version type do you want to bump?",choices:(s==="bumpVersion"?h:m).map(o=>({name:o,value:o}))});if(!e)throw n(new Error(`Must explicitly define version type.
3
3
  Version type can be one of: ${h.join(", ")}`),p),new Error("Typescript is not clever enough to understand that endWithError will exit the process");let t=await l();["main","master"].includes(t)&&(await d("Are you sure you want to bump version on main branch?")||process.exit(0)),await y(e),process.exit(0)}if(s==="releaseBeta"){a&&!m.includes(a)&&n(new Error(`Invalid version type: ${a}
4
4
  Version must be a prerelease type. (${m.join(", ")})`),p);let e=await l();["main","master"].includes(e)&&n(new Error("Cannot release beta from main branch"),p);let c=!(await w("package.json")).split(`
5
5
  `).some(i=>/^\+\s*"version":\s*"\d+\.\d+\.\d+(?:-(?:[\w-]+\.)?\d+)?",/.test(i))||await d("Version already bumped on branch. Should version be re-bumped?"),C=c&&await x(),f=c&&await y(a||"prerelease",`beta-${C||V().split("-")[0]}`);await r("npm",["run","build"]);try{await r("npm",["publish","--tag","beta","--@autofleet:registry=https://registry.npmjs.org"])}catch(i){console.error(i),n("Failed to publish beta version")}if(f)console.log(`Published beta version with new version: ${f}`);else{let{stdout:i}=await r("npm",["info",".","version"],{print:!1});console.log(`Published beta version with existing version: ${i}`)}process.exit(0)}
package/dist/index.js CHANGED
@@ -1,11 +1,13 @@
1
1
  #!/usr/bin/env node
2
- import{a as P,b as $,d as C,e as T,f as D,g as _}from"./chunk-IUE3SRHF.js";import{c as S,d as r,e as x,g as h,h as N,i as I,j as a}from"./chunk-QXLOELXG.js";import{cwd as q}from"node:process";import{randomUUID as G}from"node:crypto";import{basename as M,join as A}from"node:path";import{mkdir as z,writeFile as Y}from"node:fs/promises";import{setTimeout as H}from"node:timers/promises";async function U(){try{await r("telepresence",["version"],{print:!1})}catch{a(`Telepresence is not installed. Please install it from:
3
- https://www.telepresence.io/docs/latest/quick-start/`)}}function B(){return C({message:"Do you want to leave the connection or create a new one?",choices:[{name:"Leave the current connection",value:"leave"},{name:"Create a new connection",value:"connect"}],default:"connect"})}async function b(e){await U();let{cluster:o="",service:t=""}=e;await h(o);let i=await B();if(["leave","connect"].includes(i)||a("Invalid action, how did you get here? \u{1F914}"),i==="leave"){await r("telepresence",["leave",t]),console.log("Disconnected! \u{1F44B}");return}let m=e.variationId||await T(),s=e["local-port"]&&Number.parseInt(e["local-port"],10)||Number.parseInt(await D()||"",10);await r("telepresence",["connect",`--namespace=${m}`]),await r("telepresence",["intercept",t,"--port",s.toString(),"--env-file=./.env"]),console.log("Everything is set up! \u{1F680}"),console.log(`You can now access the service at localhost:${s}`),console.log("You can only have one connection at a time. If you want to connect to a different service, you need to leave the current connection first.")}import{EOL as k}from"node:os";import{resolve as L}from"node:path";import{readFile as F,writeFile as j}from"node:fs/promises";async function W(e,o,t){let i=L(e,".env"),s=(await F(i,"utf8")).split(k),g=`(?<!#\\s*)${o}(?==)`,w=s.find(R=>R.match(g));if(w?.split("=").at(-1)===t){console.log("env file already up to date!");return}let y=w?s.indexOf(w):-1;return y!==-1?s.splice(y,1,`${o}=${t}`):s.push(`${o}=${t}`),j(i,s.join(k))}var O=x.join("/"),p=`--variationId=<yourVariationUuid> --cluster=<${O}>`,V={switchCluster:`--cluster=<${O}>`,exposeService:`--service=<driver-ms> ${p}`,forwardDb:`${p} --local-port=<localPort>`,forwardService:`--service=<driver-ms> ${p} --port=<port> --local-port=<localPort>`,getIps:p,enableSimulator:p,rabbitCreds:p,updateExp:p,telepresenceWizard:`--service=<driver-ms> ${p} --local-port=<localPort>`,localDev:p,mirrord:`${p} --prefer-pod`,mirrordConfig:"--variationId=<yourVariationUuid>"},K=e=>Object.keys(V).includes(e),{positionals:E,values:f,help:u}=S({strict:!0,binName:"autofleet",allowPositionals:!0,options:{cluster:{type:"string",short:"c",description:"The cluster name. One of dev1, e2eManager, expManager"},variationId:{type:"string",short:"i",description:"The variation id"},service:{type:"string",short:"s",description:"The service name"},port:{type:"string",short:"p",description:"The remote port to forward"},"local-port":{type:"string",short:"l",description:"The local port to forward to"},"prefer-pod":{type:"boolean",short:"r",default:!1,description:"Wether the mirrord command should run against the pod, rather than the deployment."}},commands:V}),J={switchCluster:["cluster"],exposeService:["cluster","variationId","service"],forwardDb:["cluster","variationId",{option:"local-port",defaultVal:"5432"}],forwardService:["cluster","variationId","service","port"],telepresenceWizard:["cluster","service"],mirrordConfig:["variationId"],mirrord:["cluster","variationId","service"]};E.length||(console.log(u),process.exit(0));E.length>1&&a("Only one command is allowed",u);var[c]=E;if(!K(c))throw a(new Error(`Command ${c} does not exist`),u),new Error("Typescript is not clever enough to understand that endWithError will exit the process");await _(f,J[c]??["cluster","variationId"]);var{cluster:v,variationId:d,service:l}=f;if(c==="mirrordConfig"){let e=await $(),o=A(e,".mirrord"),t={feature:{network:{incoming:"steal",outgoing:!0},fs:"read",env:!0},target:{namespace:d||G()}};await z(o,{recursive:!0}),await Y(A(o,"mirrord.json"),JSON.stringify(t)),console.log("Wrote the default mirrord config for the requested variation ID",{mirrordConfigData:t}),process.exit(0)}if(!v)throw a(new Error("cluster required"),u),new Error("Typescript is not clever enough to understand that endWithError will exit the process");c==="telepresenceWizard"&&(await b(f),process.exit(0));c==="switchCluster"&&(await h(v),console.log(`switched to ${v} successfully`),process.exit(0));if(!d)throw a(new Error("variationId required"),u),new Error("Typescript is not clever enough to understand that endWithError will exit the process");var n;try{n=await N({clusterName:v,variationId:d})}catch(e){throw a(e),new Error("Typescript is not clever enough to understand that endWithError will exit the process")}if(c==="mirrord"){f["prefer-pod"]||(await r("mirrord",["exec","-t",`deployment/${l}`,"-n",d,"--steal","npm","run","dev"]),process.exit(0));let{stdout:e}=await r("kubectl",["get","pods",n,"-l",`service=${l}`,"-o",'jsonpath="{.items[0].metadata.name}"'],{print:!1});e&&=e.trim(),e||a(new Error(`No pods found for service ${l}`)),e.startsWith('"')&&e.endsWith('"')&&(e=e.slice(1,-1)),console.log(`Found pod ${e}, will now start mirrord and run "npm run dev". Make sure to attach a debugger!`),await r("mirrord",["exec","-t",`pod/${e}`,"-n",d,"--steal","npm","run","dev"]),process.exit(0)}if(c==="exposeService"){if(!l)throw a(new Error("service is required for exposeService"),u),new Error("Typescript is not clever enough to understand that endWithError will exit the process");await r("kubectl",["patch","svc",n,l,"-p",'{"spec": {"type": "LoadBalancer"}}']),console.log(`exposed ${l} successfully. the service is now creating an internal load balancer ip to use with vpn`),process.exit(0)}if(c==="forwardDb"){let e=Number.parseInt(f["local-port"]??"5432",10);Number.isNaN(e)&&a(new Error("if defined, local-port must be a number"),u);let o=`afpass_${d}`,t="postgres",i=d.replaceAll("-","_"),m=l?`${l.replaceAll("-","_")||""}_${i}`:"postgres",s=`postgres://${t}:${o}@localhost:${e}/${m}?&nickname=var_${d}`;console.log(`Forwarding db to local port ${e}.
4
- access the DB at ${s}
2
+ import{a as C,b,d as _,e as T,f as D,g as A}from"./chunk-RME4OYT7.js";import{c as N,d as r,e as x,g as $,h as P,i as I,j as s}from"./chunk-RBW2OJOG.js";import{cwd as q}from"node:process";import{randomUUID as G}from"node:crypto";import{basename as W,join as M}from"node:path";import{mkdir as z,writeFile as Y}from"node:fs/promises";import{setTimeout as H}from"node:timers/promises";async function R(){try{await r("telepresence",["version"],{print:!1})}catch{s(`Telepresence is not installed. Please install it from:
3
+ https://www.telepresence.io/docs/latest/quick-start/`)}}function U(){return _({message:"Do you want to leave the connection or create a new one?",choices:[{name:"Leave the current connection",value:"leave"},{name:"Create a new connection",value:"connect"}],default:"connect"})}async function E(e){await R();let{cluster:o="",service:t=""}=e;await $(o);let i=await U();if(["leave","connect"].includes(i)||s("Invalid action, how did you get here? \u{1F914}"),i==="leave"){await r("telepresence",["leave",t]),console.log("Disconnected! \u{1F44B}");return}let p=e.variationId||await T(),a=e["local-port"]&&Number.parseInt(e["local-port"],10)||Number.parseInt(await D()||"",10);await r("telepresence",["connect",`--namespace=${p}`]),await r("telepresence",["intercept",t,"--port",a.toString(),"--env-file=./.env"]),console.log("Everything is set up! \u{1F680}"),console.log(`You can now access the service at localhost:${a}`),console.log("You can only have one connection at a time. If you want to connect to a different service, you need to leave the current connection first.")}import{EOL as k}from"node:os";import{resolve as B}from"node:path";import{readFile as F,writeFile as j}from"node:fs/promises";async function y(e,o,t){let i=B(e,".env"),a=(await F(i,"utf8")).split(k),g=`(?<!#\\s*)${o}(?==)`,f=a.find(L=>L.match(g));if(f?.split("=").at(-1)===t)return!1;let v=f?a.indexOf(f):-1;return v!==-1?a.splice(v,1,`${o}=${t}`):a.push(`${o}=${t}`),await j(i,a.join(k)),!0}var O=x.join("/"),u=`--variationId=<yourVariationUuid> --cluster=<${O}>`,V={switchCluster:`--cluster=<${O}>`,exposeService:`--service=<driver-ms> ${u}`,forwardDb:`${u} --local-port=<localPort>`,forwardService:`--service=<driver-ms> ${u} --port=<port> --local-port=<localPort>`,getIps:u,enableSimulator:u,rabbitCreds:u,updateExp:u,telepresenceWizard:`--service=<driver-ms> ${u} --local-port=<localPort>`,localDev:u,mirrord:`${u} --prefer-pod`,mirrordConfig:"--variationId=<yourVariationUuid>"},K=e=>Object.keys(V).includes(e),{positionals:S,values:w,help:m}=N({strict:!0,binName:"autofleet",allowPositionals:!0,options:{cluster:{type:"string",short:"c",description:"The cluster name. One of dev1, e2eManager, expManager"},variationId:{type:"string",short:"i",description:"The variation id"},service:{type:"string",short:"s",description:"The service name"},port:{type:"string",short:"p",description:"The remote port to forward"},"local-port":{type:"string",short:"l",description:"The local port to forward to"},"prefer-pod":{type:"boolean",short:"r",default:!1,description:"Wether the mirrord command should run against the pod, rather than the deployment."}},commands:V}),J={switchCluster:["cluster"],exposeService:["cluster","variationId","service"],forwardDb:["cluster","variationId",{option:"local-port",defaultVal:"5432"}],forwardService:["cluster","variationId","service","port"],telepresenceWizard:["cluster","service"],mirrordConfig:["variationId"],mirrord:["cluster","variationId","service"]};S.length||(console.log(m),process.exit(0));S.length>1&&s("Only one command is allowed",m);var[c]=S;if(!K(c))throw s(new Error(`Command ${c} does not exist`),m),new Error("Typescript is not clever enough to understand that endWithError will exit the process");await A(w,J[c]??["cluster","variationId"]);var{cluster:h,variationId:d,service:l}=w;if(c==="mirrordConfig"){let e=await b(),o=M(e,".mirrord"),t={feature:{network:{incoming:"steal",outgoing:!0},fs:"read",env:!0},target:{namespace:d||G()}};await z(o,{recursive:!0}),await Y(M(o,"mirrord.json"),JSON.stringify(t)),console.log("Wrote the default mirrord config for the requested variation ID",{mirrordConfigData:t}),process.exit(0)}if(!h)throw s(new Error("cluster required"),m),new Error("Typescript is not clever enough to understand that endWithError will exit the process");c==="telepresenceWizard"&&(await E(w),process.exit(0));c==="switchCluster"&&(await $(h),console.log(`switched to ${h} successfully`),process.exit(0));if(!d){throw s(new Error("variationId required"),m),new Error("Typescript is not clever enough to understand that endWithError will exit the process");process.exit(1)}var n;try{n=await P({clusterName:h,variationId:d})}catch(e){throw s(e),new Error("Typescript is not clever enough to understand that endWithError will exit the process")}if(c==="mirrord"){w["prefer-pod"]||(await r("mirrord",["exec","-t",`deployment/${l}`,"-n",d,"--steal","npm","run","dev"]),process.exit(0));let{stdout:e}=await r("kubectl",["get","pods",n,"-l",`service=${l}`,"-o",'jsonpath="{.items[0].metadata.name}"'],{print:!1});e&&=e.trim(),e||s(new Error(`No pods found for service ${l}`)),e.startsWith('"')&&e.endsWith('"')&&(e=e.slice(1,-1)),console.log(`Found pod ${e}, will now start mirrord and run "npm run dev". Make sure to attach a debugger!`),await r("mirrord",["exec","-t",`pod/${e}`,"-n",d,"--steal","npm","run","dev"]),process.exit(0)}if(c==="exposeService"){if(!l)throw s(new Error("service is required for exposeService"),m),new Error("Typescript is not clever enough to understand that endWithError will exit the process");await r("kubectl",["patch","svc",n,l,"-p",'{"spec": {"type": "LoadBalancer"}}']),console.log(`exposed ${l} successfully. the service is now creating an internal load balancer ip to use with vpn`),process.exit(0)}if(c==="forwardDb"){let e=Number.parseInt(w["local-port"]??"5432",10);Number.isNaN(e)&&s(new Error("if defined, local-port must be a number"),m);let o=`afpass_${d}`,t="postgres",i=d.replaceAll("-","_"),p=l?`${l.replaceAll("-","_")||""}_${i}`:"postgres",a=`postgres://${t}:${o}@localhost:${e}/${p}?&nickname=var_${d}`;console.log(`Forwarding db to local port ${e}.
4
+ access the DB at ${a}
5
5
  Press ctrl+c to stop.`);let g=` DB_USERNAME=${t}
6
6
  DB_PASSWORD=${o}
7
- DB_NAME=${l?m:`<service_name>_${i}`}`;console.log(`Generated database environment for local development:
8
- `,g),H(1500).then(()=>r("open",[s],{print:!1})).catch(()=>null),await r("kubectl",[n,"port-forward",`statefulset/p${d}-postgresql`,`${e}:5432`],{print:!1}),process.exit(0)}if(c==="forwardService"){let e=Number.parseInt(f.port??"8080",10),o=Number.parseInt(f["local-port"]??"",10)||e;l||a(new Error("service is required for forwardService"),u),(!e||Number.isNaN(e))&&a(new Error("port is required and must be a numbers"),u),o&&Number.isNaN(o)&&a(new Error("local-port must be a number"),u);let{stdout:t}=await r("kubectl",["get","pods",n,"-l",`service=${l}`,"-o",'jsonpath="{.items[0].metadata.name}"'],{print:!1});t&&=t.trim(),t||a(new Error(`No pods found for service ${l}`)),t.startsWith('"')&&t.endsWith('"')&&(t=t.slice(1,-1)),console.log(`Found pod ${t}, serving locally on port ${o} from remote port ${e}.
9
- Press ctrl+c to stop.`),await r("kubectl",["port-forward",n,t,`${o}:${e}`],{print:!1}),process.exit(0)}if(c==="getIps"){let{stdout:e}=await r("kubectl",[n,"get","services"],{print:!1});I(e).forEach(t=>console.log(t)),process.exit(0)}if(c==="enableSimulator"){let e="simulation-cluster-front";await r("kubectl",["annotate",n,"service",e,"cloud.google.com/load-balancer-type-"]),await r("kubectl",["patch","svc",n,e,"-p",'{"spec": {"type": "LoadBalancer"}}']),await r("kubectl",["create",n,"rolebinding","admin","--clusterrole=cluster-admin",`--serviceaccount=${d}:default`]),console.log(`Successfully exposed ${e} and added role binding to dispatch simulations`),process.exit(0)}if(c==="rabbitCreds"){let e=i=>["get","secret","rabbitmq-default-user","-o",`jsonpath="{.data.${i}}"`],[{stdout:o},{stdout:t}]=await Promise.all([r("kubectl",e("username"),{print:!1}),r("kubectl",e("password"),{print:!1})]);console.log(`username: ${Buffer.from(o,"base64").toString("ascii")}`),console.log(`password: ${Buffer.from(t,"base64").toString("ascii")}`),process.exit(0)}if(c==="updateExp"){let e=M(q()),[o,t]=await Promise.all([P(),r("uname",["-m"],{print:!1})]),i=t.stdout.trim(),m=`${new Date().getHours().toString().padStart(2,"0")}-${new Date().getMinutes().toString().padStart(2,"0")}-${new Date().getSeconds().toString().padStart(2,"0")}`,s=`gcr.io/autofleetprod/${e}:${o}-${m}`;console.log(`Building and pushing image ${s}`),await r("docker",["build",".",...i==="x86_64"?[]:["--platform","linux/amd64"],"-t",s,"--build-arg",`NPM_TOKEN=${process.env.NPM_TOKEN}`]),await r("docker",["push",s]);let{stdout:w}=await r("kubectl",["describe","pod",n,"-l",`service=${e}`],{print:!1});w.includes("Init Containers:")&&await r("kubectl",["patch",`deployment/${e}`,n,"--patch",`{"spec": {"template": {"spec": {"initContainers": [{"name": "init","image": "${s}"}]}}}}`]),await r("kubectl",["set","image",`deployment/${e}`,`worker=${s}`,n]),await r("kubectl",["rollout","status","deployments",e,n]),process.exit(0)}if(c==="localDev"){let e="api-gateway-ms",o="control-center-ms",t=await $();M(t)!=="control-center"&&a(new Error("The `localDev` command must be run from the control-center repository"));let{stdout:i}=await r("kubectl",["get","ingress",`${e}-ingress`,n,"-o",'jsonpath="{.status.loadBalancer.ingress[0].ip}"'],{print:!1});i||a(new Error(`The IP of the Load balancer for ${e} was not found`)),await W(t,"API_GATEWAY_MS_SERVICE_HOST",i.replace(/"/g,"")),console.log(`Updated .env file to use ${e} IP (${i}). Will now start port-forwarding ${o} to port 8085.
10
- Press ctrl+c to stop.`),await r("kubectl",["port-forward",n,`svc/${o}`,"8085:80"],{print:!1}),process.exit(0)}
7
+ DB_NAME=${l?p:`<service_name>_${i}`}`;console.log(`Generated database environment for local development:
8
+ `,g),H(1500).then(()=>r("open",[a],{print:!1})).catch(()=>null),await r("kubectl",[n,"port-forward",`statefulset/p${d}-postgresql`,`${e}:5432`],{print:!1}),process.exit(0)}if(c==="forwardService"){let e=Number.parseInt(w.port??"8080",10),o=Number.parseInt(w["local-port"]??"",10)||e;l||s(new Error("service is required for forwardService"),m),(!e||Number.isNaN(e))&&s(new Error("port is required and must be a numbers"),m),o&&Number.isNaN(o)&&s(new Error("local-port must be a number"),m);let{stdout:t}=await r("kubectl",["get","pods",n,"-l",`service=${l}`,"-o",'jsonpath="{.items[0].metadata.name}"'],{print:!1});t&&=t.trim(),t||s(new Error(`No pods found for service ${l}`)),t.startsWith('"')&&t.endsWith('"')&&(t=t.slice(1,-1)),console.log(`Found pod ${t}, serving locally on port ${o} from remote port ${e}.
9
+ Press ctrl+c to stop.`),await r("kubectl",["port-forward",n,t,`${o}:${e}`],{print:!1}),process.exit(0)}if(c==="getIps"){let{stdout:e}=await r("kubectl",[n,"get","services"],{print:!1});I(e).forEach(t=>console.log(t)),process.exit(0)}if(c==="enableSimulator"){let e="simulation-cluster-front";await r("kubectl",["annotate",n,"service",e,"cloud.google.com/load-balancer-type-"]),await r("kubectl",["patch","svc",n,e,"-p",'{"spec": {"type": "LoadBalancer"}}']),await r("kubectl",["create",n,"rolebinding","admin","--clusterrole=cluster-admin",`--serviceaccount=${d}:default`]),console.log(`Successfully exposed ${e} and added role binding to dispatch simulations`),process.exit(0)}if(c==="rabbitCreds"){let e=i=>["get","secret","rabbitmq-default-user","-o",`jsonpath="{.data.${i}}"`],[{stdout:o},{stdout:t}]=await Promise.all([r("kubectl",e("username"),{print:!1}),r("kubectl",e("password"),{print:!1})]);console.log(`username: ${Buffer.from(o,"base64").toString("ascii")}`),console.log(`password: ${Buffer.from(t,"base64").toString("ascii")}`),process.exit(0)}if(c==="updateExp"){let e=W(q()),[o,t]=await Promise.all([C(),r("uname",["-m"],{print:!1})]),i=t.stdout.trim(),p=`${new Date().getHours().toString().padStart(2,"0")}-${new Date().getMinutes().toString().padStart(2,"0")}-${new Date().getSeconds().toString().padStart(2,"0")}`,a=`gcr.io/autofleetprod/${e}:${o}-${p}`;console.log(`Building and pushing image ${a}`),await r("docker",["build",".",...i==="x86_64"?[]:["--platform","linux/amd64"],"-t",a,"--build-arg",`NPM_TOKEN=${process.env.NPM_TOKEN}`]),await r("docker",["push",a]);let{stdout:f}=await r("kubectl",["describe","pod",n,"-l",`service=${e}`],{print:!1});f.includes("Init Containers:")&&await r("kubectl",["patch",`deployment/${e}`,n,"--patch",`{"spec": {"template": {"spec": {"initContainers": [{"name": "init","image": "${a}"}]}}}}`]),await r("kubectl",["set","image",`deployment/${e}`,`worker=${a}`,n]),await r("kubectl",["rollout","status","deployments",e,n]),process.exit(0)}if(c==="localDev"){let e="LOCAL_ENV_NAME",o="api-gateway-ms",t="control-center-ms",i=h==="staging"?"staging":`simulator-${d}`,p=await b();W(p)!=="control-center"&&s(new Error("The `localDev` command must be run from the control-center repository"));let{stdout:a}=await r("kubectl",["get","ingress",`${o}-ingress`,n,"-o",'jsonpath="{.status.loadBalancer.ingress[0].ip}"'],{print:!1});a||s(new Error(`The IP of the Load balancer for ${o} was not found`));let g=await y(p,"API_GATEWAY_MS_SERVICE_HOST",a.replace(/"/g,"")),f=await y(p,e,i),v=`${g?`Updated .env file to use ${o} IP (${a}).
10
+ `:""}${f?`Updated .env file ${e} to ${i} (used for firebase setup).
11
+ `:""}Port-forwarding of ${t} will now start to port 8085.
12
+ Press ctrl+c to stop.`;console.log(v),await r("kubectl",["port-forward",n,`svc/${t}`,"8085:80"],{print:!1}),process.exit(0)}
11
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../bin/index.ts","../bin/utils/telepresenceWizard.ts","../bin/utils/env.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { cwd } from 'node:process';\nimport { randomUUID } from 'node:crypto';\nimport { basename, join } from 'node:path';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { setTimeout } from 'node:timers/promises';\nimport parseArgs from './utils/parser.js';\nimport asyncSpawn from './utils/asyncSpawn.js';\nimport {\n SUPPORTED_CLUSTERS,\n connectAndGetPrefix, connectToCluster, endWithError, parseIps,\n} from './utils/index.js';\nimport { fillMissingRequiredValues } from './utils/inquirer.js';\nimport telepresenceWizard from './utils/telepresenceWizard.js';\nimport { getCurrentBranch, getGitPath } from './utils/git.js';\nimport { setEnvValue } from './utils/env.js';\n\nconst clusterOptions = SUPPORTED_CLUSTERS.join('/');\nconst variationAndCluster = `--variationId=<yourVariationUuid> --cluster=<${clusterOptions}>`;\n\nconst COMMANDS = {\n switchCluster: `--cluster=<${clusterOptions}>`,\n exposeService: `--service=<driver-ms> ${variationAndCluster}`,\n forwardDb: `${variationAndCluster} --local-port=<localPort>`,\n forwardService: `--service=<driver-ms> ${variationAndCluster} --port=<port> --local-port=<localPort>`,\n getIps: variationAndCluster,\n enableSimulator: variationAndCluster,\n rabbitCreds: variationAndCluster,\n updateExp: variationAndCluster,\n telepresenceWizard: `--service=<driver-ms> ${variationAndCluster} --local-port=<localPort>`,\n localDev: variationAndCluster,\n mirrord: `${variationAndCluster} --prefer-pod`,\n mirrordConfig: `--variationId=<yourVariationUuid>`,\n};\ntype Command = keyof typeof COMMANDS;\nconst isCommand = (c: string): c is Command => Object.keys(COMMANDS).includes(c);\n\nconst { positionals, values, help } = parseArgs({\n strict: true,\n binName: 'autofleet',\n allowPositionals: true,\n options: {\n cluster: {\n type: 'string',\n short: 'c',\n description: 'The cluster name. One of dev1, e2eManager, expManager',\n },\n variationId: {\n type: 'string',\n short: 'i',\n description: 'The variation id',\n },\n service: {\n type: 'string',\n short: 's',\n description: 'The service name',\n },\n port: {\n type: 'string',\n short: 'p',\n description: 'The remote port to forward',\n },\n 'local-port': {\n type: 'string',\n short: 'l',\n description: 'The local port to forward to',\n },\n 'prefer-pod': {\n type: 'boolean',\n short: 'r',\n default: false,\n description: 'Wether the mirrord command should run against the pod, rather than the deployment.',\n },\n },\n commands: COMMANDS,\n});\n\nexport type Values = typeof values;\ntype ValueWithDefault<T = keyof Values> = T | { option: T; defaultVal: string };\n\nconst COMMAND_REQUIRED_VALUES_MAP: Partial<Record<Command, ValueWithDefault[]>> = {\n switchCluster: ['cluster'],\n exposeService: ['cluster', 'variationId', 'service'],\n forwardDb: ['cluster', 'variationId', { option: 'local-port', defaultVal: '5432' }],\n forwardService: ['cluster', 'variationId', 'service', 'port'],\n telepresenceWizard: ['cluster', 'service'],\n mirrordConfig: ['variationId'],\n mirrord: ['cluster', 'variationId', 'service'],\n};\n\nif (!positionals.length) {\n console.log(help);\n process.exit(0);\n}\n\nif (positionals.length > 1) {\n endWithError('Only one command is allowed', help);\n}\n\nconst [command] = positionals;\nif (!isCommand(command)) {\n endWithError(new Error(`Command ${command} does not exist`), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n}\n\nawait fillMissingRequiredValues(values, COMMAND_REQUIRED_VALUES_MAP[command] ?? ['cluster', 'variationId']);\nconst { cluster, variationId, service } = values;\n\nif (command === 'mirrordConfig') {\n const repoPath = await getGitPath();\n const mirrordPath = join(repoPath, '.mirrord');\n const mirrordConfigData = {\n feature: {\n network: {\n incoming: 'steal',\n outgoing: true,\n },\n fs: 'read',\n env: true,\n },\n target: {\n namespace: variationId || randomUUID(),\n },\n };\n await mkdir(mirrordPath, { recursive: true });\n await writeFile(join(mirrordPath, 'mirrord.json'), JSON.stringify(mirrordConfigData));\n console.log('Wrote the default mirrord config for the requested variation ID', { mirrordConfigData });\n process.exit(0);\n}\n\nif (!cluster) {\n endWithError(new Error('cluster required'), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n}\n\nif (command === 'telepresenceWizard') {\n await telepresenceWizard(values);\n process.exit(0);\n}\n\nif (command === 'switchCluster') {\n await connectToCluster(cluster);\n console.log(`switched to ${cluster} successfully`);\n process.exit(0);\n}\n\nif (!variationId) {\n endWithError(new Error('variationId required'), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n}\nlet prefix: string;\ntry {\n prefix = await connectAndGetPrefix({ clusterName: cluster, variationId });\n} catch (error) {\n endWithError(error as Error);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n}\n\nif (command === 'mirrord') {\n if (!values['prefer-pod']) {\n await asyncSpawn('mirrord', ['exec', '-t', `deployment/${service}`, '-n', variationId, '--steal', 'npm', 'run', 'dev']);\n process.exit(0);\n }\n let { stdout: podName } = await asyncSpawn('kubectl', ['get', 'pods', prefix, '-l', `service=${service}`, '-o', 'jsonpath=\"{.items[0].metadata.name}\"'], { print: false });\n podName &&= podName.trim();\n if (!podName) {\n endWithError(new Error(`No pods found for service ${service}`));\n }\n if (podName.startsWith('\"') && podName.endsWith('\"')) {\n podName = podName.slice(1, -1);\n }\n console.log(`Found pod ${podName}, will now start mirrord and run \"npm run dev\". Make sure to attach a debugger!`);\n\n await asyncSpawn('mirrord', ['exec', '-t', `pod/${podName}`, '-n', variationId, '--steal', 'npm', 'run', 'dev']);\n process.exit(0);\n}\n\nif (command === 'exposeService') {\n if (!service) {\n endWithError(new Error('service is required for exposeService'), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n }\n await asyncSpawn('kubectl', ['patch', 'svc', prefix, service, '-p', '{\"spec\": {\"type\": \"LoadBalancer\"}}']);\n console.log(`exposed ${service} successfully. the service is now creating an internal load balancer ip to use with vpn`);\n process.exit(0);\n}\n\nif (command === 'forwardDb') {\n const localPort = Number.parseInt(values['local-port'] ?? '5432', 10);\n if (Number.isNaN(localPort)) {\n endWithError(new Error('if defined, local-port must be a number'), help);\n }\n const DB_PASSWORD = `afpass_${variationId}`;\n const USER_NAME = 'postgres';\n const variationUnderScore = variationId.replaceAll('-', '_');\n const DB_NAME = service ? `${service.replaceAll('-', '_') || ''}_${variationUnderScore}` : 'postgres';\n\n const postgressPath = `postgres://${USER_NAME}:${DB_PASSWORD}@localhost:${localPort}/${DB_NAME}?&nickname=var_${variationId}`;\n console.log(`Forwarding db to local port ${localPort}.\\naccess the DB at ${postgressPath}\\nPress ctrl+c to stop.`);\n\n const dbEnvs = ` DB_USERNAME=${USER_NAME}\n DB_PASSWORD=${DB_PASSWORD}\n DB_NAME=${service ? DB_NAME : `<service_name>_${variationUnderScore}`}`;\n console.log('Generated database environment for local development:\\n', dbEnvs);\n\n setTimeout(1500).then(() => asyncSpawn('open', [postgressPath], { print: false })).catch(() => null);\n await asyncSpawn('kubectl', [prefix, 'port-forward', `statefulset/p${variationId}-postgresql`, `${localPort}:5432`], { print: false });\n process.exit(0);\n}\n\nif (command === 'forwardService') {\n const port = Number.parseInt(values.port ?? '8080', 10);\n const localPort = Number.parseInt(values['local-port'] ?? '', 10) || port;\n if (!service) {\n endWithError(new Error('service is required for forwardService'), help);\n }\n if (!port || Number.isNaN(port)) {\n endWithError(new Error('port is required and must be a numbers'), help);\n }\n if (localPort && Number.isNaN(localPort)) {\n endWithError(new Error('local-port must be a number'), help);\n }\n let { stdout: podName } = await asyncSpawn('kubectl', ['get', 'pods', prefix, '-l', `service=${service}`, '-o', 'jsonpath=\"{.items[0].metadata.name}\"'], { print: false });\n podName &&= podName.trim();\n if (!podName) {\n endWithError(new Error(`No pods found for service ${service}`));\n }\n if (podName.startsWith('\"') && podName.endsWith('\"')) {\n podName = podName.slice(1, -1);\n }\n console.log(`Found pod ${podName}, serving locally on port ${localPort} from remote port ${port}.\\nPress ctrl+c to stop.`);\n await asyncSpawn('kubectl', ['port-forward', prefix, podName, `${localPort}:${port}`], { print: false });\n process.exit(0);\n}\n\nif (command === 'getIps') {\n const { stdout } = await asyncSpawn('kubectl', [prefix, 'get', 'services'], { print: false });\n const ips = parseIps(stdout);\n ips.forEach(ip => console.log(ip));\n process.exit(0);\n}\n\nif (command === 'enableSimulator') {\n const SIMULATION_CLUSTER_FRONT = 'simulation-cluster-front';\n await asyncSpawn('kubectl', ['annotate', prefix, 'service', SIMULATION_CLUSTER_FRONT, 'cloud.google.com/load-balancer-type-']);\n await asyncSpawn('kubectl', ['patch', 'svc', prefix, SIMULATION_CLUSTER_FRONT, '-p', '{\"spec\": {\"type\": \"LoadBalancer\"}}']);\n await asyncSpawn('kubectl', ['create', prefix, 'rolebinding', 'admin', '--clusterrole=cluster-admin', `--serviceaccount=${variationId}:default`]);\n console.log(`Successfully exposed ${SIMULATION_CLUSTER_FRONT} and added role binding to dispatch simulations`);\n process.exit(0);\n}\n\nif (command === 'rabbitCreds') {\n const getArgs = (dataKey: string) => ['get', 'secret', 'rabbitmq-default-user', '-o', `jsonpath=\"{.data.${dataKey}}\"`];\n const [{ stdout: username }, { stdout: password }] = await Promise.all([\n asyncSpawn('kubectl', getArgs('username'), { print: false }),\n asyncSpawn('kubectl', getArgs('password'), { print: false }),\n ]);\n console.log(`username: ${Buffer.from(username, 'base64').toString('ascii')}`);\n console.log(`password: ${Buffer.from(password, 'base64').toString('ascii')}`);\n process.exit(0);\n}\n\nif (command === 'updateExp') {\n const dir = basename(cwd());\n const [branchName, archResult] = await Promise.all([getCurrentBranch(), asyncSpawn('uname', ['-m'], { print: false })]);\n const arch = archResult.stdout.trim();\n const dateSuffix = `${new Date().getHours().toString().padStart(2, '0')}-${new Date().getMinutes().toString().padStart(2, '0')}-${new Date().getSeconds().toString().padStart(2, '0')}`;\n const imageName = `gcr.io/autofleetprod/${dir}:${branchName}-${dateSuffix}`;\n console.log(`Building and pushing image ${imageName}`);\n const platformFlag = arch === 'x86_64' ? [] : ['--platform', 'linux/amd64'];\n await asyncSpawn('docker', ['build', '.', ...platformFlag, '-t', imageName, '--build-arg', `NPM_TOKEN=${process.env.NPM_TOKEN}`]);\n await asyncSpawn('docker', ['push', imageName]);\n const { stdout: podDescription } = await asyncSpawn('kubectl', ['describe', 'pod', prefix, '-l', `service=${dir}`], { print: false });\n if (podDescription.includes('Init Containers:')) {\n await asyncSpawn('kubectl', ['patch', `deployment/${dir}`, prefix, '--patch', `{\"spec\": {\"template\": {\"spec\": {\"initContainers\": [{\"name\": \"init\",\"image\": \"${imageName}\"}]}}}}`]);\n }\n await asyncSpawn('kubectl', ['set', 'image', `deployment/${dir}`, `worker=${imageName}`, prefix]);\n await asyncSpawn('kubectl', ['rollout', 'status', 'deployments', dir, prefix]);\n process.exit(0);\n}\n\nif (command === 'localDev') {\n const API_GATEWAY_MS = 'api-gateway-ms';\n const CONTROL_CENTER_MS = 'control-center-ms';\n\n const repoPath = await getGitPath();\n if (basename(repoPath) !== 'control-center') {\n endWithError(new Error('The `localDev` command must be run from the control-center repository'));\n }\n const { stdout: apiGatewayMsIP } = await asyncSpawn('kubectl', ['get', 'ingress', `${API_GATEWAY_MS}-ingress`, prefix, '-o', 'jsonpath=\"{.status.loadBalancer.ingress[0].ip}\"'], { print: false });\n if (!apiGatewayMsIP) {\n endWithError(new Error(`The IP of the Load balancer for ${API_GATEWAY_MS} was not found`));\n }\n await setEnvValue(repoPath, 'API_GATEWAY_MS_SERVICE_HOST', apiGatewayMsIP.replace(/\"/g, ''));\n console.log(`Updated .env file to use ${API_GATEWAY_MS} IP (${apiGatewayMsIP}). Will now start port-forwarding ${CONTROL_CENTER_MS} to port 8085.\\nPress ctrl+c to stop.`);\n await asyncSpawn('kubectl', ['port-forward', prefix, `svc/${CONTROL_CENTER_MS}`, '8085:80'], { print: false });\n process.exit(0);\n}\n","import asyncSpawn from './asyncSpawn.js';\nimport { getVariationId, getLocalPort, safeSelect } from './inquirer.js';\nimport { connectToCluster, endWithError } from './index.js';\nimport type { Values } from '../index.js';\n\nasync function ensureTelepresenceInstalled() {\n try {\n await asyncSpawn('telepresence', ['version'], { print: false });\n } catch {\n endWithError('Telepresence is not installed. Please install it from:\\nhttps://www.telepresence.io/docs/latest/quick-start/');\n }\n}\n\nfunction leaveOrConnect() {\n return safeSelect({\n message: 'Do you want to leave the connection or create a new one?',\n choices: [\n { name: 'Leave the current connection', value: 'leave' },\n { name: 'Create a new connection', value: 'connect' },\n ] as const,\n default: 'connect',\n });\n}\n\nexport default async function telepresenceWizard(values: Values): Promise<void> {\n await ensureTelepresenceInstalled();\n\n const { cluster = '', service = '' } = values; // Values should be defined by now, thanks to inquirer. Default to hint to TS we always have values.\n await connectToCluster(cluster);\n\n const action = await leaveOrConnect();\n if (!['leave', 'connect'].includes(action!)) {\n endWithError('Invalid action, how did you get here? 🤔');\n }\n if (action === 'leave') {\n await asyncSpawn('telepresence', ['leave', service]);\n console.log('Disconnected! 👋');\n return;\n }\n const namespace = values.variationId || await getVariationId();\n const localPort = (values['local-port'] && Number.parseInt(values['local-port'], 10)) || Number.parseInt((await getLocalPort()) || '', 10);\n await asyncSpawn('telepresence', ['connect', `--namespace=${namespace}`]);\n await asyncSpawn('telepresence', ['intercept', service, '--port', localPort.toString(), '--env-file=./.env']);\n console.log('Everything is set up! 🚀');\n console.log(`You can now access the service at localhost:${localPort}`);\n console.log('You can only have one connection at a time. If you want to connect to a different service, you need to leave the current connection first.');\n}\n","import { EOL } from 'node:os';\nimport { resolve } from 'node:path';\nimport { readFile, writeFile } from 'node:fs/promises';\n\nexport async function setEnvValue(repoRoot: string, key: string, value: string): Promise<void> {\n const filePath = resolve(repoRoot, '.env');\n const envFileContent = await readFile(filePath, 'utf8');\n const envVars = envFileContent.split(EOL);\n\n // (?<!#\\\\s*) Negative lookbehind to avoid matching comments (lines that starts with #).\n // There is a double slash in the RegExp constructor to escape it.\n // (?==) Positive lookahead to check if there is an equal sign right after the key.\n // This is to prevent matching keys prefixed with the key of the env var to update.\n const regexString = `(?<!#\\\\s*)${key}(?==)`;\n const matchingLine = envVars.find((line: string) => line.match(regexString));\n\n if (matchingLine?.split('=').at(-1) === value) {\n console.log('env file already up to date!');\n return undefined;\n }\n\n const target = matchingLine ? envVars.indexOf(matchingLine) : -1;\n\n if (target !== -1) {\n envVars.splice(target, 1, `${key}=${value}`);\n } else {\n envVars.push(`${key}=${value}`);\n }\n\n return writeFile(filePath, envVars.join(EOL));\n}\n"],"mappings":"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","names":["cwd","randomUUID","basename","join","mkdir","writeFile","setTimeout","ensureTelepresenceInstalled","asyncSpawn_default","endWithError","leaveOrConnect","safeSelect","telepresenceWizard","values","cluster","service","connectToCluster","action","namespace","getVariationId","localPort","getLocalPort","EOL","resolve","readFile","writeFile","setEnvValue","repoRoot","key","value","filePath","envVars","regexString","matchingLine","line","target","clusterOptions","SUPPORTED_CLUSTERS","variationAndCluster","COMMANDS","isCommand","c","positionals","values","help","parseArgs","COMMAND_REQUIRED_VALUES_MAP","endWithError","command","fillMissingRequiredValues","cluster","variationId","service","repoPath","getGitPath","mirrordPath","join","mirrordConfigData","randomUUID","mkdir","writeFile","telepresenceWizard","connectToCluster","prefix","connectAndGetPrefix","error","asyncSpawn_default","podName","localPort","DB_PASSWORD","USER_NAME","variationUnderScore","DB_NAME","postgressPath","dbEnvs","setTimeout","port","stdout","parseIps","ip","SIMULATION_CLUSTER_FRONT","getArgs","dataKey","username","password","dir","basename","cwd","branchName","archResult","getCurrentBranch","arch","dateSuffix","imageName","podDescription","API_GATEWAY_MS","CONTROL_CENTER_MS","apiGatewayMsIP","setEnvValue"]}
1
+ {"version":3,"sources":["../bin/index.ts","../bin/utils/telepresenceWizard.ts","../bin/utils/env.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { cwd } from 'node:process';\nimport { randomUUID } from 'node:crypto';\nimport { basename, join } from 'node:path';\nimport { mkdir, writeFile } from 'node:fs/promises';\nimport { setTimeout } from 'node:timers/promises';\nimport parseArgs from './utils/parser.js';\nimport asyncSpawn from './utils/asyncSpawn.js';\nimport {\n SUPPORTED_CLUSTERS,\n connectAndGetPrefix, connectToCluster, endWithError, parseIps,\n} from './utils/index.js';\nimport { fillMissingRequiredValues } from './utils/inquirer.js';\nimport telepresenceWizard from './utils/telepresenceWizard.js';\nimport { getCurrentBranch, getGitPath } from './utils/git.js';\nimport { setEnvValue } from './utils/env.js';\n\nconst clusterOptions = SUPPORTED_CLUSTERS.join('/');\nconst variationAndCluster = `--variationId=<yourVariationUuid> --cluster=<${clusterOptions}>`;\n\nconst COMMANDS = {\n switchCluster: `--cluster=<${clusterOptions}>`,\n exposeService: `--service=<driver-ms> ${variationAndCluster}`,\n forwardDb: `${variationAndCluster} --local-port=<localPort>`,\n forwardService: `--service=<driver-ms> ${variationAndCluster} --port=<port> --local-port=<localPort>`,\n getIps: variationAndCluster,\n enableSimulator: variationAndCluster,\n rabbitCreds: variationAndCluster,\n updateExp: variationAndCluster,\n telepresenceWizard: `--service=<driver-ms> ${variationAndCluster} --local-port=<localPort>`,\n localDev: variationAndCluster,\n mirrord: `${variationAndCluster} --prefer-pod`,\n mirrordConfig: `--variationId=<yourVariationUuid>`,\n};\ntype Command = keyof typeof COMMANDS;\nconst isCommand = (c: string): c is Command => Object.keys(COMMANDS).includes(c);\n\nconst { positionals, values, help } = parseArgs({\n strict: true,\n binName: 'autofleet',\n allowPositionals: true,\n options: {\n cluster: {\n type: 'string',\n short: 'c',\n description: 'The cluster name. One of dev1, e2eManager, expManager',\n },\n variationId: {\n type: 'string',\n short: 'i',\n description: 'The variation id',\n },\n service: {\n type: 'string',\n short: 's',\n description: 'The service name',\n },\n port: {\n type: 'string',\n short: 'p',\n description: 'The remote port to forward',\n },\n 'local-port': {\n type: 'string',\n short: 'l',\n description: 'The local port to forward to',\n },\n 'prefer-pod': {\n type: 'boolean',\n short: 'r',\n default: false,\n description: 'Wether the mirrord command should run against the pod, rather than the deployment.',\n },\n },\n commands: COMMANDS,\n});\n\nexport type Values = typeof values;\ntype ValueWithDefault<T = keyof Values> = T | { option: T; defaultVal: string };\n\nconst COMMAND_REQUIRED_VALUES_MAP: Partial<Record<Command, ValueWithDefault[]>> = {\n switchCluster: ['cluster'],\n exposeService: ['cluster', 'variationId', 'service'],\n forwardDb: ['cluster', 'variationId', { option: 'local-port', defaultVal: '5432' }],\n forwardService: ['cluster', 'variationId', 'service', 'port'],\n telepresenceWizard: ['cluster', 'service'],\n mirrordConfig: ['variationId'],\n mirrord: ['cluster', 'variationId', 'service'],\n};\n\nif (!positionals.length) {\n console.log(help);\n process.exit(0);\n}\n\nif (positionals.length > 1) {\n endWithError('Only one command is allowed', help);\n}\n\nconst [command] = positionals;\nif (!isCommand(command)) {\n endWithError(new Error(`Command ${command} does not exist`), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n}\n\nawait fillMissingRequiredValues(values, COMMAND_REQUIRED_VALUES_MAP[command] ?? ['cluster', 'variationId']);\nconst { cluster, variationId, service } = values;\n\nif (command === 'mirrordConfig') {\n const repoPath = await getGitPath();\n const mirrordPath = join(repoPath, '.mirrord');\n const mirrordConfigData = {\n feature: {\n network: {\n incoming: 'steal',\n outgoing: true,\n },\n fs: 'read',\n env: true,\n },\n target: {\n namespace: variationId || randomUUID(),\n },\n };\n await mkdir(mirrordPath, { recursive: true });\n await writeFile(join(mirrordPath, 'mirrord.json'), JSON.stringify(mirrordConfigData));\n console.log('Wrote the default mirrord config for the requested variation ID', { mirrordConfigData });\n process.exit(0);\n}\n\nif (!cluster) {\n endWithError(new Error('cluster required'), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n}\n\nif (command === 'telepresenceWizard') {\n await telepresenceWizard(values);\n process.exit(0);\n}\n\nif (command === 'switchCluster') {\n await connectToCluster(cluster);\n console.log(`switched to ${cluster} successfully`);\n process.exit(0);\n}\n\nif (!variationId) {\n endWithError(new Error('variationId required'), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n process.exit(1);\n}\nlet prefix: string;\ntry {\n prefix = await connectAndGetPrefix({ clusterName: cluster, variationId });\n} catch (error) {\n endWithError(error as Error);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n}\n\nif (command === 'mirrord') {\n if (!values['prefer-pod']) {\n await asyncSpawn('mirrord', ['exec', '-t', `deployment/${service}`, '-n', variationId, '--steal', 'npm', 'run', 'dev']);\n process.exit(0);\n }\n let { stdout: podName } = await asyncSpawn('kubectl', ['get', 'pods', prefix, '-l', `service=${service}`, '-o', 'jsonpath=\"{.items[0].metadata.name}\"'], { print: false });\n podName &&= podName.trim();\n if (!podName) {\n endWithError(new Error(`No pods found for service ${service}`));\n }\n if (podName.startsWith('\"') && podName.endsWith('\"')) {\n podName = podName.slice(1, -1);\n }\n console.log(`Found pod ${podName}, will now start mirrord and run \"npm run dev\". Make sure to attach a debugger!`);\n\n await asyncSpawn('mirrord', ['exec', '-t', `pod/${podName}`, '-n', variationId, '--steal', 'npm', 'run', 'dev']);\n process.exit(0);\n}\n\nif (command === 'exposeService') {\n if (!service) {\n endWithError(new Error('service is required for exposeService'), help);\n throw new Error('Typescript is not clever enough to understand that endWithError will exit the process');\n }\n await asyncSpawn('kubectl', ['patch', 'svc', prefix, service, '-p', '{\"spec\": {\"type\": \"LoadBalancer\"}}']);\n console.log(`exposed ${service} successfully. the service is now creating an internal load balancer ip to use with vpn`);\n process.exit(0);\n}\n\nif (command === 'forwardDb') {\n const localPort = Number.parseInt(values['local-port'] ?? '5432', 10);\n if (Number.isNaN(localPort)) {\n endWithError(new Error('if defined, local-port must be a number'), help);\n }\n const DB_PASSWORD = `afpass_${variationId}`;\n const USER_NAME = 'postgres';\n const variationUnderScore = variationId.replaceAll('-', '_');\n const DB_NAME = service ? `${service.replaceAll('-', '_') || ''}_${variationUnderScore}` : 'postgres';\n\n const postgressPath = `postgres://${USER_NAME}:${DB_PASSWORD}@localhost:${localPort}/${DB_NAME}?&nickname=var_${variationId}`;\n console.log(`Forwarding db to local port ${localPort}.\\naccess the DB at ${postgressPath}\\nPress ctrl+c to stop.`);\n\n const dbEnvs = ` DB_USERNAME=${USER_NAME}\n DB_PASSWORD=${DB_PASSWORD}\n DB_NAME=${service ? DB_NAME : `<service_name>_${variationUnderScore}`}`;\n console.log('Generated database environment for local development:\\n', dbEnvs);\n\n setTimeout(1500).then(() => asyncSpawn('open', [postgressPath], { print: false })).catch(() => null);\n await asyncSpawn('kubectl', [prefix, 'port-forward', `statefulset/p${variationId}-postgresql`, `${localPort}:5432`], { print: false });\n process.exit(0);\n}\n\nif (command === 'forwardService') {\n const port = Number.parseInt(values.port ?? '8080', 10);\n const localPort = Number.parseInt(values['local-port'] ?? '', 10) || port;\n if (!service) {\n endWithError(new Error('service is required for forwardService'), help);\n }\n if (!port || Number.isNaN(port)) {\n endWithError(new Error('port is required and must be a numbers'), help);\n }\n if (localPort && Number.isNaN(localPort)) {\n endWithError(new Error('local-port must be a number'), help);\n }\n let { stdout: podName } = await asyncSpawn('kubectl', ['get', 'pods', prefix, '-l', `service=${service}`, '-o', 'jsonpath=\"{.items[0].metadata.name}\"'], { print: false });\n podName &&= podName.trim();\n if (!podName) {\n endWithError(new Error(`No pods found for service ${service}`));\n }\n if (podName.startsWith('\"') && podName.endsWith('\"')) {\n podName = podName.slice(1, -1);\n }\n console.log(`Found pod ${podName}, serving locally on port ${localPort} from remote port ${port}.\\nPress ctrl+c to stop.`);\n await asyncSpawn('kubectl', ['port-forward', prefix, podName, `${localPort}:${port}`], { print: false });\n process.exit(0);\n}\n\nif (command === 'getIps') {\n const { stdout } = await asyncSpawn('kubectl', [prefix, 'get', 'services'], { print: false });\n const ips = parseIps(stdout);\n ips.forEach(ip => console.log(ip));\n process.exit(0);\n}\n\nif (command === 'enableSimulator') {\n const SIMULATION_CLUSTER_FRONT = 'simulation-cluster-front';\n await asyncSpawn('kubectl', ['annotate', prefix, 'service', SIMULATION_CLUSTER_FRONT, 'cloud.google.com/load-balancer-type-']);\n await asyncSpawn('kubectl', ['patch', 'svc', prefix, SIMULATION_CLUSTER_FRONT, '-p', '{\"spec\": {\"type\": \"LoadBalancer\"}}']);\n await asyncSpawn('kubectl', ['create', prefix, 'rolebinding', 'admin', '--clusterrole=cluster-admin', `--serviceaccount=${variationId}:default`]);\n console.log(`Successfully exposed ${SIMULATION_CLUSTER_FRONT} and added role binding to dispatch simulations`);\n process.exit(0);\n}\n\nif (command === 'rabbitCreds') {\n const getArgs = (dataKey: string) => ['get', 'secret', 'rabbitmq-default-user', '-o', `jsonpath=\"{.data.${dataKey}}\"`];\n const [{ stdout: username }, { stdout: password }] = await Promise.all([\n asyncSpawn('kubectl', getArgs('username'), { print: false }),\n asyncSpawn('kubectl', getArgs('password'), { print: false }),\n ]);\n console.log(`username: ${Buffer.from(username, 'base64').toString('ascii')}`);\n console.log(`password: ${Buffer.from(password, 'base64').toString('ascii')}`);\n process.exit(0);\n}\n\nif (command === 'updateExp') {\n const dir = basename(cwd());\n const [branchName, archResult] = await Promise.all([getCurrentBranch(), asyncSpawn('uname', ['-m'], { print: false })]);\n const arch = archResult.stdout.trim();\n const dateSuffix = `${new Date().getHours().toString().padStart(2, '0')}-${new Date().getMinutes().toString().padStart(2, '0')}-${new Date().getSeconds().toString().padStart(2, '0')}`;\n const imageName = `gcr.io/autofleetprod/${dir}:${branchName}-${dateSuffix}`;\n console.log(`Building and pushing image ${imageName}`);\n const platformFlag = arch === 'x86_64' ? [] : ['--platform', 'linux/amd64'];\n await asyncSpawn('docker', ['build', '.', ...platformFlag, '-t', imageName, '--build-arg', `NPM_TOKEN=${process.env.NPM_TOKEN}`]);\n await asyncSpawn('docker', ['push', imageName]);\n const { stdout: podDescription } = await asyncSpawn('kubectl', ['describe', 'pod', prefix, '-l', `service=${dir}`], { print: false });\n if (podDescription.includes('Init Containers:')) {\n await asyncSpawn('kubectl', ['patch', `deployment/${dir}`, prefix, '--patch', `{\"spec\": {\"template\": {\"spec\": {\"initContainers\": [{\"name\": \"init\",\"image\": \"${imageName}\"}]}}}}`]);\n }\n await asyncSpawn('kubectl', ['set', 'image', `deployment/${dir}`, `worker=${imageName}`, prefix]);\n await asyncSpawn('kubectl', ['rollout', 'status', 'deployments', dir, prefix]);\n process.exit(0);\n}\n\nif (command === 'localDev') {\n const LOCAL_ENV_NAME = 'LOCAL_ENV_NAME';\n const API_GATEWAY_MS = 'api-gateway-ms';\n const CONTROL_CENTER_MS = 'control-center-ms';\n const envNameToUse = cluster === 'staging' ? 'staging' : `simulator-${variationId}`;\n\n const repoPath = await getGitPath();\n if (basename(repoPath) !== 'control-center') {\n endWithError(new Error('The `localDev` command must be run from the control-center repository'));\n }\n const { stdout: apiGatewayMsIP } = await asyncSpawn('kubectl', ['get', 'ingress', `${API_GATEWAY_MS}-ingress`, prefix, '-o', 'jsonpath=\"{.status.loadBalancer.ingress[0].ip}\"'], { print: false });\n if (!apiGatewayMsIP) {\n endWithError(new Error(`The IP of the Load balancer for ${API_GATEWAY_MS} was not found`));\n }\n const changedIP = await setEnvValue(repoPath, 'API_GATEWAY_MS_SERVICE_HOST', apiGatewayMsIP.replace(/\"/g, ''));\n const changedEnvName = await setEnvValue(repoPath, LOCAL_ENV_NAME, envNameToUse);\n const msg = `${\n changedIP ? `Updated .env file to use ${API_GATEWAY_MS} IP (${apiGatewayMsIP}).\\n` : ''\n }${\n changedEnvName ? `Updated .env file ${LOCAL_ENV_NAME} to ${envNameToUse} (used for firebase setup).\\n` : ''\n }Port-forwarding of ${CONTROL_CENTER_MS} will now start to port 8085.\\nPress ctrl+c to stop.`;\n console.log(msg);\n await asyncSpawn('kubectl', ['port-forward', prefix, `svc/${CONTROL_CENTER_MS}`, '8085:80'], { print: false });\n process.exit(0);\n}\n","import asyncSpawn from './asyncSpawn.js';\nimport { getVariationId, getLocalPort, safeSelect } from './inquirer.js';\nimport { connectToCluster, endWithError } from './index.js';\nimport type { Values } from '../index.js';\n\nasync function ensureTelepresenceInstalled() {\n try {\n await asyncSpawn('telepresence', ['version'], { print: false });\n } catch {\n endWithError('Telepresence is not installed. Please install it from:\\nhttps://www.telepresence.io/docs/latest/quick-start/');\n }\n}\n\nfunction leaveOrConnect() {\n return safeSelect({\n message: 'Do you want to leave the connection or create a new one?',\n choices: [\n { name: 'Leave the current connection', value: 'leave' },\n { name: 'Create a new connection', value: 'connect' },\n ] as const,\n default: 'connect',\n });\n}\n\nexport default async function telepresenceWizard(values: Values): Promise<void> {\n await ensureTelepresenceInstalled();\n\n const { cluster = '', service = '' } = values; // Values should be defined by now, thanks to inquirer. Default to hint to TS we always have values.\n await connectToCluster(cluster);\n\n const action = await leaveOrConnect();\n if (!['leave', 'connect'].includes(action!)) {\n endWithError('Invalid action, how did you get here? 🤔');\n }\n if (action === 'leave') {\n await asyncSpawn('telepresence', ['leave', service]);\n console.log('Disconnected! 👋');\n return;\n }\n const namespace = values.variationId || await getVariationId();\n const localPort = (values['local-port'] && Number.parseInt(values['local-port'], 10)) || Number.parseInt((await getLocalPort()) || '', 10);\n await asyncSpawn('telepresence', ['connect', `--namespace=${namespace}`]);\n await asyncSpawn('telepresence', ['intercept', service, '--port', localPort.toString(), '--env-file=./.env']);\n console.log('Everything is set up! 🚀');\n console.log(`You can now access the service at localhost:${localPort}`);\n console.log('You can only have one connection at a time. If you want to connect to a different service, you need to leave the current connection first.');\n}\n","import { EOL } from 'node:os';\nimport { resolve } from 'node:path';\nimport { readFile, writeFile } from 'node:fs/promises';\n\nexport async function setEnvValue(repoRoot: string, key: string, value: string): Promise<boolean> {\n const filePath = resolve(repoRoot, '.env');\n const envFileContent = await readFile(filePath, 'utf8');\n const envVars = envFileContent.split(EOL);\n\n // (?<!#\\\\s*) Negative lookbehind to avoid matching comments (lines that starts with #).\n // There is a double slash in the RegExp constructor to escape it.\n // (?==) Positive lookahead to check if there is an equal sign right after the key.\n // This is to prevent matching keys prefixed with the key of the env var to update.\n const regexString = `(?<!#\\\\s*)${key}(?==)`;\n const matchingLine = envVars.find((line: string) => line.match(regexString));\n\n if (matchingLine?.split('=').at(-1) === value) {\n return false;\n }\n\n const target = matchingLine ? envVars.indexOf(matchingLine) : -1;\n\n if (target !== -1) {\n envVars.splice(target, 1, `${key}=${value}`);\n } else {\n envVars.push(`${key}=${value}`);\n }\n\n await writeFile(filePath, envVars.join(EOL));\n return true;\n}\n"],"mappings":"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","names":["cwd","randomUUID","basename","join","mkdir","writeFile","setTimeout","ensureTelepresenceInstalled","asyncSpawn_default","endWithError","leaveOrConnect","safeSelect","telepresenceWizard","values","cluster","service","connectToCluster","action","namespace","getVariationId","localPort","getLocalPort","EOL","resolve","readFile","writeFile","setEnvValue","repoRoot","key","value","filePath","envVars","regexString","matchingLine","line","target","clusterOptions","SUPPORTED_CLUSTERS","variationAndCluster","COMMANDS","isCommand","c","positionals","values","help","parseArgs","COMMAND_REQUIRED_VALUES_MAP","endWithError","command","fillMissingRequiredValues","cluster","variationId","service","repoPath","getGitPath","mirrordPath","join","mirrordConfigData","randomUUID","mkdir","writeFile","telepresenceWizard","connectToCluster","prefix","connectAndGetPrefix","error","asyncSpawn_default","podName","localPort","DB_PASSWORD","USER_NAME","variationUnderScore","DB_NAME","postgressPath","dbEnvs","setTimeout","port","stdout","parseIps","ip","SIMULATION_CLUSTER_FRONT","getArgs","dataKey","username","password","dir","basename","cwd","branchName","archResult","getCurrentBranch","arch","dateSuffix","imageName","podDescription","LOCAL_ENV_NAME","API_GATEWAY_MS","CONTROL_CENTER_MS","envNameToUse","apiGatewayMsIP","changedIP","setEnvValue","changedEnvName","msg"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/cli",
3
- "version": "2.5.9",
3
+ "version": "2.6.0",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {