@autofleet/cli 2.10.1 → 2.10.2

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 A=(e,t)=>(t=Symbol[e])?t:Symbol.for("Symbol."+e),C=e=>{throw TypeError(e)};var $=(e,t,r)=>{if(t!=null){typeof t!="object"&&typeof t!="function"&&C("Object expected");var o,s;r&&(o=t[A("asyncDispose")]),o===void 0&&(o=t[A("dispose")],r&&(s=o)),typeof o!="function"&&C("Object not disposable"),s&&(o=function(){try{s.call(this)}catch(i){return Promise.reject(i)}}),e.push([r,o,t])}else r&&e.push([r]);return t},j=(e,t,r)=>{var o=typeof SuppressedError=="function"?SuppressedError:function(n,a,p,l){return l=Error(p),l.name="SuppressedError",l.error=n,l.suppressed=a,l},s=n=>t=r?new o(n,t,"An error was suppressed during disposal"):(r=!0,n),i=n=>{for(;n=e.pop();)try{var a=n[1]&&n[1].call(n[2]);if(n[0])return Promise.resolve(a).then(i,p=>(s(p),i()))}catch(p){s(p)}if(r)throw t};return i()};import{parseArgs as W}from"node:util";var R="2.10.1";var G={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 q(e){e.options={...G,...e.options};let t=W(e),{values:r}=t;r.version&&(console.log(R),process.exit(0));let o=e.commands?`
1
+ var A=(e,t)=>(t=Symbol[e])?t:Symbol.for("Symbol."+e),C=e=>{throw TypeError(e)};var $=(e,t,r)=>{if(t!=null){typeof t!="object"&&typeof t!="function"&&C("Object expected");var o,s;r&&(o=t[A("asyncDispose")]),o===void 0&&(o=t[A("dispose")],r&&(s=o)),typeof o!="function"&&C("Object not disposable"),s&&(o=function(){try{s.call(this)}catch(i){return Promise.reject(i)}}),e.push([r,o,t])}else r&&e.push([r]);return t},j=(e,t,r)=>{var o=typeof SuppressedError=="function"?SuppressedError:function(n,a,p,l){return l=Error(p),l.name="SuppressedError",l.error=n,l.suppressed=a,l},s=n=>t=r?new o(n,t,"An error was suppressed during disposal"):(r=!0,n),i=n=>{for(;n=e.pop();)try{var a=n[1]&&n[1].call(n[2]);if(n[0])return Promise.resolve(a).then(i,p=>(s(p),i()))}catch(p){s(p)}if(r)throw t};return i()};import{parseArgs as W}from"node:util";var R="2.10.2";var G={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 q(e){e.options={...G,...e.options};let t=W(e),{values:r}=t;r.version&&(console.log(R),process.exit(0));let o=e.commands?`
2
2
 
3
3
  Commands:
4
4
  ${Object.entries(e.commands).map(([n,a])=>`${n.padEnd(30," ")} ${a}`).join(`
@@ -10,5 +10,5 @@ Options:
10
10
  `)}
11
11
  `;return r.help&&(console.log(i),process.exit(0)),{...t,help:i}}import{spawn as B}from"node:child_process";var O=()=>{if(Promise.withResolvers)return Promise.withResolvers();let e,t;return{promise:new Promise((o,s)=>{e=s,t=o}),reject:e,resolve:t}};var d=async(e,t,{print:r=!0,env:o={},signal:s,shell:i}={})=>{typeof t=="boolean"&&(r=t,t=void 0);let n=new Error,a=n.stack?n.stack.replace(/^.*/," ..."):null,{promise:p,reject:l,resolve:y}=O(),c=B(e,t,{env:Object.assign(o,process.env),signal:s,shell:i});r&&(c.stdout.pipe(process.stdout),c.stderr.pipe(process.stderr));let f="",P="";c.stdout?.on("data",u=>{f+=u}),c.stderr?.on("data",u=>{P+=u});let x=r?"exit":"close";function w(u){c.removeListener(x,b),Object.assign(u,{pid:c.pid,stdout:f,stderr:P,status:null,signal:null}),l(u)}function b(u,v){c.removeListener("error",w);let S={pid:c.pid,stdout:f,stderr:P,status:u,signal:v};if(u!==0){let _=typeof t!="boolean"&&` ${t?.join(" ")}`||"",m=v?new Error(`${e}${_} exited with signal: ${v}`):new Error(`${e}${_} exited with non-zero code: ${u}`);m.stack&&a&&(m.stack+=`
12
12
  ${a}`),Object.assign(m,S),l(m)}else y(S)}return c.once(x,b),c.once("error",w),p};var Pe=async()=>{let{stdout:e}=await d("git",["branch","--show-current"],{print:!1});return e.trim()},L=async()=>{let{stdout:e}=await d("git",["rev-parse","--show-toplevel"],{print:!1});return e.trim()},ve=async e=>{let{stdout:t}=await d("git",["diff","origin/master..",e],{print:!1});return t},he=async e=>{try{return await d("git",["check-ignore",e],{print:!1}),!0}catch{return!1}};import{confirm as X,input as E,select as Z}from"@inquirer/prompts";import k from"node:fs";var J="SERVICE_HOST",M={prodUs:["us-autofleet-production","us-central1","autofleet-production"],prodEu:["autofleetprod","europe-west1","autofleetprod"],prodJp:["jp-autofleet-production","asia-northeast1","autofleet-japan"]},I={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"],loadTest:["lt-autofleet-production","asia-northeast1","load-testing-428806"],...M},U=Object.keys(I),z=async e=>{let t=I[e];if(!t)throw new Error(`Cluster name ${e} does not exist!`);let[r,o,s]=t;return M[e]&&!await D(`\u274C\u274C Are you sure you want to run this command on ${e}? \u274C\u274C`,!1)?(console.log("Aborting..."),process.exit(1)):{name:r,region:o,project:s}},be=({newFilePath:e,filePath:t,linesToReplace:r})=>{let o=k.readFileSync(t,"utf8");for(let{find:s,replace:i}of r)o=o.replace(s,i);k.writeFileSync(e,o)},H=async e=>{let{name:t,region:r,project:o}=await z(e);return await d("gcloud",["container","clusters","get-credentials",t,"--region",r,"--project",o||t],{print:!1}),console.log(`Switched to ${e} successfully`),{name:t,region:r,project:o}},Se=async({clusterName:e,variationId:t})=>(await H(e),`--namespace=${t}`),_e=e=>{let t=e.split(`
13
- `).filter(Boolean);t.shift();let r=t.map(o=>{let[s,i,n,a,p,l]=o.split(/(\s+)/).map(f=>f.trim()).filter(Boolean);return`${s.replace(/-/g,"_").toUpperCase()}_${J}=${a}`});return r=r.filter(o=>!o.includes("none")&&!o.includes("undefined")),r},h=(e,t)=>(e instanceof Error||(e=new Error(e)),console.error(e),t&&console.log(t),process.exit(1));import{sep as K}from"path";Symbol.dispose??=Symbol.for("nodejs.dispose");Symbol.asyncDispose??=Symbol.for("nodejs.asyncDispose");var T,V=()=>T?.();function Q(){return process.once("beforeExit",V),{[Symbol.dispose](){process.off("beforeExit",V),T=void 0}}}async function g(e,...t){try{var r=[];try{let n=$(r,Q());let a=e(...t);T=a.cancel;return await a}catch(o){var s=o,i=!0}finally{j(r,s,i)}}catch(n){n instanceof Error&&["CancelPromptError","ExitPromptError"].includes(n.constructor.name)&&h("Cancelled! \u{1F44B}"),h(n)}}function Y(...e){return g(Z,...e)}var ee=e=>e.charAt(0).toUpperCase()+e.slice(1).split(/(?=[A-Z])/).join(" ");function te(){return Y({message:"Which environment do you want to use?",choices:U.map(e=>({name:ee(e),value:e})),default:"expManager"})}async function re(){let t=(await L()).split(K).pop();return g(E,{message:"Enter the service name:",default:t})}function oe(e=""){return g(E,{message:"Enter your simulator id (Press enter to pass):",default:e})}async function F(e="8080",t=!1){return g(E,{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 ne(e="5432"){return F(e,!0)}var se={cluster:te,variationId:oe,service:re,port:(e="8080")=>F(e),"local-port":ne};async function Oe(e,t){for(let r of t){let o=typeof r=="object"?r.option:r,s=typeof r=="object"?r.defaultVal:void 0;if(typeof o!="string")throw new Error(`Invalid option ${String(o)}`);let i=se[o];if(!i)throw new Error(`No value getter for ${String(o)}`);e[o]??=await i(s)}return e}async function D(e,t=!0){return g(X,{message:e,default:t})}export{q as a,O as b,d as c,Pe as d,L as e,ve as f,he as g,Y as h,oe as i,ne as j,Oe as k,D as l,U as m,be as n,H as o,Se as p,_e as q,h as r};
14
- //# sourceMappingURL=chunk-U3FWRRER.js.map
13
+ `).filter(Boolean);t.shift();let r=t.map(o=>{let[s,i,n,a,p,l]=o.split(/(\s+)/).map(f=>f.trim()).filter(Boolean);return`${s.replace(/-/g,"_").toUpperCase()}_${J}=${a}`});return r=r.filter(o=>!o.includes("none")&&!o.includes("undefined")),r},h=(e,t)=>(e instanceof Error||(e=new Error(e)),console.error(e),t&&console.log(t),process.exit(1));import{sep as K}from"path";Symbol.dispose??=Symbol.for("nodejs.dispose");Symbol.asyncDispose??=Symbol.for("nodejs.asyncDispose");var T,V=()=>T?.();function Q(){return process.once("beforeExit",V),{[Symbol.dispose](){process.off("beforeExit",V),T=void 0}}}async function g(e,...t){try{var r=[];try{let n=$(r,Q());let a=e(...t);T=a.cancel;return await a}catch(o){var s=o,i=!0}finally{j(r,s,i)}}catch(n){n instanceof Error&&["CancelPromptError","ExitPromptError"].includes(n.constructor.name)&&h("Cancelled! \u{1F44B}"),h(n)}}function Y(...e){return g(Z,...e)}var ee=e=>e.charAt(0).toUpperCase()+e.slice(1).split(/(?=[A-Z])/).join(" ");function te(){return Y({message:"Which environment do you want to use?",choices:U.map(e=>({name:ee(e),value:e})),default:"expManager"})}async function re(){let t=(await L()).split(K).pop();return g(E,{message:"Enter the service name:",default:t})}function oe(e="default"){return g(E,{message:"Enter your simulator id (Press enter to pass):",default:e})}async function F(e="8080",t=!1){return g(E,{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 ne(e="5432"){return F(e,!0)}var se={cluster:te,variationId:oe,service:re,port:(e="8080")=>F(e),"local-port":ne};async function Oe(e,t){for(let r of t){let o=typeof r=="object"?r.option:r,s=typeof r=="object"?r.defaultVal:void 0;if(typeof o!="string")throw new Error(`Invalid option ${String(o)}`);let i=se[o];if(!i)throw new Error(`No value getter for ${String(o)}`);e[o]??=await i(s)}return e}async function D(e,t=!0){return g(X,{message:e,default:t})}export{q as a,O as b,d as c,Pe as d,L as e,ve as f,he as g,Y as h,oe as i,ne as j,Oe as k,D as l,U as m,be as n,H as o,Se as p,_e as q,h as r};
14
+ //# sourceMappingURL=chunk-QMSNCYJF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../bin/utils/parser.ts","../package.json","../bin/utils/asyncSpawn.ts","../bin/utils/promise.ts","../bin/utils/git.ts","../bin/utils/inquirer.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.10.2\",\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';\nimport { createDeferredPromise } from './promise.js';\n\ninterface SpawnResult {\n pid?: number;\n stdout: string;\n stderr: string;\n status: number | null;\n signal: string | null;\n}\n\nexport default async (command: string, args?: boolean | readonly string[], { print = true, env = {}, signal, shell }: { print?: boolean; env?: NodeJS.ProcessEnv; signal?: AbortSignal; shell?: string | boolean } = {}) => {\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), signal, shell });\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","declare 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\nexport const 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","import asyncSpawn from './asyncSpawn.js';\n\nexport const getCurrentBranch = async () => {\n const { stdout: currentBranch } = await asyncSpawn('git', ['branch', '--show-current'], { print: false });\n return currentBranch.trim();\n};\n\nexport const getGitPath = async () => {\n const { stdout: gitPath } = await asyncSpawn('git', ['rev-parse', '--show-toplevel'], { print: false });\n return gitPath.trim();\n};\n\nexport const getChangesOfFile = async (filePath: string) => {\n const { stdout: changes } = await asyncSpawn('git', ['diff', 'origin/master..', filePath], { print: false });\n return changes;\n};\n\nexport const isPathIgnored = async (path: string) => {\n try {\n await asyncSpawn('git', ['check-ignore', path], { print: false });\n return true;\n } catch {\n return false;\n }\n};\n","import { confirm, input, select } from '@inquirer/prompts';\nimport type { Prompt } from '@inquirer/type';\nimport { getGitPath } from './git.js';\nimport { SUPPORTED_CLUSTERS, endWithError } from './index.js';\nimport { sep } from 'path';\n\ndeclare global {\n interface SymbolConstructor {\n /** A method that is used to release resources held by an object. Called by the semantics of the `using` statement. */\n readonly dispose: unique symbol;\n /** A method that is used to asynchronously release resources held by an object. Called by the semantics of the `await using` statement. */\n readonly asyncDispose: unique symbol;\n }\n}\n// @ts-expect-error polyfill for node < 18.18\nSymbol.dispose ??= Symbol.for('nodejs.dispose');\n// @ts-expect-error polyfill for node < 18.18\nSymbol.asyncDispose ??= Symbol.for('nodejs.asyncDispose');\nlet cancelFn: (() => void) | undefined;\nconst handler = () => cancelFn?.();\nfunction addExitListener() {\n process.once('beforeExit', handler);\n return {\n [Symbol.dispose]() {\n process.off('beforeExit', handler);\n cancelFn = undefined;\n },\n };\n}\n\nasync function inquirerWrapper<Value, Config>(fn: Prompt<Value, Config>, ...params: Parameters<Prompt<Value, Config>>) {\n try {\n using _ = addExitListener();\n const result = fn(...params);\n cancelFn = result.cancel;\n return await result;\n } catch (error) {\n if (error instanceof Error && ['CancelPromptError', 'ExitPromptError'].includes(error.constructor.name)) {\n endWithError('Cancelled! 👋');\n }\n endWithError(error as Error);\n }\n}\n\nexport function safeSelect<Value>(...params: Parameters<typeof select<Value>>) {\n return inquirerWrapper(select, ...params);\n}\n\nconst splitWordAtCapital = (str: string) => str.charAt(0).toUpperCase() + str.slice(1).split(/(?=[A-Z])/).join(' ');\n\nfunction getEnvironment() {\n return safeSelect({\n message: 'Which environment do you want to use?',\n choices: SUPPORTED_CLUSTERS.map(cluster => ({ name: splitWordAtCapital(cluster), value: cluster })),\n default: 'expManager',\n });\n}\n\nasync function getServiceName() {\n const currentServicePath = await getGitPath();\n const defaultValue = currentServicePath.split(sep).pop();\n return inquirerWrapper(input, { message: 'Enter the service name:', default: defaultValue });\n}\n\nexport function getVariationId(defaultVal = 'default') {\n return inquirerWrapper(input, { message: 'Enter your simulator id (Press enter to pass):', default: defaultVal });\n}\n\nasync function getPort(defaultVal = '8080', isLocal = false) {\n return inquirerWrapper(input, {\n message: `Enter the ${isLocal ? 'local ' : ''}port:`,\n default: defaultVal,\n validate(value) {\n // Regex source: https://stackoverflow.com/a/12968117\n if (!/^([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(value)) {\n return 'Please enter a valid port number';\n }\n return true;\n },\n });\n}\n\nexport async function getLocalPort(defaultVal = '5432') {\n return getPort(defaultVal, true);\n}\n\nconst VALUE_GETTER_MAP = {\n cluster: getEnvironment,\n variationId: getVariationId,\n service: getServiceName,\n port: (defaultVal = '8080') => getPort(defaultVal),\n 'local-port': getLocalPort,\n} as const;\n\nexport async function fillMissingRequiredValues<T extends { [key in keyof typeof VALUE_GETTER_MAP]?: string }>(values: T, requiredValues: (keyof T | { option: keyof T; defaultVal: string })[]) {\n for (const value of requiredValues) {\n const option = typeof value === 'object' ? value.option : value;\n const defaultVal = typeof value === 'object' ? value.defaultVal : undefined;\n if (typeof option !== 'string') {\n throw new Error(`Invalid option ${String(option)}`);\n }\n const getter = VALUE_GETTER_MAP[option as keyof typeof VALUE_GETTER_MAP];\n if (!getter) {\n throw new Error(`No value getter for ${String(option)}`);\n }\n\n values[option] ??= await getter(defaultVal) as T[keyof T & string];\n }\n return values;\n}\n\nexport async function promptForConfirmation(message: string, defaultVal = true) {\n return inquirerWrapper(confirm, { message, default: defaultVal });\n}\n","#!/usr/bin/env node\nimport fs from 'node:fs';\nimport asyncSpawn from './asyncSpawn.js';\nimport { promptForConfirmation } from './inquirer.js';\n\nconst IP_LINE_SUFFIX = 'SERVICE_HOST';\nconst PROD_CLUSTER_TO_CMD_MAP = {\n prodUs: ['us-autofleet-production', 'us-central1', 'autofleet-production'],\n prodEu: ['autofleetprod', 'europe-west1', 'autofleetprod'],\n prodJp: ['jp-autofleet-production', 'asia-northeast1', 'autofleet-japan'],\n};\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 loadTest: ['lt-autofleet-production', 'asia-northeast1', 'load-testing-428806'],\n ...PROD_CLUSTER_TO_CMD_MAP,\n};\n\nexport const SUPPORTED_CLUSTERS = Object.keys(CLUSTER_TO_CMD_MAP) as (keyof typeof CLUSTER_TO_CMD_MAP)[];\n\nconst getClusterDetails = 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\n if (\n PROD_CLUSTER_TO_CMD_MAP[clusterName as keyof typeof PROD_CLUSTER_TO_CMD_MAP]\n && !(await promptForConfirmation(`❌❌ Are you sure you want to run this command on ${clusterName}? ❌❌`, false))) {\n console.log('Aborting...');\n return process.exit(1);\n }\n\n return { name, region, project };\n};\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};\n\nexport const connectToCluster = async (clusterName: string) => {\n const { name, region, project } = await getClusterDetails(clusterName);\n\n await asyncSpawn('gcloud', ['container', 'clusters', 'get-credentials', name, '--region', region, '--project', project || name], { print: false });\n\n console.log(`Switched to ${clusterName} successfully`);\n\n return { name, region, project };\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","signal","shell","stubError","callerStack","promise","reject","resolve","createDeferredPromise","child","spawn","stdout","stderr","data","completionEventName","errorListener","error","completionListener","code","result","argumentString","getCurrentBranch","currentBranch","asyncSpawn_default","getGitPath","gitPath","getChangesOfFile","filePath","changes","isPathIgnored","path","confirm","input","select","fs","IP_LINE_SUFFIX","PROD_CLUSTER_TO_CMD_MAP","CLUSTER_TO_CMD_MAP","SUPPORTED_CLUSTERS","getClusterDetails","clusterName","command","name","region","project","promptForConfirmation","replaceInFile","newFilePath","filePath","linesToReplace","fileAsString","fs","find","replace","connectToCluster","asyncSpawn_default","connectAndGetPrefix","variationId","parseIps","ips","ipLines","formattedIps","ipLine","_type","_clusterIp","externalIp","_port","_age","s","formattedIp","endWithError","error","helpText","sep","cancelFn","handler","addExitListener","inquirerWrapper","fn","params","_stack","_","__using","result","_error","_hasError","__callDispose","error","endWithError","safeSelect","select","splitWordAtCapital","str","getEnvironment","SUPPORTED_CLUSTERS","cluster","getServiceName","defaultValue","getGitPath","sep","input","getVariationId","defaultVal","getPort","isLocal","value","getLocalPort","VALUE_GETTER_MAP","fillMissingRequiredValues","values","requiredValues","option","getter","promptForConfirmation","message","confirm"]}
package/dist/e2e.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{a as p,c as t,n as m,p as d,q as h,r as s}from"./chunk-U3FWRRER.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{a as p,c as t,n as m,p as d,q as h,r as s}from"./chunk-QMSNCYJF.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 g,c as r,d as l,e as u,f as w,h as b,l as d,r as n}from"./chunk-U3FWRRER.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 g,c as r,d as l,e as u,f as w,h as b,l as d,r as n}from"./chunk-QMSNCYJF.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,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import{a as z,b as J,c as r,d as Q,e as x,g as Y,h as $,i as K,j as X,k as I,m as Z,o as v,p as ee,q as te,r as c}from"./chunk-U3FWRRER.js";import{join as re}from"node:path";import{randomUUID as ge}from"node:crypto";import{mkdir as we,writeFile as he,readFile as be}from"node:fs/promises";var k=".mirrord";async function oe({makeDir:e=!1}={}){let o=await x(),t=re(o,k);return e&&await we(t,{recursive:!0}),re(t,"mirrord.json")}async function ae(e){let o=await oe({makeDir:!0}),t={feature:{network:{incoming:"steal",outgoing:!0},fs:"read",env:!0},target:{namespace:e||ge()}};return await he(o,JSON.stringify(t)),{mirrordConfigData:t,mirrordPath:o}}async function se(){try{let e=await oe(),o=await be(e,{encoding:"utf-8"});return JSON.parse(o||"{}")?.target?.namespace??""}catch{return""}}function ne(e){process.once("exit",e),process.once("SIGTERM",e),process.once("SIGINT",e)}function ie(e){return e&&=e.trim(),e&&(e.startsWith("'")&&e.endsWith("'")&&(e=e.slice(1,-1)),e)}var _="livenessProbe",N="readinessProbe",ce=e=>`jsonpath='{.spec.template.spec.containers[?(@.name=="worker")].${e}}'`,le=(...e)=>`{"spec": {"template": {"spec": {"containers": [{"name": "worker",${e.map(([o,t])=>`"${o}": ${t}`).join(",")}}]}}}}`,R=async(e,o,t)=>{console.log("Will now disable health check to allow debugging.");let[{stdout:s},{stdout:n}]=await Promise.all([await r("kubectl",["get",`deployment/${t}`,e,"-o",ce(_)],{print:!1}),await r("kubectl",["get",`deployment/${t}`,e,"-o",ce(N)],{print:!1})]);s&&=ie(s),n&&=ie(n),(s||n)&&(await r("kubectl",["patch",`deployment/${t}`,e,"--patch",le([_,"null"],[N,"null"])],{print:!1}),console.log('Health check disabled, will now start mirrord and run "npm run dev". Make sure to attach a debugger!'));let i=new AbortController;ne(async()=>{globalThis.executedExitHooks||(globalThis.executedExitHooks=!0,i.abort(),(s||n)&&(console.log("Re-enabling health check."),await r("kubectl",["patch",`deployment/${t}`,e,"--patch",`'${le([_,s],[N,n])}'`],{print:!1,shell:!0}),console.log("health check enabled.")),process.exit(0))});try{await r("mirrord",["exec","-t",`deployment/${t}`,"-n",o,"--steal","npm","run","dev"],{signal:i.signal})}catch(a){if(a&&typeof a=="object"&&"code"in a&&a.code==="ABORT_ERR")return;c(a)}};var T=async(e,o)=>{if(await v(e),e==="expManager"||e==="dev1"){let{variationId:t}=await I({variationId:o},["variationId"]);t!==""&&(await r("kubectl",["config","set-context","--current",`--namespace=${t}`],{print:!1}),console.log(`Switched to simulation with uuid: ${t} successfully`))}process.exit(0)};async function ve(){try{await r("telepresence",["version"],{print:!1})}catch{c(`Telepresence is not installed. Please install it from:
2
+ import{a as z,b as J,c as r,d as Q,e as x,g as Y,h as $,i as K,j as X,k as I,m as Z,o as v,p as ee,q as te,r as c}from"./chunk-QMSNCYJF.js";import{join as re}from"node:path";import{randomUUID as ge}from"node:crypto";import{mkdir as we,writeFile as he,readFile as be}from"node:fs/promises";var k=".mirrord";async function oe({makeDir:e=!1}={}){let o=await x(),t=re(o,k);return e&&await we(t,{recursive:!0}),re(t,"mirrord.json")}async function ae(e){let o=await oe({makeDir:!0}),t={feature:{network:{incoming:"steal",outgoing:!0},fs:"read",env:!0},target:{namespace:e||ge()}};return await he(o,JSON.stringify(t)),{mirrordConfigData:t,mirrordPath:o}}async function se(){try{let e=await oe(),o=await be(e,{encoding:"utf-8"});return JSON.parse(o||"{}")?.target?.namespace??""}catch{return""}}function ne(e){process.once("exit",e),process.once("SIGTERM",e),process.once("SIGINT",e)}function ie(e){return e&&=e.trim(),e&&(e.startsWith("'")&&e.endsWith("'")&&(e=e.slice(1,-1)),e)}var _="livenessProbe",N="readinessProbe",ce=e=>`jsonpath='{.spec.template.spec.containers[?(@.name=="worker")].${e}}'`,le=(...e)=>`{"spec": {"template": {"spec": {"containers": [{"name": "worker",${e.map(([o,t])=>`"${o}": ${t}`).join(",")}}]}}}}`,R=async(e,o,t)=>{console.log("Will now disable health check to allow debugging.");let[{stdout:s},{stdout:n}]=await Promise.all([await r("kubectl",["get",`deployment/${t}`,e,"-o",ce(_)],{print:!1}),await r("kubectl",["get",`deployment/${t}`,e,"-o",ce(N)],{print:!1})]);s&&=ie(s),n&&=ie(n),(s||n)&&(await r("kubectl",["patch",`deployment/${t}`,e,"--patch",le([_,"null"],[N,"null"])],{print:!1}),console.log('Health check disabled, will now start mirrord and run "npm run dev". Make sure to attach a debugger!'));let i=new AbortController;ne(async()=>{globalThis.executedExitHooks||(globalThis.executedExitHooks=!0,i.abort(),(s||n)&&(console.log("Re-enabling health check."),await r("kubectl",["patch",`deployment/${t}`,e,"--patch",`'${le([_,s],[N,n])}'`],{print:!1,shell:!0}),console.log("health check enabled.")),process.exit(0))});try{await r("mirrord",["exec","-t",`deployment/${t}`,"-n",o,"--steal","npm","run","dev"],{signal:i.signal})}catch(a){if(a&&typeof a=="object"&&"code"in a&&a.code==="ABORT_ERR")return;c(a)}};var T=async(e,o)=>{if(await v(e),e==="expManager"||e==="dev1"){let{variationId:t}=await I({variationId:o},["variationId"]);t!==""&&(await r("kubectl",["config","set-context","--current",`--namespace=${t}`],{print:!1}),console.log(`Switched to simulation with uuid: ${t} successfully`))}process.exit(0)};async function ve(){try{await r("telepresence",["version"],{print:!1})}catch{c(`Telepresence is not installed. Please install it from:
3
3
  https://www.telepresence.io/docs/latest/quick-start/`)}}function ye(){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 P(e){await ve();let{cluster:o="",service:t=""}=e;await v(o);let s=await ye();if(["leave","connect"].includes(s)||c("Invalid action, how did you get here? \u{1F914}"),s==="leave"){await r("telepresence",["leave",t]),console.log("Disconnected! \u{1F44B}");return}let n=e.variationId||await K(),i=e["local-port"]&&Number.parseInt(e["local-port"],10)||Number.parseInt(await X()||"",10);await r("telepresence",["connect",`--namespace=${n}`]),await r("telepresence",["intercept",t,"--port",i.toString(),"--env-file=./.env"]),console.log("Everything is set up! \u{1F680}"),console.log(`You can now access the service at localhost:${i}`),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."),process.exit(0)}var D=async(e,o,t)=>{if(!t)throw c(new Error("service is required for exposeService"),o),new Error("Typescript is not clever enough to understand that endWithError will exit the process");await r("kubectl",["patch","svc",e,t,"-p",'{"spec": {"type": "LoadBalancer"}}']),console.log(`exposed ${t} successfully. the service is now creating an internal load balancer ip to use with vpn`),process.exit(0)};import{setTimeout as Se}from"node:timers/promises";var A=async(e,o,t,s,n)=>{let i=Number.parseInt(e["local-port"]??"5432",10);Number.isNaN(i)&&c(new Error("if defined, local-port must be a number"),s);let a=`afpass_${t}`,d="postgres",p=t.replaceAll("-","_"),l=n?`${n.replaceAll("-","_")||""}_${p}`:"postgres",f=`postgres://${d}:${a}@localhost:${i}/${l}?&nickname=var_${t}`;console.log(`Forwarding db to local port ${i}.
4
4
  access the DB at ${f}
5
5
  Press ctrl+c to stop.`);let b=` DB_USERNAME=${d}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/cli",
3
- "version": "2.10.1",
3
+ "version": "2.10.2",
4
4
  "description": "",
5
5
  "main": "dist/index.js",
6
6
  "scripts": {
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../bin/utils/parser.ts","../package.json","../bin/utils/asyncSpawn.ts","../bin/utils/promise.ts","../bin/utils/git.ts","../bin/utils/inquirer.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.10.1\",\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';\nimport { createDeferredPromise } from './promise.js';\n\ninterface SpawnResult {\n pid?: number;\n stdout: string;\n stderr: string;\n status: number | null;\n signal: string | null;\n}\n\nexport default async (command: string, args?: boolean | readonly string[], { print = true, env = {}, signal, shell }: { print?: boolean; env?: NodeJS.ProcessEnv; signal?: AbortSignal; shell?: string | boolean } = {}) => {\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), signal, shell });\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","declare 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\nexport const 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","import asyncSpawn from './asyncSpawn.js';\n\nexport const getCurrentBranch = async () => {\n const { stdout: currentBranch } = await asyncSpawn('git', ['branch', '--show-current'], { print: false });\n return currentBranch.trim();\n};\n\nexport const getGitPath = async () => {\n const { stdout: gitPath } = await asyncSpawn('git', ['rev-parse', '--show-toplevel'], { print: false });\n return gitPath.trim();\n};\n\nexport const getChangesOfFile = async (filePath: string) => {\n const { stdout: changes } = await asyncSpawn('git', ['diff', 'origin/master..', filePath], { print: false });\n return changes;\n};\n\nexport const isPathIgnored = async (path: string) => {\n try {\n await asyncSpawn('git', ['check-ignore', path], { print: false });\n return true;\n } catch {\n return false;\n }\n};\n","import { confirm, input, select } from '@inquirer/prompts';\nimport type { Prompt } from '@inquirer/type';\nimport { getGitPath } from './git.js';\nimport { SUPPORTED_CLUSTERS, endWithError } from './index.js';\nimport { sep } from 'path';\n\ndeclare global {\n interface SymbolConstructor {\n /** A method that is used to release resources held by an object. Called by the semantics of the `using` statement. */\n readonly dispose: unique symbol;\n /** A method that is used to asynchronously release resources held by an object. Called by the semantics of the `await using` statement. */\n readonly asyncDispose: unique symbol;\n }\n}\n// @ts-expect-error polyfill for node < 18.18\nSymbol.dispose ??= Symbol.for('nodejs.dispose');\n// @ts-expect-error polyfill for node < 18.18\nSymbol.asyncDispose ??= Symbol.for('nodejs.asyncDispose');\nlet cancelFn: (() => void) | undefined;\nconst handler = () => cancelFn?.();\nfunction addExitListener() {\n process.once('beforeExit', handler);\n return {\n [Symbol.dispose]() {\n process.off('beforeExit', handler);\n cancelFn = undefined;\n },\n };\n}\n\nasync function inquirerWrapper<Value, Config>(fn: Prompt<Value, Config>, ...params: Parameters<Prompt<Value, Config>>) {\n try {\n using _ = addExitListener();\n const result = fn(...params);\n cancelFn = result.cancel;\n return await result;\n } catch (error) {\n if (error instanceof Error && ['CancelPromptError', 'ExitPromptError'].includes(error.constructor.name)) {\n endWithError('Cancelled! 👋');\n }\n endWithError(error as Error);\n }\n}\n\nexport function safeSelect<Value>(...params: Parameters<typeof select<Value>>) {\n return inquirerWrapper(select, ...params);\n}\n\nconst splitWordAtCapital = (str: string) => str.charAt(0).toUpperCase() + str.slice(1).split(/(?=[A-Z])/).join(' ');\n\nfunction getEnvironment() {\n return safeSelect({\n message: 'Which environment do you want to use?',\n choices: SUPPORTED_CLUSTERS.map(cluster => ({ name: splitWordAtCapital(cluster), value: cluster })),\n default: 'expManager',\n });\n}\n\nasync function getServiceName() {\n const currentServicePath = await getGitPath();\n const defaultValue = currentServicePath.split(sep).pop();\n return inquirerWrapper(input, { message: 'Enter the service name:', default: defaultValue });\n}\n\nexport function getVariationId(defaultVal = '') {\n return inquirerWrapper(input, { message: 'Enter your simulator id (Press enter to pass):', default: defaultVal });\n}\n\nasync function getPort(defaultVal = '8080', isLocal = false) {\n return inquirerWrapper(input, {\n message: `Enter the ${isLocal ? 'local ' : ''}port:`,\n default: defaultVal,\n validate(value) {\n // Regex source: https://stackoverflow.com/a/12968117\n if (!/^([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(value)) {\n return 'Please enter a valid port number';\n }\n return true;\n },\n });\n}\n\nexport async function getLocalPort(defaultVal = '5432') {\n return getPort(defaultVal, true);\n}\n\nconst VALUE_GETTER_MAP = {\n cluster: getEnvironment,\n variationId: getVariationId,\n service: getServiceName,\n port: (defaultVal = '8080') => getPort(defaultVal),\n 'local-port': getLocalPort,\n} as const;\n\nexport async function fillMissingRequiredValues<T extends { [key in keyof typeof VALUE_GETTER_MAP]?: string }>(values: T, requiredValues: (keyof T | { option: keyof T; defaultVal: string })[]) {\n for (const value of requiredValues) {\n const option = typeof value === 'object' ? value.option : value;\n const defaultVal = typeof value === 'object' ? value.defaultVal : undefined;\n if (typeof option !== 'string') {\n throw new Error(`Invalid option ${String(option)}`);\n }\n const getter = VALUE_GETTER_MAP[option as keyof typeof VALUE_GETTER_MAP];\n if (!getter) {\n throw new Error(`No value getter for ${String(option)}`);\n }\n\n values[option] ??= await getter(defaultVal) as T[keyof T & string];\n }\n return values;\n}\n\nexport async function promptForConfirmation(message: string, defaultVal = true) {\n return inquirerWrapper(confirm, { message, default: defaultVal });\n}\n","#!/usr/bin/env node\nimport fs from 'node:fs';\nimport asyncSpawn from './asyncSpawn.js';\nimport { promptForConfirmation } from './inquirer.js';\n\nconst IP_LINE_SUFFIX = 'SERVICE_HOST';\nconst PROD_CLUSTER_TO_CMD_MAP = {\n prodUs: ['us-autofleet-production', 'us-central1', 'autofleet-production'],\n prodEu: ['autofleetprod', 'europe-west1', 'autofleetprod'],\n prodJp: ['jp-autofleet-production', 'asia-northeast1', 'autofleet-japan'],\n};\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 loadTest: ['lt-autofleet-production', 'asia-northeast1', 'load-testing-428806'],\n ...PROD_CLUSTER_TO_CMD_MAP,\n};\n\nexport const SUPPORTED_CLUSTERS = Object.keys(CLUSTER_TO_CMD_MAP) as (keyof typeof CLUSTER_TO_CMD_MAP)[];\n\nconst getClusterDetails = 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\n if (\n PROD_CLUSTER_TO_CMD_MAP[clusterName as keyof typeof PROD_CLUSTER_TO_CMD_MAP]\n && !(await promptForConfirmation(`❌❌ Are you sure you want to run this command on ${clusterName}? ❌❌`, false))) {\n console.log('Aborting...');\n return process.exit(1);\n }\n\n return { name, region, project };\n};\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};\n\nexport const connectToCluster = async (clusterName: string) => {\n const { name, region, project } = await getClusterDetails(clusterName);\n\n await asyncSpawn('gcloud', ['container', 'clusters', 'get-credentials', name, '--region', region, '--project', project || name], { print: false });\n\n console.log(`Switched to ${clusterName} successfully`);\n\n return { name, region, project };\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","signal","shell","stubError","callerStack","promise","reject","resolve","createDeferredPromise","child","spawn","stdout","stderr","data","completionEventName","errorListener","error","completionListener","code","result","argumentString","getCurrentBranch","currentBranch","asyncSpawn_default","getGitPath","gitPath","getChangesOfFile","filePath","changes","isPathIgnored","path","confirm","input","select","fs","IP_LINE_SUFFIX","PROD_CLUSTER_TO_CMD_MAP","CLUSTER_TO_CMD_MAP","SUPPORTED_CLUSTERS","getClusterDetails","clusterName","command","name","region","project","promptForConfirmation","replaceInFile","newFilePath","filePath","linesToReplace","fileAsString","fs","find","replace","connectToCluster","asyncSpawn_default","connectAndGetPrefix","variationId","parseIps","ips","ipLines","formattedIps","ipLine","_type","_clusterIp","externalIp","_port","_age","s","formattedIp","endWithError","error","helpText","sep","cancelFn","handler","addExitListener","inquirerWrapper","fn","params","_stack","_","__using","result","_error","_hasError","__callDispose","error","endWithError","safeSelect","select","splitWordAtCapital","str","getEnvironment","SUPPORTED_CLUSTERS","cluster","getServiceName","defaultValue","getGitPath","sep","input","getVariationId","defaultVal","getPort","isLocal","value","getLocalPort","VALUE_GETTER_MAP","fillMissingRequiredValues","values","requiredValues","option","getter","promptForConfirmation","message","confirm"]}