@radhya/mach 1.4.15 → 1.4.17

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.
Files changed (2) hide show
  1. package/dist/index.js +9 -14
  2. package/package.json +1 -1
package/dist/index.js CHANGED
@@ -269,11 +269,8 @@ touch /opt/mach-prewarmed
269
269
  echo "Build orchestrator finished. Auto-terminating instance in 5 seconds..."
270
270
  sleep 5
271
271
  sudo shutdown -h now
272
- `;var Si=async(e,n,t={},i)=>{let o=Wn(),r=e.buildProfile||"production",a=r==="production",c=e.apk===!0,s=a?"bundleRelease":"assembleRelease",l=e.buildCommand||(c?"assembleRelease":s),d=e.nodeVersion?`export NVM_DIR="$HOME/.nvm"
273
- [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
274
- nvm install ${e.nodeVersion} 2>/dev/null || true
275
- nvm use ${e.nodeVersion}
276
- echo "Switched to Node $(node -v) via nvm"`:"",u=hi.replace(/\{\{BUILD_ID\}\}/g,n).replace(/\{\{BUILD_COMMAND\}\}/g,l).replace("{{NODE_VERSION_SETUP}}",d).replace("{{ENV_VARS}}",`
272
+ `;var Si=async(e,n,t={},i)=>{let o=Wn(),r=e.buildProfile||"production",a=r==="production",c=e.apk===!0,s=a?"bundleRelease":"assembleRelease",l=e.buildCommand||(c?"assembleRelease":s),d=e.nodeVersion?['export NVM_DIR="$HOME/.nvm"','[ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"',`nvm install ${e.nodeVersion} 2>/dev/null || true`,`nvm use ${e.nodeVersion}`,'export PATH="$NVM_BIN:$PATH"','echo "[NODE] Using Node $(node -v) at $(which node)"'].join(`
273
+ `):"",u=hi.replace(/\{\{BUILD_ID\}\}/g,n).replace(/\{\{BUILD_COMMAND\}\}/g,l).replace("{{NODE_VERSION_SETUP}}",d).replace("{{ENV_VARS}}",`
277
274
  export MACH_APP_NAME="${e.appName||"App"}"
278
275
  export MACH_BUILD_PROFILE="${r}"
279
276
  {{ENV_VARS}}
@@ -297,7 +294,10 @@ if [ -f "$HOME/.bash_profile" ]; then source "$HOME/.bash_profile"; fi
297
294
  if [ -f "$HOME/.bashrc" ]; then source "$HOME/.bashrc"; fi
298
295
  set -e
299
296
 
300
- # 3. Forward environment variables (includes PRESIGNED_* URLs + project secrets)
297
+ # 3. Node version switch (must happen before any npm/node usage)
298
+ {{NODE_VERSION_SETUP}}
299
+
300
+ # 4. Forward environment variables (includes PRESIGNED_* URLs + project secrets)
301
301
  {{ENV_VARS}}
302
302
 
303
303
  BUILD_ID="{{BUILD_ID}}"
@@ -336,9 +336,6 @@ unzip -o -q source.zip
336
336
 
337
337
  echo "[STEP_START:deps] $(date +%s)"
338
338
 
339
- # --- Node Version Switch ---
340
- {{NODE_VERSION_SETUP}}
341
-
342
339
  # --- DERIVED DATA SETUP ---
343
340
  export DERIVED_DATA_PATH="{{REMOTE_DIR}}/DerivedData"
344
341
  mkdir -p "$DERIVED_DATA_PATH"
@@ -374,6 +371,7 @@ if [ ! -d "node_modules" ] || [ -z "$(ls -A node_modules 2>/dev/null)" ]; then
374
371
  fi
375
372
 
376
373
  # Install Dependencies
374
+ echo "[NODE] Active: $(node -v) | $(which node)"
377
375
  if [ -f "yarn.lock" ]; then
378
376
  echo "Running yarn install..."
379
377
  yarn install --ignore-engines --prefer-offline || exit 1
@@ -717,11 +715,8 @@ fi
717
715
  `);o.message("Generating macOS build script...");let O=process.env.CODEARTIFACT_AUTH_TOKEN?`export CODEARTIFACT_AUTH_TOKEN="${process.env.CODEARTIFACT_AUTH_TOKEN}"
718
716
  `:"";if(t)for(let[I,b]of Object.entries(t)){let R=b.replace(/"/g,'\\"').replace(/\$/g,"\\$").replace(/`/g,"\\`");O+=`export ${I}="${R}"
719
717
  `}let L=[O,P.logUpload?`export PRESIGNED_LOG_UPLOAD="${P.logUpload}"`:"",P.doneMarker?`export PRESIGNED_DONE_MARKER="${P.doneMarker}"`:"",P.cacheDerivedDataDownload?`export PRESIGNED_CACHE_DD_DOWNLOAD="${P.cacheDerivedDataDownload}"`:"",P.cacheDerivedDataUpload?`export PRESIGNED_CACHE_DD_UPLOAD="${P.cacheDerivedDataUpload}"`:"",P.cacheNodeModulesDownload?`export PRESIGNED_CACHE_NODE_DOWNLOAD="${P.cacheNodeModulesDownload}"`:"",P.cacheNodeModulesUpload?`export PRESIGNED_CACHE_NODE_UPLOAD="${P.cacheNodeModulesUpload}"`:"",P.cachePodsDownload?`export PRESIGNED_CACHE_PODS_DOWNLOAD="${P.cachePodsDownload}"`:"",P.cachePodsUpload?`export PRESIGNED_CACHE_PODS_UPLOAD="${P.cachePodsUpload}"`:"",P.artifactIpaUpload?`export PRESIGNED_ARTIFACT_IPA_UPLOAD="${P.artifactIpaUpload}"`:"",P.artifactAppZipUpload?`export PRESIGNED_ARTIFACT_APP_ZIP_UPLOAD="${P.artifactAppZipUpload}"`:"",`export BUILD_ID="${n}"`,`export ${f.envPrefix}PROJECT_ID="${u}"`,t.MATCH_ENCRYPTION_PASSPHRASE?`export MATCH_PASSWORD="${t.MATCH_ENCRYPTION_PASSPHRASE}"`:"",t.APPLE_TEAM_ID?`export FASTLANE_TEAM_ID="${t.APPLE_TEAM_ID}"`:"",`export MATCH_KEYCHAIN_NAME="${f.credentialsKeychain}"`,`export MATCH_KEYCHAIN_PASSWORD="${f.keychainPassword}"`].filter(Boolean).join(`
720
- `),H=e.nodeVersion?`export NVM_DIR="$HOME/.nvm"
721
- [ -s "$NVM_DIR/nvm.sh" ] && source "$NVM_DIR/nvm.sh"
722
- nvm install ${e.nodeVersion} 2>/dev/null || true
723
- nvm use ${e.nodeVersion}
724
- echo "Switched to Node $(node -v) via nvm"`:"",q=Ai,y={"{{REMOTE_DIR}}":p,"{{ENV_VARS}}":L,"{{CREDENTIAL_DOWNLOADS}}":N,"{{IOS_SCHEME}}":e.iosScheme||"","{{IOS_CONFIG}}":e.iosConfiguration||"Release","{{TEAM_ID}}":e.iosTeamId||"","{{AUTH_PARAMS}}":h,"{{IS_SIMULATOR}}":e.simulator?"true":"false","{{BUILD_ID}}":n,"{{EXPORT_METHOD}}":e.iosExportMethod||"ad-hoc","{{NODE_VERSION_SETUP}}":H};Object.entries(y).forEach(([I,b])=>{q=q.split(I).join(b)});let w=`/tmp/${f.nameLower}-mac-build-${n}.sh`;if(Jn.writeFileSync(w,q),Qe(`${l} ${w} ${c}:${p}/build.sh`),o.stop("Remote script uploaded."),He.info(Te.cyan("Executing remote build. This might take a while...")),Qe(`${s} "bash ${p}/build.sh"`,{stdio:"inherit"}),o.stop("Remote build finished!"),i){o.start("Fetching artifact links...");try{let b=(await $.get(`/builds/${i}/${n}/artifacts`)).data.artifacts||[],R=e.simulator===!0;if(b.length===0&&!R)throw o.stop("Build Failed!"),new Error("Build completed but no artifacts were generated. Check build logs for errors.");if(o.stop("Build Successful!"),b.length>0){He.success("Build Artifacts Ready:");for(let G of b)console.log(`
718
+ `),H=e.nodeVersion?['export NVM_DIR="$HOME/.nvm"','[ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"',`nvm install ${e.nodeVersion} 2>/dev/null || true`,`nvm use ${e.nodeVersion}`,'export PATH="$NVM_BIN:$PATH"','echo "[NODE] Switched to Node $(node -v)"'].join(`
719
+ `):"",q=Ai,y={"{{REMOTE_DIR}}":p,"{{ENV_VARS}}":L,"{{CREDENTIAL_DOWNLOADS}}":N,"{{IOS_SCHEME}}":e.iosScheme||"","{{IOS_CONFIG}}":e.iosConfiguration||"Release","{{TEAM_ID}}":e.iosTeamId||"","{{AUTH_PARAMS}}":h,"{{IS_SIMULATOR}}":e.simulator?"true":"false","{{BUILD_ID}}":n,"{{EXPORT_METHOD}}":e.iosExportMethod||"ad-hoc","{{NODE_VERSION_SETUP}}":H};Object.entries(y).forEach(([I,b])=>{q=q.split(I).join(b)});let w=`/tmp/${f.nameLower}-mac-build-${n}.sh`;if(Jn.writeFileSync(w,q),Qe(`${l} ${w} ${c}:${p}/build.sh`),o.stop("Remote script uploaded."),He.info(Te.cyan("Executing remote build. This might take a while...")),Qe(`${s} "bash ${p}/build.sh"`,{stdio:"inherit"}),o.stop("Remote build finished!"),i){o.start("Fetching artifact links...");try{let b=(await $.get(`/builds/${i}/${n}/artifacts`)).data.artifacts||[],R=e.simulator===!0;if(b.length===0&&!R)throw o.stop("Build Failed!"),new Error("Build completed but no artifacts were generated. Check build logs for errors.");if(o.stop("Build Successful!"),b.length>0){He.success("Build Artifacts Ready:");for(let G of b)console.log(`
725
720
  ${Te.yellow(G.name)}:
726
721
  ${Te.cyan(G.downloadUrl)}`);console.log(`
727
722
  ${Te.dim("Note: Links are valid for 7 days.")}`)}else R&&He.warn("Simulator build completed. No artifacts uploaded.")}catch(I){o.stop("Could not fetch artifacts"),He.warn(Te.yellow(`Artifact listing failed: ${I.message}`))}}}catch(d){throw o.stop("iOS Build Failed"),d}};import Xn from"crypto";import et from"axios";async function Ii(e,n){try{let t=await Zn(n),o=(await et.post(`https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${e}/edits`,{},{headers:{Authorization:`Bearer ${t}`,Connection:"close"}})).data.id,r=0,c=(await et.get(`https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${e}/edits/${o}/tracks`,{headers:{Authorization:`Bearer ${t}`,Connection:"close"}})).data.tracks||[];for(let s of c)if(s.releases){for(let l of s.releases)if(l.versionCodes)for(let d of l.versionCodes){let u=parseInt(d,10);u>r&&(r=u)}}try{let l=(await et.get(`https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${e}/edits/${o}/bundles`,{headers:{Authorization:`Bearer ${t}`,Connection:"close"}})).data.bundles||[];for(let d of l)d.versionCode&&d.versionCode>r&&(r=d.versionCode)}catch{}try{let l=(await et.get(`https://androidpublisher.googleapis.com/androidpublisher/v3/applications/${e}/edits/${o}/apks`,{headers:{Authorization:`Bearer ${t}`,Connection:"close"}})).data.apks||[];for(let d of l)d.versionCode&&d.versionCode>r&&(r=d.versionCode)}catch{}return r}catch(t){let i=t.response?.data?.error?.message||t.message;throw new Error(`Google Play API Error: ${i}`)}}async function Zn(e){let n=Math.floor(Date.now()/1e3),t=n+3600,i={alg:"RS256",typ:"JWT"},o={iss:e.client_email,sub:e.client_email,aud:"https://oauth2.googleapis.com/token",iat:n,exp:t,scope:"https://www.googleapis.com/auth/androidpublisher"},r=Buffer.from(JSON.stringify(i)).toString("base64url"),a=Buffer.from(JSON.stringify(o)).toString("base64url"),c=`${r}.${a}`,s=Xn.createSign("RSA-SHA256");s.update(c);let l=s.sign(e.private_key,"base64url"),d=`${c}.${l}`;return(await et.post("https://oauth2.googleapis.com/token",{grant_type:"urn:ietf:params:oauth:grant-type:jwt-bearer",assertion:d},{headers:{Connection:"close"}})).data.access_token}import{spinner as ht,log as A,isCancel as yt,confirm as Qn,select as Ft}from"@clack/prompts";import S from"chalk";import E from"fs";import _ from"path";import{execSync as F,spawn as Pi}from"child_process";import _e from"os";import eo from"crypto";var $i=(e,n)=>n.filter(t=>E.existsSync(_.join(e,t))).reduce((t,i)=>t.update(E.readFileSync(_.join(e,i))),eo.createHash("sha256")).digest("hex").slice(0,16),to=e=>$i(e,["package.json","yarn.lock","package-lock.json","bun.lockb"]),io=e=>$i(e,["Podfile","Podfile.lock"]),no=e=>{let n=_.join(e,"fingerprint.json");try{return JSON.parse(E.readFileSync(n,"utf-8"))}catch{return{}}},bi=(e,n)=>{E.mkdirSync(e,{recursive:!0}),E.writeFileSync(_.join(e,"fingerprint.json"),JSON.stringify(n,null,2))},oo=7200*1e3,ro=(e,n)=>{E.mkdirSync(e,{recursive:!0});let t=_.join(e,"build.lock");if(E.existsSync(t))try{let i=JSON.parse(E.readFileSync(t,"utf-8")),o=Date.now()-(i.timestamp||0);if(o<oo)throw new Error(`Another build is already running for this project (build ${i.buildId}, started ${Math.round(o/6e4)}m ago). Cancel it from the dashboard first, or wait for it to complete.`)}catch(i){if(i.message.includes("Another build"))throw i}E.writeFileSync(t,JSON.stringify({buildId:n,pid:process.pid,timestamp:Date.now()}))},so=(e,n)=>{let t=_.join(e,"build.lock");try{E.existsSync(t)&&JSON.parse(E.readFileSync(t,"utf-8")).buildId===n&&E.unlinkSync(t)}catch{}},De=(e,n,t=process.cwd(),i={},o,r)=>new Promise((a,c)=>{let s=[_.dirname(process.execPath),"/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin",_.join(_e.homedir(),".npm-global/bin"),_.join(_e.homedir(),".nvm/current/bin")],l=process.env.PATH||"",d=[...s,...l.split(":")].filter((m,h,P)=>m&&P.indexOf(m)===h).join(":");process.env[`${f.envPrefix}DEBUG`]&&console.log(S.magenta(`[${f.nameUpper}_DEBUG] Execution PATH: ${d}`));let u={...process.env,...i,PATH:d,LANG:"en_US.UTF-8",LC_ALL:"en_US.UTF-8"};o&&process.env[`${f.envPrefix}DEBUG`]&&(o(S.magenta(`[ENVIRONMENT] node: ${process.execPath}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@radhya/mach",
3
- "version": "1.4.15",
3
+ "version": "1.4.17",
4
4
  "description": "Mach CLI: Cloud Build Orchestrator for React Native & Expo",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",