@radhya/mach 2.4.3 → 2.4.4

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,14 +1,14 @@
1
- import{a as I,h as W,i as Tt,k as Ii}from"./chunk-LO6DP2SE.js";import{log as g,spinner as it,text as Oe,password as pt,select as Ie,confirm as fi,isCancel as Z,cancel as z,intro as Xa,outro as Ha,note as Ka}from"@clack/prompts";import{log as q,spinner as It,text as Ue,select as ct,isCancel as fe,cancel as _e,note as qt,confirm as vi}from"@clack/prompts";import ce from"chalk";import{spawnSync as Bt}from"child_process";import ue from"fs";import ke from"path";import $n from"os";import Jt from"fs";import{log as mo}from"@clack/prompts";var go=["react-native","expo","flutter"],nl="react-native",Si=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Ai=e=>Si(e)?.toUpperCase()||void 0,Yt=(...e)=>{for(let t of e){let n=Si(t);if(n)return n}};function ho(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(t==="react-native"||t==="react_native"||t==="reactnative")return"react-native";if(t==="expo")return"expo";if(t==="flutter")return"flutter"}function Cn(e){let t=ho(e?.framework);if(t)return t;let n=go.map(i=>`"${i}"`).join(", ");throw e?.framework?new Error(`${I.configFileName} has invalid framework "${e.framework}". Use one of: ${n}.`):new Error(`${I.configFileName} is missing required field "framework". Add one of: ${n}.`)}function Ft(e,t="production"){let n=e?.ios||{},i=e?.submit?.[t]?.ios||{},r=e?.submit?.production?.ios||{},o=Ai(n.appleTeamId||n.developerTeamId||i.appleTeamId||i.developerTeamId||r.appleTeamId||r.developerTeamId),s=Yt(n.appStoreConnectTeamId,n.itcTeamId,n.appleConnectTeamId,i.appStoreConnectTeamId,i.itcTeamId,i.appleConnectTeamId,r.appStoreConnectTeamId,r.itcTeamId,r.appleConnectTeamId);return{teamId:o,teamName:Yt(n.appleTeamName,n.teamName,n.developerTeamName,i.appleTeamName,i.teamName,i.developerTeamName,r.appleTeamName,r.teamName,r.developerTeamName),developerTeamId:Ai(n.developerTeamId||i.developerTeamId||r.developerTeamId||o),appStoreConnectTeamId:s,providerId:Yt(n.providerId,i.providerId,r.providerId,s),providerName:Yt(n.providerName,n.appStoreConnectTeamName,i.providerName,i.appStoreConnectTeamName,r.providerName,r.appStoreConnectTeamName)}}function bi(e){if(e){if(!Jt.existsSync(e))return null;try{return JSON.parse(Jt.readFileSync(e,"utf-8"))}catch{return null}}if(!Jt.existsSync(`./${I.configFileName}`))return null;try{return JSON.parse(Jt.readFileSync(`./${I.configFileName}`,"utf-8"))}catch{return null}}function gt(e,t,n=new Set){if(n.has(t))throw new Error(`Circular inheritance detected in profile: ${t}`);n.add(t);let i=e.build?.[t];if(!i)return null;let r={...i};if(i.extends){let o=gt(e,i.extends,n);o&&(r={...o,...i,env:{...o.env,...i.env},ios:{...o.ios,...i.ios},android:{...o.android,...i.android}})}if(r.envGroups&&Array.isArray(r.envGroups)){let o={};for(let s of r.envGroups){let a=e.envGroups?.[s];a?Object.assign(o,a):mo.warn(`Environment group not found: ${s}`)}r.env={...o,...r.env}}return r}function ht(e,t){let n=t?gt(e,t)||{}:{};if(n.android?.package)return n.android.package;if(n.androidPackage)return n.androidPackage;if(e.android?.package)return e.android.package;if(e.expo?.android?.package)return e.expo.android.package}function ze(e,t){let n=t?gt(e,t)||{}:{};if(n.ios?.bundleIdentifier)return n.ios.bundleIdentifier;if(n.iosBundleIdentifier)return n.iosBundleIdentifier;if(e.ios?.bundleIdentifier)return e.ios.bundleIdentifier;if(e.ios?.bundleId)return e.ios.bundleId;if(e.expo?.ios?.bundleIdentifier)return e.expo.ios.bundleIdentifier}var il=(e,t=`${I.envPrefix}`)=>{let n={},i=(r,o)=>{if(r)for(let s in r){let a=r[s],c=`${o}${s.toUpperCase().replace(/[^A-Z0-9]/g,"_")}`;a!==null&&typeof a=="object"&&!Array.isArray(a)?i(a,`${c}_`):n[c]=String(a)}};return i(e,t),n};import{cancel as vn,confirm as yo,isCancel as Pn,log as ot,select as Io,text as Ao}from"@clack/prompts";import st from"chalk";import En from"fs";import{createRequire as So}from"module";import bo from"os";import zt from"path";var Co=So(import.meta.url),wn=null;function wo(){return wn||(wn=Co("@expo/apple-utils")),wn}function Qt(e){if(!e)return!1;try{return En.readdirSync(zt.join(e,"gems"),{withFileTypes:!0}).some(t=>t.isDirectory()&&t.name.startsWith("fastlane-"))}catch{return!1}}function vo(){let e=["/opt/homebrew/opt/fastlane/libexec","/usr/local/opt/fastlane/libexec"];for(let n of e)if(Qt(n))return n;let t=["/opt/homebrew/Cellar/fastlane","/usr/local/Cellar/fastlane"];for(let n of t)try{let i=En.readdirSync(n,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>r.name).sort((r,o)=>o.localeCompare(r,void 0,{numeric:!0}));for(let r of i){let o=zt.join(n,r,"libexec");if(Qt(o))return o}}catch{}}function yt(){let e=process.env.HOME||bo.homedir(),t=zt.join(e,".local/share/fastlane/3.4.0"),n=process.env.FASTLANE_GEM_HOME?.trim(),i=Qt(n)?n:vo()||(Qt(t)?t:n||t);return{...process.env,PATH:[process.env.FASTLANE_BIN_DIR,zt.join(i,"bin"),"/usr/local/opt/ruby/bin","/opt/homebrew/opt/ruby/bin","/usr/local/bin","/opt/homebrew/bin",process.env.PATH].filter(Boolean).join(":"),GEM_HOME:i,GEM_PATH:[i,process.env.GEM_PATH].filter(Boolean).join(":"),FASTLANE_INSTALLED_VIA_HOMEBREW:"true",FASTLANE_SKIP_UPDATE_CHECK:"1",FASTLANE_HIDE_CHANGELOG:"1",LANG:process.env.LANG||"en_US.UTF-8",LC_ALL:process.env.LC_ALL||"en_US.UTF-8",CI:"1"}}function Po(e,t="production"){return e.submit||(e.submit={}),e.submit[t]||(e.submit[t]={}),e.submit[t].ios||(e.submit[t].ios={}),e.submit[t].ios}function Eo(e,t,n="production"){if(!e||!t.id)return;let i=Po(e,n);i.appleTeamId=t.id;try{En.writeFileSync(`./${I.configFileName}`,JSON.stringify(e,null,2))}catch{}}function Ro(e){let t=String(e?.teamId||e?.id||"").trim().toUpperCase();return t?{id:t,name:String(e?.name||"").trim()||void 0,type:String(e?.type||"").trim()||void 0}:null}async function No(e){try{let{Auth:t,Teams:n}=wo(),i=await t.loginAsync({username:e},{autoResolveProvider:!0}),r=String(i?.context?.teamId||"").trim().toUpperCase(),o=await n.getTeamsAsync(),s=new Map;for(let l of o||[]){let d=Ro(l);d&&s.set(d.id,d)}let a=Array.from(s.values()),c=r?a.find(l=>l.id===r)||{id:r}:void 0;return{teams:a,selectedTeam:c}}catch(t){let n=t instanceof Error?t.message:String(t||"");return ot.warn(st.yellow(`Apple Developer team lookup failed${n?`: ${n}`:""}`)),{teams:[]}}}async function Ci(){ot.warn(st.yellow(`
2
- Apple Team ID is required to fetch certificates.`)),ot.info(st.dim("You can find this at: https://developer.apple.com/account -> Membership Details"));let e=await Ao({message:"Enter your 10-character Apple Team ID:",placeholder:"e.g. SA56KTS33U",validate:t=>/^[A-Z0-9]{10}$/i.test(t.trim())?void 0:"Team ID must be exactly 10 letters/numbers"});return Pn(e)?(vn("Operation cancelled"),null):{id:e.trim().toUpperCase()}}function xo(e){let t=[e.id,e.type].filter(Boolean);return t.length>0?t.join(" \xB7 "):void 0}async function ko(e,t){if(!e.config)return!1;if(e.persistConfig)return!0;if(!e.promptToPersistConfig)return!1;let n=e.profile||"production",i=await yo({message:`Save Apple Team ID ${t} to ${I.configFileName} for "${n}" profile?`,initialValue:n==="production"});return Pn(i)?(vn("Operation cancelled"),null):i}async function Dt(e){let t=e.initialTeam?.teamId?.trim().toUpperCase();if(t){let l=e.initialTeam?.developerTeamId?.trim().toUpperCase();return{...e.initialTeam,teamId:t,developerTeamId:l||t}}ot.info(st.blue("Fetching Apple Developer teams..."));let{teams:n,selectedTeam:i}=await No(e.appleId),r;if(i)r=i,ot.success(st.green(`\u2713 Using Apple Developer team ${r.name||r.id} (${r.id})`));else if(n.length===1)r=n[0],ot.success(st.green(`\u2713 Using Apple Developer team ${r.name||r.id} (${r.id})`));else if(n.length>1){let l=await Io({message:"Select Apple Developer team:",options:[...n.map(d=>({value:d.id,label:d.name||d.id,hint:xo(d)})),{value:"__manual__",label:"Enter Team ID manually",hint:"Use if your team is not listed"}]});if(Pn(l))return vn("Operation cancelled"),null;r=l==="__manual__"?await Ci():n.find(d=>d.id===l)||{id:l}}else ot.warn(st.yellow("Could not list Apple Developer teams automatically.")),r=await Ci();if(!r)return null;let o=r.id.trim().toUpperCase(),s=r.name?.trim(),a={...e.initialTeam,teamId:o,teamName:s||e.initialTeam?.teamName,developerTeamId:o},c=await ko(e,o);return c===null?null:(c&&Eo(e.config,{...r,id:o,name:s},e.profile),e.saveTeamId&&await e.saveTeamId(o,s),a)}var Oo="cmVxdWlyZSAnc3BhY2VzaGlwJwpyZXF1aXJlICdqc29uJwoKZGVmIHJlYWRfdGVhbV9maWVsZCh0ZWFtLCAqa2V5cykKICBrZXlzLmVhY2ggZG8gfGtleXwKICAgIGJlZ2luCiAgICAgIHZhbHVlID0gdGVhbVtrZXldIGlmIHRlYW0ucmVzcG9uZF90bz8oOltdKQogICAgICByZXR1cm4gdmFsdWUgaWYgdmFsdWUgJiYgdmFsdWUudG9fcy5sZW5ndGggPiAwCiAgICByZXNjdWUKICAgIGVuZAoKICAgIG1ldGhvZF9uYW1lID0ga2V5LnRvX3MKICAgIGlmIHRlYW0ucmVzcG9uZF90bz8obWV0aG9kX25hbWUpCiAgICAgIHZhbHVlID0gdGVhbS5wdWJsaWNfc2VuZChtZXRob2RfbmFtZSkKICAgICAgcmV0dXJuIHZhbHVlIGlmIHZhbHVlICYmIHZhbHVlLnRvX3MubGVuZ3RoID4gMAogICAgZW5kCiAgZW5kCgogIG5pbAplbmQKCmRlZiBub3JtYWxpemVfdGVhbV9uYW1lKG5hbWUpCiAgbmFtZS50b19zLmRvd25jYXNlLmdzdWIoL1teYS16MC05XSsvLCAnICcpLnN0cmlwCmVuZAoKZGVmIHBvcnRhbF90ZWFtX25hbWUKICB0ZWFtX2lkID0gRU5WWydGQVNUTEFORV9URUFNX0lEJ10udG9fcwogIHRlYW1zID0gU3BhY2VzaGlwOjpQb3J0YWwuY2xpZW50LnRlYW1zCiAgdGVhbXMgPSB0ZWFtcy52YWx1ZXMgaWYgdGVhbXMuaXNfYT8oSGFzaCkKCiAgdGVhbSA9IEFycmF5KHRlYW1zKS5maW5kIGRvIHx0fAogICAgWwogICAgICByZWFkX3RlYW1fZmllbGQodCwgJ3RlYW1JZCcsIDp0ZWFtSWQpLAogICAgICByZWFkX3RlYW1fZmllbGQodCwgJ3RlYW1faWQnLCA6dGVhbV9pZCksCiAgICAgIHJlYWRfdGVhbV9maWVsZCh0LCAnaWQnLCA6aWQpCiAgICBdLmNvbXBhY3QubWFwKCY6dG9fcykuaW5jbHVkZT8odGVhbV9pZCkKICBlbmQKCiAgcmVhZF90ZWFtX2ZpZWxkKHRlYW0sICduYW1lJywgOm5hbWUsICd0ZWFtTmFtZScsIDp0ZWFtTmFtZSwgJ2Rpc3BsYXlOYW1lJywgOmRpc3BsYXlOYW1lKQpyZXNjdWUgPT4gZQogICRzdGRlcnIucHV0cyAiREVCVUc6IENvdWxkIG5vdCByZXNvbHZlIERldmVsb3BlciBQb3J0YWwgdGVhbSBuYW1lOiAje2UubWVzc2FnZX0iCiAgbmlsCmVuZAoKZGVmIHR1bmVzX3RlYW1faWQodGVhbSkKICByZWFkX3RlYW1fZmllbGQoCiAgICB0ZWFtLAogICAgJ3Byb3ZpZGVySWQnLCA6cHJvdmlkZXJJZCwKICAgICdwcm92aWRlcl9pZCcsIDpwcm92aWRlcl9pZCwKICAgICdjb250ZW50UHJvdmlkZXJJZCcsIDpjb250ZW50UHJvdmlkZXJJZCwKICAgICdjb250ZW50X3Byb3ZpZGVyX2lkJywgOmNvbnRlbnRfcHJvdmlkZXJfaWQsCiAgICAndGVhbUlkJywgOnRlYW1JZCwKICAgICd0ZWFtX2lkJywgOnRlYW1faWQsCiAgICAnaWQnLCA6aWQKICApLnRvX3MKZW5kCgpkZWYgdHVuZXNfdGVhbV9uYW1lKHRlYW0pCiAgcmVhZF90ZWFtX2ZpZWxkKAogICAgdGVhbSwKICAgICduYW1lJywgOm5hbWUsCiAgICAnY29udGVudFByb3ZpZGVyTmFtZScsIDpjb250ZW50UHJvdmlkZXJOYW1lLAogICAgJ2NvbnRlbnRfcHJvdmlkZXJfbmFtZScsIDpjb250ZW50X3Byb3ZpZGVyX25hbWUsCiAgICAndGVhbU5hbWUnLCA6dGVhbU5hbWUsCiAgICAnZGlzcGxheU5hbWUnLCA6ZGlzcGxheU5hbWUKICApLnRvX3MKZW5kCgpkZWYgYXZhaWxhYmxlX3R1bmVzX3RlYW1zCiAgdGVhbXMgPSBTcGFjZXNoaXA6OlR1bmVzLmNsaWVudC50ZWFtcwogIHRlYW1zID0gdGVhbXMudmFsdWVzIGlmIHRlYW1zLmlzX2E/KEhhc2gpCiAgQXJyYXkodGVhbXMpCnJlc2N1ZSA9PiBlCiAgJHN0ZGVyci5wdXRzICJERUJVRzogQ291bGQgbm90IGluc3BlY3QgQXBwIFN0b3JlIENvbm5lY3QgdGVhbXM6ICN7ZS5tZXNzYWdlfSIKICBbXQplbmQKCmRlZiBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogIGV4cGxpY2l0X3RlYW1faWQgPSBFTlZbJ0ZBU1RMQU5FX0lUQ19URUFNX0lEJ10gfHwgRU5WWydGQVNUTEFORV9BU0NfVEVBTV9JRCddCiAgaWYgZXhwbGljaXRfdGVhbV9pZCAmJiBleHBsaWNpdF90ZWFtX2lkLnRvX3MubGVuZ3RoID4gMAogICAgU3BhY2VzaGlwOjpUdW5lcy5zZWxlY3RfdGVhbSh0ZWFtX2lkOiBleHBsaWNpdF90ZWFtX2lkKQogICAgcmV0dXJuIGV4cGxpY2l0X3RlYW1faWQKICBlbmQKCiAgZGV2ZWxvcGVyX3RlYW1faWQgPSBFTlZbJ0ZBU1RMQU5FX1RFQU1fSUQnXS50b19zCiAgZGV2ZWxvcGVyX3RlYW1fbmFtZSA9IHBvcnRhbF90ZWFtX25hbWUKICB0ZWFtcyA9IGF2YWlsYWJsZV90dW5lc190ZWFtcwoKICBpZiBkZXZlbG9wZXJfdGVhbV9uYW1lICYmIGRldmVsb3Blcl90ZWFtX25hbWUubGVuZ3RoID4gMAogICAgbm9ybWFsaXplZF9kZXZlbG9wZXJfbmFtZSA9IG5vcm1hbGl6ZV90ZWFtX25hbWUoZGV2ZWxvcGVyX3RlYW1fbmFtZSkKICAgIG1hdGNoZWRfdGVhbSA9IHRlYW1zLmZpbmQgeyB8dGVhbXwgbm9ybWFsaXplX3RlYW1fbmFtZSh0dW5lc190ZWFtX25hbWUodGVhbSkpID09IG5vcm1hbGl6ZWRfZGV2ZWxvcGVyX25hbWUgfQoKICAgIGlmIG1hdGNoZWRfdGVhbQogICAgICBtYXRjaGVkX2lkID0gdHVuZXNfdGVhbV9pZChtYXRjaGVkX3RlYW0pCiAgICAgIG1hdGNoZWRfbmFtZSA9IHR1bmVzX3RlYW1fbmFtZShtYXRjaGVkX3RlYW0pCiAgICAgIFNwYWNlc2hpcDo6VHVuZXMuc2VsZWN0X3RlYW0odGVhbV9pZDogbWF0Y2hlZF9pZCkKICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogQXV0by1zZWxlY3RlZCBBcHAgU3RvcmUgQ29ubmVjdCB0ZWFtICN7bWF0Y2hlZF9pZH0gKCN7bWF0Y2hlZF9uYW1lfSkgZm9yIERldmVsb3BlciBUZWFtICN7ZGV2ZWxvcGVyX3RlYW1faWR9IgogICAgICByZXR1cm4gbWF0Y2hlZF9pZAogICAgZW5kCiAgZW5kCgogIGlmIHRlYW1zLmxlbmd0aCA9PSAxCiAgICBvbmx5X3RlYW0gPSB0ZWFtcy5maXJzdAogICAgb25seV90ZWFtX2lkID0gdHVuZXNfdGVhbV9pZChvbmx5X3RlYW0pCiAgICBTcGFjZXNoaXA6OlR1bmVzLnNlbGVjdF90ZWFtKHRlYW1faWQ6IG9ubHlfdGVhbV9pZCkKICAgICRzdGRlcnIucHV0cyAiREVCVUc6IEF1dG8tc2VsZWN0ZWQgb25seSBBcHAgU3RvcmUgQ29ubmVjdCB0ZWFtICN7b25seV90ZWFtX2lkfSAoI3t0dW5lc190ZWFtX25hbWUob25seV90ZWFtKX0pIgogICAgcmV0dXJuIG9ubHlfdGVhbV9pZAogIGVuZAoKICAkc3RkZXJyLnB1dHMgIkVSUk9SOiBDb3VsZCBub3QgbWFwIEFwcGxlIERldmVsb3BlciBUZWFtIElEICcje2RldmVsb3Blcl90ZWFtX2lkfScje2RldmVsb3Blcl90ZWFtX25hbWUgPyAiICgje2RldmVsb3Blcl90ZWFtX25hbWV9KSIgOiAnJ30gdG8gQXBwIFN0b3JlIENvbm5lY3QuIgogICRzdGRlcnIucHV0cyAiQXZhaWxhYmxlIEFwcCBTdG9yZSBDb25uZWN0IHRlYW1zOiIKICB0ZWFtcy5lYWNoIGRvIHx0ZWFtfAogICAgJHN0ZGVyci5wdXRzICItICN7dHVuZXNfdGVhbV9pZCh0ZWFtKX0gKCN7dHVuZXNfdGVhbV9uYW1lKHRlYW0pfSkiCiAgZW5kCiAgZXhpdCAxCmVuZAoKZGVmIGxpc3RfdGVhbXMKICBiZWdpbgogICAgU3BhY2VzaGlwOjpQb3J0YWwubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBTcGFjZXNoaXA6OlBvcnRhbC5zZWxlY3RfdGVhbSh0ZWFtX2lkOiBFTlZbJ0ZBU1RMQU5FX1RFQU1fSUQnXSkKCiAgICBkZXZlbG9wZXJfdGVhbV9uYW1lID0gcG9ydGFsX3RlYW1fbmFtZQoKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBub3JtYWxpemVkX2RldmVsb3Blcl9uYW1lID0gbm9ybWFsaXplX3RlYW1fbmFtZShkZXZlbG9wZXJfdGVhbV9uYW1lKQogICAgdGVhbXMgPSBhdmFpbGFibGVfdHVuZXNfdGVhbXMubWFwIGRvIHx0ZWFtfAogICAgICB0ZWFtX25hbWUgPSB0dW5lc190ZWFtX25hbWUodGVhbSkKICAgICAgewogICAgICAgIGlkOiB0dW5lc190ZWFtX2lkKHRlYW0pLAogICAgICAgIG5hbWU6IHRlYW1fbmFtZSwKICAgICAgICByZWNvbW1lbmRlZDogbm9ybWFsaXplZF9kZXZlbG9wZXJfbmFtZS5sZW5ndGggPiAwICYmIG5vcm1hbGl6ZV90ZWFtX25hbWUodGVhbV9uYW1lKSA9PSBub3JtYWxpemVkX2RldmVsb3Blcl9uYW1lCiAgICAgIH0KICAgIGVuZAoKICAgIHB1dHMgIl9fX01BQ0hfSlNPTl9TVEFSVF9fXyIgKyB7CiAgICAgIGRldmVsb3BlclRlYW1JZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10sCiAgICAgIGRldmVsb3BlclRlYW1OYW1lOiBkZXZlbG9wZXJfdGVhbV9uYW1lLAogICAgICB0ZWFtczogdGVhbXMKICAgIH0udG9fanNvbiArICJfX19NQUNIX0pTT05fRU5EX19fIgogIHJlc2N1ZSA9PiBlCiAgICAkc3RkZXJyLnB1dHMgIkVSUk9SOiAje2UubWVzc2FnZX0iCiAgICBleGl0IDEKICBlbmQKZW5kCgpkZWYgbGlzdF9rZXlzCiAgYmVnaW4KICAgIFNwYWNlc2hpcDo6UG9ydGFsLmxvZ2luKEVOVlsnRkFTVExBTkVfVVNFUiddKQogICAgU3BhY2VzaGlwOjpQb3J0YWwuc2VsZWN0X3RlYW0odGVhbV9pZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10pCiAgICAKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogICAgCiAgICAjIFVzZSBUdW5lcyBjbGllbnQgd2hpY2ggcG9pbnRzIHRvIGFwcHN0b3JlY29ubmVjdC5hcHBsZS5jb20KICAgIGNsaWVudCA9IFNwYWNlc2hpcDo6VHVuZXMuY2xpZW50CiAgICAjIFVzZSByb290LXJlbGF0aXZlIFVSTCB0byByZXBsYWNlIHRoZSBkZWZhdWx0IFR1bmVzIHBhdGggKC9XZWJPYmplY3RzLy4uLikKICAgIHJlc3BvbnNlID0gY2xpZW50LnJlcXVlc3QoOmdldCwgJy9pcmlzL3YxL2FwaUtleXMnKQogICAgCiAgICBpZiByZXNwb25zZS5ib2R5Lm5pbD8gfHwgIXJlc3BvbnNlLmJvZHkuaXNfYT8oSGFzaCkKICAgICAgcmFpc2UgIkFQSSByZXR1cm5lZCBlbXB0eSBvciBpbnZhbGlkIHJlc3BvbnNlIGJvZHkgZm9yIGxpc3Rpbmcga2V5cyIKICAgIGVuZAogICAgCiAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBGdWxsIExpc3QgUmVzcG9uc2U6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIAogICAga2V5cyA9IHJlc3BvbnNlLmJvZHlbJ2RhdGEnXSB8fCBbXQogICAgCiAgICBvdXRwdXQgPSBrZXlzLm1hcCBkbyB8a3wKICAgICAgYXR0ciA9IGtbJ2F0dHJpYnV0ZXMnXSB8fCB7fQogICAgICB7CiAgICAgICAgaWQ6IGtbJ2lkJ10sCiAgICAgICAgbmFtZTogYXR0clsnbmFtZSddLAogICAgICAgIGlzc3VlcklkOiBhdHRyWydpc3N1ZXJJZCddLAogICAgICAgIHJvbGU6IGF0dHJbJ3JvbGVzJ10mLmZpcnN0LAogICAgICAgIHJldm9jYWJsZTogYXR0clsncmV2b2NhYmxlJ10KICAgICAgfQogICAgZW5kCiAgICAKICAgIHB1dHMgIl9fX01BQ0hfSlNPTl9TVEFSVF9fXyIgKyBvdXRwdXQudG9fanNvbiArICJfX19NQUNIX0pTT05fRU5EX19fIgogIHJlc2N1ZSA9PiBlCiAgICAkc3RkZXJyLnB1dHMgIkVSUk9SOiAje2UubWVzc2FnZX0iCiAgICBpZiBkZWZpbmVkPyhyZXNwb25zZSkgJiYgcmVzcG9uc2UgJiYgcmVzcG9uc2UuYm9keQogICAgICAkc3RkZXJyLnB1dHMgIlJlc3BvbnNlIEJvZHk6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIGVuZAogICAgZXhpdCAxCiAgZW5kCmVuZAoKZGVmIGNyZWF0ZV9rZXkobmFtZSwgcm9sZSA9ICdBRE1JTicpCiAgYmVnaW4KICAgIFNwYWNlc2hpcDo6UG9ydGFsLmxvZ2luKEVOVlsnRkFTVExBTkVfVVNFUiddKQogICAgU3BhY2VzaGlwOjpQb3J0YWwuc2VsZWN0X3RlYW0odGVhbV9pZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10pCiAgICAKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogICAgCiAgICBjbGllbnQgPSBTcGFjZXNoaXA6OlR1bmVzLmNsaWVudAogICAgCiAgICAjIFRydW5jYXRlIG5pY2tuYW1lIHRvIDMwIGNoYXJzIGFzIHBlciBBcHBsZSdzIGxpbWl0CiAgICAjIFdlIGtlZXAgdGhlIG9yaWdpbmFsICduYW1lJyBmb3IgbG9nZ2luZyBidXQgc2VuZCB0cnVuY2F0ZWQgJ25pY2tuYW1lJyB0byBBUEkKICAgIHNhZmVfbmlja25hbWUgPSBuYW1lWzAsIDMwXQogICAgCiAgICBwYXlsb2FkID0gewogICAgICBkYXRhOiB7CiAgICAgICAgdHlwZTogImFwaUtleXMiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIG5pY2tuYW1lOiBzYWZlX25pY2tuYW1lLAogICAgICAgICAga2V5VHlwZTogIlBVQkxJQ19BUEkiLAogICAgICAgICAgcm9sZXM6IFtyb2xlXSwKICAgICAgICAgIGFsbEFwcHNWaXNpYmxlOiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIHJlc3BvbnNlID0gY2xpZW50LnJlcXVlc3QoOnBvc3QpIGRvIHxyZXF8CiAgICAgIHJlcS51cmwgIi9pcmlzL3YxL2FwaUtleXMiCiAgICAgIHJlcS5ib2R5ID0gcGF5bG9hZC50b19qc29uCiAgICAgIHJlcS5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJwogICAgICByZXEuaGVhZGVyc1snQWNjZXB0J10gPSAnYXBwbGljYXRpb24vdm5kLmFwaStqc29uLCBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJwogICAgICByZXEuaGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JwogICAgICByZXEuaGVhZGVyc1snUmVmZXJlciddID0gJ2h0dHBzOi8vYXBwc3RvcmVjb25uZWN0LmFwcGxlLmNvbS9hY2Nlc3MvYXBpJwogICAgICByZXEuaGVhZGVyc1snWC1BcHBsZS1XaWRnZXQtS2V5J10gPSBjbGllbnQud2lkZ2V0X2tleSBpZiBjbGllbnQucmVzcG9uZF90bz8oOndpZGdldF9rZXkpCiAgICBlbmQKICAgIAogICAgIyBERUJVRzogSW5zcGVjdCB0aGUgcmF3IHJlc3BvbnNlIG9iamVjdAogICAgJHN0ZGVyci5wdXRzICJERUJVRzogUmVzcG9uc2UgQ2xhc3M6ICN7cmVzcG9uc2UuY2xhc3N9IgogICAgJHN0ZGVyci5wdXRzICJERUJVRzogUmVzcG9uc2UgSGVhZGVyczogI3tyZXNwb25zZS5oZWFkZXJzfSIKICAgICRzdGRlcnIucHV0cyAiREVCVUc6IFJlc3BvbnNlIEJvZHk6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIAogICAgaWYgcmVzcG9uc2UuYm9keS5uaWw/IHx8ICFyZXNwb25zZS5ib2R5LmlzX2E/KEhhc2gpIHx8IHJlc3BvbnNlLmJvZHlbJ2RhdGEnXS5uaWw/CiAgICAgIGVycm9yX21zZyA9ICJBUEkgZmFpbGVkIHRvIGNyZWF0ZSBrZXkuIgogICAgICBpZiByZXNwb25zZS5ib2R5ICYmIHJlc3BvbnNlLmJvZHlbJ2Vycm9ycyddCiAgICAgICAgZXJyb3JfbXNnICs9ICIgRXJyb3JzOiAiICsgcmVzcG9uc2UuYm9keVsnZXJyb3JzJ10ubWFwe3xlfCBlWydkZXRhaWwnXX0uam9pbignLCAnKQogICAgICBlbmQKICAgICAgcmFpc2UgZXJyb3JfbXNnCiAgICBlbmQKICAgIAogICAga2V5X2RhdGEgPSByZXNwb25zZS5ib2R5WydkYXRhJ10KICAgIGF0dHIgPSBrZXlfZGF0YVsnYXR0cmlidXRlcyddIHx8IHt9CgogICAgIyBUaGUgLnA4IGNvbnRlbnQgaXMgdXN1YWxseSBpbiAncHJpdmF0ZUtleScgb3IgJ2tleUNvbnRlbnQnIG9uIHRoZSBJTklUSUFMIENSRUFURSByZXNwb25zZQogICAgcDhfY29udGVudCA9IGF0dHJbJ3ByaXZhdGVLZXknXSB8fCBhdHRyWydrZXlDb250ZW50J10KICAgIAogICAgaWYgcDhfY29udGVudC5uaWw/CiAgICAgICRzdGRlcnIucHV0cyAiREVCVUc6IEtleSBjb250ZW50IG1pc3NpbmcgaW4gcmVzcG9uc2UuIEF0dGVtcHRpbmcgcmV0cmlldmFsIHZpYSBkb3dubG9hZC9leHBvcnQgZW5kcG9pbnRzLi4uIiAKICAgICAgCiAgICAgIHBhdGhzX3RvX3RyeSA9IFsKICAgICAgICAiaHR0cHM6Ly9hcHBzdG9yZWNvbm5lY3QuYXBwbGUuY29tL2lyaXMvdjEvYXBpS2V5cy8je2tleV9kYXRhWydpZCddfS9kb3dubG9hZCIsCiAgICAgICAgImh0dHBzOi8vYXBwc3RvcmVjb25uZWN0LmFwcGxlLmNvbS9pcmlzL3YxL2FwaUtleXMvI3trZXlfZGF0YVsnaWQnXX0vZXhwb3J0IgogICAgICBdCiAgICAgIAogICAgICBwYXRoc190b190cnkuZWFjaCBkbyB8cGF0aHwKICAgICAgICBiZWdpbgogICAgICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogVHJ5aW5nICN7cGF0aH0uLi4iCiAgICAgICAgICBkb3dubG9hZF9yZXNwID0gY2xpZW50LnJlcXVlc3QoOmdldCkgZG8gfHJlcXwKICAgICAgICAgICAgcmVxLnVybCBwYXRoCiAgICAgICAgICAgIHJlcS5oZWFkZXJzWydBY2NlcHQnXSA9ICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24sIGFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnCiAgICAgICAgICAgIHJlcS5oZWFkZXJzWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnCiAgICAgICAgICAgIHJlcS5oZWFkZXJzWydSZWZlcmVyJ10gPSAnaHR0cHM6Ly9hcHBzdG9yZWNvbm5lY3QuYXBwbGUuY29tL2FjY2Vzcy9hcGknCiAgICAgICAgICBlbmQKICAgICAgICAgICRzdGRlcnIucHV0cyAiREVCVUc6IFJlc3BvbnNlIENsYXNzOiAje2Rvd25sb2FkX3Jlc3AuYm9keS5jbGFzc30iCiAgICAgICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBSZXNwb25zZSBTdGF0dXM6ICN7ZG93bmxvYWRfcmVzcC5zdGF0dXN9IiBpZiBkb3dubG9hZF9yZXNwLnJlc3BvbmRfdG8/KDpzdGF0dXMpCiAgICAgICAgICAKICAgICAgICAgIGlmIGRvd25sb2FkX3Jlc3AuYm9keSAmJiAhZG93bmxvYWRfcmVzcC5ib2R5LnRvX3MuaW5jbHVkZT8oJyJlcnJvcnMiPT4nKQogICAgICAgICAgICAgaWYgZG93bmxvYWRfcmVzcC5ib2R5LmlzX2E/KEhhc2gpCiAgICAgICAgICAgICAgIHA4X2NvbnRlbnQgPSBkb3dubG9hZF9yZXNwLmJvZHlbJ2tleUNvbnRlbnQnXSB8fCBkb3dubG9hZF9yZXNwLmJvZHlbJ2NvbnRlbnQnXSB8fCBkb3dubG9hZF9yZXNwLmJvZHkuZGlnKCdkYXRhJywgJ2F0dHJpYnV0ZXMnLCAncHJpdmF0ZUtleScpCiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHA4X2NvbnRlbnQgPSBkb3dubG9hZF9yZXNwLmJvZHkKICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiBwOF9jb250ZW50ICYmIHA4X2NvbnRlbnQudG9fcy5zdGFydF93aXRoPygnLS0tLS1CRUdJTicpCiAgICAgICAgICAgICAgICRzdGRlcnIucHV0cyAiREVCVUc6IFJldHJpZXZhbCB2aWEgI3twYXRofSBzdWNjZXNzZnVsISBDb250ZW50IGxlbmd0aDogI3twOF9jb250ZW50LnRvX3MubGVuZ3RofSIKICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogUmVzcG9uc2UgZnJvbSAje3BhdGh9IGRpZCBub3QgY29udGFpbiBhIHZhbGlkIHByaXZhdGUga2V5LiIKICAgICAgICAgICAgICAgcDhfY29udGVudCA9IG5pbAogICAgICAgICAgICAgZW5kCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBSZXNwb25zZSBmcm9tICN7cGF0aH0gZW1wdHkgb3IgY29udGFpbnMgZXJyb3JzLiIKICAgICAgICAgIGVuZAogICAgICAgIHJlc2N1ZSA9PiBlCiAgICAgICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBBdHRlbXB0IGZvciAje3BhdGh9IGZhaWxlZDogI3tlLm1lc3NhZ2V9IgogICAgICAgIGVuZAogICAgICBlbmQKICAgIGVuZAoKICAgICMgRklOQUwgVkFMSURBVElPTjogRW5zdXJlIGl0J3Mgbm90IGEgUnVieSBoYXNoIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciBlcnJvcgogICAgaWYgcDhfY29udGVudC5pc19hPyhIYXNoKSB8fCBwOF9jb250ZW50LnRvX3MuaW5jbHVkZT8oJyJlcnJvcnMiPT4nKSB8fCAhcDhfY29udGVudC50b19zLnN0YXJ0X3dpdGg/KCctLS0tLUJFR0lOJykKICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogSW52YWxpZCBrZXkgY29udGVudCBkZXRlY3RlZC4iCiAgICAgIHA4X2NvbnRlbnQgPSBuaWwKICAgIGVuZAoKICAgIGlmIHA4X2NvbnRlbnQubmlsPwogICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBGYWlsZWQgdG8gcmV0cmlldmUga2V5IGNvbnRlbnQuIgogICAgZW5kCiAgICAKICAgIHJlc3VsdCA9IHsKICAgICAgaWQ6IGtleV9kYXRhWydpZCddLAogICAgICBuYW1lOiBhdHRyWyduaWNrbmFtZSddIHx8IGF0dHJbJ25hbWUnXSwKICAgICAgaXNzdWVySWQ6IGF0dHJbJ2lzc3VlcklkJ10sCiAgICAgIGtleUNvbnRlbnQ6IHA4X2NvbnRlbnQsCiAgICAgIHJhd19yZXNwb25zZTogcmVzcG9uc2UuYm9keSAjIEluY2x1ZGUgdGhpcyBmb3IgZGVidWdnaW5nIHdoZW4ga2V5Q29udGVudCBpcyBuaWwKICAgIH0KICAgIAogICAgcHV0cyAiX19fTUFDSF9KU09OX1NUQVJUX19fIiArIHJlc3VsdC50b19qc29uICsgIl9fX01BQ0hfSlNPTl9FTkRfX18iCiAgcmVzY3VlID0+IGUKICAgICRzdGRlcnIucHV0cyAiRVJST1I6ICN7ZS5tZXNzYWdlfSIKICAgIGlmIGRlZmluZWQ/KHJlc3BvbnNlKSAmJiByZXNwb25zZSAmJiByZXNwb25zZS5ib2R5CiAgICAgICAkc3RkZXJyLnB1dHMgIlJlc3BvbnNlIEJvZHk6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIGVuZAogICAgZXhpdCAxCiAgZW5kCmVuZAoKZGVmIGRlbGV0ZV9rZXkoaWQpCiAgYmVnaW4KICAgIFNwYWNlc2hpcDo6UG9ydGFsLmxvZ2luKEVOVlsnRkFTVExBTkVfVVNFUiddKQogICAgU3BhY2VzaGlwOjpQb3J0YWwuc2VsZWN0X3RlYW0odGVhbV9pZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10pCiAgICAKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogICAgCiAgICBjbGllbnQgPSBTcGFjZXNoaXA6OlR1bmVzLmNsaWVudAogICAgY2xpZW50LnJlcXVlc3QoOmRlbGV0ZSwgIi9pcmlzL3YxL2FwaUtleXMvI3tpZH0iKQogICAgcHV0cyAiU1VDQ0VTUyIKICByZXNjdWUgPT4gZQogICAgJHN0ZGVyci5wdXRzICJFUlJPUjogI3tlLm1lc3NhZ2V9IgogICAgZXhpdCAxCiAgZW5kCmVuZAoKY29tbWFuZCA9IEFSR1ZbMF0KaWYgY29tbWFuZCA9PSAnbGlzdCcKICBsaXN0X2tleXMKZWxzaWYgY29tbWFuZCA9PSAndGVhbXMnCiAgbGlzdF90ZWFtcwplbHNpZiBjb21tYW5kID09ICdjcmVhdGUnCiAgY3JlYXRlX2tleShBUkdWWzFdIHx8ICJNYWNoIEFQSSBLZXkgI3tUaW1lLm5vdy50b19pfSIpCmVsc2lmIGNvbW1hbmQgPT0gJ2RlbGV0ZScKICBkZWxldGVfa2V5KEFSR1ZbMV0pCmVuZAo=";function Nn(){let e=ke.join($n.tmpdir(),I.nameLower);ue.existsSync(e)||ue.mkdirSync(e,{recursive:!0});let t=ke.join(e,"manage_asc_keys.rb");return ue.writeFileSync(t,Buffer.from(Oo,"base64").toString("utf-8"),{mode:493}),t}function xn(){return yt()}function _n(e){let t=new Map,n=/-\s+(\d+)\s+\(([^)]+)\)/g,i=/\d+\)\s+"([^"]+)"\s+\((\d+)\)/g,r;for(;(r=n.exec(e))!==null;)t.set(r[1],{id:r[1],name:r[2]});for(;(r=i.exec(e))!==null;)t.set(r[2],{id:r[2],name:r[1]});return Array.from(t.values())}function Pi(e){return Ft(e).appStoreConnectTeamId}function Ei(e,t,n){return{...xn(),FASTLANE_USER:e,FASTLANE_TEAM_ID:t,...n?{FASTLANE_ITC_TEAM_ID:n,FASTLANE_ASC_TEAM_ID:n}:{}}}function at(e,t="production",n={}){let i=Ft(e,t),r=n.teamId||i.teamId,o=n.appStoreConnectTeamId||i.appStoreConnectTeamId;return{teamId:r,teamName:n.teamName||i.teamName,developerTeamId:n.developerTeamId||i.developerTeamId||r,appStoreConnectTeamId:o,providerId:n.providerId||i.providerId||o,providerName:n.providerName||i.providerName}}function $o(e,t){if(!t.id)return;e.submit||(e.submit={}),e.submit.production||(e.submit.production={}),e.submit.production.ios||(e.submit.production.ios={});let n=e.submit.production.ios;n.appStoreConnectTeamId=t.id,delete n.providerId,delete n.appStoreConnectTeamName,delete n.providerName,delete n.appleTeamName}function Tn(e,t){$o(e,t);try{ue.writeFileSync(`./${I.configFileName}`,JSON.stringify(e,null,2))}catch{}}async function _o(e,t,n,i){let r=It();r.start("Fetching App Store Connect providers...");let o=Bt("ruby",[e,"teams"],{env:Ei(n,i),stdio:["inherit","pipe","pipe"],encoding:"utf-8"});if(o.status!==0){r.stop("Could not fetch providers");let p=_n(`${o.stdout||""}
3
- ${o.stderr||""}`);if(p.length>0)return kn(t,p,"Select the App Store Connect provider for this API key:");q.warn(ce.yellow(`Could not list App Store Connect providers: ${o.stderr||"Unknown error"}`));return}let s=(o.stdout||"").match(new RegExp(`${I.jsonStartMarker}(.*)${I.jsonEndMarker}`));if(!s){r.stop("Could not parse providers");return}let a=JSON.parse(s[1]),c=(a.teams||[]).filter(p=>p.id&&p.name);if(r.stop(c.length===1?"Found 1 provider":`Found ${c.length} providers`),c.length===0)return;if(c.length===1){q.success(ce.green(`\u2713 Using App Store Connect provider ${c[0].name} (${c[0].id})`));let p={...c[0],developerTeamName:a.developerTeamName};return Tn(t,p),p}let l=c.filter(p=>p.recommended),d=c.filter(p=>!p.recommended);return kn(t,[...l,...d],`Select the App Store Connect provider for Developer Team ${a.developerTeamName||i}:`,a.developerTeamName)}async function kn(e,t,n,i){let r=await ct({message:n,options:t.map(c=>({value:c.id,label:c.name,hint:`${c.id}${c.recommended?" \xB7 recommended":""}`}))});if(fe(r))return _e("Operation cancelled"),null;let o=r,a={...t.find(c=>c.id===o)||{id:o,name:o},developerTeamName:i};return Tn(e,a),q.success(ce.green(`\u2713 Using App Store Connect provider ${a.name} (${a.id})`)),a}var Vt=e=>typeof e=="string"&&e.trim()?e.trim():void 0,wi=e=>Vt(e)?.toUpperCase();function To(e,t){let n=wi(t.developerTeamId||t.teamId),i=Vt(t.appStoreConnectTeamId||t.providerId);return e.filter(r=>{let o=wi(r.teamId),s=Vt(r.appStoreConnectTeamId||r.providerId);return!(n&&o!==n||i&&s!==i)})}function Rn(e){let t=Vt(e.name)||"App Store Connect API key",n=Vt(e.sourceProjectName)||e.sourceProjectId;return`${t} \xB7 ${n}`}function Fo(e){return[e.teamId?`Apple Team ${e.teamId}`:void 0,e.appStoreConnectTeamId||e.providerId?`ASC provider ${e.appStoreConnectTeamId||e.providerId}`:void 0,e.keyId?`Key ${e.keyId}`:void 0].filter(Boolean).join(" \xB7 ")}async function Do(e,t,n){let i=at(t,n),r=i.developerTeamId||i.teamId,o=i.appStoreConnectTeamId||i.providerId;if(!r){q.error(`Set ios.appleTeamId or submit.${n}.ios.appleTeamId in ${I.configFileName} before reusing an App Store Connect API key.`);return}let s=It(),a=[];try{s.start("Looking for compatible saved App Store Connect API keys...");let d=await W.get("/credentials/reusable",{params:{projectId:e,type:"asc_api_key"}});a=To(Array.isArray(d.data?.credentials)?d.data.credentials:[],i),s.stop(a.length===1?"Found 1 compatible saved API key":`Found ${a.length} compatible saved API keys`)}catch(d){s.stop("Could not load saved API keys"),q.error(`Could not load reusable App Store Connect API keys: ${d.response?.data?.message||d.message}. You need administrator access to this project and the source project.`);return}if(a.length===0){let d=o?`Apple Team ${r} and App Store Connect provider ${o}`:`Apple Team ${r}`;q.info(`No compatible saved API keys were found for ${d}.`);return}let c=await ct({message:"Select a saved App Store Connect API key to reuse:",options:[...a.map((d,p)=>({value:String(p),label:Rn(d),hint:Fo(d)})),{value:"cancel",label:"Cancel"}]});if(fe(c)||c==="cancel"){_e("Operation cancelled");return}let l=a[Number(c)];if(!l){q.error("The selected App Store Connect API key is no longer available.");return}try{s.start(`Copying ${Rn(l)} into this project...`),await W.post("/credentials/reuse",{projectId:e,sourceProjectId:l.sourceProjectId,credentialId:l.credentialId,type:"asc_api_key"}),s.stop("Saved API key copied to this project");let d=l.appStoreConnectTeamId||l.providerId;d&&Tn(t,{id:d,name:l.providerName||d}),q.success(ce.green(`\u2713 Reused ${Rn(l)} for this project.`))}catch(d){s.stop("Could not reuse saved API key"),q.error(`Could not reuse the selected App Store Connect API key: ${d.response?.data?.message||d.message}.`)}}var Ri=async e=>{let t=It(),n=e.platform,i=`./${I.configFileName}`;if(!ue.existsSync(i)){q.error(`No ${I.configFileName} found. Run \`${I.nameLower} init\` or \`${I.nameLower} link\` first.`);return}let r=JSON.parse(ue.readFileSync(i,"utf-8")),{projectId:o}=r,s=e.profile||"production";if(!o){q.error(`${I.configFileName} is missing projectId.`);return}let a=e.file,c=n==="android"?e.packageName||e.bundleId:e.bundleId||ze(r,s)||"*";if(n==="android"&&!c&&(c=await Bo(o,r,s),c===null))return;if(n==="ios"&&!a){let u=await ct({message:"Manage App Store Connect API Key:",options:[{value:"magic",label:"\u2728 Create new automatically",hint:"Requires Apple ID + 2FA"},{value:"reuse",label:"\u267B\uFE0F Use a saved API Key",hint:"Copy a compatible key from another Mach project"},{value:"manual",label:"\u{1F50D} Configure manually",hint:"Provide existing .p8 file"},{value:"delete",label:"\u{1F5D1}\uFE0F Delete an existing Key"}]});if(fe(u)){_e("Operation cancelled");return}if(u==="magic"){await jo(o,r);return}if(u==="reuse"){await Do(o,r,s);return}if(u==="delete"){await Wo(o,r);return}}if(!a){let u=n==="ios"?"https://appstoreconnect.apple.com/access/api":"https://console.cloud.google.com/apis/credentials";qt(`To submit to the ${n==="ios"?"App Store":"Google Play Store"}, you need a Service Key:
1
+ import{a as I,h as W,i as Tt,k as Ii}from"./chunk-LO6DP2SE.js";import{log as m,spinner as it,text as Oe,password as pt,select as Ie,confirm as fi,isCancel as Z,cancel as z,intro as Xa,outro as Ha,note as Ka}from"@clack/prompts";import{log as q,spinner as It,text as Ue,select as ct,isCancel as fe,cancel as _e,note as qt,confirm as vi}from"@clack/prompts";import ce from"chalk";import{spawnSync as Bt}from"child_process";import ue from"fs";import ke from"path";import $n from"os";import Jt from"fs";import{log as go}from"@clack/prompts";var mo=["react-native","expo","flutter"],nl="react-native",Si=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Ai=e=>Si(e)?.toUpperCase()||void 0,Yt=(...e)=>{for(let t of e){let n=Si(t);if(n)return n}};function ho(e){if(typeof e!="string")return;let t=e.trim().toLowerCase();if(t==="react-native"||t==="react_native"||t==="reactnative")return"react-native";if(t==="expo")return"expo";if(t==="flutter")return"flutter"}function Cn(e){let t=ho(e?.framework);if(t)return t;let n=mo.map(i=>`"${i}"`).join(", ");throw e?.framework?new Error(`${I.configFileName} has invalid framework "${e.framework}". Use one of: ${n}.`):new Error(`${I.configFileName} is missing required field "framework". Add one of: ${n}.`)}function Ft(e,t="production"){let n=e?.ios||{},i=e?.submit?.[t]?.ios||{},r=e?.submit?.production?.ios||{},o=Ai(n.appleTeamId||n.developerTeamId||i.appleTeamId||i.developerTeamId||r.appleTeamId||r.developerTeamId),s=Yt(n.appStoreConnectTeamId,n.itcTeamId,n.appleConnectTeamId,i.appStoreConnectTeamId,i.itcTeamId,i.appleConnectTeamId,r.appStoreConnectTeamId,r.itcTeamId,r.appleConnectTeamId);return{teamId:o,teamName:Yt(n.appleTeamName,n.teamName,n.developerTeamName,i.appleTeamName,i.teamName,i.developerTeamName,r.appleTeamName,r.teamName,r.developerTeamName),developerTeamId:Ai(n.developerTeamId||i.developerTeamId||r.developerTeamId||o),appStoreConnectTeamId:s,providerId:Yt(n.providerId,i.providerId,r.providerId,s),providerName:Yt(n.providerName,n.appStoreConnectTeamName,i.providerName,i.appStoreConnectTeamName,r.providerName,r.appStoreConnectTeamName)}}function bi(e){if(e){if(!Jt.existsSync(e))return null;try{return JSON.parse(Jt.readFileSync(e,"utf-8"))}catch{return null}}if(!Jt.existsSync(`./${I.configFileName}`))return null;try{return JSON.parse(Jt.readFileSync(`./${I.configFileName}`,"utf-8"))}catch{return null}}function mt(e,t,n=new Set){if(n.has(t))throw new Error(`Circular inheritance detected in profile: ${t}`);n.add(t);let i=e.build?.[t];if(!i)return null;let r={...i};if(i.extends){let o=mt(e,i.extends,n);o&&(r={...o,...i,env:{...o.env,...i.env},ios:{...o.ios,...i.ios},android:{...o.android,...i.android}})}if(r.envGroups&&Array.isArray(r.envGroups)){let o={};for(let s of r.envGroups){let a=e.envGroups?.[s];a?Object.assign(o,a):go.warn(`Environment group not found: ${s}`)}r.env={...o,...r.env}}return r}function ht(e,t){let n=t?mt(e,t)||{}:{};if(n.android?.package)return n.android.package;if(n.androidPackage)return n.androidPackage;if(e.android?.package)return e.android.package;if(e.expo?.android?.package)return e.expo.android.package}function ze(e,t){let n=t?mt(e,t)||{}:{};if(n.ios?.bundleIdentifier)return n.ios.bundleIdentifier;if(n.iosBundleIdentifier)return n.iosBundleIdentifier;if(e.ios?.bundleIdentifier)return e.ios.bundleIdentifier;if(e.ios?.bundleId)return e.ios.bundleId;if(e.expo?.ios?.bundleIdentifier)return e.expo.ios.bundleIdentifier}var il=(e,t=`${I.envPrefix}`)=>{let n={},i=(r,o)=>{if(r)for(let s in r){let a=r[s],c=`${o}${s.toUpperCase().replace(/[^A-Z0-9]/g,"_")}`;a!==null&&typeof a=="object"&&!Array.isArray(a)?i(a,`${c}_`):n[c]=String(a)}};return i(e,t),n};import{cancel as vn,confirm as yo,isCancel as Pn,log as ot,select as Io,text as Ao}from"@clack/prompts";import st from"chalk";import En from"fs";import{createRequire as So}from"module";import bo from"os";import zt from"path";var Co=So(import.meta.url),wn=null;function wo(){return wn||(wn=Co("@expo/apple-utils")),wn}function Qt(e){if(!e)return!1;try{return En.readdirSync(zt.join(e,"gems"),{withFileTypes:!0}).some(t=>t.isDirectory()&&t.name.startsWith("fastlane-"))}catch{return!1}}function vo(){let e=["/opt/homebrew/opt/fastlane/libexec","/usr/local/opt/fastlane/libexec"];for(let n of e)if(Qt(n))return n;let t=["/opt/homebrew/Cellar/fastlane","/usr/local/Cellar/fastlane"];for(let n of t)try{let i=En.readdirSync(n,{withFileTypes:!0}).filter(r=>r.isDirectory()).map(r=>r.name).sort((r,o)=>o.localeCompare(r,void 0,{numeric:!0}));for(let r of i){let o=zt.join(n,r,"libexec");if(Qt(o))return o}}catch{}}function yt(){let e=process.env.HOME||bo.homedir(),t=zt.join(e,".local/share/fastlane/3.4.0"),n=process.env.FASTLANE_GEM_HOME?.trim(),i=Qt(n)?n:vo()||(Qt(t)?t:n||t);return{...process.env,PATH:[process.env.FASTLANE_BIN_DIR,zt.join(i,"bin"),"/usr/local/opt/ruby/bin","/opt/homebrew/opt/ruby/bin","/usr/local/bin","/opt/homebrew/bin",process.env.PATH].filter(Boolean).join(":"),GEM_HOME:i,GEM_PATH:[i,process.env.GEM_PATH].filter(Boolean).join(":"),FASTLANE_INSTALLED_VIA_HOMEBREW:"true",FASTLANE_SKIP_UPDATE_CHECK:"1",FASTLANE_HIDE_CHANGELOG:"1",LANG:process.env.LANG||"en_US.UTF-8",LC_ALL:process.env.LC_ALL||"en_US.UTF-8",CI:"1"}}function Po(e,t="production"){return e.submit||(e.submit={}),e.submit[t]||(e.submit[t]={}),e.submit[t].ios||(e.submit[t].ios={}),e.submit[t].ios}function Eo(e,t,n="production"){if(!e||!t.id)return;let i=Po(e,n);i.appleTeamId=t.id;try{En.writeFileSync(`./${I.configFileName}`,JSON.stringify(e,null,2))}catch{}}function Ro(e){let t=String(e?.teamId||e?.id||"").trim().toUpperCase();return t?{id:t,name:String(e?.name||"").trim()||void 0,type:String(e?.type||"").trim()||void 0}:null}async function No(e){try{let{Auth:t,Teams:n}=wo(),i=await t.loginAsync({username:e},{autoResolveProvider:!0}),r=String(i?.context?.teamId||"").trim().toUpperCase(),o=await n.getTeamsAsync(),s=new Map;for(let l of o||[]){let p=Ro(l);p&&s.set(p.id,p)}let a=Array.from(s.values()),c=r?a.find(l=>l.id===r)||{id:r}:void 0;return{teams:a,selectedTeam:c}}catch(t){let n=t instanceof Error?t.message:String(t||"");return ot.warn(st.yellow(`Apple Developer team lookup failed${n?`: ${n}`:""}`)),{teams:[]}}}async function Ci(){ot.warn(st.yellow(`
2
+ Apple Team ID is required to fetch certificates.`)),ot.info(st.dim("You can find this at: https://developer.apple.com/account -> Membership Details"));let e=await Ao({message:"Enter your 10-character Apple Team ID:",placeholder:"e.g. SA56KTS33U",validate:t=>/^[A-Z0-9]{10}$/i.test(t.trim())?void 0:"Team ID must be exactly 10 letters/numbers"});return Pn(e)?(vn("Operation cancelled"),null):{id:e.trim().toUpperCase()}}function xo(e){let t=[e.id,e.type].filter(Boolean);return t.length>0?t.join(" \xB7 "):void 0}async function ko(e,t){if(!e.config)return!1;if(e.persistConfig)return!0;if(!e.promptToPersistConfig)return!1;let n=e.profile||"production",i=await yo({message:`Save Apple Team ID ${t} to ${I.configFileName} for "${n}" profile?`,initialValue:n==="production"});return Pn(i)?(vn("Operation cancelled"),null):i}async function Dt(e){let t=e.initialTeam?.teamId?.trim().toUpperCase();if(t){let l=e.initialTeam?.developerTeamId?.trim().toUpperCase();return{...e.initialTeam,teamId:t,developerTeamId:l||t}}ot.info(st.blue("Fetching Apple Developer teams..."));let{teams:n,selectedTeam:i}=await No(e.appleId),r;if(i)r=i,ot.success(st.green(`\u2713 Using Apple Developer team ${r.name||r.id} (${r.id})`));else if(n.length===1)r=n[0],ot.success(st.green(`\u2713 Using Apple Developer team ${r.name||r.id} (${r.id})`));else if(n.length>1){let l=await Io({message:"Select Apple Developer team:",options:[...n.map(p=>({value:p.id,label:p.name||p.id,hint:xo(p)})),{value:"__manual__",label:"Enter Team ID manually",hint:"Use if your team is not listed"}]});if(Pn(l))return vn("Operation cancelled"),null;r=l==="__manual__"?await Ci():n.find(p=>p.id===l)||{id:l}}else ot.warn(st.yellow("Could not list Apple Developer teams automatically.")),r=await Ci();if(!r)return null;let o=r.id.trim().toUpperCase(),s=r.name?.trim(),a={...e.initialTeam,teamId:o,teamName:s||e.initialTeam?.teamName,developerTeamId:o},c=await ko(e,o);return c===null?null:(c&&Eo(e.config,{...r,id:o,name:s},e.profile),e.saveTeamId&&await e.saveTeamId(o,s),a)}var Oo="cmVxdWlyZSAnc3BhY2VzaGlwJwpyZXF1aXJlICdqc29uJwoKZGVmIHJlYWRfdGVhbV9maWVsZCh0ZWFtLCAqa2V5cykKICBrZXlzLmVhY2ggZG8gfGtleXwKICAgIGJlZ2luCiAgICAgIHZhbHVlID0gdGVhbVtrZXldIGlmIHRlYW0ucmVzcG9uZF90bz8oOltdKQogICAgICByZXR1cm4gdmFsdWUgaWYgdmFsdWUgJiYgdmFsdWUudG9fcy5sZW5ndGggPiAwCiAgICByZXNjdWUKICAgIGVuZAoKICAgIG1ldGhvZF9uYW1lID0ga2V5LnRvX3MKICAgIGlmIHRlYW0ucmVzcG9uZF90bz8obWV0aG9kX25hbWUpCiAgICAgIHZhbHVlID0gdGVhbS5wdWJsaWNfc2VuZChtZXRob2RfbmFtZSkKICAgICAgcmV0dXJuIHZhbHVlIGlmIHZhbHVlICYmIHZhbHVlLnRvX3MubGVuZ3RoID4gMAogICAgZW5kCiAgZW5kCgogIG5pbAplbmQKCmRlZiBub3JtYWxpemVfdGVhbV9uYW1lKG5hbWUpCiAgbmFtZS50b19zLmRvd25jYXNlLmdzdWIoL1teYS16MC05XSsvLCAnICcpLnN0cmlwCmVuZAoKZGVmIHBvcnRhbF90ZWFtX25hbWUKICB0ZWFtX2lkID0gRU5WWydGQVNUTEFORV9URUFNX0lEJ10udG9fcwogIHRlYW1zID0gU3BhY2VzaGlwOjpQb3J0YWwuY2xpZW50LnRlYW1zCiAgdGVhbXMgPSB0ZWFtcy52YWx1ZXMgaWYgdGVhbXMuaXNfYT8oSGFzaCkKCiAgdGVhbSA9IEFycmF5KHRlYW1zKS5maW5kIGRvIHx0fAogICAgWwogICAgICByZWFkX3RlYW1fZmllbGQodCwgJ3RlYW1JZCcsIDp0ZWFtSWQpLAogICAgICByZWFkX3RlYW1fZmllbGQodCwgJ3RlYW1faWQnLCA6dGVhbV9pZCksCiAgICAgIHJlYWRfdGVhbV9maWVsZCh0LCAnaWQnLCA6aWQpCiAgICBdLmNvbXBhY3QubWFwKCY6dG9fcykuaW5jbHVkZT8odGVhbV9pZCkKICBlbmQKCiAgcmVhZF90ZWFtX2ZpZWxkKHRlYW0sICduYW1lJywgOm5hbWUsICd0ZWFtTmFtZScsIDp0ZWFtTmFtZSwgJ2Rpc3BsYXlOYW1lJywgOmRpc3BsYXlOYW1lKQpyZXNjdWUgPT4gZQogICRzdGRlcnIucHV0cyAiREVCVUc6IENvdWxkIG5vdCByZXNvbHZlIERldmVsb3BlciBQb3J0YWwgdGVhbSBuYW1lOiAje2UubWVzc2FnZX0iCiAgbmlsCmVuZAoKZGVmIHR1bmVzX3RlYW1faWQodGVhbSkKICByZWFkX3RlYW1fZmllbGQoCiAgICB0ZWFtLAogICAgJ3Byb3ZpZGVySWQnLCA6cHJvdmlkZXJJZCwKICAgICdwcm92aWRlcl9pZCcsIDpwcm92aWRlcl9pZCwKICAgICdjb250ZW50UHJvdmlkZXJJZCcsIDpjb250ZW50UHJvdmlkZXJJZCwKICAgICdjb250ZW50X3Byb3ZpZGVyX2lkJywgOmNvbnRlbnRfcHJvdmlkZXJfaWQsCiAgICAndGVhbUlkJywgOnRlYW1JZCwKICAgICd0ZWFtX2lkJywgOnRlYW1faWQsCiAgICAnaWQnLCA6aWQKICApLnRvX3MKZW5kCgpkZWYgdHVuZXNfdGVhbV9uYW1lKHRlYW0pCiAgcmVhZF90ZWFtX2ZpZWxkKAogICAgdGVhbSwKICAgICduYW1lJywgOm5hbWUsCiAgICAnY29udGVudFByb3ZpZGVyTmFtZScsIDpjb250ZW50UHJvdmlkZXJOYW1lLAogICAgJ2NvbnRlbnRfcHJvdmlkZXJfbmFtZScsIDpjb250ZW50X3Byb3ZpZGVyX25hbWUsCiAgICAndGVhbU5hbWUnLCA6dGVhbU5hbWUsCiAgICAnZGlzcGxheU5hbWUnLCA6ZGlzcGxheU5hbWUKICApLnRvX3MKZW5kCgpkZWYgYXZhaWxhYmxlX3R1bmVzX3RlYW1zCiAgdGVhbXMgPSBTcGFjZXNoaXA6OlR1bmVzLmNsaWVudC50ZWFtcwogIHRlYW1zID0gdGVhbXMudmFsdWVzIGlmIHRlYW1zLmlzX2E/KEhhc2gpCiAgQXJyYXkodGVhbXMpCnJlc2N1ZSA9PiBlCiAgJHN0ZGVyci5wdXRzICJERUJVRzogQ291bGQgbm90IGluc3BlY3QgQXBwIFN0b3JlIENvbm5lY3QgdGVhbXM6ICN7ZS5tZXNzYWdlfSIKICBbXQplbmQKCmRlZiBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogIGV4cGxpY2l0X3RlYW1faWQgPSBFTlZbJ0ZBU1RMQU5FX0lUQ19URUFNX0lEJ10gfHwgRU5WWydGQVNUTEFORV9BU0NfVEVBTV9JRCddCiAgaWYgZXhwbGljaXRfdGVhbV9pZCAmJiBleHBsaWNpdF90ZWFtX2lkLnRvX3MubGVuZ3RoID4gMAogICAgU3BhY2VzaGlwOjpUdW5lcy5zZWxlY3RfdGVhbSh0ZWFtX2lkOiBleHBsaWNpdF90ZWFtX2lkKQogICAgcmV0dXJuIGV4cGxpY2l0X3RlYW1faWQKICBlbmQKCiAgZGV2ZWxvcGVyX3RlYW1faWQgPSBFTlZbJ0ZBU1RMQU5FX1RFQU1fSUQnXS50b19zCiAgZGV2ZWxvcGVyX3RlYW1fbmFtZSA9IHBvcnRhbF90ZWFtX25hbWUKICB0ZWFtcyA9IGF2YWlsYWJsZV90dW5lc190ZWFtcwoKICBpZiBkZXZlbG9wZXJfdGVhbV9uYW1lICYmIGRldmVsb3Blcl90ZWFtX25hbWUubGVuZ3RoID4gMAogICAgbm9ybWFsaXplZF9kZXZlbG9wZXJfbmFtZSA9IG5vcm1hbGl6ZV90ZWFtX25hbWUoZGV2ZWxvcGVyX3RlYW1fbmFtZSkKICAgIG1hdGNoZWRfdGVhbSA9IHRlYW1zLmZpbmQgeyB8dGVhbXwgbm9ybWFsaXplX3RlYW1fbmFtZSh0dW5lc190ZWFtX25hbWUodGVhbSkpID09IG5vcm1hbGl6ZWRfZGV2ZWxvcGVyX25hbWUgfQoKICAgIGlmIG1hdGNoZWRfdGVhbQogICAgICBtYXRjaGVkX2lkID0gdHVuZXNfdGVhbV9pZChtYXRjaGVkX3RlYW0pCiAgICAgIG1hdGNoZWRfbmFtZSA9IHR1bmVzX3RlYW1fbmFtZShtYXRjaGVkX3RlYW0pCiAgICAgIFNwYWNlc2hpcDo6VHVuZXMuc2VsZWN0X3RlYW0odGVhbV9pZDogbWF0Y2hlZF9pZCkKICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogQXV0by1zZWxlY3RlZCBBcHAgU3RvcmUgQ29ubmVjdCB0ZWFtICN7bWF0Y2hlZF9pZH0gKCN7bWF0Y2hlZF9uYW1lfSkgZm9yIERldmVsb3BlciBUZWFtICN7ZGV2ZWxvcGVyX3RlYW1faWR9IgogICAgICByZXR1cm4gbWF0Y2hlZF9pZAogICAgZW5kCiAgZW5kCgogIGlmIHRlYW1zLmxlbmd0aCA9PSAxCiAgICBvbmx5X3RlYW0gPSB0ZWFtcy5maXJzdAogICAgb25seV90ZWFtX2lkID0gdHVuZXNfdGVhbV9pZChvbmx5X3RlYW0pCiAgICBTcGFjZXNoaXA6OlR1bmVzLnNlbGVjdF90ZWFtKHRlYW1faWQ6IG9ubHlfdGVhbV9pZCkKICAgICRzdGRlcnIucHV0cyAiREVCVUc6IEF1dG8tc2VsZWN0ZWQgb25seSBBcHAgU3RvcmUgQ29ubmVjdCB0ZWFtICN7b25seV90ZWFtX2lkfSAoI3t0dW5lc190ZWFtX25hbWUob25seV90ZWFtKX0pIgogICAgcmV0dXJuIG9ubHlfdGVhbV9pZAogIGVuZAoKICAkc3RkZXJyLnB1dHMgIkVSUk9SOiBDb3VsZCBub3QgbWFwIEFwcGxlIERldmVsb3BlciBUZWFtIElEICcje2RldmVsb3Blcl90ZWFtX2lkfScje2RldmVsb3Blcl90ZWFtX25hbWUgPyAiICgje2RldmVsb3Blcl90ZWFtX25hbWV9KSIgOiAnJ30gdG8gQXBwIFN0b3JlIENvbm5lY3QuIgogICRzdGRlcnIucHV0cyAiQXZhaWxhYmxlIEFwcCBTdG9yZSBDb25uZWN0IHRlYW1zOiIKICB0ZWFtcy5lYWNoIGRvIHx0ZWFtfAogICAgJHN0ZGVyci5wdXRzICItICN7dHVuZXNfdGVhbV9pZCh0ZWFtKX0gKCN7dHVuZXNfdGVhbV9uYW1lKHRlYW0pfSkiCiAgZW5kCiAgZXhpdCAxCmVuZAoKZGVmIGxpc3RfdGVhbXMKICBiZWdpbgogICAgU3BhY2VzaGlwOjpQb3J0YWwubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBTcGFjZXNoaXA6OlBvcnRhbC5zZWxlY3RfdGVhbSh0ZWFtX2lkOiBFTlZbJ0ZBU1RMQU5FX1RFQU1fSUQnXSkKCiAgICBkZXZlbG9wZXJfdGVhbV9uYW1lID0gcG9ydGFsX3RlYW1fbmFtZQoKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBub3JtYWxpemVkX2RldmVsb3Blcl9uYW1lID0gbm9ybWFsaXplX3RlYW1fbmFtZShkZXZlbG9wZXJfdGVhbV9uYW1lKQogICAgdGVhbXMgPSBhdmFpbGFibGVfdHVuZXNfdGVhbXMubWFwIGRvIHx0ZWFtfAogICAgICB0ZWFtX25hbWUgPSB0dW5lc190ZWFtX25hbWUodGVhbSkKICAgICAgewogICAgICAgIGlkOiB0dW5lc190ZWFtX2lkKHRlYW0pLAogICAgICAgIG5hbWU6IHRlYW1fbmFtZSwKICAgICAgICByZWNvbW1lbmRlZDogbm9ybWFsaXplZF9kZXZlbG9wZXJfbmFtZS5sZW5ndGggPiAwICYmIG5vcm1hbGl6ZV90ZWFtX25hbWUodGVhbV9uYW1lKSA9PSBub3JtYWxpemVkX2RldmVsb3Blcl9uYW1lCiAgICAgIH0KICAgIGVuZAoKICAgIHB1dHMgIl9fX01BQ0hfSlNPTl9TVEFSVF9fXyIgKyB7CiAgICAgIGRldmVsb3BlclRlYW1JZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10sCiAgICAgIGRldmVsb3BlclRlYW1OYW1lOiBkZXZlbG9wZXJfdGVhbV9uYW1lLAogICAgICB0ZWFtczogdGVhbXMKICAgIH0udG9fanNvbiArICJfX19NQUNIX0pTT05fRU5EX19fIgogIHJlc2N1ZSA9PiBlCiAgICAkc3RkZXJyLnB1dHMgIkVSUk9SOiAje2UubWVzc2FnZX0iCiAgICBleGl0IDEKICBlbmQKZW5kCgpkZWYgbGlzdF9rZXlzCiAgYmVnaW4KICAgIFNwYWNlc2hpcDo6UG9ydGFsLmxvZ2luKEVOVlsnRkFTVExBTkVfVVNFUiddKQogICAgU3BhY2VzaGlwOjpQb3J0YWwuc2VsZWN0X3RlYW0odGVhbV9pZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10pCiAgICAKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogICAgCiAgICAjIFVzZSBUdW5lcyBjbGllbnQgd2hpY2ggcG9pbnRzIHRvIGFwcHN0b3JlY29ubmVjdC5hcHBsZS5jb20KICAgIGNsaWVudCA9IFNwYWNlc2hpcDo6VHVuZXMuY2xpZW50CiAgICAjIFVzZSByb290LXJlbGF0aXZlIFVSTCB0byByZXBsYWNlIHRoZSBkZWZhdWx0IFR1bmVzIHBhdGggKC9XZWJPYmplY3RzLy4uLikKICAgIHJlc3BvbnNlID0gY2xpZW50LnJlcXVlc3QoOmdldCwgJy9pcmlzL3YxL2FwaUtleXMnKQogICAgCiAgICBpZiByZXNwb25zZS5ib2R5Lm5pbD8gfHwgIXJlc3BvbnNlLmJvZHkuaXNfYT8oSGFzaCkKICAgICAgcmFpc2UgIkFQSSByZXR1cm5lZCBlbXB0eSBvciBpbnZhbGlkIHJlc3BvbnNlIGJvZHkgZm9yIGxpc3Rpbmcga2V5cyIKICAgIGVuZAogICAgCiAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBGdWxsIExpc3QgUmVzcG9uc2U6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIAogICAga2V5cyA9IHJlc3BvbnNlLmJvZHlbJ2RhdGEnXSB8fCBbXQogICAgCiAgICBvdXRwdXQgPSBrZXlzLm1hcCBkbyB8a3wKICAgICAgYXR0ciA9IGtbJ2F0dHJpYnV0ZXMnXSB8fCB7fQogICAgICB7CiAgICAgICAgaWQ6IGtbJ2lkJ10sCiAgICAgICAgbmFtZTogYXR0clsnbmFtZSddLAogICAgICAgIGlzc3VlcklkOiBhdHRyWydpc3N1ZXJJZCddLAogICAgICAgIHJvbGU6IGF0dHJbJ3JvbGVzJ10mLmZpcnN0LAogICAgICAgIHJldm9jYWJsZTogYXR0clsncmV2b2NhYmxlJ10KICAgICAgfQogICAgZW5kCiAgICAKICAgIHB1dHMgIl9fX01BQ0hfSlNPTl9TVEFSVF9fXyIgKyBvdXRwdXQudG9fanNvbiArICJfX19NQUNIX0pTT05fRU5EX19fIgogIHJlc2N1ZSA9PiBlCiAgICAkc3RkZXJyLnB1dHMgIkVSUk9SOiAje2UubWVzc2FnZX0iCiAgICBpZiBkZWZpbmVkPyhyZXNwb25zZSkgJiYgcmVzcG9uc2UgJiYgcmVzcG9uc2UuYm9keQogICAgICAkc3RkZXJyLnB1dHMgIlJlc3BvbnNlIEJvZHk6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIGVuZAogICAgZXhpdCAxCiAgZW5kCmVuZAoKZGVmIGNyZWF0ZV9rZXkobmFtZSwgcm9sZSA9ICdBRE1JTicpCiAgYmVnaW4KICAgIFNwYWNlc2hpcDo6UG9ydGFsLmxvZ2luKEVOVlsnRkFTVExBTkVfVVNFUiddKQogICAgU3BhY2VzaGlwOjpQb3J0YWwuc2VsZWN0X3RlYW0odGVhbV9pZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10pCiAgICAKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogICAgCiAgICBjbGllbnQgPSBTcGFjZXNoaXA6OlR1bmVzLmNsaWVudAogICAgCiAgICAjIFRydW5jYXRlIG5pY2tuYW1lIHRvIDMwIGNoYXJzIGFzIHBlciBBcHBsZSdzIGxpbWl0CiAgICAjIFdlIGtlZXAgdGhlIG9yaWdpbmFsICduYW1lJyBmb3IgbG9nZ2luZyBidXQgc2VuZCB0cnVuY2F0ZWQgJ25pY2tuYW1lJyB0byBBUEkKICAgIHNhZmVfbmlja25hbWUgPSBuYW1lWzAsIDMwXQogICAgCiAgICBwYXlsb2FkID0gewogICAgICBkYXRhOiB7CiAgICAgICAgdHlwZTogImFwaUtleXMiLAogICAgICAgIGF0dHJpYnV0ZXM6IHsKICAgICAgICAgIG5pY2tuYW1lOiBzYWZlX25pY2tuYW1lLAogICAgICAgICAga2V5VHlwZTogIlBVQkxJQ19BUEkiLAogICAgICAgICAgcm9sZXM6IFtyb2xlXSwKICAgICAgICAgIGFsbEFwcHNWaXNpYmxlOiB0cnVlCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAKICAgIHJlc3BvbnNlID0gY2xpZW50LnJlcXVlc3QoOnBvc3QpIGRvIHxyZXF8CiAgICAgIHJlcS51cmwgIi9pcmlzL3YxL2FwaUtleXMiCiAgICAgIHJlcS5ib2R5ID0gcGF5bG9hZC50b19qc29uCiAgICAgIHJlcS5oZWFkZXJzWydDb250ZW50LVR5cGUnXSA9ICdhcHBsaWNhdGlvbi9qc29uJwogICAgICByZXEuaGVhZGVyc1snQWNjZXB0J10gPSAnYXBwbGljYXRpb24vdm5kLmFwaStqc29uLCBhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQsICovKjsgcT0wLjAxJwogICAgICByZXEuaGVhZGVyc1snWC1SZXF1ZXN0ZWQtV2l0aCddID0gJ1hNTEh0dHBSZXF1ZXN0JwogICAgICByZXEuaGVhZGVyc1snUmVmZXJlciddID0gJ2h0dHBzOi8vYXBwc3RvcmVjb25uZWN0LmFwcGxlLmNvbS9hY2Nlc3MvYXBpJwogICAgICByZXEuaGVhZGVyc1snWC1BcHBsZS1XaWRnZXQtS2V5J10gPSBjbGllbnQud2lkZ2V0X2tleSBpZiBjbGllbnQucmVzcG9uZF90bz8oOndpZGdldF9rZXkpCiAgICBlbmQKICAgIAogICAgIyBERUJVRzogSW5zcGVjdCB0aGUgcmF3IHJlc3BvbnNlIG9iamVjdAogICAgJHN0ZGVyci5wdXRzICJERUJVRzogUmVzcG9uc2UgQ2xhc3M6ICN7cmVzcG9uc2UuY2xhc3N9IgogICAgJHN0ZGVyci5wdXRzICJERUJVRzogUmVzcG9uc2UgSGVhZGVyczogI3tyZXNwb25zZS5oZWFkZXJzfSIKICAgICRzdGRlcnIucHV0cyAiREVCVUc6IFJlc3BvbnNlIEJvZHk6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIAogICAgaWYgcmVzcG9uc2UuYm9keS5uaWw/IHx8ICFyZXNwb25zZS5ib2R5LmlzX2E/KEhhc2gpIHx8IHJlc3BvbnNlLmJvZHlbJ2RhdGEnXS5uaWw/CiAgICAgIGVycm9yX21zZyA9ICJBUEkgZmFpbGVkIHRvIGNyZWF0ZSBrZXkuIgogICAgICBpZiByZXNwb25zZS5ib2R5ICYmIHJlc3BvbnNlLmJvZHlbJ2Vycm9ycyddCiAgICAgICAgZXJyb3JfbXNnICs9ICIgRXJyb3JzOiAiICsgcmVzcG9uc2UuYm9keVsnZXJyb3JzJ10ubWFwe3xlfCBlWydkZXRhaWwnXX0uam9pbignLCAnKQogICAgICBlbmQKICAgICAgcmFpc2UgZXJyb3JfbXNnCiAgICBlbmQKICAgIAogICAga2V5X2RhdGEgPSByZXNwb25zZS5ib2R5WydkYXRhJ10KICAgIGF0dHIgPSBrZXlfZGF0YVsnYXR0cmlidXRlcyddIHx8IHt9CgogICAgIyBUaGUgLnA4IGNvbnRlbnQgaXMgdXN1YWxseSBpbiAncHJpdmF0ZUtleScgb3IgJ2tleUNvbnRlbnQnIG9uIHRoZSBJTklUSUFMIENSRUFURSByZXNwb25zZQogICAgcDhfY29udGVudCA9IGF0dHJbJ3ByaXZhdGVLZXknXSB8fCBhdHRyWydrZXlDb250ZW50J10KICAgIAogICAgaWYgcDhfY29udGVudC5uaWw/CiAgICAgICRzdGRlcnIucHV0cyAiREVCVUc6IEtleSBjb250ZW50IG1pc3NpbmcgaW4gcmVzcG9uc2UuIEF0dGVtcHRpbmcgcmV0cmlldmFsIHZpYSBkb3dubG9hZC9leHBvcnQgZW5kcG9pbnRzLi4uIiAKICAgICAgCiAgICAgIHBhdGhzX3RvX3RyeSA9IFsKICAgICAgICAiaHR0cHM6Ly9hcHBzdG9yZWNvbm5lY3QuYXBwbGUuY29tL2lyaXMvdjEvYXBpS2V5cy8je2tleV9kYXRhWydpZCddfS9kb3dubG9hZCIsCiAgICAgICAgImh0dHBzOi8vYXBwc3RvcmVjb25uZWN0LmFwcGxlLmNvbS9pcmlzL3YxL2FwaUtleXMvI3trZXlfZGF0YVsnaWQnXX0vZXhwb3J0IgogICAgICBdCiAgICAgIAogICAgICBwYXRoc190b190cnkuZWFjaCBkbyB8cGF0aHwKICAgICAgICBiZWdpbgogICAgICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogVHJ5aW5nICN7cGF0aH0uLi4iCiAgICAgICAgICBkb3dubG9hZF9yZXNwID0gY2xpZW50LnJlcXVlc3QoOmdldCkgZG8gfHJlcXwKICAgICAgICAgICAgcmVxLnVybCBwYXRoCiAgICAgICAgICAgIHJlcS5oZWFkZXJzWydBY2NlcHQnXSA9ICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24sIGFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCwgKi8qOyBxPTAuMDEnCiAgICAgICAgICAgIHJlcS5oZWFkZXJzWydYLVJlcXVlc3RlZC1XaXRoJ10gPSAnWE1MSHR0cFJlcXVlc3QnCiAgICAgICAgICAgIHJlcS5oZWFkZXJzWydSZWZlcmVyJ10gPSAnaHR0cHM6Ly9hcHBzdG9yZWNvbm5lY3QuYXBwbGUuY29tL2FjY2Vzcy9hcGknCiAgICAgICAgICBlbmQKICAgICAgICAgICRzdGRlcnIucHV0cyAiREVCVUc6IFJlc3BvbnNlIENsYXNzOiAje2Rvd25sb2FkX3Jlc3AuYm9keS5jbGFzc30iCiAgICAgICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBSZXNwb25zZSBTdGF0dXM6ICN7ZG93bmxvYWRfcmVzcC5zdGF0dXN9IiBpZiBkb3dubG9hZF9yZXNwLnJlc3BvbmRfdG8/KDpzdGF0dXMpCiAgICAgICAgICAKICAgICAgICAgIGlmIGRvd25sb2FkX3Jlc3AuYm9keSAmJiAhZG93bmxvYWRfcmVzcC5ib2R5LnRvX3MuaW5jbHVkZT8oJyJlcnJvcnMiPT4nKQogICAgICAgICAgICAgaWYgZG93bmxvYWRfcmVzcC5ib2R5LmlzX2E/KEhhc2gpCiAgICAgICAgICAgICAgIHA4X2NvbnRlbnQgPSBkb3dubG9hZF9yZXNwLmJvZHlbJ2tleUNvbnRlbnQnXSB8fCBkb3dubG9hZF9yZXNwLmJvZHlbJ2NvbnRlbnQnXSB8fCBkb3dubG9hZF9yZXNwLmJvZHkuZGlnKCdkYXRhJywgJ2F0dHJpYnV0ZXMnLCAncHJpdmF0ZUtleScpCiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgIHA4X2NvbnRlbnQgPSBkb3dubG9hZF9yZXNwLmJvZHkKICAgICAgICAgICAgIGVuZAogICAgICAgICAgICAgCiAgICAgICAgICAgICBpZiBwOF9jb250ZW50ICYmIHA4X2NvbnRlbnQudG9fcy5zdGFydF93aXRoPygnLS0tLS1CRUdJTicpCiAgICAgICAgICAgICAgICRzdGRlcnIucHV0cyAiREVCVUc6IFJldHJpZXZhbCB2aWEgI3twYXRofSBzdWNjZXNzZnVsISBDb250ZW50IGxlbmd0aDogI3twOF9jb250ZW50LnRvX3MubGVuZ3RofSIKICAgICAgICAgICAgICAgYnJlYWsKICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogUmVzcG9uc2UgZnJvbSAje3BhdGh9IGRpZCBub3QgY29udGFpbiBhIHZhbGlkIHByaXZhdGUga2V5LiIKICAgICAgICAgICAgICAgcDhfY29udGVudCA9IG5pbAogICAgICAgICAgICAgZW5kCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBSZXNwb25zZSBmcm9tICN7cGF0aH0gZW1wdHkgb3IgY29udGFpbnMgZXJyb3JzLiIKICAgICAgICAgIGVuZAogICAgICAgIHJlc2N1ZSA9PiBlCiAgICAgICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBBdHRlbXB0IGZvciAje3BhdGh9IGZhaWxlZDogI3tlLm1lc3NhZ2V9IgogICAgICAgIGVuZAogICAgICBlbmQKICAgIGVuZAoKICAgICMgRklOQUwgVkFMSURBVElPTjogRW5zdXJlIGl0J3Mgbm90IGEgUnVieSBoYXNoIHN0cmluZyByZXByZXNlbnRhdGlvbiBvciBlcnJvcgogICAgaWYgcDhfY29udGVudC5pc19hPyhIYXNoKSB8fCBwOF9jb250ZW50LnRvX3MuaW5jbHVkZT8oJyJlcnJvcnMiPT4nKSB8fCAhcDhfY29udGVudC50b19zLnN0YXJ0X3dpdGg/KCctLS0tLUJFR0lOJykKICAgICAgJHN0ZGVyci5wdXRzICJERUJVRzogSW52YWxpZCBrZXkgY29udGVudCBkZXRlY3RlZC4iCiAgICAgIHA4X2NvbnRlbnQgPSBuaWwKICAgIGVuZAoKICAgIGlmIHA4X2NvbnRlbnQubmlsPwogICAgICAkc3RkZXJyLnB1dHMgIkRFQlVHOiBGYWlsZWQgdG8gcmV0cmlldmUga2V5IGNvbnRlbnQuIgogICAgZW5kCiAgICAKICAgIHJlc3VsdCA9IHsKICAgICAgaWQ6IGtleV9kYXRhWydpZCddLAogICAgICBuYW1lOiBhdHRyWyduaWNrbmFtZSddIHx8IGF0dHJbJ25hbWUnXSwKICAgICAgaXNzdWVySWQ6IGF0dHJbJ2lzc3VlcklkJ10sCiAgICAgIGtleUNvbnRlbnQ6IHA4X2NvbnRlbnQsCiAgICAgIHJhd19yZXNwb25zZTogcmVzcG9uc2UuYm9keSAjIEluY2x1ZGUgdGhpcyBmb3IgZGVidWdnaW5nIHdoZW4ga2V5Q29udGVudCBpcyBuaWwKICAgIH0KICAgIAogICAgcHV0cyAiX19fTUFDSF9KU09OX1NUQVJUX19fIiArIHJlc3VsdC50b19qc29uICsgIl9fX01BQ0hfSlNPTl9FTkRfX18iCiAgcmVzY3VlID0+IGUKICAgICRzdGRlcnIucHV0cyAiRVJST1I6ICN7ZS5tZXNzYWdlfSIKICAgIGlmIGRlZmluZWQ/KHJlc3BvbnNlKSAmJiByZXNwb25zZSAmJiByZXNwb25zZS5ib2R5CiAgICAgICAkc3RkZXJyLnB1dHMgIlJlc3BvbnNlIEJvZHk6ICN7cmVzcG9uc2UuYm9keS50b19qc29ufSIKICAgIGVuZAogICAgZXhpdCAxCiAgZW5kCmVuZAoKZGVmIGRlbGV0ZV9rZXkoaWQpCiAgYmVnaW4KICAgIFNwYWNlc2hpcDo6UG9ydGFsLmxvZ2luKEVOVlsnRkFTVExBTkVfVVNFUiddKQogICAgU3BhY2VzaGlwOjpQb3J0YWwuc2VsZWN0X3RlYW0odGVhbV9pZDogRU5WWydGQVNUTEFORV9URUFNX0lEJ10pCiAgICAKICAgIFNwYWNlc2hpcDo6VHVuZXMubG9naW4oRU5WWydGQVNUTEFORV9VU0VSJ10pCiAgICBzZWxlY3RfYXBwX3N0b3JlX2Nvbm5lY3RfdGVhbQogICAgCiAgICBjbGllbnQgPSBTcGFjZXNoaXA6OlR1bmVzLmNsaWVudAogICAgY2xpZW50LnJlcXVlc3QoOmRlbGV0ZSwgIi9pcmlzL3YxL2FwaUtleXMvI3tpZH0iKQogICAgcHV0cyAiU1VDQ0VTUyIKICByZXNjdWUgPT4gZQogICAgJHN0ZGVyci5wdXRzICJFUlJPUjogI3tlLm1lc3NhZ2V9IgogICAgZXhpdCAxCiAgZW5kCmVuZAoKY29tbWFuZCA9IEFSR1ZbMF0KaWYgY29tbWFuZCA9PSAnbGlzdCcKICBsaXN0X2tleXMKZWxzaWYgY29tbWFuZCA9PSAndGVhbXMnCiAgbGlzdF90ZWFtcwplbHNpZiBjb21tYW5kID09ICdjcmVhdGUnCiAgY3JlYXRlX2tleShBUkdWWzFdIHx8ICJNYWNoIEFQSSBLZXkgI3tUaW1lLm5vdy50b19pfSIpCmVsc2lmIGNvbW1hbmQgPT0gJ2RlbGV0ZScKICBkZWxldGVfa2V5KEFSR1ZbMV0pCmVuZAo=";function Nn(){let e=ke.join($n.tmpdir(),I.nameLower);ue.existsSync(e)||ue.mkdirSync(e,{recursive:!0});let t=ke.join(e,"manage_asc_keys.rb");return ue.writeFileSync(t,Buffer.from(Oo,"base64").toString("utf-8"),{mode:493}),t}function xn(){return yt()}function _n(e){let t=new Map,n=/-\s+(\d+)\s+\(([^)]+)\)/g,i=/\d+\)\s+"([^"]+)"\s+\((\d+)\)/g,r;for(;(r=n.exec(e))!==null;)t.set(r[1],{id:r[1],name:r[2]});for(;(r=i.exec(e))!==null;)t.set(r[2],{id:r[2],name:r[1]});return Array.from(t.values())}function Pi(e){return Ft(e).appStoreConnectTeamId}function Ei(e,t,n){return{...xn(),FASTLANE_USER:e,FASTLANE_TEAM_ID:t,...n?{FASTLANE_ITC_TEAM_ID:n,FASTLANE_ASC_TEAM_ID:n}:{}}}function at(e,t="production",n={}){let i=Ft(e,t),r=n.teamId||i.teamId,o=n.appStoreConnectTeamId||i.appStoreConnectTeamId;return{teamId:r,teamName:n.teamName||i.teamName,developerTeamId:n.developerTeamId||i.developerTeamId||r,appStoreConnectTeamId:o,providerId:n.providerId||i.providerId||o,providerName:n.providerName||i.providerName}}function $o(e,t){if(!t.id)return;e.submit||(e.submit={}),e.submit.production||(e.submit.production={}),e.submit.production.ios||(e.submit.production.ios={});let n=e.submit.production.ios;n.appStoreConnectTeamId=t.id,delete n.providerId,delete n.appStoreConnectTeamName,delete n.providerName,delete n.appleTeamName}function Tn(e,t){$o(e,t);try{ue.writeFileSync(`./${I.configFileName}`,JSON.stringify(e,null,2))}catch{}}async function _o(e,t,n,i){let r=It();r.start("Fetching App Store Connect providers...");let o=Bt("ruby",[e,"teams"],{env:Ei(n,i),stdio:["inherit","pipe","pipe"],encoding:"utf-8"});if(o.status!==0){r.stop("Could not fetch providers");let d=_n(`${o.stdout||""}
3
+ ${o.stderr||""}`);if(d.length>0)return kn(t,d,"Select the App Store Connect provider for this API key:");q.warn(ce.yellow(`Could not list App Store Connect providers: ${o.stderr||"Unknown error"}`));return}let s=(o.stdout||"").match(new RegExp(`${I.jsonStartMarker}(.*)${I.jsonEndMarker}`));if(!s){r.stop("Could not parse providers");return}let a=JSON.parse(s[1]),c=(a.teams||[]).filter(d=>d.id&&d.name);if(r.stop(c.length===1?"Found 1 provider":`Found ${c.length} providers`),c.length===0)return;if(c.length===1){q.success(ce.green(`\u2713 Using App Store Connect provider ${c[0].name} (${c[0].id})`));let d={...c[0],developerTeamName:a.developerTeamName};return Tn(t,d),d}let l=c.filter(d=>d.recommended),p=c.filter(d=>!d.recommended);return kn(t,[...l,...p],`Select the App Store Connect provider for Developer Team ${a.developerTeamName||i}:`,a.developerTeamName)}async function kn(e,t,n,i){let r=await ct({message:n,options:t.map(c=>({value:c.id,label:c.name,hint:`${c.id}${c.recommended?" \xB7 recommended":""}`}))});if(fe(r))return _e("Operation cancelled"),null;let o=r,a={...t.find(c=>c.id===o)||{id:o,name:o},developerTeamName:i};return Tn(e,a),q.success(ce.green(`\u2713 Using App Store Connect provider ${a.name} (${a.id})`)),a}var Vt=e=>typeof e=="string"&&e.trim()?e.trim():void 0,wi=e=>Vt(e)?.toUpperCase();function To(e,t){let n=wi(t.developerTeamId||t.teamId),i=Vt(t.appStoreConnectTeamId||t.providerId);return e.filter(r=>{let o=wi(r.teamId),s=Vt(r.appStoreConnectTeamId||r.providerId);return!(n&&o!==n||i&&s!==i)})}function Rn(e){let t=Vt(e.name)||"App Store Connect API key",n=Vt(e.sourceProjectName)||e.sourceProjectId;return`${t} \xB7 ${n}`}function Fo(e){return[e.teamId?`Apple Team ${e.teamId}`:void 0,e.appStoreConnectTeamId||e.providerId?`ASC provider ${e.appStoreConnectTeamId||e.providerId}`:void 0,e.keyId?`Key ${e.keyId}`:void 0].filter(Boolean).join(" \xB7 ")}async function Do(e,t,n){let i=at(t,n),r=i.developerTeamId||i.teamId,o=i.appStoreConnectTeamId||i.providerId;if(!r){q.error(`Set ios.appleTeamId or submit.${n}.ios.appleTeamId in ${I.configFileName} before reusing an App Store Connect API key.`);return}let s=It(),a=[];try{s.start("Looking for compatible saved App Store Connect API keys...");let p=await W.get("/credentials/reusable",{params:{projectId:e,type:"asc_api_key"}});a=To(Array.isArray(p.data?.credentials)?p.data.credentials:[],i),s.stop(a.length===1?"Found 1 compatible saved API key":`Found ${a.length} compatible saved API keys`)}catch(p){s.stop("Could not load saved API keys"),q.error(`Could not load reusable App Store Connect API keys: ${p.response?.data?.message||p.message}. You need administrator access to this project and the source project.`);return}if(a.length===0){let p=o?`Apple Team ${r} and App Store Connect provider ${o}`:`Apple Team ${r}`;q.info(`No compatible saved API keys were found for ${p}.`);return}let c=await ct({message:"Select a saved App Store Connect API key to reuse:",options:[...a.map((p,d)=>({value:String(d),label:Rn(p),hint:Fo(p)})),{value:"cancel",label:"Cancel"}]});if(fe(c)||c==="cancel"){_e("Operation cancelled");return}let l=a[Number(c)];if(!l){q.error("The selected App Store Connect API key is no longer available.");return}try{s.start(`Copying ${Rn(l)} into this project...`),await W.post("/credentials/reuse",{projectId:e,sourceProjectId:l.sourceProjectId,credentialId:l.credentialId,type:"asc_api_key"}),s.stop("Saved API key copied to this project");let p=l.appStoreConnectTeamId||l.providerId;p&&Tn(t,{id:p,name:l.providerName||p}),q.success(ce.green(`\u2713 Reused ${Rn(l)} for this project.`))}catch(p){s.stop("Could not reuse saved API key"),q.error(`Could not reuse the selected App Store Connect API key: ${p.response?.data?.message||p.message}.`)}}var Ri=async e=>{let t=It(),n=e.platform,i=`./${I.configFileName}`;if(!ue.existsSync(i)){q.error(`No ${I.configFileName} found. Run \`${I.nameLower} init\` or \`${I.nameLower} link\` first.`);return}let r=JSON.parse(ue.readFileSync(i,"utf-8")),{projectId:o}=r,s=e.profile||"production";if(!o){q.error(`${I.configFileName} is missing projectId.`);return}let a=e.file,c=n==="android"?e.packageName||e.bundleId:e.bundleId||ze(r,s)||"*";if(n==="android"&&!c&&(c=await Bo(o,r,s),c===null))return;if(n==="ios"&&!a){let u=await ct({message:"Manage App Store Connect API Key:",options:[{value:"magic",label:"\u2728 Create new automatically",hint:"Requires Apple ID + 2FA"},{value:"reuse",label:"\u267B\uFE0F Use a saved API Key",hint:"Copy a compatible key from another Mach project"},{value:"manual",label:"\u{1F50D} Configure manually",hint:"Provide existing .p8 file"},{value:"delete",label:"\u{1F5D1}\uFE0F Delete an existing Key"}]});if(fe(u)){_e("Operation cancelled");return}if(u==="magic"){await jo(o,r);return}if(u==="reuse"){await Do(o,r,s);return}if(u==="delete"){await Wo(o,r);return}}if(!a){let u=n==="ios"?"https://appstoreconnect.apple.com/access/api":"https://console.cloud.google.com/apis/credentials";qt(`To submit to the ${n==="ios"?"App Store":"Google Play Store"}, you need a Service Key:
4
4
 
5
5
  1. Open: ${ce.cyan(u)}
6
6
  `+(n==="ios"?`2. Generate an "App Store Connect API Key" with ${ce.bold("Admin")} role.
7
7
  3. Download the ${ce.bold(".p8")} file.`:`2. Create a "Service Account", generate a ${ce.bold("JSON")} key.
8
- 3. Download the ${ce.bold(".json")} file.`),"Guided Setup"),t.start("Scanning for downloaded keys...");let f=Zo(n);if(t.stop(f.length>0?`Detected ${f.length} potential key(s)`:"No keys detected automatically"),f.length>0){let m=await ct({message:"Found these potential keys. Use one of them?",options:[...f.map(N=>({value:N.path,label:`${ke.basename(N.path)} (${N.location})`})),{value:"manual",label:"Enter path manually..."}]});if(fe(m)){_e("Operation cancelled");return}m!=="manual"&&(a=m)}if(!a){let m=await Ue({message:`Paste the path to your ${n==="ios"?".p8":".json"} file:`,validate:N=>ue.existsSync(N)?void 0:"File not found"});if(fe(m)){_e("Operation cancelled");return}a=m}}let l=e.issuerId,d=e.keyId;if(n==="ios"){if(!d&&a){let u=ke.basename(a).match(/AuthKey_(.*)\.p8/);u&&(d=u[1],q.info(`Auto-detected Key ID from filename: ${ce.green(d)}`))}if(!l){let u=await Ue({message:"Enter App Store Connect Issuer ID (Found on the Keys page):",validate:f=>f.length>0?void 0:"Issuer ID is required"});if(fe(u)){_e("Operation cancelled");return}l=u}if(!d){let u=await Ue({message:"Enter App Store Connect Key ID:",validate:f=>f.length>0?void 0:"Key ID is required"});if(fe(u)){_e("Operation cancelled");return}d=u}}if(n==="android"&&(!c||c==="*")){let u=await Ni();if(u===null)return;c=u}let p=n==="ios"?at(r,s):{};await On(o,a,n,l,d,c,{...p})};async function Bo(e,t,n){let i=await Vo(e),r=Mo(t,n);if(r&&!i.includes(r)&&i.unshift(r),i.length>0){let o=await ct({message:"Select Android package for this Google Play service key:",options:[...i.map(s=>({value:s,label:s,hint:s===r?"from config":void 0})),{value:"manual",label:"Enter another package name..."}]});if(fe(o))return _e("Operation cancelled"),null;if(o==="manual")return Ni();if(o!=="manual")return o}if(r){let o=await vi({message:`Use Android package from local config (${r})?`,initialValue:!0});if(fe(o))return _e("Operation cancelled"),null;if(o)return r}}async function Ni(){let e=await Ue({message:"Android package name for this Google Play service key:",placeholder:"com.example.app",validate:t=>t.includes(".")?void 0:"Enter a valid package name"});return fe(e)?(_e("Operation cancelled"),null):e}async function Vo(e){try{let n=(await W.get(`/credentials/${e}`)).data.credentials||[],i=new Set;for(let r of n)(r.platform==="android"||r.type==="android_keystore"||r.type==="google_service_account")&&r.bundleId&&r.bundleId!=="*"&&i.add(r.bundleId);return Array.from(i).sort()}catch(t){return q.warn(ce.yellow(`Could not fetch saved Android package identifiers: ${t.message}`)),[]}}function Mo(e,t){let n=ht(e,t);if(n)return n;let i=ke.join(process.cwd(),"app.json");if(ue.existsSync(i))try{return JSON.parse(ue.readFileSync(i,"utf-8")).expo?.android?.package}catch{}let r=ke.join(process.cwd(),"app.config.json");if(ue.existsSync(r))try{let o=JSON.parse(ue.readFileSync(r,"utf-8"));return o.expo?.android?.package||o.android?.package}catch{}}async function jo(e,t){let n=It(),i=t.submit?.production?.ios?.appleId,r=at(t).teamId,o=Pi(t);if(!i){let c=await Ue({message:"Apple ID:",placeholder:"your-email@example.com"});if(fe(c))return;i=c}if(!r){let c=await Dt({appleId:i,config:t,profile:"production",initialTeam:at(t),promptToPersistConfig:!0});if(!c?.teamId)return;r=c.teamId}let s=await Ue({message:"Enter a name for the new API Key:",initialValue:`[${I.name}] Project ${e}`});if(fe(s))return;let a=Nn();if(!ue.existsSync(a)){q.error(`Magic Error: Helper script not found at ${a}`);return}try{let c=await _o(a,t,i,r);if(c===null)return;let l;if(c)l=c,o=c.id;else if(!o)return;n.start("Creating App Store Connect API Key...");let d=C=>Bt("ruby",[a,"create",s],{env:Ei(i,r,C),stdio:["inherit","pipe","pipe"],encoding:"utf-8"}),p=d(o),u=p.stdout||"",f=p.stderr||"";if(p.status!==0){let C=_n(`${u}
8
+ 3. Download the ${ce.bold(".json")} file.`),"Guided Setup"),t.start("Scanning for downloaded keys...");let f=Zo(n);if(t.stop(f.length>0?`Detected ${f.length} potential key(s)`:"No keys detected automatically"),f.length>0){let g=await ct({message:"Found these potential keys. Use one of them?",options:[...f.map(N=>({value:N.path,label:`${ke.basename(N.path)} (${N.location})`})),{value:"manual",label:"Enter path manually..."}]});if(fe(g)){_e("Operation cancelled");return}g!=="manual"&&(a=g)}if(!a){let g=await Ue({message:`Paste the path to your ${n==="ios"?".p8":".json"} file:`,validate:N=>ue.existsSync(N)?void 0:"File not found"});if(fe(g)){_e("Operation cancelled");return}a=g}}let l=e.issuerId,p=e.keyId;if(n==="ios"){if(!p&&a){let u=ke.basename(a).match(/AuthKey_(.*)\.p8/);u&&(p=u[1],q.info(`Auto-detected Key ID from filename: ${ce.green(p)}`))}if(!l){let u=await Ue({message:"Enter App Store Connect Issuer ID (Found on the Keys page):",validate:f=>f.length>0?void 0:"Issuer ID is required"});if(fe(u)){_e("Operation cancelled");return}l=u}if(!p){let u=await Ue({message:"Enter App Store Connect Key ID:",validate:f=>f.length>0?void 0:"Key ID is required"});if(fe(u)){_e("Operation cancelled");return}p=u}}if(n==="android"&&(!c||c==="*")){let u=await Ni();if(u===null)return;c=u}let d=n==="ios"?at(r,s):{};await On(o,a,n,l,p,c,{...d})};async function Bo(e,t,n){let i=await Vo(e),r=Mo(t,n);if(r&&!i.includes(r)&&i.unshift(r),i.length>0){let o=await ct({message:"Select Android package for this Google Play service key:",options:[...i.map(s=>({value:s,label:s,hint:s===r?"from config":void 0})),{value:"manual",label:"Enter another package name..."}]});if(fe(o))return _e("Operation cancelled"),null;if(o==="manual")return Ni();if(o!=="manual")return o}if(r){let o=await vi({message:`Use Android package from local config (${r})?`,initialValue:!0});if(fe(o))return _e("Operation cancelled"),null;if(o)return r}}async function Ni(){let e=await Ue({message:"Android package name for this Google Play service key:",placeholder:"com.example.app",validate:t=>t.includes(".")?void 0:"Enter a valid package name"});return fe(e)?(_e("Operation cancelled"),null):e}async function Vo(e){try{let n=(await W.get(`/credentials/${e}`)).data.credentials||[],i=new Set;for(let r of n)(r.platform==="android"||r.type==="android_keystore"||r.type==="google_service_account")&&r.bundleId&&r.bundleId!=="*"&&i.add(r.bundleId);return Array.from(i).sort()}catch(t){return q.warn(ce.yellow(`Could not fetch saved Android package identifiers: ${t.message}`)),[]}}function Mo(e,t){let n=ht(e,t);if(n)return n;let i=ke.join(process.cwd(),"app.json");if(ue.existsSync(i))try{return JSON.parse(ue.readFileSync(i,"utf-8")).expo?.android?.package}catch{}let r=ke.join(process.cwd(),"app.config.json");if(ue.existsSync(r))try{let o=JSON.parse(ue.readFileSync(r,"utf-8"));return o.expo?.android?.package||o.android?.package}catch{}}async function jo(e,t){let n=It(),i=t.submit?.production?.ios?.appleId,r=at(t).teamId,o=Pi(t);if(!i){let c=await Ue({message:"Apple ID:",placeholder:"your-email@example.com"});if(fe(c))return;i=c}if(!r){let c=await Dt({appleId:i,config:t,profile:"production",initialTeam:at(t),promptToPersistConfig:!0});if(!c?.teamId)return;r=c.teamId}let s=await Ue({message:"Enter a name for the new API Key:",initialValue:`[${I.name}] Project ${e}`});if(fe(s))return;let a=Nn();if(!ue.existsSync(a)){q.error(`Magic Error: Helper script not found at ${a}`);return}try{let c=await _o(a,t,i,r);if(c===null)return;let l;if(c)l=c,o=c.id;else if(!o)return;n.start("Creating App Store Connect API Key...");let p=C=>Bt("ruby",[a,"create",s],{env:Ei(i,r,C),stdio:["inherit","pipe","pipe"],encoding:"utf-8"}),d=p(o),u=d.stdout||"",f=d.stderr||"";if(d.status!==0){let C=_n(`${u}
9
9
  ${f}`);if(C.length>0){n.stop("Select App Store Connect team"),qt(`Apple Developer Team IDs look like ${ce.bold(r)}.
10
- App Store Connect API keys use a numeric provider/team ID instead.`,"Team ID mismatch");let v=await kn(t,C,"Select the App Store Connect provider for this API key:");if(!v)return;l=v,o=v.id,n.start("Creating API Key with selected App Store Connect team..."),p=d(o),u=p.stdout||"",f=p.stderr||""}}if(f&&(f.includes("DEBUG:")||f.includes("ERROR:"))&&f.split(`
11
- `).forEach(C=>{C.trim()&&q.info(ce.dim(`[Ruby] ${C.trim()}`))}),p.status!==0){n.stop("Failed"),q.error(`Magic creation failed: ${f}`);return}let m=u.match(new RegExp(`${I.jsonStartMarker}(.*)${I.jsonEndMarker}`));if(!m){n.stop("Parse Error"),q.error("Could not parse response from Apple Portal.");return}let N=JSON.parse(m[1]),{id:b,issuerId:P,keyContent:_}=N,S=at(t,"production",{teamId:r,teamName:l?.developerTeamName,developerTeamId:r,appStoreConnectTeamId:o,providerId:o,providerName:l?.name});if(n.stop("Key Created Successfully"),q.success(`\u2713 Created Key ID: ${ce.green(b)}`),!P){qt(`Your Issuer ID is shown at the top of:
10
+ App Store Connect API keys use a numeric provider/team ID instead.`,"Team ID mismatch");let v=await kn(t,C,"Select the App Store Connect provider for this API key:");if(!v)return;l=v,o=v.id,n.start("Creating API Key with selected App Store Connect team..."),d=p(o),u=d.stdout||"",f=d.stderr||""}}if(f&&(f.includes("DEBUG:")||f.includes("ERROR:"))&&f.split(`
11
+ `).forEach(C=>{C.trim()&&q.info(ce.dim(`[Ruby] ${C.trim()}`))}),d.status!==0){n.stop("Failed"),q.error(`Magic creation failed: ${f}`);return}let g=u.match(new RegExp(`${I.jsonStartMarker}(.*)${I.jsonEndMarker}`));if(!g){n.stop("Parse Error"),q.error("Could not parse response from Apple Portal.");return}let N=JSON.parse(g[1]),{id:b,issuerId:P,keyContent:_}=N,S=at(t,"production",{teamId:r,teamName:l?.developerTeamName,developerTeamId:r,appStoreConnectTeamId:o,providerId:o,providerName:l?.name});if(n.stop("Key Created Successfully"),q.success(`\u2713 Created Key ID: ${ce.green(b)}`),!P){qt(`Your Issuer ID is shown at the top of:
12
12
  ${ce.cyan("https://appstoreconnect.apple.com/access/integrations/api")}
13
13
 
14
14
  It looks like: ${ce.dim("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")}`,"One More Thing");let C=await Ue({message:"Enter your App Store Connect Issuer ID:",validate:v=>v.trim().length>0?void 0:"Issuer ID is required"});if(fe(C)){_e("Operation cancelled.");return}P=C.trim()}if(_){let C=ke.join($n.tmpdir(),`AuthKey_${b}.p8`);ue.writeFileSync(C,_),await On(e,C,"ios",P,b,t.ios?.bundleIdentifier||"*",{...S}),ue.unlinkSync(C)}else{q.warn(ce.yellow("\u26A0\uFE0F Apple did not return the private key in the response.")),qt(`Download the .p8 file manually:
@@ -16,8 +16,8 @@ It looks like: ${ce.dim("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")}`,"One More Thin
16
16
  1. Open: ${ce.cyan("https://appstoreconnect.apple.com/access/integrations/api")}
17
17
  2. Find Key ID: ${ce.green(b)}
18
18
  3. Click ${ce.bold("Download API Key")} (only available once)
19
- 4. Drag & drop the downloaded .p8 file below`,"Manual Step Required");let C=await Ue({message:"Path to the downloaded .p8 file (drag & drop here):",validate:v=>ue.existsSync(v)?void 0:"File not found"});if(fe(C)){_e("Operation cancelled. Credential ID was registered but key content is missing.");return}await On(e,C,"ios",P,b,t.ios?.bundleIdentifier||"*",{...S})}}catch(c){n.stop("Error"),q.error(`Error: ${c.message}`)}}async function Wo(e,t){let n=It(),i=t.submit?.production?.ios?.appleId,r=at(t).teamId,o=Pi(t);if(!i){let a=await Ue({message:"Apple ID:"});if(fe(a))return;i=a}if(!r){let a=await Dt({appleId:i,config:t,profile:"production",initialTeam:at(t),promptToPersistConfig:!0});if(!a?.teamId)return;r=a.teamId}n.start("Fetching existing API Keys...");let s=Nn();if(!ue.existsSync(s)){q.error(`Magic Error: Helper script not found at ${s}`);return}try{let a=m=>Bt("ruby",[s,"list"],{env:{...xn(),FASTLANE_USER:i,FASTLANE_TEAM_ID:r,...m?{FASTLANE_ITC_TEAM_ID:m,FASTLANE_ASC_TEAM_ID:m}:{}},stdio:["inherit","pipe","pipe"],encoding:"utf-8"}),c=a(o);if(c.status!==0){let m=_n(`${c.stdout||""}
20
- ${c.stderr||""}`);if(m.length>0){n.stop("Select App Store Connect team");let N=await ct({message:"Select the App Store Connect team to list API keys:",options:m.map(b=>({value:b.id,label:b.name,hint:b.id}))});if(fe(N)){_e("Operation cancelled");return}o=N,n.start("Fetching existing API Keys..."),c=a(o)}}if(c.status!==0){n.stop("Failed"),q.error(`Listing failed: ${c.stderr}`);return}let l=c.stdout.match(new RegExp(`${I.jsonStartMarker}(.*)${I.jsonEndMarker}`));if(!l){n.stop("Parse Error");return}let d=JSON.parse(l[1]);if(n.stop(`Found ${d.length} keys`),d.length===0){q.info("No API Keys found on this team.");return}let p=await ct({message:"Select a key to delete from Apple Developer Portal:",options:[...d.map(m=>({value:m.id,label:`ID: ${m.id} - ${m.name} (${m.role})`})),{value:"cancel",label:"Cancel"}]});if(fe(p)||p==="cancel")return;let u=await vi({message:`Are you sure you want to delete Key ${p}? This cannot be undone.`});if(!u||fe(u))return;n.start(`Deleting Key ${p}...`);let f=Bt("ruby",[Nn(),"delete",p],{env:{...xn(),FASTLANE_USER:i,FASTLANE_TEAM_ID:r,...o?{FASTLANE_ITC_TEAM_ID:o,FASTLANE_ASC_TEAM_ID:o}:{}},stdio:"pipe",encoding:"utf-8"});f.status===0?(n.stop("Deleted"),q.success(`\u2713 Key ${p} has been removed from Apple Portal.`)):(n.stop("Deletion Failed"),q.error(`Error: ${f.stderr}`))}catch(a){n.stop("Error"),q.error(`Error: ${a.message}`)}}async function On(e,t,n,i,r,o="*",s={}){let a=It();a.start(`Uploading Service Credentials for ${n}...`);try{let c=n==="ios"?"asc_api_key":"google_service_account",l=new URL(import.meta.url),d=ke.dirname(l.pathname),p=[ke.join(d,"isolated-upload.js"),ke.join(d,"commands","isolated-upload.js"),ke.resolve(d,"../commands/isolated-upload.js"),ke.resolve(process.cwd(),`node_modules/.bin/${I.nameLower}-upload`)],u="";for(let m of p)if(ue.existsSync(m)){u=m;break}if(!u)throw new Error("Could not locate isolated-upload.js. Ensure the CLI is properly installed.");let f=Bt("node",[u,e,t,c,o,"service","undefined","undefined",i||"undefined",r||"undefined","undefined","undefined","undefined",s.teamId||"undefined",s.teamName||"undefined",s.developerTeamId||"undefined",s.appStoreConnectTeamId||"undefined",s.providerId||"undefined",s.providerName||"undefined"],{stdio:"pipe",encoding:"utf-8",env:{...process.env,AT_CLI_ISOLATED:"1"}});if(f.status!==0){let m=f.stderr||f.stdout||"Unknown upload failure";a.stop("Upload Failed"),q.error(ce.red(`Upload Failed: ${m}`));return}f.stdout.includes("SUCCESS")?(a.stop("Upload Success"),q.success(ce.green(`\u2713 Service Credentials for ${n} uploaded successfully.`))):(a.stop("Upload Summary"),q.warn(ce.yellow(`Upload finished but success not confirmed: ${f.stdout}`)))}catch(c){a.stop("Upload Error"),q.error(ce.red(`Error: ${c.message}`))}}function Zo(e){let t=e==="ios"?".p8":".json",n=[],i=[{path:"./",label:"Project Root"},{path:ke.join($n.homedir(),"Downloads"),label:"Downloads"}];for(let r of i)if(ue.existsSync(r.path))try{let o=ue.readdirSync(r.path);for(let s of o)if(s.endsWith(t)){if(e==="android"&&!ue.readFileSync(ke.join(r.path,s),"utf8").includes("service_account")||e==="ios"&&!s.startsWith("AuthKey"))continue;n.push({path:ke.join(r.path,s),location:r.label})}}catch{}return n}import{spinner as pn}from"@clack/prompts";import re from"chalk";import{spawnSync as Ta}from"child_process";import pe from"fs";import Ee from"path";import Y from"fs";import se from"path";var Uo={expo:["src/app/_layout.tsx","src/app/_layout.ts","src/app/_layout.jsx","src/app/_layout.js","app/_layout.tsx","app/_layout.ts","app/_layout.jsx","app/_layout.js","src/App.tsx","src/App.ts","src/App.jsx","src/App.js","App.tsx","App.ts","App.jsx","App.js"],"react-native":["index.ts","index.tsx","index.js","index.jsx","src/index.ts","src/index.tsx","src/index.js","src/index.jsx","App.tsx","App.ts","App.jsx","App.js","src/App.tsx","src/App.ts","src/App.jsx","src/App.js"]};function Te(e,t){return se.relative(e,t).split(se.sep).join("/")}function Go(e,t){return t.find(n=>Y.existsSync(se.join(e,n)))}function Lo(e,t){return t.split(se.sep).join("/").startsWith("src/")?se.join(e,"src"):e}function Xo(e){return e.endsWith(".ts")||e.endsWith(".tsx")}function Ho(e,t){let n=t.replace(/\.(?:tsx?|jsx?)$/,""),i=se.relative(se.dirname(e),n).split(se.sep).join("/");return i.startsWith(".")||(i=`./${i}`),i}function Ko(e,t){let n=Y.readFileSync(e,"utf8");if(n.includes("MACH Push setup")||/(?:from\s+)?['"][^'"]*mach-push['"]/.test(n))return!1;let i=Ho(e,t);return Y.writeFileSync(e,`import '${i}'; // MACH Push setup
19
+ 4. Drag & drop the downloaded .p8 file below`,"Manual Step Required");let C=await Ue({message:"Path to the downloaded .p8 file (drag & drop here):",validate:v=>ue.existsSync(v)?void 0:"File not found"});if(fe(C)){_e("Operation cancelled. Credential ID was registered but key content is missing.");return}await On(e,C,"ios",P,b,t.ios?.bundleIdentifier||"*",{...S})}}catch(c){n.stop("Error"),q.error(`Error: ${c.message}`)}}async function Wo(e,t){let n=It(),i=t.submit?.production?.ios?.appleId,r=at(t).teamId,o=Pi(t);if(!i){let a=await Ue({message:"Apple ID:"});if(fe(a))return;i=a}if(!r){let a=await Dt({appleId:i,config:t,profile:"production",initialTeam:at(t),promptToPersistConfig:!0});if(!a?.teamId)return;r=a.teamId}n.start("Fetching existing API Keys...");let s=Nn();if(!ue.existsSync(s)){q.error(`Magic Error: Helper script not found at ${s}`);return}try{let a=g=>Bt("ruby",[s,"list"],{env:{...xn(),FASTLANE_USER:i,FASTLANE_TEAM_ID:r,...g?{FASTLANE_ITC_TEAM_ID:g,FASTLANE_ASC_TEAM_ID:g}:{}},stdio:["inherit","pipe","pipe"],encoding:"utf-8"}),c=a(o);if(c.status!==0){let g=_n(`${c.stdout||""}
20
+ ${c.stderr||""}`);if(g.length>0){n.stop("Select App Store Connect team");let N=await ct({message:"Select the App Store Connect team to list API keys:",options:g.map(b=>({value:b.id,label:b.name,hint:b.id}))});if(fe(N)){_e("Operation cancelled");return}o=N,n.start("Fetching existing API Keys..."),c=a(o)}}if(c.status!==0){n.stop("Failed"),q.error(`Listing failed: ${c.stderr}`);return}let l=c.stdout.match(new RegExp(`${I.jsonStartMarker}(.*)${I.jsonEndMarker}`));if(!l){n.stop("Parse Error");return}let p=JSON.parse(l[1]);if(n.stop(`Found ${p.length} keys`),p.length===0){q.info("No API Keys found on this team.");return}let d=await ct({message:"Select a key to delete from Apple Developer Portal:",options:[...p.map(g=>({value:g.id,label:`ID: ${g.id} - ${g.name} (${g.role})`})),{value:"cancel",label:"Cancel"}]});if(fe(d)||d==="cancel")return;let u=await vi({message:`Are you sure you want to delete Key ${d}? This cannot be undone.`});if(!u||fe(u))return;n.start(`Deleting Key ${d}...`);let f=Bt("ruby",[Nn(),"delete",d],{env:{...xn(),FASTLANE_USER:i,FASTLANE_TEAM_ID:r,...o?{FASTLANE_ITC_TEAM_ID:o,FASTLANE_ASC_TEAM_ID:o}:{}},stdio:"pipe",encoding:"utf-8"});f.status===0?(n.stop("Deleted"),q.success(`\u2713 Key ${d} has been removed from Apple Portal.`)):(n.stop("Deletion Failed"),q.error(`Error: ${f.stderr}`))}catch(a){n.stop("Error"),q.error(`Error: ${a.message}`)}}async function On(e,t,n,i,r,o="*",s={}){let a=It();a.start(`Uploading Service Credentials for ${n}...`);try{let c=n==="ios"?"asc_api_key":"google_service_account",l=new URL(import.meta.url),p=ke.dirname(l.pathname),d=[ke.join(p,"isolated-upload.js"),ke.join(p,"commands","isolated-upload.js"),ke.resolve(p,"../commands/isolated-upload.js"),ke.resolve(process.cwd(),`node_modules/.bin/${I.nameLower}-upload`)],u="";for(let g of d)if(ue.existsSync(g)){u=g;break}if(!u)throw new Error("Could not locate isolated-upload.js. Ensure the CLI is properly installed.");let f=Bt("node",[u,e,t,c,o,"service","undefined","undefined",i||"undefined",r||"undefined","undefined","undefined","undefined",s.teamId||"undefined",s.teamName||"undefined",s.developerTeamId||"undefined",s.appStoreConnectTeamId||"undefined",s.providerId||"undefined",s.providerName||"undefined"],{stdio:"pipe",encoding:"utf-8",env:{...process.env,AT_CLI_ISOLATED:"1"}});if(f.status!==0){let g=f.stderr||f.stdout||"Unknown upload failure";a.stop("Upload Failed"),q.error(ce.red(`Upload Failed: ${g}`));return}f.stdout.includes("SUCCESS")?(a.stop("Upload Success"),q.success(ce.green(`\u2713 Service Credentials for ${n} uploaded successfully.`))):(a.stop("Upload Summary"),q.warn(ce.yellow(`Upload finished but success not confirmed: ${f.stdout}`)))}catch(c){a.stop("Upload Error"),q.error(ce.red(`Error: ${c.message}`))}}function Zo(e){let t=e==="ios"?".p8":".json",n=[],i=[{path:"./",label:"Project Root"},{path:ke.join($n.homedir(),"Downloads"),label:"Downloads"}];for(let r of i)if(ue.existsSync(r.path))try{let o=ue.readdirSync(r.path);for(let s of o)if(s.endsWith(t)){if(e==="android"&&!ue.readFileSync(ke.join(r.path,s),"utf8").includes("service_account")||e==="ios"&&!s.startsWith("AuthKey"))continue;n.push({path:ke.join(r.path,s),location:r.label})}}catch{}return n}import{spinner as pn}from"@clack/prompts";import re from"chalk";import{spawnSync as Ta}from"child_process";import pe from"fs";import Ee from"path";import Y from"fs";import se from"path";var Uo={expo:["src/app/_layout.tsx","src/app/_layout.ts","src/app/_layout.jsx","src/app/_layout.js","app/_layout.tsx","app/_layout.ts","app/_layout.jsx","app/_layout.js","src/App.tsx","src/App.ts","src/App.jsx","src/App.js","App.tsx","App.ts","App.jsx","App.js"],"react-native":["index.ts","index.tsx","index.js","index.jsx","src/index.ts","src/index.tsx","src/index.js","src/index.jsx","App.tsx","App.ts","App.jsx","App.js","src/App.tsx","src/App.ts","src/App.jsx","src/App.js"]};function Te(e,t){return se.relative(e,t).split(se.sep).join("/")}function Go(e,t){return t.find(n=>Y.existsSync(se.join(e,n)))}function Lo(e,t){return t.split(se.sep).join("/").startsWith("src/")?se.join(e,"src"):e}function Xo(e){return e.endsWith(".ts")||e.endsWith(".tsx")}function Ho(e,t){let n=t.replace(/\.(?:tsx?|jsx?)$/,""),i=se.relative(se.dirname(e),n).split(se.sep).join("/");return i.startsWith(".")||(i=`./${i}`),i}function Ko(e,t){let n=Y.readFileSync(e,"utf8");if(n.includes("MACH Push setup")||/(?:from\s+)?['"][^'"]*mach-push['"]/.test(n))return!1;let i=Ho(e,t);return Y.writeFileSync(e,`import '${i}'; // MACH Push setup
21
21
  ${n}`),!0}function Jo(e,t){let n={projectId:e.projectId};return e.appId&&e.publishableKey&&(n.appId=e.appId,n.publishableKey=e.publishableKey),e.apiUrl&&e.apiUrl!=="https://mach-api.securejs.in"&&(n.apiUrl=e.apiUrl),e.environment&&e.environment!=="production"&&(n.environment=e.environment),`// Generated by \`mach push setup\`. Re-run the command to refresh.
22
22
  // Public client configuration only. Provider credentials are never written here.
23
23
  ${t?`import type { MachPushConfig } from '@radhya/mach-push-react-native';
@@ -137,7 +137,7 @@ export function startMachPush() {
137
137
  // The basic experience works immediately. Remove this line if your product
138
138
  // asks for notification permission at a later, contextual moment.
139
139
  void startMachPush()?.catch(() => undefined);
140
- `}function xi(e,t,n){let i=[],r=[],o=Go(e,Uo[t]);if(!o)return{written:i,notes:["Could not locate the application entry point. Import the generated mach-push file once from your root App or layout."]};let s=se.join(e,o),a=Lo(e,o),c=Xo(o)?"ts":"js",l=c==="ts",d=se.join(a,`mach-push.generated.${c}`),p=se.join(a,`mach-push.${c}`);return Y.mkdirSync(a,{recursive:!0}),Y.writeFileSync(d,Jo(n,l)),i.push(Te(e,d)),Y.existsSync(p)?r.push(`${Te(e,p)} already exists; developer callbacks were preserved.`):(Y.writeFileSync(p,Yo("./mach-push.generated",l)),i.push(Te(e,p))),Ko(s,p)?i.push(Te(e,s)):r.push(`${Te(e,s)} already starts MACH Push.`),{written:i,notes:r,editableFile:Te(e,p),generatedFile:Te(e,d),entryFile:Te(e,s)}}function ki(e,t){if(!Y.existsSync(e))return[];let n=[];for(let i of Y.readdirSync(e,{withFileTypes:!0})){if(i.name==="Pods"||i.name==="build")continue;let r=se.join(e,i.name);i.isDirectory()?n.push(...ki(r,t)):t(r)&&n.push(r)}return n}function zo(e,t){if(Y.mkdirSync(se.dirname(e),{recursive:!0}),!Y.existsSync(e)){Y.writeFileSync(e,`<?xml version="1.0" encoding="UTF-8"?>
140
+ `}function xi(e,t,n){let i=[],r=[],o=Go(e,Uo[t]);if(!o)return{written:i,notes:["Could not locate the application entry point. Import the generated mach-push file once from your root App or layout."]};let s=se.join(e,o),a=Lo(e,o),c=Xo(o)?"ts":"js",l=c==="ts",p=se.join(a,`mach-push.generated.${c}`),d=se.join(a,`mach-push.${c}`);return Y.mkdirSync(a,{recursive:!0}),Y.writeFileSync(p,Jo(n,l)),i.push(Te(e,p)),Y.existsSync(d)?r.push(`${Te(e,d)} already exists; developer callbacks were preserved.`):(Y.writeFileSync(d,Yo("./mach-push.generated",l)),i.push(Te(e,d))),Ko(s,d)?i.push(Te(e,s)):r.push(`${Te(e,s)} already starts MACH Push.`),{written:i,notes:r,editableFile:Te(e,d),generatedFile:Te(e,p),entryFile:Te(e,s)}}function ki(e,t){if(!Y.existsSync(e))return[];let n=[];for(let i of Y.readdirSync(e,{withFileTypes:!0})){if(i.name==="Pods"||i.name==="build")continue;let r=se.join(e,i.name);i.isDirectory()?n.push(...ki(r,t)):t(r)&&n.push(r)}return n}function zo(e,t){if(Y.mkdirSync(se.dirname(e),{recursive:!0}),!Y.existsSync(e)){Y.writeFileSync(e,`<?xml version="1.0" encoding="UTF-8"?>
141
141
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
142
142
  <plist version="1.0">
143
143
  <dict>
@@ -147,18 +147,18 @@ void startMachPush()?.catch(() => undefined);
147
147
  </plist>
148
148
  `);return}let n=Y.readFileSync(e,"utf8"),i=/(<key>aps-environment<\/key>\s*<string>)([^<]*)(<\/string>)/;if(i.test(n)){Y.writeFileSync(e,n.replace(i,`$1${t}$3`));return}n.includes("</dict>")&&Y.writeFileSync(e,n.replace("</dict>",` <key>aps-environment</key>
149
149
  <string>${t}</string>
150
- </dict>`))}function Qo(e,t,n){let i=[],r=[],o=se.join(e,"ios");if(!Y.existsSync(o))return r.push("iOS native project is not present; no APNs entitlement was changed."),{written:i,notes:r};let a=ki(o,d=>d.endsWith(".xcodeproj/project.pbxproj"))[0];if(!a)return r.push("Could not locate an iOS Xcode project for the APNs entitlement."),{written:i,notes:r};let c=Y.readFileSync(a,"utf8"),l=Array.from(c.matchAll(/CODE_SIGN_ENTITLEMENTS\s*=\s*"?([^";$]+\.entitlements)"?;/g),d=>d[1].trim());if(l.length===0&&t){let d=se.basename(se.dirname(a),".xcodeproj"),u=[Y.existsSync(se.join(o,d))?d:"",`${d}.entitlements`].filter(Boolean).join("/"),f=!1;c=c.replace(/buildSettings = \{([\s\S]*?)\n(\s*)\};/g,(m,N,b)=>!new RegExp(`PRODUCT_BUNDLE_IDENTIFIER\\s*=\\s*"?${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}"?;`).test(N)||N.includes("CODE_SIGN_ENTITLEMENTS")?m:(f=!0,m.replace(/(\n\s*PRODUCT_BUNDLE_IDENTIFIER\s*=)/,`
151
- ${b} CODE_SIGN_ENTITLEMENTS = ${u};$1`))),f&&(Y.writeFileSync(a,c),i.push(Te(e,a)),l.push(u))}if(l.length===0)return r.push("Could not safely identify the iOS app target. Enable the Push Notifications capability in Xcode."),{written:i,notes:r};for(let d of new Set(l)){let p=se.join(o,d);zo(p,n),i.push(Te(e,p))}return r.push(`iOS APNs entitlement is configured for ${n}.`),{written:[...new Set(i)],notes:r}}function qo(e,t){let n=Y.readFileSync(e,"utf8");if(n.includes("com.google.gms.google-services"))return!1;let i=/plugins\s*\{/.exec(n);if(i?.index!==void 0){let r=t?` id("com.google.gms.google-services")
150
+ </dict>`))}function Qo(e,t,n){let i=[],r=[],o=se.join(e,"ios");if(!Y.existsSync(o))return r.push("iOS native project is not present; no APNs entitlement was changed."),{written:i,notes:r};let a=ki(o,p=>p.endsWith(".xcodeproj/project.pbxproj"))[0];if(!a)return r.push("Could not locate an iOS Xcode project for the APNs entitlement."),{written:i,notes:r};let c=Y.readFileSync(a,"utf8"),l=Array.from(c.matchAll(/CODE_SIGN_ENTITLEMENTS\s*=\s*"?([^";$]+\.entitlements)"?;/g),p=>p[1].trim());if(l.length===0&&t){let p=se.basename(se.dirname(a),".xcodeproj"),u=[Y.existsSync(se.join(o,p))?p:"",`${p}.entitlements`].filter(Boolean).join("/"),f=!1;c=c.replace(/buildSettings = \{([\s\S]*?)\n(\s*)\};/g,(g,N,b)=>!new RegExp(`PRODUCT_BUNDLE_IDENTIFIER\\s*=\\s*"?${t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}"?;`).test(N)||N.includes("CODE_SIGN_ENTITLEMENTS")?g:(f=!0,g.replace(/(\n\s*PRODUCT_BUNDLE_IDENTIFIER\s*=)/,`
151
+ ${b} CODE_SIGN_ENTITLEMENTS = ${u};$1`))),f&&(Y.writeFileSync(a,c),i.push(Te(e,a)),l.push(u))}if(l.length===0)return r.push("Could not safely identify the iOS app target. Enable the Push Notifications capability in Xcode."),{written:i,notes:r};for(let p of new Set(l)){let d=se.join(o,p);zo(d,n),i.push(Te(e,d))}return r.push(`iOS APNs entitlement is configured for ${n}.`),{written:[...new Set(i)],notes:r}}function qo(e,t){let n=Y.readFileSync(e,"utf8");if(n.includes("com.google.gms.google-services"))return!1;let i=/plugins\s*\{/.exec(n);if(i?.index!==void 0){let r=t?` id("com.google.gms.google-services")
152
152
  `:` id 'com.google.gms.google-services'
153
153
  `,o=i.index+i[0].length;Y.writeFileSync(e,`${n.slice(0,o)}
154
154
  ${r}${n.slice(o)}`)}else{let r=t?`
155
155
  apply(plugin = "com.google.gms.google-services")
156
156
  `:`
157
157
  apply plugin: "com.google.gms.google-services"
158
- `;Y.writeFileSync(e,`${n.trimEnd()}${r}`)}return!0}function es(e){let t=["settings.gradle.kts","settings.gradle"].map(a=>se.join(e,a)).find(a=>Y.existsSync(a));if(t){let a=Y.readFileSync(t,"utf8");if(a.includes("com.google.gms.google-services"))return;let c=/plugins\s*\{/.exec(a);if(c?.index!==void 0){let d=t.endsWith(".kts")?` id("com.google.gms.google-services") version "4.4.4" apply false
158
+ `;Y.writeFileSync(e,`${n.trimEnd()}${r}`)}return!0}function es(e){let t=["settings.gradle.kts","settings.gradle"].map(a=>se.join(e,a)).find(a=>Y.existsSync(a));if(t){let a=Y.readFileSync(t,"utf8");if(a.includes("com.google.gms.google-services"))return;let c=/plugins\s*\{/.exec(a);if(c?.index!==void 0){let p=t.endsWith(".kts")?` id("com.google.gms.google-services") version "4.4.4" apply false
159
159
  `:` id "com.google.gms.google-services" version "4.4.4" apply false
160
- `,p=c.index+c[0].length;return Y.writeFileSync(t,`${a.slice(0,p)}
161
- ${d}${a.slice(p)}`),t}}let n=["build.gradle.kts","build.gradle"].map(a=>se.join(e,a)).find(a=>Y.existsSync(a));if(!n)return;let i=Y.readFileSync(n,"utf8");if(i.includes("com.google.gms:google-services"))return;let r=/dependencies\s*\{/.exec(i);if(r?.index===void 0)return;let o=` classpath("com.google.gms:google-services:4.4.4")
160
+ `,d=c.index+c[0].length;return Y.writeFileSync(t,`${a.slice(0,d)}
161
+ ${p}${a.slice(d)}`),t}}let n=["build.gradle.kts","build.gradle"].map(a=>se.join(e,a)).find(a=>Y.existsSync(a));if(!n)return;let i=Y.readFileSync(n,"utf8");if(i.includes("com.google.gms:google-services"))return;let r=/dependencies\s*\{/.exec(i);if(r?.index===void 0)return;let o=` classpath("com.google.gms:google-services:4.4.4")
162
162
  `,s=r.index+r[0].length;return Y.writeFileSync(n,`${i.slice(0,s)}
163
163
  ${o}${i.slice(s)}`),n}function ts(e,t){let n=[],i=[],r=se.join(e,"android");if(!Y.existsSync(r))return i.push("Android native project is not present; no Firebase configuration was changed."),{written:n,notes:i};if(!t)return i.push("Android needs google-services.json. Add it at the project root and re-run mach push setup."),{written:n,notes:i};let o=se.resolve(e,t);if(!Y.existsSync(o))return i.push(`Android Firebase file was not found at ${t}; re-run setup with --google-services-file.`),{written:n,notes:i};let s=se.join(r,"app/google-services.json");Y.mkdirSync(se.dirname(s),{recursive:!0}),o!==s&&(Y.copyFileSync(o,s),n.push(Te(e,s)));let a=["build.gradle.kts","build.gradle"].map(l=>se.join(r,"app",l)).find(l=>Y.existsSync(l));if(!a)return i.push("Could not locate android/app/build.gradle to enable Firebase."),{written:n,notes:i};qo(a,a.endsWith(".kts"))&&n.push(Te(e,a));let c=es(r);return c&&n.push(Te(e,c)),i.push("Android Firebase configuration and notification permission are wired."),{written:[...new Set(n)],notes:i}}function Oi(e,t){let n=Qo(e,t.iosBundleId,t.iosEnvironment),i=ts(e,t.googleServicesFile);return{written:[...new Set([...n.written,...i.written])],notes:[...n.notes,...i.notes]}}import{spinner as ln,log as E,isCancel as dn,confirm as ea,select as qn}from"@clack/prompts";import w from"chalk";import A from"fs";import y from"path";import{execFileSync as He,execSync as ee,spawn as Ar}from"child_process";import Ce from"os";import ta from"crypto";import as from"crypto";import{log as Fe}from"@clack/prompts";import De from"chalk";import{execSync as ns}from"child_process";import Be from"fs";import Qe from"path";var $i={id:"expo",displayName:"Expo",applyLocalProcessEnv:e=>{e.developmentClient?(Fe.info(De.blue("\u2139\uFE0F Configuring Expo build to INCLUDE expo-dev-client (Development Client mode)...")),delete process.env.EXPO_NO_DEV_CLIENT,delete process.env.EXPO_AUTOLINKING_EXCLUDE):(Fe.info(De.blue("\u2139\uFE0F Configuring Expo build to EXCLUDE expo-dev-client (Production/Staging mode)...")),process.env.EXPO_NO_DEV_CLIENT="1",process.env.EXPO_AUTOLINKING_EXCLUDE="expo-dev-client")},localAndroidEnv:(e,t)=>({EXPO_NO_DOTENV:"1",MACH_FRAMEWORK:"expo",MACH_BUILD_PROFILE:t}),remoteEnvSetupScript:()=>`
164
164
  export MACH_FRAMEWORK="expo"
@@ -255,7 +255,7 @@ fi
255
255
  echo "expo.enableHermes=true" >> gradle.properties
256
256
  `,androidRemoteReleaseGradlePropertiesScript:()=>`
257
257
  echo "expo.enableProguardInReleaseBuilds=true" >> gradle.properties
258
- `,prepareLocalProject:async e=>{let{platform:t,options:n,appRoot:i,cacheMeta:r,cacheMetaDir:o,currentBuildEnv:s,reportStep:a,loggedRun:c,configureXcodeNodeBinary:l,podsFingerprint:d,writeCacheMeta:p}=e,u=n.iosBundleIdentifier||"",f=n.name||"",m=Qe.join(i,"app.json"),N=null;Fe.info(De.blue(`Running Expo prebuild for ${t}...`));try{if(Be.existsSync(m)){N=Be.readFileSync(m,"utf-8");let P=JSON.parse(N);P.expo=P.expo||{},f||(f=P.expo.name||""),t==="ios"&&!u&&(u=P.expo?.ios?.bundleIdentifier||""),n.name&&(P.expo.name=n.name),n.scheme&&(P.expo.scheme=n.scheme),t==="ios"&&n.iosBundleIdentifier?(P.expo.ios=P.expo.ios||{},P.expo.ios.bundleIdentifier=n.iosBundleIdentifier):t==="android"&&n.androidPackage&&(P.expo.android=P.expo.android||{},P.expo.android.package=n.androidPackage),Be.writeFileSync(m,JSON.stringify(P,null,2))}let b=["exec","--","expo","prebuild","--platform",t,"--no-install"];if(await a("prebuild"),await c("npm",b,i,s()),t!=="ios"||!Be.existsSync(Qe.join(i,"ios")))return{appName:f,bundleId:u};await a("pods"),Fe.info(De.blue("Running pod install..."));try{let P=Qe.join(i,"ios"),_=Qe.join(P,"Podfile");if(!Be.existsSync(_))throw new Error("ios/Podfile not found. Skipping pod install.");let S=s();l(P,S);let C=Be.readFileSync(_,"utf-8"),v=n.iosDeploymentTarget||"13.4";if(!n.developmentClient&&(Fe.info(De.blue("\u2139\uFE0F Patching Podfile to EXCLUDE expo-dev-client...")),C.includes("use_expo_modules!")&&!C.includes("exclude:"))){let U=/use_expo_modules!(\s*)$/m;U.test(C)?C=C.replace(U,'use_expo_modules!(exclude: ["expo-dev-client"])$1'):C=C.replace("use_expo_modules!",'use_expo_modules!(exclude: ["expo-dev-client"])')}let L=`
258
+ `,prepareLocalProject:async e=>{let{platform:t,options:n,appRoot:i,cacheMeta:r,cacheMetaDir:o,currentBuildEnv:s,reportStep:a,loggedRun:c,configureXcodeNodeBinary:l,podsFingerprint:p,writeCacheMeta:d}=e,u=n.iosBundleIdentifier||"",f=n.name||"",g=Qe.join(i,"app.json"),N=null;Fe.info(De.blue(`Running Expo prebuild for ${t}...`));try{if(Be.existsSync(g)){N=Be.readFileSync(g,"utf-8");let P=JSON.parse(N);P.expo=P.expo||{},f||(f=P.expo.name||""),t==="ios"&&!u&&(u=P.expo?.ios?.bundleIdentifier||""),n.name&&(P.expo.name=n.name),n.scheme&&(P.expo.scheme=n.scheme),t==="ios"&&n.iosBundleIdentifier?(P.expo.ios=P.expo.ios||{},P.expo.ios.bundleIdentifier=n.iosBundleIdentifier):t==="android"&&n.androidPackage&&(P.expo.android=P.expo.android||{},P.expo.android.package=n.androidPackage),Be.writeFileSync(g,JSON.stringify(P,null,2))}let b=["exec","--","expo","prebuild","--platform",t,"--no-install"];if(await a("prebuild"),await c("npm",b,i,s()),t!=="ios"||!Be.existsSync(Qe.join(i,"ios")))return{appName:f,bundleId:u};await a("pods"),Fe.info(De.blue("Running pod install..."));try{let P=Qe.join(i,"ios"),_=Qe.join(P,"Podfile");if(!Be.existsSync(_))throw new Error("ios/Podfile not found. Skipping pod install.");let S=s();l(P,S);let C=Be.readFileSync(_,"utf-8"),v=n.iosDeploymentTarget||"13.4";if(!n.developmentClient&&(Fe.info(De.blue("\u2139\uFE0F Patching Podfile to EXCLUDE expo-dev-client...")),C.includes("use_expo_modules!")&&!C.includes("exclude:"))){let U=/use_expo_modules!(\s*)$/m;U.test(C)?C=C.replace(U,'use_expo_modules!(exclude: ["expo-dev-client"])$1'):C=C.replace("use_expo_modules!",'use_expo_modules!(exclude: ["expo-dev-client"])')}let L=`
259
259
  installer.generated_projects.each do |project|
260
260
  project.targets.each do |target|
261
261
  target.build_configurations.each do |config|
@@ -273,8 +273,8 @@ ${L}`),Be.writeFileSync(_,C);else{Fe.info(De.dim(`Appending new post_install hoo
273
273
  post_install do |installer|
274
274
  ${L}
275
275
  end
276
- `;Be.appendFileSync(_,U)}let k="/opt/homebrew/bin/pod",T=Be.existsSync(k)?k:"pod",H=d(P);Be.existsSync(Qe.join(P,"Pods"))&&r.pods&&r.pods!==H&&(await e.reportLog(`[CACHE] Podfile/Podfile.lock changed \u2014 wiping ios/Pods
277
- `),Fe.info(De.dim("Podfile fingerprint changed \u2014 clearing Pods for clean install...")),Be.rmSync(Qe.join(P,"Pods"),{recursive:!0,force:!0})),Fe.info(De.dim(`Using pod command: ${T} in ${P}`)),await c(T,["install"],P,S),r.pods=H,p(o,r)}catch(P){let _=P.message||"Unknown error";Fe.warn(De.yellow(`Native "pod" command failed: ${_}`)),Fe.info(De.dim("Falling back to npm exec pod-install..."));let S=s();l(Qe.join(i,"ios"),S),Fe.info(De.magenta(`${I.nameUpper}_DEBUG: Executing pod-install override via npx --yes pod-install@latest`)),await c("npx",["--yes","pod-install@latest","ios"],i,S)}if(Be.existsSync(Qe.join(i,"ios/Pods"))){Fe.info(De.dim("Disabling signing for Pod targets to prevent conflicts..."));try{ns(`find ios/Pods -name "project.pbxproj" -exec sed -i '' 's/buildSettings = {/buildSettings = { CODE_SIGNING_ALLOWED = NO; CODE_SIGNING_REQUIRED = NO; PROVISIONING_PROFILE_SPECIFIER = ""; EXPANDED_CODE_SIGN_IDENTITY = "";/g' {} +`,{cwd:i,stdio:"ignore"})}catch{}}return{appName:f,bundleId:u}}finally{N&&Be.writeFileSync(m,N)}}};import{log as et}from"@clack/prompts";import tt from"chalk";import Le from"fs";import Mt from"path";import{spawnSync as is}from"child_process";import Ge from"fs";import qe from"path";var _i=(e,t)=>qe.join(e,"node_modules",".bin",process.platform==="win32"?`${t}.cmd`:t),rs=e=>{try{return JSON.parse(Ge.readFileSync(qe.join(e,"package.json"),"utf-8"))}catch{return{}}};function jl(e,t){let n=rs(e);return!!(n.dependencies?.[t]||n.devDependencies?.[t])}function Fn(e,t,n,i={}){let r=`${t} ${n.join(" ")}`,o=is(t,n,{cwd:e,stdio:"inherit",env:{...process.env,CI:process.env.CI||"1",EXPO_NO_TELEMETRY:"1",...i}});return o.error?{ok:!1,command:r,error:o.error.message}:o.status!==0?{ok:!1,command:r,error:`${t} exited with code ${o.status}`}:{ok:!0,command:r}}function Wl(e){return Fn(e,"npx",["--yes","install-expo-modules@latest"])}function Zl(e){let t=_i(e,"expo");return Ge.existsSync(t)?Fn(e,t,["install","expo-updates"]):{ok:!1,command:"npx expo install expo-updates",error:"Expo Modules are not installed. Install Expo Modules first."}}function Ul(e){let t=[];return Ge.existsSync(qe.join(e,"ios"))&&t.push("ios"),Ge.existsSync(qe.join(e,"android"))&&t.push("android"),t}function Ti(e){let t=_i(e.cwd,"expo-updates");return Ge.existsSync(t)?e.platforms.map(n=>Fn(e.cwd,t,["configuration:syncnative","--platform",n,"--workflow","generic"],{MACH_OTA_RUNTIME_VERSION:e.runtimeVersion,MACH_OTA_CHANNEL:e.channel,MACH_OTA_URL:e.url})):[{ok:!1,command:"expo-updates configuration:syncnative",error:"expo-updates is not installed in this project."}]}function Gl(e){let t=qe.join(e,"android","app","src","main","AndroidManifest.xml"),n=qe.join(e,"android","app","src","main","res","values","strings.xml"),i,r=qe.join(e,"ios");if(Ge.existsSync(r)){let o=[r];for(;o.length>0&&!i;){let s=o.shift();for(let a of Ge.readdirSync(s,{withFileTypes:!0})){if(a.name==="Pods"||a.name==="build")continue;let c=qe.join(s,a.name);if(a.isDirectory())o.push(c);else if(a.isFile()&&a.name==="Expo.plist"){i=c;break}}}}return{...Ge.existsSync(t)?{androidManifest:t}:{},...Ge.existsSync(n)?{androidStrings:n}:{},...i?{iosExpoPlist:i}:{}}}var os=(e,t)=>!Le.existsSync(e)||!Le.existsSync(t)?!1:Le.readFileSync(e,"utf-8")!==Le.readFileSync(t,"utf-8"),Dn={id:"react-native",displayName:"React Native",applyLocalProcessEnv:e=>{delete process.env.EXPO_NO_DEV_CLIENT,delete process.env.EXPO_AUTOLINKING_EXCLUDE,delete process.env.EXPO_NO_DOTENV},localAndroidEnv:(e,t)=>({MACH_FRAMEWORK:"react-native",MACH_BUILD_PROFILE:t}),remoteEnvSetupScript:()=>`
276
+ `;Be.appendFileSync(_,U)}let k="/opt/homebrew/bin/pod",T=Be.existsSync(k)?k:"pod",H=p(P);Be.existsSync(Qe.join(P,"Pods"))&&r.pods&&r.pods!==H&&(await e.reportLog(`[CACHE] Podfile/Podfile.lock changed \u2014 wiping ios/Pods
277
+ `),Fe.info(De.dim("Podfile fingerprint changed \u2014 clearing Pods for clean install...")),Be.rmSync(Qe.join(P,"Pods"),{recursive:!0,force:!0})),Fe.info(De.dim(`Using pod command: ${T} in ${P}`)),await c(T,["install"],P,S),r.pods=H,d(o,r)}catch(P){let _=P.message||"Unknown error";Fe.warn(De.yellow(`Native "pod" command failed: ${_}`)),Fe.info(De.dim("Falling back to npm exec pod-install..."));let S=s();l(Qe.join(i,"ios"),S),Fe.info(De.magenta(`${I.nameUpper}_DEBUG: Executing pod-install override via npx --yes pod-install@latest`)),await c("npx",["--yes","pod-install@latest","ios"],i,S)}if(Be.existsSync(Qe.join(i,"ios/Pods"))){Fe.info(De.dim("Disabling signing for Pod targets to prevent conflicts..."));try{ns(`find ios/Pods -name "project.pbxproj" -exec sed -i '' 's/buildSettings = {/buildSettings = { CODE_SIGNING_ALLOWED = NO; CODE_SIGNING_REQUIRED = NO; PROVISIONING_PROFILE_SPECIFIER = ""; EXPANDED_CODE_SIGN_IDENTITY = "";/g' {} +`,{cwd:i,stdio:"ignore"})}catch{}}return{appName:f,bundleId:u}}finally{N&&Be.writeFileSync(g,N)}}};import{log as et}from"@clack/prompts";import tt from"chalk";import Le from"fs";import Mt from"path";import{spawnSync as is}from"child_process";import Ge from"fs";import qe from"path";var _i=(e,t)=>qe.join(e,"node_modules",".bin",process.platform==="win32"?`${t}.cmd`:t),rs=e=>{try{return JSON.parse(Ge.readFileSync(qe.join(e,"package.json"),"utf-8"))}catch{return{}}};function jl(e,t){let n=rs(e);return!!(n.dependencies?.[t]||n.devDependencies?.[t])}function Fn(e,t,n,i={}){let r=`${t} ${n.join(" ")}`,o=is(t,n,{cwd:e,stdio:"inherit",env:{...process.env,CI:process.env.CI||"1",EXPO_NO_TELEMETRY:"1",...i}});return o.error?{ok:!1,command:r,error:o.error.message}:o.status!==0?{ok:!1,command:r,error:`${t} exited with code ${o.status}`}:{ok:!0,command:r}}function Wl(e){return Fn(e,"npx",["--yes","install-expo-modules@latest"])}function Zl(e){let t=_i(e,"expo");return Ge.existsSync(t)?Fn(e,t,["install","expo-updates"]):{ok:!1,command:"npx expo install expo-updates",error:"Expo Modules are not installed. Install Expo Modules first."}}function Ul(e){let t=[];return Ge.existsSync(qe.join(e,"ios"))&&t.push("ios"),Ge.existsSync(qe.join(e,"android"))&&t.push("android"),t}function Ti(e){let t=_i(e.cwd,"expo-updates");return Ge.existsSync(t)?e.platforms.map(n=>Fn(e.cwd,t,["configuration:syncnative","--platform",n,"--workflow","generic"],{MACH_OTA_RUNTIME_VERSION:e.runtimeVersion,MACH_OTA_CHANNEL:e.channel,MACH_OTA_URL:e.url})):[{ok:!1,command:"expo-updates configuration:syncnative",error:"expo-updates is not installed in this project."}]}function Gl(e){let t=qe.join(e,"android","app","src","main","AndroidManifest.xml"),n=qe.join(e,"android","app","src","main","res","values","strings.xml"),i,r=qe.join(e,"ios");if(Ge.existsSync(r)){let o=[r];for(;o.length>0&&!i;){let s=o.shift();for(let a of Ge.readdirSync(s,{withFileTypes:!0})){if(a.name==="Pods"||a.name==="build")continue;let c=qe.join(s,a.name);if(a.isDirectory())o.push(c);else if(a.isFile()&&a.name==="Expo.plist"){i=c;break}}}}return{...Ge.existsSync(t)?{androidManifest:t}:{},...Ge.existsSync(n)?{androidStrings:n}:{},...i?{iosExpoPlist:i}:{}}}var os=(e,t)=>!Le.existsSync(e)||!Le.existsSync(t)?!1:Le.readFileSync(e,"utf-8")!==Le.readFileSync(t,"utf-8"),Dn={id:"react-native",displayName:"React Native",applyLocalProcessEnv:e=>{delete process.env.EXPO_NO_DEV_CLIENT,delete process.env.EXPO_AUTOLINKING_EXCLUDE,delete process.env.EXPO_NO_DOTENV},localAndroidEnv:(e,t)=>({MACH_FRAMEWORK:"react-native",MACH_BUILD_PROFILE:t}),remoteEnvSetupScript:()=>`
278
278
  export MACH_FRAMEWORK="react-native"
279
279
  echo "[ENV] MACH_FRAMEWORK=$MACH_FRAMEWORK"
280
280
  unset EXPO_NO_DOTENV
@@ -307,14 +307,14 @@ fi
307
307
  :
308
308
  `,androidRemoteReleaseGradlePropertiesScript:()=>`
309
309
  :
310
- `,prepareLocalProject:async e=>{let{platform:t,appRoot:n,cacheMeta:i,cacheMetaDir:r,currentBuildEnv:o,reportStep:s,reportLog:a,loggedRun:c,configureXcodeNodeBinary:l,podsFingerprint:d,writeCacheMeta:p}=e,u=o(),f=u.MACH_OTA_RUNTIME_VERSION,m=u.MACH_OTA_CHANNEL,N=u.MACH_OTA_URL;if(f&&m&&N){let R=Ti({cwd:n,platforms:[t],runtimeVersion:f,channel:m,url:N}).find(U=>!U.ok);if(R)throw new Error(`Could not synchronize ${t} Expo Updates configuration: ${R.error||R.command}. Run \`mach ota setup --platform ${t}\` and try again.`);et.info(tt.green(`\u2713 OTA runtime ${f} synchronized for ${t}`))}if(t!=="ios")return{};let b=Mt.join(n,"ios"),P=Mt.join(b,"Podfile");if(!Le.existsSync(P))throw new Error("React Native iOS build requires ios/Podfile. Commit the ios directory for vanilla React Native projects.");await s("pods"),et.info(tt.blue("Running React Native pod install..."));let _=o();l(b,_);let S=Mt.join(b,"Pods"),C=Mt.join(b,"Podfile.lock"),v=Mt.join(S,"Manifest.lock"),L=Le.existsSync(S),B=d(b);L&&i.reactNativePods&&i.reactNativePods!==B?(await a(`[CACHE] React Native Podfile/Podfile.lock changed - wiping ios/Pods
310
+ `,prepareLocalProject:async e=>{let{platform:t,appRoot:n,cacheMeta:i,cacheMetaDir:r,currentBuildEnv:o,reportStep:s,reportLog:a,loggedRun:c,configureXcodeNodeBinary:l,podsFingerprint:p,writeCacheMeta:d}=e,u=o(),f=u.MACH_OTA_RUNTIME_VERSION,g=u.MACH_OTA_CHANNEL,N=u.MACH_OTA_URL;if(f&&g&&N){let R=Ti({cwd:n,platforms:[t],runtimeVersion:f,channel:g,url:N}).find(U=>!U.ok);if(R)throw new Error(`Could not synchronize ${t} Expo Updates configuration: ${R.error||R.command}. Run \`mach ota setup --platform ${t}\` and try again.`);et.info(tt.green(`\u2713 OTA runtime ${f} synchronized for ${t}`))}if(t!=="ios")return{};let b=Mt.join(n,"ios"),P=Mt.join(b,"Podfile");if(!Le.existsSync(P))throw new Error("React Native iOS build requires ios/Podfile. Commit the ios directory for vanilla React Native projects.");await s("pods"),et.info(tt.blue("Running React Native pod install..."));let _=o();l(b,_);let S=Mt.join(b,"Pods"),C=Mt.join(b,"Podfile.lock"),v=Mt.join(S,"Manifest.lock"),L=Le.existsSync(S),B=p(b);L&&i.reactNativePods&&i.reactNativePods!==B?(await a(`[CACHE] React Native Podfile/Podfile.lock changed - wiping ios/Pods
311
311
  `),et.info(tt.dim("React Native Podfile fingerprint changed - clearing Pods for clean install...")),Le.rmSync(S,{recursive:!0,force:!0})):L&&os(C,v)&&(await a(`[CACHE] React Native Pods Manifest.lock is out of sync - wiping ios/Pods
312
- `),et.info(tt.dim("React Native Pods manifest is out of sync - clearing Pods for clean install...")),Le.rmSync(S,{recursive:!0,force:!0}));let k="/opt/homebrew/bin/pod",T=Le.existsSync(k)?k:"pod";try{et.info(tt.dim(`Using pod command: ${T} in ${b}`)),await c(T,["install"],b,_)}catch(H){let R=H.message||"Unknown error";et.warn(tt.yellow(`Native "pod" command failed: ${R}`)),et.info(tt.dim("Falling back to npx pod-install..."));let U=o();l(b,U),et.info(tt.magenta(`${I.nameUpper}_DEBUG: Executing pod-install fallback via npx --yes pod-install@latest`)),await c("npx",["--yes","pod-install@latest","ios"],n,U)}return i.reactNativePods=d(b),p(r,i),{}}};var ss={expo:$i,"react-native":Dn};function jt(e){if(!e)return Dn;if(e!=="flutter")return ss[e];throw new Error('Flutter builds are not implemented yet. Set framework to "expo" or "react-native" for this build.')}var cs="mach-env-v3-project-layout",ls=new Set(["BUILD_ID","BUILD_NUMBER","ANDROID_VERSION_CODE","MACH_TOKEN","MACH_DEBUG","MACH_S3_DEBUG","MACH_ENV_FINGERPRINT","CODEARTIFACT_AUTH_TOKEN","EXPO_ZQRN_BB_REPO_TOKEN","SENTRY_AUTH_TOKEN","IOS_DIST_P12","IOS_PROVISIONING_PROFILE","IOS_PROVISIONING_PROFILES","IOS_P12_PASSWORD","MATCH_ENCRYPTION_PASSPHRASE","MATCH_PASSWORD","MATCH_KEYCHAIN_NAME","MATCH_KEYCHAIN_PASSWORD","APPLE_TEAM_ID","FASTLANE_TEAM_ID","ANDROID_KEYSTORE","ANDROID_KEYSTORE_BASE64","ANDROID_STORE_PASSWORD","ANDROID_KEY_PASSWORD","ANDROID_KEY_ALIAS","KEYSTORE_PASSWORD","KEYSTORE_ALIAS","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","AWS_SECURITY_TOKEN","GITHUB_TOKEN","NPM_TOKEN"]),ds=["PRESIGNED_","KEYSTORE_PASSWORD_"],ps=e=>!e||ls.has(e)?!1:!ds.some(t=>e.startsWith(t)),Bn=(e,t,n)=>{let i=jt(n.framework);return{...e,...i.localAndroidEnv(n,t),MACH_APP_NAME:n.appName||n.name||"App",MACH_APP_DIRECTORY:n.appDirectory||"."}},Fi=e=>{let t=Object.entries(e).filter(([n])=>ps(n)).sort(([n],[i])=>n.localeCompare(i));return as.createHash("sha256").update(JSON.stringify({version:cs,entries:t})).digest("hex")};var us=/^\d+(?:\.\d+){0,2}$/,fs="auto";var Di=e=>typeof e=="string"&&e.trim().toLowerCase()===fs,od=(e,t,n,i=!0)=>e!=null&&String(e).trim()!==""?{kind:"persisted",value:e}:t!=null&&!Di(t)?{kind:"explicit",value:t}:i&&(n||Di(t))?{kind:"auto"}:{kind:"none"},Wt=e=>{let t=String(e??"").trim();return!t||t==="undefined"||t==="null"?null:us.test(t)?t:null},At=(e,t)=>{let n=Wt(e);if(!n)throw new Error(`Invalid iOS buildNumber from ${t}: "${String(e??"")}". Use one to three period-separated integers, for example "68" or "1.2.3".`);return n},ms=e=>{if(typeof e=="string"&&!/^\d+$/.test(e.trim()))return null;let t=Number(e);return!Number.isSafeInteger(t)||t<1||t>21e8?null:String(t)},We=(e,t)=>{let n=ms(e);if(!n)throw new Error(`Invalid Android versionCode from ${t}: "${String(e??"")}". Use an integer from 1 to 2100000000.`);return n},sd=(e,t,n,i)=>{let r=At(n,i);return e.resolvedBuildNumber=r,t.BUILD_NUMBER=r,t.CURRENT_PROJECT_VERSION=r,t.MACH_IOS_BUILD_NUMBER_LOCKED="1",r},ad=(e,t,n,i)=>{let r=We(n,i);return e.resolvedVersionCode=r,t.ANDROID_VERSION_CODE=r,t.MACH_ANDROID_VERSION_CODE_LOCKED="1",r},cd=(e,t)=>{let n=t.buildNumber!==void 0&&t.buildNumber!==null&&String(t.buildNumber).trim()!=="",i=t.versionCode!==void 0&&t.versionCode!==null&&String(t.versionCode).trim()!=="";!e.resolvedBuildNumber&&n&&(e.resolvedBuildNumber=At(t.buildNumber,"saved MACH build record")),!e.resolvedVersionCode&&i&&(e.resolvedVersionCode=We(t.versionCode,"saved MACH build record"))};import{execFileSync as Vn}from"child_process";import Xe from"fs";import lt from"path";var gs=new Set(["Pods","build","DerivedData",".git"]),Bi=(e,t=[])=>{if(!Xe.existsSync(e))return t;for(let n of Xe.readdirSync(e,{withFileTypes:!0})){if(n.isSymbolicLink())continue;let i=lt.join(e,n.name);if(n.isDirectory()){if(gs.has(n.name)||n.name.endsWith(".xcworkspace")||n.name.endsWith(".xcarchive")||n.name.endsWith(".framework")||n.name.endsWith(".xcframework")||n.name.endsWith(".bundle")||n.name.endsWith(".app")||n.name.endsWith(".appex"))continue;Bi(i,t);continue}n.isFile()&&n.name==="Info.plist"&&t.push(i)}return t},hs=(e,t,n)=>{let i=String(e||"").trim().replace(/^"|"$/g,"");if(!i||(i=i.replace(/\$\(([^)]+)\)|\$\{([^}]+)\}/g,(o,s,a)=>{let l=t[s||a];return l===void 0?"":String(l)}),!i||i.includes("$(")||i.includes("${")))return null;let r=String(t.SRCROOT||t.PROJECT_DIR||n);return lt.resolve(lt.isAbsolute(i)?i:lt.join(r,i))},ys=e=>{let t=e.indexOf("["),n=e.lastIndexOf("]");if(t<0||n<t)return[];let i=JSON.parse(e.slice(t,n+1));return Array.isArray(i)?i:[]},Is=(e,t)=>{let n=new Set,i=[];(t.workspace||t.project)&&i.push([...t.workspace?["-workspace",t.workspace]:["-project",t.project],"-scheme",t.scheme]),t.project&&i.push(["-project",t.project,"-alltargets"]);for(let r of i){let o="";try{o=Vn("xcodebuild",[...r,"-configuration",t.configuration,"-showBuildSettings","-json"],{cwd:e,encoding:"utf8",maxBuffer:16*1024*1024})}catch{continue}for(let s of ys(o)){let a=s?.buildSettings;if(!a)continue;let c=String(a.WRAPPER_EXTENSION||"").toLowerCase();if(c!=="app"&&c!=="appex")continue;let l=hs(String(a.INFOPLIST_FILE||""),a,e);if(!l||!Xe.existsSync(l))continue;let d=lt.relative(e,l);d.startsWith("..")||lt.isAbsolute(d)||n.add(l)}}return[...n].sort()},As=(e,t)=>{let n=Xe.readFileSync(e,"utf8");if(!/<plist(?:\s|>)/.test(n))return!1;let r=/<key>\s*CFBundleVersion\s*<\/key>/.exec(n),o;if(r){let s=r.index+r[0].length,a=n.slice(s),c=/^\s*<(string|integer)>[\s\S]*?<\/\1>/.exec(a);if(!c)throw new Error(`Could not update CFBundleVersion in ${e}: unsupported plist value type.`);o=n.slice(0,s)+`
312
+ `),et.info(tt.dim("React Native Pods manifest is out of sync - clearing Pods for clean install...")),Le.rmSync(S,{recursive:!0,force:!0}));let k="/opt/homebrew/bin/pod",T=Le.existsSync(k)?k:"pod";try{et.info(tt.dim(`Using pod command: ${T} in ${b}`)),await c(T,["install"],b,_)}catch(H){let R=H.message||"Unknown error";et.warn(tt.yellow(`Native "pod" command failed: ${R}`)),et.info(tt.dim("Falling back to npx pod-install..."));let U=o();l(b,U),et.info(tt.magenta(`${I.nameUpper}_DEBUG: Executing pod-install fallback via npx --yes pod-install@latest`)),await c("npx",["--yes","pod-install@latest","ios"],n,U)}return i.reactNativePods=p(b),d(r,i),{}}};var ss={expo:$i,"react-native":Dn};function jt(e){if(!e)return Dn;if(e!=="flutter")return ss[e];throw new Error('Flutter builds are not implemented yet. Set framework to "expo" or "react-native" for this build.')}var cs="mach-env-v3-project-layout",ls=new Set(["BUILD_ID","BUILD_NUMBER","ANDROID_VERSION_CODE","MACH_TOKEN","MACH_DEBUG","MACH_S3_DEBUG","MACH_ENV_FINGERPRINT","CODEARTIFACT_AUTH_TOKEN","EXPO_ZQRN_BB_REPO_TOKEN","SENTRY_AUTH_TOKEN","IOS_DIST_P12","IOS_PROVISIONING_PROFILE","IOS_PROVISIONING_PROFILES","IOS_P12_PASSWORD","MATCH_ENCRYPTION_PASSPHRASE","MATCH_PASSWORD","MATCH_KEYCHAIN_NAME","MATCH_KEYCHAIN_PASSWORD","APPLE_TEAM_ID","FASTLANE_TEAM_ID","ANDROID_KEYSTORE","ANDROID_KEYSTORE_BASE64","ANDROID_STORE_PASSWORD","ANDROID_KEY_PASSWORD","ANDROID_KEY_ALIAS","KEYSTORE_PASSWORD","KEYSTORE_ALIAS","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","AWS_SESSION_TOKEN","AWS_SECURITY_TOKEN","GITHUB_TOKEN","NPM_TOKEN"]),ds=["PRESIGNED_","KEYSTORE_PASSWORD_"],ps=e=>!e||ls.has(e)?!1:!ds.some(t=>e.startsWith(t)),Bn=(e,t,n)=>{let i=jt(n.framework);return{...e,...i.localAndroidEnv(n,t),MACH_APP_NAME:n.appName||n.name||"App",MACH_APP_DIRECTORY:n.appDirectory||"."}},Fi=e=>{let t=Object.entries(e).filter(([n])=>ps(n)).sort(([n],[i])=>n.localeCompare(i));return as.createHash("sha256").update(JSON.stringify({version:cs,entries:t})).digest("hex")};var us=/^\d+(?:\.\d+){0,2}$/,fs="auto";var Di=e=>typeof e=="string"&&e.trim().toLowerCase()===fs,od=(e,t,n,i=!0)=>e!=null&&String(e).trim()!==""?{kind:"persisted",value:e}:t!=null&&!Di(t)?{kind:"explicit",value:t}:i&&(n||Di(t))?{kind:"auto"}:{kind:"none"},Wt=e=>{let t=String(e??"").trim();return!t||t==="undefined"||t==="null"?null:us.test(t)?t:null},At=(e,t)=>{let n=Wt(e);if(!n)throw new Error(`Invalid iOS buildNumber from ${t}: "${String(e??"")}". Use one to three period-separated integers, for example "68" or "1.2.3".`);return n},gs=e=>{if(typeof e=="string"&&!/^\d+$/.test(e.trim()))return null;let t=Number(e);return!Number.isSafeInteger(t)||t<1||t>21e8?null:String(t)},We=(e,t)=>{let n=gs(e);if(!n)throw new Error(`Invalid Android versionCode from ${t}: "${String(e??"")}". Use an integer from 1 to 2100000000.`);return n},sd=(e,t,n,i)=>{let r=At(n,i);return e.resolvedBuildNumber=r,t.BUILD_NUMBER=r,t.CURRENT_PROJECT_VERSION=r,t.MACH_IOS_BUILD_NUMBER_LOCKED="1",r},ad=(e,t,n,i)=>{let r=We(n,i);return e.resolvedVersionCode=r,t.ANDROID_VERSION_CODE=r,t.MACH_ANDROID_VERSION_CODE_LOCKED="1",r},cd=(e,t)=>{let n=t.buildNumber!==void 0&&t.buildNumber!==null&&String(t.buildNumber).trim()!=="",i=t.versionCode!==void 0&&t.versionCode!==null&&String(t.versionCode).trim()!=="";!e.resolvedBuildNumber&&n&&(e.resolvedBuildNumber=At(t.buildNumber,"saved MACH build record")),!e.resolvedVersionCode&&i&&(e.resolvedVersionCode=We(t.versionCode,"saved MACH build record"))};import{execFileSync as Vn}from"child_process";import Xe from"fs";import lt from"path";var ms=new Set(["Pods","build","DerivedData",".git"]),Bi=(e,t=[])=>{if(!Xe.existsSync(e))return t;for(let n of Xe.readdirSync(e,{withFileTypes:!0})){if(n.isSymbolicLink())continue;let i=lt.join(e,n.name);if(n.isDirectory()){if(ms.has(n.name)||n.name.endsWith(".xcworkspace")||n.name.endsWith(".xcarchive")||n.name.endsWith(".framework")||n.name.endsWith(".xcframework")||n.name.endsWith(".bundle")||n.name.endsWith(".app")||n.name.endsWith(".appex"))continue;Bi(i,t);continue}n.isFile()&&n.name==="Info.plist"&&t.push(i)}return t},hs=(e,t,n)=>{let i=String(e||"").trim().replace(/^"|"$/g,"");if(!i||(i=i.replace(/\$\(([^)]+)\)|\$\{([^}]+)\}/g,(o,s,a)=>{let l=t[s||a];return l===void 0?"":String(l)}),!i||i.includes("$(")||i.includes("${")))return null;let r=String(t.SRCROOT||t.PROJECT_DIR||n);return lt.resolve(lt.isAbsolute(i)?i:lt.join(r,i))},ys=e=>{let t=e.indexOf("["),n=e.lastIndexOf("]");if(t<0||n<t)return[];let i=JSON.parse(e.slice(t,n+1));return Array.isArray(i)?i:[]},Is=(e,t)=>{let n=new Set,i=[];(t.workspace||t.project)&&i.push([...t.workspace?["-workspace",t.workspace]:["-project",t.project],"-scheme",t.scheme]),t.project&&i.push(["-project",t.project,"-alltargets"]);for(let r of i){let o="";try{o=Vn("xcodebuild",[...r,"-configuration",t.configuration,"-showBuildSettings","-json"],{cwd:e,encoding:"utf8",maxBuffer:16*1024*1024})}catch{continue}for(let s of ys(o)){let a=s?.buildSettings;if(!a)continue;let c=String(a.WRAPPER_EXTENSION||"").toLowerCase();if(c!=="app"&&c!=="appex")continue;let l=hs(String(a.INFOPLIST_FILE||""),a,e);if(!l||!Xe.existsSync(l))continue;let p=lt.relative(e,l);p.startsWith("..")||lt.isAbsolute(p)||n.add(l)}}return[...n].sort()},As=(e,t)=>{let n=Xe.readFileSync(e,"utf8");if(!/<plist(?:\s|>)/.test(n))return!1;let r=/<key>\s*CFBundleVersion\s*<\/key>/.exec(n),o;if(r){let s=r.index+r[0].length,a=n.slice(s),c=/^\s*<(string|integer)>[\s\S]*?<\/\1>/.exec(a);if(!c)throw new Error(`Could not update CFBundleVersion in ${e}: unsupported plist value type.`);o=n.slice(0,s)+`
313
313
  <string>${t}</string>`+a.slice(c[0].length)}else{let s=n.lastIndexOf("</dict>");if(s<0)throw new Error(`Could not update CFBundleVersion in ${e}: root dictionary not found.`);o=n.slice(0,s)+` <key>CFBundleVersion</key>
314
314
  <string>${t}</string>
315
- `+n.slice(s)}return Xe.writeFileSync(e,o),!0},Ss=(e,t)=>{if(!As(e,t)){if(process.platform!=="darwin")throw new Error(`Could not update binary Info.plist outside macOS: ${e}`);try{Vn("/usr/bin/plutil",["-replace","CFBundleVersion","-string",t,e])}catch{Vn("/usr/bin/plutil",["-insert","CFBundleVersion","-string",t,e])}}},Vi=(e,t,n)=>{let i=At(t,"resolved MACH build"),r=lt.resolve(e),o=new Set;if(n)try{for(let l of Is(r,n))o.add(l)}catch{}for(let l of Bi(r))o.add(l);let s=[...o].sort(),a=new Map,c=!1;try{for(let l of s)a.set(l,Xe.readFileSync(l)),Ss(l,i)}catch(l){for(let[d,p]of a)Xe.writeFileSync(d,p);throw l}return{buildNumber:i,plistPaths:s,restore:()=>{if(!c){c=!0;for(let[l,d]of a)Xe.existsSync(l)&&Xe.writeFileSync(l,d)}}}},Mn=(e,t,n)=>{let i=At(e,n),r=At(t,"resolved MACH build");if(i!==r)throw new Error(`iOS build number mismatch in ${n}: expected MACH buildNumber ${r}, but the artifact contains CFBundleVersion ${i}.`);return i};import{execFileSync as Mi}from"child_process";import Zt from"fs";import Pe from"path";import bs from"adm-zip";var jn=(e,t)=>{let n=0n,i=0n,r=t;for(;r<e.length&&i<=63n;){let o=e[r++];if(n|=BigInt(o&127)<<i,(o&128)===0)return{value:n,next:r};i+=7n}throw new Error("Malformed protobuf varint")},Ut=e=>{let t=[],n=0;for(;n<e.length;){let i=jn(e,n);n=i.next;let r=Number(i.value>>3n),o=Number(i.value&7n);if(r<1)throw new Error("Malformed protobuf field number");if(o===0){let s=jn(e,n);n=s.next,t.push({number:r,wireType:o,varint:s.value});continue}if(o===1){if(n+8>e.length)throw new Error("Truncated protobuf fixed64");t.push({number:r,wireType:o,bytes:e.subarray(n,n+8)}),n+=8;continue}if(o===2){let s=jn(e,n);n=s.next;let a=Number(s.value);if(!Number.isSafeInteger(a)||n+a>e.length)throw new Error("Truncated protobuf length-delimited field");t.push({number:r,wireType:o,bytes:e.subarray(n,n+a)}),n+=a;continue}if(o===5){if(n+4>e.length)throw new Error("Truncated protobuf fixed32");t.push({number:r,wireType:o,bytes:e.subarray(n,n+4)}),n+=4;continue}throw new Error(`Unsupported protobuf wire type ${o}`)}return t},ji=(e,t)=>e.find(i=>i.number===t&&i.wireType===2)?.bytes?.toString("utf8"),Cs=e=>{let n=Ut(e).find(o=>o.number===7&&o.wireType===2)?.bytes;if(!n)return null;let r=Ut(n).find(o=>(o.number===6||o.number===7)&&o.wireType===0)?.varint;return r===void 0||r>BigInt(Number.MAX_SAFE_INTEGER)?null:r.toString()},ws=e=>{let n=Ut(e).find(l=>l.number===1&&l.wireType===2)?.bytes;if(!n)throw new Error("AAB base manifest has no root XML element");let o=Ut(n).filter(l=>l.number===4&&l.wireType===2).map(l=>Ut(l.bytes)).find(l=>ji(l,2)==="versionCode");if(!o)throw new Error("AAB base manifest has no android:versionCode");let s=ji(o,3)?.trim();if(s&&/^\d+$/.test(s))return We(s,"packaged AAB manifest");let a=o.find(l=>l.number===6&&l.wireType===2)?.bytes,c=a?Cs(a):null;return We(c,"packaged AAB manifest")},Wi=e=>{try{return Zt.accessSync(e,Zt.constants.X_OK),Zt.statSync(e).isFile()}catch{return!1}},Wn=e=>String(process.env.PATH||"").split(Pe.delimiter).filter(Boolean).map(t=>Pe.join(t,e)),Zi=()=>Array.from(new Set([process.env.ANDROID_HOME,process.env.ANDROID_SDK_ROOT,process.platform==="darwin"?Pe.join(process.env.HOME||"","Library/Android/sdk"):Pe.join(process.env.HOME||"","Android/Sdk"),"/opt/android-sdk"].filter(e=>!!e))),Ui=e=>{try{return Zt.readdirSync(e).map(t=>Pe.join(e,t)).filter(t=>Zt.statSync(t).isDirectory()).sort((t,n)=>n.localeCompare(t,void 0,{numeric:!0}))}catch{return[]}},vs=()=>{let e=Wn("apkanalyzer");for(let t of Zi()){let n=Pe.join(t,"cmdline-tools");e.push(Pe.join(n,"latest/bin/apkanalyzer"));for(let i of Ui(n))e.push(Pe.join(i,"bin/apkanalyzer"))}return e},Ps=()=>{let e=[...Wn("aapt2"),...Wn("aapt")];for(let t of Zi())for(let n of Ui(Pe.join(t,"build-tools")))e.push(Pe.join(n,"aapt2"),Pe.join(n,"aapt"));return e},Es=e=>{let t=e.trim();return/^\d+$/.test(t)?t:null},Rs=e=>e.match(/^package:.*\bversionCode='(\d+)'/m)?.[1]||null,Ns=(e,t)=>{let n=t.apkanalyzer??vs();for(let r of n)if(Wi(r))try{let o=Mi(r,["manifest","version-code",e],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),s=Es(o);if(s)return We(s,"packaged APK manifest")}catch{}let i=t.aapt??Ps();for(let r of i)if(Wi(r))try{let o=Mi(r,["dump","badging",e],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),s=Rs(o);if(s)return We(s,"packaged APK manifest")}catch{}throw new Error("Could not inspect the packaged APK versionCode. Install Android SDK command-line tools (apkanalyzer or aapt2) and rebuild; MACH will not publish an unverified artifact.")},xs=(e,t={})=>{let n=Pe.extname(e).toLowerCase();if(n===".apk")return Ns(e,t);if(n!==".aab")throw new Error(`Unsupported Android artifact for version validation: ${e}`);let i;try{i=new bs(e)}catch(o){throw new Error(`Could not open AAB ${Pe.basename(e)}: ${o.message}`)}let r=i.getEntry("base/manifest/AndroidManifest.xml")||i.getEntries().find(o=>o.entryName.replace(/\\/g,"/")==="base/manifest/AndroidManifest.xml");if(!r)throw new Error(`AAB ${Pe.basename(e)} has no base module manifest`);try{return ws(r.getData())}catch(o){throw new Error(`Could not read versionCode from ${Pe.basename(e)}: ${o.message}`)}},Zn=(e,t,n={})=>{let i=We(t,"resolved MACH build assignment"),r=xs(e,n);if(r!==i)throw new Error(`Android versionCode mismatch in ${Pe.basename(e)}: expected ${i}, packaged ${r}. MACH stopped the build before upload.`);return r};import me from"fs";import ie from"path";var Un=e=>{let t=ie.join(e,"package.json");if(!me.existsSync(t))return null;try{return JSON.parse(me.readFileSync(t,"utf8"))}catch{return null}},Gi=e=>{let t=Un(e);if(!t)return 0;let n={...t.dependencies||{},...t.devDependencies||{}},i=0;return n.expo&&(i+=8),n["react-native"]&&(i+=8),me.existsSync(ie.join(e,"android"))&&(i+=3),me.existsSync(ie.join(e,"ios"))&&(i+=3),/^(app|mobile)$/i.test(ie.basename(e))&&(i+=1),i},ks=e=>{let t=e?.workspaces;return Array.isArray(t)?t.filter(n=>typeof n=="string"):Array.isArray(t?.packages)?t.packages.filter(n=>typeof n=="string"):[]},Os=(e,t)=>{let n=new Set;for(let i of t){let r=i.replace(/\\/g,"/").replace(/\/+$/,"");if(!r||r.startsWith("/")||r===".."||r.startsWith("../")||r.includes("/../"))continue;if(!r.includes("*")){n.add(ie.resolve(e,r));continue}let o=r.match(/^(.*)\/\*$/);if(!o)continue;let s=ie.resolve(e,o[1]);if(!(!me.existsSync(s)||!me.statSync(s).isDirectory()))for(let a of me.readdirSync(s,{withFileTypes:!0}))a.isDirectory()&&n.add(ie.join(s,a.name))}for(let i of["apps","packages"]){let r=ie.join(e,i);if(!(!me.existsSync(r)||!me.statSync(r).isDirectory()))for(let o of me.readdirSync(r,{withFileTypes:!0}))o.isDirectory()&&n.add(ie.join(r,o.name))}return Array.from(n)},wd=e=>{let t=ie.resolve(e);if(Gi(t)>0)return".";let n=Un(t),i=Os(t,ks(n)).map(r=>({directory:r,score:Gi(r)})).filter(r=>r.score>0).sort((r,o)=>o.score-r.score||r.directory.localeCompare(o.directory));return i.length===0||i[1]&&i[1].score===i[0].score?null:ie.relative(t,i[0].directory).split(ie.sep).join("/")},vd=(e,t)=>{let n=St(e,t,{requireAppDirectory:!0}),i=Un(n.appRoot);return{...i?.dependencies||{},...i?.devDependencies||{}}.expo?"expo":"react-native"},$s=e=>{if(e==null)return".";if(typeof e!="string")throw new Error("appDirectory must be a relative directory path.");let t=e.trim();if(!t||t===".")return".";if(t.includes("\0"))throw new Error("appDirectory contains an invalid null byte.");let n=t.replace(/\\/g,"/");if(ie.posix.isAbsolute(n)||/^[A-Za-z]:\//.test(n))throw new Error("appDirectory must be relative to the project root.");let i=ie.posix.normalize(n).replace(/^\.\//,"");if(i===".."||i.startsWith("../")||i.includes("/../"))throw new Error("appDirectory must stay inside the project root.");return!i||i==="."?".":i.replace(/\/+$/,"")},St=(e,t,n={})=>{let i=ie.resolve(e),r=$s(t),o=ie.resolve(i,...r.split("/").filter(a=>a&&a!==".")),s=ie.relative(i,o);if(s===".."||s.startsWith(`..${ie.sep}`)||ie.isAbsolute(s))throw new Error("appDirectory must stay inside the project root.");if(n.requireAppDirectory){if(!me.existsSync(o)||!me.statSync(o).isDirectory())throw new Error(`Configured appDirectory "${r}" does not exist inside the project root.`);if(!me.existsSync(ie.join(o,"package.json")))throw new Error(`Configured appDirectory "${r}" must contain a package.json.`);let a=me.realpathSync(i),c=me.realpathSync(o),l=ie.relative(a,c);if(l===".."||l.startsWith(`..${ie.sep}`)||ie.isAbsolute(l))throw new Error("Configured appDirectory resolves outside the project root.")}return{sourceRoot:i,appDirectory:r,appRoot:o}},Pd=(e,t,n)=>{if(t==="react-native"){if(n==="android"){let i=ie.join(e.appRoot,"android/gradlew"),r=ie.join(e.appRoot,"gradlew");if(!me.existsSync(i)&&!me.existsSync(r))throw new Error(`React Native Android build requires android/gradlew inside appDirectory "${e.appDirectory}".`);return}if(!me.existsSync(ie.join(e.appRoot,"ios/Podfile")))throw new Error(`React Native iOS build requires ios/Podfile inside appDirectory "${e.appDirectory}".`)}};import Gn from"fs";import tn from"path";import{spawnSync as _s}from"child_process";var ge=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Li=e=>e==null?void 0:ge(String(e)),Hi=e=>{if(!Gn.existsSync(e))return null;try{return JSON.parse(Gn.readFileSync(e,"utf-8"))}catch{return null}},Ts=e=>{let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{let n=t.indexOf("{"),i=t.lastIndexOf("}");if(n<0||i<=n)return null;try{return JSON.parse(t.slice(n,i+1))}catch{return null}}};function Xi(e=process.cwd()){let t=Hi(tn.join(e,"package.json"))||{};return ge(t.version)}function Fs(e=process.cwd()){let t=Hi(tn.join(e,"package.json"))||{},n={...t.dependencies||{},...t.devDependencies||{}};if(n.expo)return"expo";if(n["react-native"])return"react-native"}function Ki(e=process.cwd(),t={}){let n=process.platform==="win32"?tn.join(e,"node_modules",".bin","expo.cmd"):tn.join(e,"node_modules",".bin","expo"),i=Gn.existsSync(n),s=_s(i?n:"npx",i?["config","--type","public","--json"]:["--no-install","expo","config","--type","public","--json"],{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","pipe"],env:{...process.env,EXPO_NO_TELEMETRY:"1",...t}});return s.error||s.status!==0?null:Ts(s.stdout||"")}var Ji=e=>{let t=ge(e);if(!(!t||t==="manual"))return t},en=(e,t,n,i={})=>{let r=ge(e);if(r)return r;if(!e||typeof e!="object")return;let o=ge(e.policy);if(o==="appVersion")return ge(t.version);if(o==="sdkVersion")return ge(t.sdkVersion);if(o==="nativeVersion"){let s=ge(t.version);if(!s||!n)return;let a=n==="ios"?Li(i.iosBuildNumber)||Li(t.ios?.buildNumber):i.androidVersionCode!==void 0?String(i.androidVersionCode).trim():t.android?.versionCode!==void 0?String(t.android.versionCode).trim():void 0;return!a||a.toLowerCase()==="auto"?s:a?`${s}(${a})`:s}};function Ds(e,t,n={},i){let r=t?en(e[t]?.runtimeVersion,e,t,n):void 0;if(r)return r;let o=en(e.runtimeVersion,e,t,n);return o||(i?en({policy:i},e,t,n):void 0)}function Bs(e,t){if(!(!e||typeof e!="object"))return ge(t?e[t]?.runtimeVersion:void 0)||ge(e.runtimeVersion)}function kd(e,t={}){return ge(t.MACH_OTA_CHANNEL)||ge(e.ota?.channel)||"production"}function Yi(e,t){return[e?.runtimeVersion!==t.runtimeVersion?`runtime ${e?.runtimeVersion||"missing"} (expected ${t.runtimeVersion})`:void 0,e?.channel!==t.channel?`channel ${e?.channel||"missing"} (expected ${t.channel})`:void 0,e?.url!==t.url?`URL ${e?.url||"missing"} (expected ${t.url})`:void 0].filter(n=>!!n)}function zi(e,t){let n=Ki(e,{MACH_OTA_RUNTIME_VERSION:t.runtimeVersion,MACH_OTA_CHANNEL:t.channel,MACH_OTA_URL:t.url});return n?{runtimeVersion:Bs(n,t.platform),channel:ge(n.updates?.requestHeaders?.["expo-channel-name"]),url:ge(n.updates?.url),expoConfig:n}:null}function Vs(e,t,n={}){let i=ge(n.runtimeVersion)||ge(e.ota?.runtimeVersion);if(i)return i;let r={iosBuildNumber:n.iosBuildNumber,androidVersionCode:n.androidVersionCode},o=Ji(e.ota?.runtimeVersionPolicy);if(o){let s=en({policy:o},t,n.platform,r);if(s)return s}return Ds(t,n.platform,r)}function Od(e,t={}){let n=t.cwd||process.cwd(),i=ge(t.runtimeVersion)||ge(e.ota?.runtimeVersion);if(i)return i;let r=Ji(e.ota?.runtimeVersionPolicy),o={iosBuildNumber:t.iosBuildNumber,androidVersionCode:t.androidVersionCode};if((t.framework||e.framework||Fs(n))==="expo"){let a=Ki(n),c=a?Vs(e,a,{platform:t.platform,iosBuildNumber:o.iosBuildNumber,androidVersionCode:o.androidVersionCode}):void 0;if(c)return c}return Xi(n)||"1.0.0"}import Gt from"fs";import Ln from"path";import{spawnSync as Ms}from"child_process";var nn=/^[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/;function qi(e){if(!e||typeof e!="object")return;let t=e,n=typeof t.targetName=="string"?t.targetName.trim():"",i=typeof t.bundleIdentifier=="string"?t.bundleIdentifier.trim():"";if(!(!n||n.length>128||/[\r\n\0]/.test(n)||!nn.test(i)))return{targetName:n,bundleIdentifier:i}}function Xn(e){if(!e||typeof e!="object")return[];let t=e,i=(t.expo&&typeof t.expo=="object"?t.expo:t)?.extra?.eas?.build?.experimental?.ios?.appExtensions;return Array.isArray(i)?i.map(qi).filter(Boolean):[]}function js(e){for(let t of["app.json","app.config.json"]){let n=Ln.join(e,t);if(Gt.existsSync(n))try{return Xn(JSON.parse(Gt.readFileSync(n,"utf8")))}catch{return[]}}return[]}function Ws(e){let t=Ms(process.platform==="win32"?"npx.cmd":"npx",["--no-install","expo","config","--type","public","--json"],{cwd:e,encoding:"utf8",timeout:15e3,maxBuffer:5242880,stdio:["ignore","pipe","ignore"]});if(t.status!==0||!t.stdout)return[];try{return Xn(JSON.parse(t.stdout))}catch{return[]}}function Qi(e,t,n){let i=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`${i}(?:\\s+\\/\\*[^\\n]*\\*\\/)?\\s*=\\s*\\{\\s*isa\\s*=\\s*${n};([\\s\\S]*?)\\n\\s*\\};`))?.[1]}function Zs(e){let t=Ln.join(e,"ios");if(!Gt.existsSync(t))return[];let n=[],i=o=>{for(let s of Gt.readdirSync(o,{withFileTypes:!0})){if(s.name==="Pods"||s.name==="build")continue;let a=Ln.join(o,s.name);s.isDirectory()?i(a):s.name==="project.pbxproj"&&n.push(a)}};i(t);let r=[];for(let o of n){let s=Gt.readFileSync(o,"utf8"),a=/([A-Fa-f0-9]{24})(?: \/\* ([^*\n]+) \*\/)? = \{\s*isa = PBXNativeTarget;([\s\S]*?)\n\s*\};/g;for(let c of s.matchAll(a)){let l=c[3]||"";if(!/productType\s*=\s*"?com\.apple\.product-type\.app-extension"?;/.test(l))continue;let d=(l.match(/\bname\s*=\s*"?([^";\n]+)"?;/)?.[1]||c[2]||"").trim(),p=l.match(/buildConfigurationList\s*=\s*([A-Fa-f0-9]{24})/)?.[1];if(!d||!p)continue;let f=[...(Qi(s,p,"XCConfigurationList")||"").matchAll(/([A-Fa-f0-9]{24})(?: \/\*[^*\n]+\*\/)?/g)].map(N=>N[1]),m;for(let N of f){let P=Qi(s,N,"XCBuildConfiguration")?.match(/PRODUCT_BUNDLE_IDENTIFIER\s*=\s*"?([^";\s]+)"?;/)?.[1]?.trim();if(P&&!P.includes("$")&&nn.test(P)){m=P;break}}m&&r.push({targetName:d,bundleIdentifier:m})}}return r}function Us(e,t,n){if(!nn.test(e))throw new Error(`Invalid main iOS bundle identifier "${e}".`);let i=[{targetName:t,bundleIdentifier:e,isMainApplication:!0}],r=new Set([e]),o=new Set(t?[t]:[]);for(let s of n){let a=qi(s);if(!a)throw new Error("Each ios.appExtensions entry requires a valid targetName and bundleIdentifier.");if(r.has(a.bundleIdentifier))throw new Error(`Duplicate iOS signing bundle identifier "${a.bundleIdentifier}".`);if(o.has(a.targetName))throw new Error(`Duplicate iOS signing target name "${a.targetName}".`);r.add(a.bundleIdentifier),o.add(a.targetName),i.push({...a,isMainApplication:!1})}return i}function Dd(e){let{config:t,resolvedProfile:n,framework:i,appRoot:r}=e,o=n?.ios?.appExtensions??t?.ios?.appExtensions,s=Array.isArray(o)?o:[];return s.length===0&&(s=Xn(t?.expo)),s.length===0&&i==="expo"&&(s=js(r)),s.length===0&&i==="expo"&&(s=Ws(r)),s.length===0&&(s=Zs(r)),Us(e.mainBundleIdentifier,e.mainTargetName,s)}function Bd(e){return JSON.stringify({version:1,profiles:e})}function er(e){if(!e)return[];let t;try{t=JSON.parse(e)}catch{throw new Error("IOS_PROVISIONING_PROFILES contains invalid JSON.")}let n=t;if(n.version!==1||!Array.isArray(n.profiles))throw new Error("IOS_PROVISIONING_PROFILES has an unsupported format.");return n.profiles.map(i=>{let r=i.isMainApplication===!0,o=typeof i.bundleIdentifier=="string"?i.bundleIdentifier.trim():"",s=typeof i.targetName=="string"?i.targetName.trim():"";if(!nn.test(o)||!r&&(!s||s.length>128||/[\r\n\0]/.test(s))||typeof i.profileBase64!="string"||i.profileBase64.length<64)throw new Error("IOS_PROVISIONING_PROFILES contains an invalid profile.");return{targetName:s||void 0,bundleIdentifier:o,isMainApplication:r,profileBase64:i.profileBase64}})}import be from"fs";import an from"os";import he from"path";import{execFileSync as cr,spawnSync as lr}from"child_process";import{spawnSync as Hn}from"child_process";import tr from"crypto";import Gs from"fs";var rn=e=>String(e||"").replace(/[^a-fA-F0-9]/g,"").toUpperCase(),Kn=(e,t)=>{let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`<key>${n}<\\/key>\\s*<string>([^<]+)<\\/string>`))?.[1]?.trim()},Ls=(e,t)=>{let n=Kn(e,"application-identifier");if(!n)return;if(t&&n.startsWith(`${t}.`))return n.slice(t.length+1);let i=n.indexOf(".");return i>=0?n.slice(i+1):n},nr=e=>{let t=new tr.X509Certificate(e);return{sha1:rn(t.fingerprint),sha256:rn(t.fingerprint256),serial:rn(t.serialNumber),subject:t.subject}},Xs=e=>(e.match(/-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g)||[]).map(n=>new tr.X509Certificate(n).raw);function Yn(e){let t=e.match(/<key>TeamIdentifier<\/key>\s*<array>\s*<string>([^<]+)<\/string>/)?.[1]?.trim(),n=e.match(/<key>DeveloperCertificates<\/key>\s*<array>([\s\S]*?)<\/array>/)?.[1]||"",r=Array.from(n.matchAll(/<data>\s*([\s\S]*?)\s*<\/data>/g),a=>a[1].replace(/\s+/g,"")).filter(Boolean).map(a=>nr(Buffer.from(a,"base64"))),o=/<key>get-task-allow<\/key>\s*<true\/>/.test(e),s=e.includes("<key>ProvisionedDevices</key>");return{uuid:Kn(e,"UUID"),name:Kn(e,"Name"),teamId:t,bundleIdentifier:Ls(e,t),isDevelopment:o,isAppStore:!o&&!s,certificateSha1s:r.map(a=>a.sha1),certificateSha256s:r.map(a=>a.sha256)}}var Hs=e=>{let t=Gs.readFileSync(e,"utf8");if(t.includes("<plist")&&t.includes("DeveloperCertificates"))return t;let n=Hn("security",["cms","-D","-i",e],{encoding:"utf8",maxBuffer:5*1024*1024});if(!n.error&&n.status===0&&n.stdout?.includes("<plist"))return n.stdout;let i=Hn("openssl",["smime","-verify","-inform","DER","-in",e,"-noverify"],{encoding:"utf8",maxBuffer:5*1024*1024});if(!i.error&&i.status===0&&i.stdout?.includes("<plist"))return i.stdout;let r=[n.stderr,i.stderr,n.error?.message,i.error?.message].filter(Boolean).join(`
315
+ `+n.slice(s)}return Xe.writeFileSync(e,o),!0},Ss=(e,t)=>{if(!As(e,t)){if(process.platform!=="darwin")throw new Error(`Could not update binary Info.plist outside macOS: ${e}`);try{Vn("/usr/bin/plutil",["-replace","CFBundleVersion","-string",t,e])}catch{Vn("/usr/bin/plutil",["-insert","CFBundleVersion","-string",t,e])}}},Vi=(e,t,n)=>{let i=At(t,"resolved MACH build"),r=lt.resolve(e),o=new Set;if(n)try{for(let l of Is(r,n))o.add(l)}catch{}for(let l of Bi(r))o.add(l);let s=[...o].sort(),a=new Map,c=!1;try{for(let l of s)a.set(l,Xe.readFileSync(l)),Ss(l,i)}catch(l){for(let[p,d]of a)Xe.writeFileSync(p,d);throw l}return{buildNumber:i,plistPaths:s,restore:()=>{if(!c){c=!0;for(let[l,p]of a)Xe.existsSync(l)&&Xe.writeFileSync(l,p)}}}},Mn=(e,t,n)=>{let i=At(e,n),r=At(t,"resolved MACH build");if(i!==r)throw new Error(`iOS build number mismatch in ${n}: expected MACH buildNumber ${r}, but the artifact contains CFBundleVersion ${i}.`);return i};import{execFileSync as Mi}from"child_process";import Zt from"fs";import Pe from"path";import bs from"adm-zip";var jn=(e,t)=>{let n=0n,i=0n,r=t;for(;r<e.length&&i<=63n;){let o=e[r++];if(n|=BigInt(o&127)<<i,(o&128)===0)return{value:n,next:r};i+=7n}throw new Error("Malformed protobuf varint")},Ut=e=>{let t=[],n=0;for(;n<e.length;){let i=jn(e,n);n=i.next;let r=Number(i.value>>3n),o=Number(i.value&7n);if(r<1)throw new Error("Malformed protobuf field number");if(o===0){let s=jn(e,n);n=s.next,t.push({number:r,wireType:o,varint:s.value});continue}if(o===1){if(n+8>e.length)throw new Error("Truncated protobuf fixed64");t.push({number:r,wireType:o,bytes:e.subarray(n,n+8)}),n+=8;continue}if(o===2){let s=jn(e,n);n=s.next;let a=Number(s.value);if(!Number.isSafeInteger(a)||n+a>e.length)throw new Error("Truncated protobuf length-delimited field");t.push({number:r,wireType:o,bytes:e.subarray(n,n+a)}),n+=a;continue}if(o===5){if(n+4>e.length)throw new Error("Truncated protobuf fixed32");t.push({number:r,wireType:o,bytes:e.subarray(n,n+4)}),n+=4;continue}throw new Error(`Unsupported protobuf wire type ${o}`)}return t},ji=(e,t)=>e.find(i=>i.number===t&&i.wireType===2)?.bytes?.toString("utf8"),Cs=e=>{let n=Ut(e).find(o=>o.number===7&&o.wireType===2)?.bytes;if(!n)return null;let r=Ut(n).find(o=>(o.number===6||o.number===7)&&o.wireType===0)?.varint;return r===void 0||r>BigInt(Number.MAX_SAFE_INTEGER)?null:r.toString()},ws=e=>{let n=Ut(e).find(l=>l.number===1&&l.wireType===2)?.bytes;if(!n)throw new Error("AAB base manifest has no root XML element");let o=Ut(n).filter(l=>l.number===4&&l.wireType===2).map(l=>Ut(l.bytes)).find(l=>ji(l,2)==="versionCode");if(!o)throw new Error("AAB base manifest has no android:versionCode");let s=ji(o,3)?.trim();if(s&&/^\d+$/.test(s))return We(s,"packaged AAB manifest");let a=o.find(l=>l.number===6&&l.wireType===2)?.bytes,c=a?Cs(a):null;return We(c,"packaged AAB manifest")},Wi=e=>{try{return Zt.accessSync(e,Zt.constants.X_OK),Zt.statSync(e).isFile()}catch{return!1}},Wn=e=>String(process.env.PATH||"").split(Pe.delimiter).filter(Boolean).map(t=>Pe.join(t,e)),Zi=()=>Array.from(new Set([process.env.ANDROID_HOME,process.env.ANDROID_SDK_ROOT,process.platform==="darwin"?Pe.join(process.env.HOME||"","Library/Android/sdk"):Pe.join(process.env.HOME||"","Android/Sdk"),"/opt/android-sdk"].filter(e=>!!e))),Ui=e=>{try{return Zt.readdirSync(e).map(t=>Pe.join(e,t)).filter(t=>Zt.statSync(t).isDirectory()).sort((t,n)=>n.localeCompare(t,void 0,{numeric:!0}))}catch{return[]}},vs=()=>{let e=Wn("apkanalyzer");for(let t of Zi()){let n=Pe.join(t,"cmdline-tools");e.push(Pe.join(n,"latest/bin/apkanalyzer"));for(let i of Ui(n))e.push(Pe.join(i,"bin/apkanalyzer"))}return e},Ps=()=>{let e=[...Wn("aapt2"),...Wn("aapt")];for(let t of Zi())for(let n of Ui(Pe.join(t,"build-tools")))e.push(Pe.join(n,"aapt2"),Pe.join(n,"aapt"));return e},Es=e=>{let t=e.trim();return/^\d+$/.test(t)?t:null},Rs=e=>e.match(/^package:.*\bversionCode='(\d+)'/m)?.[1]||null,Ns=(e,t)=>{let n=t.apkanalyzer??vs();for(let r of n)if(Wi(r))try{let o=Mi(r,["manifest","version-code",e],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),s=Es(o);if(s)return We(s,"packaged APK manifest")}catch{}let i=t.aapt??Ps();for(let r of i)if(Wi(r))try{let o=Mi(r,["dump","badging",e],{encoding:"utf8",stdio:["ignore","pipe","pipe"]}),s=Rs(o);if(s)return We(s,"packaged APK manifest")}catch{}throw new Error("Could not inspect the packaged APK versionCode. Install Android SDK command-line tools (apkanalyzer or aapt2) and rebuild; MACH will not publish an unverified artifact.")},xs=(e,t={})=>{let n=Pe.extname(e).toLowerCase();if(n===".apk")return Ns(e,t);if(n!==".aab")throw new Error(`Unsupported Android artifact for version validation: ${e}`);let i;try{i=new bs(e)}catch(o){throw new Error(`Could not open AAB ${Pe.basename(e)}: ${o.message}`)}let r=i.getEntry("base/manifest/AndroidManifest.xml")||i.getEntries().find(o=>o.entryName.replace(/\\/g,"/")==="base/manifest/AndroidManifest.xml");if(!r)throw new Error(`AAB ${Pe.basename(e)} has no base module manifest`);try{return ws(r.getData())}catch(o){throw new Error(`Could not read versionCode from ${Pe.basename(e)}: ${o.message}`)}},Zn=(e,t,n={})=>{let i=We(t,"resolved MACH build assignment"),r=xs(e,n);if(r!==i)throw new Error(`Android versionCode mismatch in ${Pe.basename(e)}: expected ${i}, packaged ${r}. MACH stopped the build before upload.`);return r};import ge from"fs";import ie from"path";var Un=e=>{let t=ie.join(e,"package.json");if(!ge.existsSync(t))return null;try{return JSON.parse(ge.readFileSync(t,"utf8"))}catch{return null}},Gi=e=>{let t=Un(e);if(!t)return 0;let n={...t.dependencies||{},...t.devDependencies||{}},i=0;return n.expo&&(i+=8),n["react-native"]&&(i+=8),ge.existsSync(ie.join(e,"android"))&&(i+=3),ge.existsSync(ie.join(e,"ios"))&&(i+=3),/^(app|mobile)$/i.test(ie.basename(e))&&(i+=1),i},ks=e=>{let t=e?.workspaces;return Array.isArray(t)?t.filter(n=>typeof n=="string"):Array.isArray(t?.packages)?t.packages.filter(n=>typeof n=="string"):[]},Os=(e,t)=>{let n=new Set;for(let i of t){let r=i.replace(/\\/g,"/").replace(/\/+$/,"");if(!r||r.startsWith("/")||r===".."||r.startsWith("../")||r.includes("/../"))continue;if(!r.includes("*")){n.add(ie.resolve(e,r));continue}let o=r.match(/^(.*)\/\*$/);if(!o)continue;let s=ie.resolve(e,o[1]);if(!(!ge.existsSync(s)||!ge.statSync(s).isDirectory()))for(let a of ge.readdirSync(s,{withFileTypes:!0}))a.isDirectory()&&n.add(ie.join(s,a.name))}for(let i of["apps","packages"]){let r=ie.join(e,i);if(!(!ge.existsSync(r)||!ge.statSync(r).isDirectory()))for(let o of ge.readdirSync(r,{withFileTypes:!0}))o.isDirectory()&&n.add(ie.join(r,o.name))}return Array.from(n)},wd=e=>{let t=ie.resolve(e);if(Gi(t)>0)return".";let n=Un(t),i=Os(t,ks(n)).map(r=>({directory:r,score:Gi(r)})).filter(r=>r.score>0).sort((r,o)=>o.score-r.score||r.directory.localeCompare(o.directory));return i.length===0||i[1]&&i[1].score===i[0].score?null:ie.relative(t,i[0].directory).split(ie.sep).join("/")},vd=(e,t)=>{let n=St(e,t,{requireAppDirectory:!0}),i=Un(n.appRoot);return{...i?.dependencies||{},...i?.devDependencies||{}}.expo?"expo":"react-native"},$s=e=>{if(e==null)return".";if(typeof e!="string")throw new Error("appDirectory must be a relative directory path.");let t=e.trim();if(!t||t===".")return".";if(t.includes("\0"))throw new Error("appDirectory contains an invalid null byte.");let n=t.replace(/\\/g,"/");if(ie.posix.isAbsolute(n)||/^[A-Za-z]:\//.test(n))throw new Error("appDirectory must be relative to the project root.");let i=ie.posix.normalize(n).replace(/^\.\//,"");if(i===".."||i.startsWith("../")||i.includes("/../"))throw new Error("appDirectory must stay inside the project root.");return!i||i==="."?".":i.replace(/\/+$/,"")},St=(e,t,n={})=>{let i=ie.resolve(e),r=$s(t),o=ie.resolve(i,...r.split("/").filter(a=>a&&a!==".")),s=ie.relative(i,o);if(s===".."||s.startsWith(`..${ie.sep}`)||ie.isAbsolute(s))throw new Error("appDirectory must stay inside the project root.");if(n.requireAppDirectory){if(!ge.existsSync(o)||!ge.statSync(o).isDirectory())throw new Error(`Configured appDirectory "${r}" does not exist inside the project root.`);if(!ge.existsSync(ie.join(o,"package.json")))throw new Error(`Configured appDirectory "${r}" must contain a package.json.`);let a=ge.realpathSync(i),c=ge.realpathSync(o),l=ie.relative(a,c);if(l===".."||l.startsWith(`..${ie.sep}`)||ie.isAbsolute(l))throw new Error("Configured appDirectory resolves outside the project root.")}return{sourceRoot:i,appDirectory:r,appRoot:o}},Pd=(e,t,n)=>{if(t==="react-native"){if(n==="android"){let i=ie.join(e.appRoot,"android/gradlew"),r=ie.join(e.appRoot,"gradlew");if(!ge.existsSync(i)&&!ge.existsSync(r))throw new Error(`React Native Android build requires android/gradlew inside appDirectory "${e.appDirectory}".`);return}if(!ge.existsSync(ie.join(e.appRoot,"ios/Podfile")))throw new Error(`React Native iOS build requires ios/Podfile inside appDirectory "${e.appDirectory}".`)}};import Gn from"fs";import tn from"path";import{spawnSync as _s}from"child_process";var me=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Li=e=>e==null?void 0:me(String(e)),Hi=e=>{if(!Gn.existsSync(e))return null;try{return JSON.parse(Gn.readFileSync(e,"utf-8"))}catch{return null}},Ts=e=>{let t=e.trim();if(!t)return null;try{return JSON.parse(t)}catch{let n=t.indexOf("{"),i=t.lastIndexOf("}");if(n<0||i<=n)return null;try{return JSON.parse(t.slice(n,i+1))}catch{return null}}};function Xi(e=process.cwd()){let t=Hi(tn.join(e,"package.json"))||{};return me(t.version)}function Fs(e=process.cwd()){let t=Hi(tn.join(e,"package.json"))||{},n={...t.dependencies||{},...t.devDependencies||{}};if(n.expo)return"expo";if(n["react-native"])return"react-native"}function Ki(e=process.cwd(),t={}){let n=process.platform==="win32"?tn.join(e,"node_modules",".bin","expo.cmd"):tn.join(e,"node_modules",".bin","expo"),i=Gn.existsSync(n),s=_s(i?n:"npx",i?["config","--type","public","--json"]:["--no-install","expo","config","--type","public","--json"],{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","pipe"],env:{...process.env,EXPO_NO_TELEMETRY:"1",...t}});return s.error||s.status!==0?null:Ts(s.stdout||"")}var Ji=e=>{let t=me(e);if(!(!t||t==="manual"))return t},en=(e,t,n,i={})=>{let r=me(e);if(r)return r;if(!e||typeof e!="object")return;let o=me(e.policy);if(o==="appVersion")return me(t.version);if(o==="sdkVersion")return me(t.sdkVersion);if(o==="nativeVersion"){let s=me(t.version);if(!s||!n)return;let a=n==="ios"?Li(i.iosBuildNumber)||Li(t.ios?.buildNumber):i.androidVersionCode!==void 0?String(i.androidVersionCode).trim():t.android?.versionCode!==void 0?String(t.android.versionCode).trim():void 0;return!a||a.toLowerCase()==="auto"?s:a?`${s}(${a})`:s}};function Ds(e,t,n={},i){let r=t?en(e[t]?.runtimeVersion,e,t,n):void 0;if(r)return r;let o=en(e.runtimeVersion,e,t,n);return o||(i?en({policy:i},e,t,n):void 0)}function Bs(e,t){if(!(!e||typeof e!="object"))return me(t?e[t]?.runtimeVersion:void 0)||me(e.runtimeVersion)}function kd(e,t={}){return me(t.MACH_OTA_CHANNEL)||me(e.ota?.channel)||"production"}function Yi(e,t){return[e?.runtimeVersion!==t.runtimeVersion?`runtime ${e?.runtimeVersion||"missing"} (expected ${t.runtimeVersion})`:void 0,e?.channel!==t.channel?`channel ${e?.channel||"missing"} (expected ${t.channel})`:void 0,e?.url!==t.url?`URL ${e?.url||"missing"} (expected ${t.url})`:void 0].filter(n=>!!n)}function zi(e,t){let n=Ki(e,{MACH_OTA_RUNTIME_VERSION:t.runtimeVersion,MACH_OTA_CHANNEL:t.channel,MACH_OTA_URL:t.url});return n?{runtimeVersion:Bs(n,t.platform),channel:me(n.updates?.requestHeaders?.["expo-channel-name"]),url:me(n.updates?.url),expoConfig:n}:null}function Vs(e,t,n={}){let i=me(n.runtimeVersion)||me(e.ota?.runtimeVersion);if(i)return i;let r={iosBuildNumber:n.iosBuildNumber,androidVersionCode:n.androidVersionCode},o=Ji(e.ota?.runtimeVersionPolicy);if(o){let s=en({policy:o},t,n.platform,r);if(s)return s}return Ds(t,n.platform,r)}function Od(e,t={}){let n=t.cwd||process.cwd(),i=me(t.runtimeVersion)||me(e.ota?.runtimeVersion);if(i)return i;let r=Ji(e.ota?.runtimeVersionPolicy),o={iosBuildNumber:t.iosBuildNumber,androidVersionCode:t.androidVersionCode};if((t.framework||e.framework||Fs(n))==="expo"){let a=Ki(n),c=a?Vs(e,a,{platform:t.platform,iosBuildNumber:o.iosBuildNumber,androidVersionCode:o.androidVersionCode}):void 0;if(c)return c}return Xi(n)||"1.0.0"}import Gt from"fs";import Ln from"path";import{spawnSync as Ms}from"child_process";var nn=/^[A-Za-z0-9-]+(?:\.[A-Za-z0-9-]+)+$/;function qi(e){if(!e||typeof e!="object")return;let t=e,n=typeof t.targetName=="string"?t.targetName.trim():"",i=typeof t.bundleIdentifier=="string"?t.bundleIdentifier.trim():"";if(!(!n||n.length>128||/[\r\n\0]/.test(n)||!nn.test(i)))return{targetName:n,bundleIdentifier:i}}function Xn(e){if(!e||typeof e!="object")return[];let t=e,i=(t.expo&&typeof t.expo=="object"?t.expo:t)?.extra?.eas?.build?.experimental?.ios?.appExtensions;return Array.isArray(i)?i.map(qi).filter(Boolean):[]}function js(e){for(let t of["app.json","app.config.json"]){let n=Ln.join(e,t);if(Gt.existsSync(n))try{return Xn(JSON.parse(Gt.readFileSync(n,"utf8")))}catch{return[]}}return[]}function Ws(e){let t=Ms(process.platform==="win32"?"npx.cmd":"npx",["--no-install","expo","config","--type","public","--json"],{cwd:e,encoding:"utf8",timeout:15e3,maxBuffer:5242880,stdio:["ignore","pipe","ignore"]});if(t.status!==0||!t.stdout)return[];try{return Xn(JSON.parse(t.stdout))}catch{return[]}}function Qi(e,t,n){let i=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`${i}(?:\\s+\\/\\*[^\\n]*\\*\\/)?\\s*=\\s*\\{\\s*isa\\s*=\\s*${n};([\\s\\S]*?)\\n\\s*\\};`))?.[1]}function Zs(e){let t=Ln.join(e,"ios");if(!Gt.existsSync(t))return[];let n=[],i=o=>{for(let s of Gt.readdirSync(o,{withFileTypes:!0})){if(s.name==="Pods"||s.name==="build")continue;let a=Ln.join(o,s.name);s.isDirectory()?i(a):s.name==="project.pbxproj"&&n.push(a)}};i(t);let r=[];for(let o of n){let s=Gt.readFileSync(o,"utf8"),a=/([A-Fa-f0-9]{24})(?: \/\* ([^*\n]+) \*\/)? = \{\s*isa = PBXNativeTarget;([\s\S]*?)\n\s*\};/g;for(let c of s.matchAll(a)){let l=c[3]||"";if(!/productType\s*=\s*"?com\.apple\.product-type\.app-extension"?;/.test(l))continue;let p=(l.match(/\bname\s*=\s*"?([^";\n]+)"?;/)?.[1]||c[2]||"").trim(),d=l.match(/buildConfigurationList\s*=\s*([A-Fa-f0-9]{24})/)?.[1];if(!p||!d)continue;let f=[...(Qi(s,d,"XCConfigurationList")||"").matchAll(/([A-Fa-f0-9]{24})(?: \/\*[^*\n]+\*\/)?/g)].map(N=>N[1]),g;for(let N of f){let P=Qi(s,N,"XCBuildConfiguration")?.match(/PRODUCT_BUNDLE_IDENTIFIER\s*=\s*"?([^";\s]+)"?;/)?.[1]?.trim();if(P&&!P.includes("$")&&nn.test(P)){g=P;break}}g&&r.push({targetName:p,bundleIdentifier:g})}}return r}function Us(e,t,n){if(!nn.test(e))throw new Error(`Invalid main iOS bundle identifier "${e}".`);let i=[{targetName:t,bundleIdentifier:e,isMainApplication:!0}],r=new Set([e]),o=new Set(t?[t]:[]);for(let s of n){let a=qi(s);if(!a)throw new Error("Each ios.appExtensions entry requires a valid targetName and bundleIdentifier.");if(r.has(a.bundleIdentifier))throw new Error(`Duplicate iOS signing bundle identifier "${a.bundleIdentifier}".`);if(o.has(a.targetName))throw new Error(`Duplicate iOS signing target name "${a.targetName}".`);r.add(a.bundleIdentifier),o.add(a.targetName),i.push({...a,isMainApplication:!1})}return i}function Dd(e){let{config:t,resolvedProfile:n,framework:i,appRoot:r}=e,o=n?.ios?.appExtensions??t?.ios?.appExtensions,s=Array.isArray(o)?o:[];return s.length===0&&(s=Xn(t?.expo)),s.length===0&&i==="expo"&&(s=js(r)),s.length===0&&i==="expo"&&(s=Ws(r)),s.length===0&&(s=Zs(r)),Us(e.mainBundleIdentifier,e.mainTargetName,s)}function Bd(e){return JSON.stringify({version:1,profiles:e})}function er(e){if(!e)return[];let t;try{t=JSON.parse(e)}catch{throw new Error("IOS_PROVISIONING_PROFILES contains invalid JSON.")}let n=t;if(n.version!==1||!Array.isArray(n.profiles))throw new Error("IOS_PROVISIONING_PROFILES has an unsupported format.");return n.profiles.map(i=>{let r=i.isMainApplication===!0,o=typeof i.bundleIdentifier=="string"?i.bundleIdentifier.trim():"",s=typeof i.targetName=="string"?i.targetName.trim():"";if(!nn.test(o)||!r&&(!s||s.length>128||/[\r\n\0]/.test(s))||typeof i.profileBase64!="string"||i.profileBase64.length<64)throw new Error("IOS_PROVISIONING_PROFILES contains an invalid profile.");return{targetName:s||void 0,bundleIdentifier:o,isMainApplication:r,profileBase64:i.profileBase64}})}import be from"fs";import an from"os";import he from"path";import{execFileSync as cr,spawnSync as lr}from"child_process";import{spawnSync as Hn}from"child_process";import tr from"crypto";import Gs from"fs";var rn=e=>String(e||"").replace(/[^a-fA-F0-9]/g,"").toUpperCase(),Kn=(e,t)=>{let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`<key>${n}<\\/key>\\s*<string>([^<]+)<\\/string>`))?.[1]?.trim()},Ls=(e,t)=>{let n=Kn(e,"application-identifier");if(!n)return;if(t&&n.startsWith(`${t}.`))return n.slice(t.length+1);let i=n.indexOf(".");return i>=0?n.slice(i+1):n},nr=e=>{let t=new tr.X509Certificate(e);return{sha1:rn(t.fingerprint),sha256:rn(t.fingerprint256),serial:rn(t.serialNumber),subject:t.subject}},Xs=e=>(e.match(/-----BEGIN CERTIFICATE-----[\s\S]*?-----END CERTIFICATE-----/g)||[]).map(n=>new tr.X509Certificate(n).raw);function Yn(e){let t=e.match(/<key>TeamIdentifier<\/key>\s*<array>\s*<string>([^<]+)<\/string>/)?.[1]?.trim(),n=e.match(/<key>DeveloperCertificates<\/key>\s*<array>([\s\S]*?)<\/array>/)?.[1]||"",r=Array.from(n.matchAll(/<data>\s*([\s\S]*?)\s*<\/data>/g),a=>a[1].replace(/\s+/g,"")).filter(Boolean).map(a=>nr(Buffer.from(a,"base64"))),o=/<key>get-task-allow<\/key>\s*<true\/>/.test(e),s=e.includes("<key>ProvisionedDevices</key>");return{uuid:Kn(e,"UUID"),name:Kn(e,"Name"),teamId:t,bundleIdentifier:Ls(e,t),isDevelopment:o,isAppStore:!o&&!s,certificateSha1s:r.map(a=>a.sha1),certificateSha256s:r.map(a=>a.sha256)}}var Hs=e=>{let t=Gs.readFileSync(e,"utf8");if(t.includes("<plist")&&t.includes("DeveloperCertificates"))return t;let n=Hn("security",["cms","-D","-i",e],{encoding:"utf8",maxBuffer:5*1024*1024});if(!n.error&&n.status===0&&n.stdout?.includes("<plist"))return n.stdout;let i=Hn("openssl",["smime","-verify","-inform","DER","-in",e,"-noverify"],{encoding:"utf8",maxBuffer:5*1024*1024});if(!i.error&&i.status===0&&i.stdout?.includes("<plist"))return i.stdout;let r=[n.stderr,i.stderr,n.error?.message,i.error?.message].filter(Boolean).join(`
316
316
  `).trim();throw new Error(`Could not decode provisioning profile${r?`: ${r}`:"."}`)};function Ct(e){return Yn(Hs(e))}function Lt(e,t){let n=[!0,!1],i;for(let o of n){let s=Hn("openssl",["pkcs12","-in",e,"-clcerts","-nokeys","-passin",`pass:${t}`,...o?["-legacy"]:[]],{encoding:"utf8",maxBuffer:5242880});if(i=s,s.error||s.status!==0||!s.stdout)continue;let a=Xs(s.stdout).map(nr);if(a.length>0)return a}let r=[i?.stderr,i?.error?.message].filter(Boolean).join(`
317
- `).trim();throw new Error(`Could not read signing certificate from .p12${r?`: ${r}`:"."}`)}function ir(e){let t=Array.from(e.matchAll(/\)\s*([A-Fa-f0-9]{40})\s+"([^"]+)"/g),i=>({sha1:rn(i[1]),name:i[2]})),n=new Set;return t.filter(i=>n.has(i.sha1)?!1:(n.add(i.sha1),!0))}var bt=e=>e.name||e.uuid||"selected provisioning profile",Jn=e=>e.length>12?`${e.slice(0,12)}\u2026`:e;function on(e,t){if(t.certificateSha1s.length===0)throw new Error(`${bt(t)} has no embedded signing certificates.`);let n=e.find(o=>t.certificateSha1s.includes(o.sha1)||t.certificateSha256s.includes(o.sha256));if(n)return n;let i=e.map(o=>Jn(o.sha1)).join(", "),r=t.certificateSha1s.map(Jn).join(", ");throw new Error(`${bt(t)} was created for a different signing certificate. P12 fingerprint(s): ${i||"none"}; profile fingerprint(s): ${r||"none"}. Run \`mach credentials\` to regenerate the profile with the selected certificate.`)}var Ks=(e,t)=>e?e===t||e==="*"?!0:e.endsWith(".*")?t.startsWith(`${e.slice(0,-2)}.`):!1:!1;function sn(e,t){if(!Ks(e.bundleIdentifier,t.bundleIdentifier))throw new Error(`${bt(e)} is for ${e.bundleIdentifier||"an unknown bundle ID"}, not ${t.bundleIdentifier}.`);if(t.teamId&&e.teamId&&e.teamId.toUpperCase()!==t.teamId.toUpperCase())throw new Error(`${bt(e)} belongs to Apple Team ${e.teamId}, not ${t.teamId}.`);let n=e.isDevelopment?"development":e.isAppStore?"store":"adhoc";if(n!==t.distributionType)throw new Error(`${bt(e)} is a ${n} profile, not the requested ${t.distributionType} profile.`)}function rr(e,t){let n=e.filter(r=>t.certificateSha1s.includes(r.sha1));if(n.length===0){let r=t.certificateSha1s.map(Jn).join(", ");throw new Error(`${bt(t)} does not include any certificate imported from the selected P12. Expected fingerprint(s): ${r||"none"}. Run \`mach credentials\` to repair this signing pair.`)}let i=t.isDevelopment?/\b(Development|Developer)\b/i:/\bDistribution\b/i;return n.find(r=>i.test(r.name))||n[0]}var or=e=>e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),Qn=(e,t)=>{let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`<key>${n}<\\/key>\\s*<string>([^<]+)<\\/string>`))?.[1]?.trim()},Js=e=>{let t=Qn(e,"application-identifier");if(!t)return;let n=e.match(/<key>TeamIdentifier<\/key>\s*<array>\s*<string>([^<]+)<\/string>/)?.[1]?.trim();if(n&&t.startsWith(`${n}.`))return t.slice(n.length+1);let i=t.indexOf(".");return i>=0?t.slice(i+1):t},Ys=(e,t)=>e===t||e==="*"?!0:e.endsWith(".*")?t.startsWith(`${e.slice(0,-2)}.`):!1;function dr(e){let t=e.profileDirectory||he.join(an.homedir(),"Library","MobileDevice","Provisioning Profiles");return be.mkdirSync(t,{recursive:!0}),e.profiles.map((n,i)=>{let r=he.join(an.tmpdir(),`mach-profile-${e.buildId}-${i}.mobileprovision`);be.writeFileSync(r,Buffer.from(n.profileBase64,"base64"),{mode:384});try{let o=cr("security",["cms","-D","-i",r],{encoding:"utf8",maxBuffer:5242880}),s=Qn(o,"UUID");if(!s)throw new Error(`Provisioning profile for ${n.bundleIdentifier} has no UUID.`);let a=Js(o);if(!a||!Ys(a,n.bundleIdentifier))throw new Error(`Provisioning profile mismatch for ${n.bundleIdentifier}; profile contains ${a||"an unknown App ID"}.`);let c=/<key>get-task-allow<\/key>\s*<true\/>/.test(o),l=o.includes("<key>ProvisionedDevices</key>"),d=Yn(o);if(d.certificateSha1s.length===0)throw new Error(`Provisioning profile for ${n.bundleIdentifier} has no embedded signing certificates.`);let p=he.join(t,`${s}.mobileprovision`);return be.copyFileSync(r,p),be.chmodSync(p,384),{targetName:n.targetName,bundleIdentifier:n.bundleIdentifier,isMainApplication:n.isMainApplication,uuid:s,name:Qn(o,"Name"),isAppStore:!l&&!c,isDevelopment:c,signingProfile:d}}finally{try{be.unlinkSync(r)}catch{}}})}var pr=(e,t=[])=>{if(!be.existsSync(e))return t;for(let n of be.readdirSync(e,{withFileTypes:!0})){if(n.name==="Pods"||n.name==="build"||n.name==="DerivedData")continue;let i=he.join(e,n.name);if(n.isDirectory()&&n.name.endsWith(".xcodeproj")){let r=he.join(i,"project.pbxproj");be.existsSync(r)&&t.push(r);continue}n.isDirectory()&&pr(i,t)}return t},sr=e=>e.filter(t=>!!(t&&be.existsSync(t))),zn=e=>{if(!be.existsSync(e))return[];try{return be.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>he.join(e,t.name))}catch{return[]}},ar=(e,t,n)=>{let i=lr(e,t,{env:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(!(i.error||i.status!==0))return i.stdout.trim()||void 0};function zs(e={}){let t=e.baseEnv||process.env,n=e.homeDirectory||an.homedir(),i=String(t.GEM_PATH||"").split(he.delimiter).filter(Boolean),r=String(t.PATH||"").split(he.delimiter).filter(Boolean),o=[...e.fastlaneGemRoots||[],t.FASTLANE_GEM_HOME,...zn(he.join(n,".local/share/fastlane")),...zn("/opt/homebrew/Cellar/fastlane").map(a=>he.join(a,"libexec")),...zn("/usr/local/Cellar/fastlane").map(a=>he.join(a,"libexec")),...i],s=[...e.rubyBinDirectories||[],t.FASTLANE_BIN_DIR,"/opt/homebrew/opt/ruby/bin","/usr/local/opt/ruby/bin",...r];return{...t,PATH:[...new Set(sr(s))].join(he.delimiter),GEM_PATH:[...new Set(sr(o))].join(he.delimiter),FASTLANE_INSTALLED_VIA_HOMEBREW:t.FASTLANE_INSTALLED_VIA_HOMEBREW||"true",FASTLANE_SKIP_UPDATE_CHECK:"1",FASTLANE_HIDE_CHANGELOG:"1"}}var Qs=e=>{let t={...process.env},n=ar("brew",["--prefix","fastlane"],t),i=ar("brew",["--prefix","ruby"],t),r=zs({baseEnv:t,fastlaneGemRoots:n?[he.join(n,"libexec")]:[],rubyBinDirectories:i?[he.join(i,"bin")]:[]}),o=[...process.env.MACH_XCODEPROJ_RUBY?[{command:process.env.MACH_XCODEPROJ_RUBY,prefixArguments:[],env:r}]:[],{command:"ruby",prefixArguments:[],env:r},{command:"bundle",prefixArguments:["exec","ruby"],env:r}];for(let s of o){let a=lr(s.command,[...s.prefixArguments,"-e","require 'xcodeproj'; print Xcodeproj::VERSION"],{cwd:e,env:s.env,encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(!a.error&&a.status===0)return s}throw new Error(["Mach could not load the Ruby xcodeproj library required for multi-target iOS signing.","Install Fastlane with Homebrew (`brew install fastlane`) or install the xcodeproj gem in the runner Ruby environment.","Mach checks Homebrew Fastlane, FASTLANE_GEM_HOME, and `bundle exec ruby` automatically."].join(" "))},qs=String.raw`
317
+ `).trim();throw new Error(`Could not read signing certificate from .p12${r?`: ${r}`:"."}`)}function ir(e){let t=Array.from(e.matchAll(/\)\s*([A-Fa-f0-9]{40})\s+"([^"]+)"/g),i=>({sha1:rn(i[1]),name:i[2]})),n=new Set;return t.filter(i=>n.has(i.sha1)?!1:(n.add(i.sha1),!0))}var bt=e=>e.name||e.uuid||"selected provisioning profile",Jn=e=>e.length>12?`${e.slice(0,12)}\u2026`:e;function on(e,t){if(t.certificateSha1s.length===0)throw new Error(`${bt(t)} has no embedded signing certificates.`);let n=e.find(o=>t.certificateSha1s.includes(o.sha1)||t.certificateSha256s.includes(o.sha256));if(n)return n;let i=e.map(o=>Jn(o.sha1)).join(", "),r=t.certificateSha1s.map(Jn).join(", ");throw new Error(`${bt(t)} was created for a different signing certificate. P12 fingerprint(s): ${i||"none"}; profile fingerprint(s): ${r||"none"}. Run \`mach credentials\` to regenerate the profile with the selected certificate.`)}var Ks=(e,t)=>e?e===t||e==="*"?!0:e.endsWith(".*")?t.startsWith(`${e.slice(0,-2)}.`):!1:!1;function sn(e,t){if(!Ks(e.bundleIdentifier,t.bundleIdentifier))throw new Error(`${bt(e)} is for ${e.bundleIdentifier||"an unknown bundle ID"}, not ${t.bundleIdentifier}.`);if(t.teamId&&e.teamId&&e.teamId.toUpperCase()!==t.teamId.toUpperCase())throw new Error(`${bt(e)} belongs to Apple Team ${e.teamId}, not ${t.teamId}.`);let n=e.isDevelopment?"development":e.isAppStore?"store":"adhoc";if(n!==t.distributionType)throw new Error(`${bt(e)} is a ${n} profile, not the requested ${t.distributionType} profile.`)}function rr(e,t){let n=e.filter(r=>t.certificateSha1s.includes(r.sha1));if(n.length===0){let r=t.certificateSha1s.map(Jn).join(", ");throw new Error(`${bt(t)} does not include any certificate imported from the selected P12. Expected fingerprint(s): ${r||"none"}. Run \`mach credentials\` to repair this signing pair.`)}let i=t.isDevelopment?/\b(Development|Developer)\b/i:/\bDistribution\b/i;return n.find(r=>i.test(r.name))||n[0]}var or=e=>e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;").replace(/'/g,"&apos;"),Qn=(e,t)=>{let n=t.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");return e.match(new RegExp(`<key>${n}<\\/key>\\s*<string>([^<]+)<\\/string>`))?.[1]?.trim()},Js=e=>{let t=Qn(e,"application-identifier");if(!t)return;let n=e.match(/<key>TeamIdentifier<\/key>\s*<array>\s*<string>([^<]+)<\/string>/)?.[1]?.trim();if(n&&t.startsWith(`${n}.`))return t.slice(n.length+1);let i=t.indexOf(".");return i>=0?t.slice(i+1):t},Ys=(e,t)=>e===t||e==="*"?!0:e.endsWith(".*")?t.startsWith(`${e.slice(0,-2)}.`):!1;function dr(e){let t=e.profileDirectory||he.join(an.homedir(),"Library","MobileDevice","Provisioning Profiles");return be.mkdirSync(t,{recursive:!0}),e.profiles.map((n,i)=>{let r=he.join(an.tmpdir(),`mach-profile-${e.buildId}-${i}.mobileprovision`);be.writeFileSync(r,Buffer.from(n.profileBase64,"base64"),{mode:384});try{let o=cr("security",["cms","-D","-i",r],{encoding:"utf8",maxBuffer:5242880}),s=Qn(o,"UUID");if(!s)throw new Error(`Provisioning profile for ${n.bundleIdentifier} has no UUID.`);let a=Js(o);if(!a||!Ys(a,n.bundleIdentifier))throw new Error(`Provisioning profile mismatch for ${n.bundleIdentifier}; profile contains ${a||"an unknown App ID"}.`);let c=/<key>get-task-allow<\/key>\s*<true\/>/.test(o),l=o.includes("<key>ProvisionedDevices</key>"),p=Yn(o);if(p.certificateSha1s.length===0)throw new Error(`Provisioning profile for ${n.bundleIdentifier} has no embedded signing certificates.`);let d=he.join(t,`${s}.mobileprovision`);return be.copyFileSync(r,d),be.chmodSync(d,384),{targetName:n.targetName,bundleIdentifier:n.bundleIdentifier,isMainApplication:n.isMainApplication,uuid:s,name:Qn(o,"Name"),isAppStore:!l&&!c,isDevelopment:c,signingProfile:p}}finally{try{be.unlinkSync(r)}catch{}}})}var pr=(e,t=[])=>{if(!be.existsSync(e))return t;for(let n of be.readdirSync(e,{withFileTypes:!0})){if(n.name==="Pods"||n.name==="build"||n.name==="DerivedData")continue;let i=he.join(e,n.name);if(n.isDirectory()&&n.name.endsWith(".xcodeproj")){let r=he.join(i,"project.pbxproj");be.existsSync(r)&&t.push(r);continue}n.isDirectory()&&pr(i,t)}return t},sr=e=>e.filter(t=>!!(t&&be.existsSync(t))),zn=e=>{if(!be.existsSync(e))return[];try{return be.readdirSync(e,{withFileTypes:!0}).filter(t=>t.isDirectory()).map(t=>he.join(e,t.name))}catch{return[]}},ar=(e,t,n)=>{let i=lr(e,t,{env:n,encoding:"utf8",stdio:["ignore","pipe","ignore"]});if(!(i.error||i.status!==0))return i.stdout.trim()||void 0};function zs(e={}){let t=e.baseEnv||process.env,n=e.homeDirectory||an.homedir(),i=String(t.GEM_PATH||"").split(he.delimiter).filter(Boolean),r=String(t.PATH||"").split(he.delimiter).filter(Boolean),o=[...e.fastlaneGemRoots||[],t.FASTLANE_GEM_HOME,...zn(he.join(n,".local/share/fastlane")),...zn("/opt/homebrew/Cellar/fastlane").map(a=>he.join(a,"libexec")),...zn("/usr/local/Cellar/fastlane").map(a=>he.join(a,"libexec")),...i],s=[...e.rubyBinDirectories||[],t.FASTLANE_BIN_DIR,"/opt/homebrew/opt/ruby/bin","/usr/local/opt/ruby/bin",...r];return{...t,PATH:[...new Set(sr(s))].join(he.delimiter),GEM_PATH:[...new Set(sr(o))].join(he.delimiter),FASTLANE_INSTALLED_VIA_HOMEBREW:t.FASTLANE_INSTALLED_VIA_HOMEBREW||"true",FASTLANE_SKIP_UPDATE_CHECK:"1",FASTLANE_HIDE_CHANGELOG:"1"}}var Qs=e=>{let t={...process.env},n=ar("brew",["--prefix","fastlane"],t),i=ar("brew",["--prefix","ruby"],t),r=zs({baseEnv:t,fastlaneGemRoots:n?[he.join(n,"libexec")]:[],rubyBinDirectories:i?[he.join(i,"bin")]:[]}),o=[...process.env.MACH_XCODEPROJ_RUBY?[{command:process.env.MACH_XCODEPROJ_RUBY,prefixArguments:[],env:r}]:[],{command:"ruby",prefixArguments:[],env:r},{command:"bundle",prefixArguments:["exec","ruby"],env:r}];for(let s of o){let a=lr(s.command,[...s.prefixArguments,"-e","require 'xcodeproj'; print Xcodeproj::VERSION"],{cwd:e,env:s.env,encoding:"utf8",stdio:["ignore","pipe","pipe"]});if(!a.error&&a.status===0)return s}throw new Error(["Mach could not load the Ruby xcodeproj library required for multi-target iOS signing.","Install Fastlane with Homebrew (`brew install fastlane`) or install the xcodeproj gem in the runner Ruby environment.","Mach checks Homebrew Fastlane, FASTLANE_GEM_HOME, and `bundle exec ruby` automatically."].join(" "))},qs=String.raw`
318
318
  require 'json'
319
319
  require 'xcodeproj'
320
320
 
@@ -359,44 +359,44 @@ unless missing.empty?
359
359
  end
360
360
 
361
361
  puts JSON.generate(matched)
362
- `;function ur(e){if(e.profiles.length<2)return{matchedTargets:[],restore:()=>{}};let t=pr(e.iosDirectory);if(t.length===0)throw new Error(`Multi-target iOS signing requires a committed .xcodeproj in ${e.iosDirectory}.`);let n=new Map(t.map(a=>[a,be.readFileSync(a)])),i=be.mkdtempSync(he.join(an.tmpdir(),`mach-signing-${e.temporaryLabel}-`)),r=he.join(i,"profiles.json"),o=he.join(i,"apply.rb");be.writeFileSync(r,JSON.stringify({projects:t,profiles:e.profiles,teamId:e.teamId}),{mode:384}),be.writeFileSync(o,qs,{mode:448});let s=()=>{for(let[a,c]of n)be.writeFileSync(a,c)};try{let a=Qs(e.iosDirectory),c=cr(a.command,[...a.prefixArguments,o,r],{cwd:e.iosDirectory,env:a.env,encoding:"utf8",maxBuffer:5*1024*1024}),l=JSON.parse(c.trim()||"{}");return{matchedTargets:Object.entries(l).map(([d,p])=>`${p} (${d})`),restore:s}}catch(a){throw s(),a}finally{be.rmSync(i,{recursive:!0,force:!0})}}function fr(e){return e.length===0?"":[" <key>provisioningProfiles</key>"," <dict>",...e.flatMap(t=>[` <key>${or(t.bundleIdentifier)}</key>`,` <string>${or(t.uuid)}</string>`])," </dict>"].join(`
363
- `)}var Sr=(e,t)=>t.filter(n=>A.existsSync(y.join(e,n))).reduce((n,i)=>n.update(A.readFileSync(y.join(e,i))),ta.createHash("sha256")).digest("hex").slice(0,16),na=e=>Sr(e,["package.json","yarn.lock","package-lock.json","bun.lockb"]),ia=e=>Sr(e,["Podfile","Podfile.lock"]),ra=e=>{let t=y.join(e,"fingerprint.json");try{return JSON.parse(A.readFileSync(t,"utf-8"))}catch{return{}}},mr=(e,t)=>{A.mkdirSync(e,{recursive:!0}),A.writeFileSync(y.join(e,"fingerprint.json"),JSON.stringify(t,null,2))},oa=7200*1e3,sa=(e,t)=>{A.mkdirSync(e,{recursive:!0});let n=y.join(e,"build.lock");if(A.existsSync(n))try{let i=JSON.parse(A.readFileSync(n,"utf-8")),r=Date.now()-(i.timestamp||0);if(r<oa)throw new Error(`Another build is already running for this project (build ${i.buildId}, started ${Math.round(r/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}A.writeFileSync(n,JSON.stringify({buildId:t,pid:process.pid,timestamp:Date.now()}))},aa=(e,t)=>{let n=y.join(e,"build.lock");try{A.existsSync(n)&&JSON.parse(A.readFileSync(n,"utf-8")).buildId===t&&A.unlinkSync(n)}catch{}},gr=15e5,hr=(e,t)=>{let n=e+t;return n.length>gr?n.slice(-gr):n},ei=e=>e.replace(/\u001b\[[0-9;]*m/g,""),br=e=>/^\s*\d+\s*\|/.test(e),ti=e=>{let t=ei(e).trim();return!t||br(t)?!1:/(?:^|\s)(?:fatal\s+)?error:|xcodebuild:\s*error|The following build commands failed|Command PhaseScriptExecution failed|PhaseScriptExecution|Command .* failed|CodeSign\b.*(?:failed|error:)|Provisioning profile.*(?:doesn't|does not|missing|not include|invalid|required)|No profiles|requires a provisioning profile|Undefined symbols|(?:^|\s)ld:|clang:\s*error|node: command not found|env: node|No such file or directory|Permission denied/i.test(t)},ca=e=>{let t=new Set,n=[];e.forEach((r,o)=>{ti(r)&&n.push(o)});for(let r of n){let o=/PhaseScriptExecution|Command PhaseScriptExecution failed|The following build commands failed/i.test(e[r])?18:8,s=/The following build commands failed/i.test(e[r])?18:10;for(let a=Math.max(0,r-o);a<=Math.min(e.length-1,r+s);a++)t.add(a)}if(t.size===0)return e.slice(-120);let i=Array.from(t).sort((r,o)=>r-o).map(r=>e[r]);return i.length>160?i.slice(-160):i},la=(e,t,n,i)=>{let r=ei(i).replace(/\r/g,`
362
+ `;function ur(e){if(e.profiles.length<2)return{matchedTargets:[],restore:()=>{}};let t=pr(e.iosDirectory);if(t.length===0)throw new Error(`Multi-target iOS signing requires a committed .xcodeproj in ${e.iosDirectory}.`);let n=new Map(t.map(a=>[a,be.readFileSync(a)])),i=be.mkdtempSync(he.join(an.tmpdir(),`mach-signing-${e.temporaryLabel}-`)),r=he.join(i,"profiles.json"),o=he.join(i,"apply.rb");be.writeFileSync(r,JSON.stringify({projects:t,profiles:e.profiles,teamId:e.teamId}),{mode:384}),be.writeFileSync(o,qs,{mode:448});let s=()=>{for(let[a,c]of n)be.writeFileSync(a,c)};try{let a=Qs(e.iosDirectory),c=cr(a.command,[...a.prefixArguments,o,r],{cwd:e.iosDirectory,env:a.env,encoding:"utf8",maxBuffer:5*1024*1024}),l=JSON.parse(c.trim()||"{}");return{matchedTargets:Object.entries(l).map(([p,d])=>`${d} (${p})`),restore:s}}catch(a){throw s(),a}finally{be.rmSync(i,{recursive:!0,force:!0})}}function fr(e){return e.length===0?"":[" <key>provisioningProfiles</key>"," <dict>",...e.flatMap(t=>[` <key>${or(t.bundleIdentifier)}</key>`,` <string>${or(t.uuid)}</string>`])," </dict>"].join(`
363
+ `)}var Sr=(e,t)=>t.filter(n=>A.existsSync(y.join(e,n))).reduce((n,i)=>n.update(A.readFileSync(y.join(e,i))),ta.createHash("sha256")).digest("hex").slice(0,16),na=e=>Sr(e,["package.json","yarn.lock","package-lock.json","bun.lockb"]),ia=e=>Sr(e,["Podfile","Podfile.lock"]),ra=e=>{let t=y.join(e,"fingerprint.json");try{return JSON.parse(A.readFileSync(t,"utf-8"))}catch{return{}}},gr=(e,t)=>{A.mkdirSync(e,{recursive:!0}),A.writeFileSync(y.join(e,"fingerprint.json"),JSON.stringify(t,null,2))},oa=7200*1e3,sa=(e,t)=>{A.mkdirSync(e,{recursive:!0});let n=y.join(e,"build.lock");if(A.existsSync(n))try{let i=JSON.parse(A.readFileSync(n,"utf-8")),r=Date.now()-(i.timestamp||0);if(r<oa)throw new Error(`Another build is already running for this project (build ${i.buildId}, started ${Math.round(r/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}A.writeFileSync(n,JSON.stringify({buildId:t,pid:process.pid,timestamp:Date.now()}))},aa=(e,t)=>{let n=y.join(e,"build.lock");try{A.existsSync(n)&&JSON.parse(A.readFileSync(n,"utf-8")).buildId===t&&A.unlinkSync(n)}catch{}},mr=15e5,hr=(e,t)=>{let n=e+t;return n.length>mr?n.slice(-mr):n},ei=e=>e.replace(/\u001b\[[0-9;]*m/g,""),br=e=>/^\s*\d+\s*\|/.test(e),ti=e=>{let t=ei(e).trim();return!t||br(t)?!1:/(?:^|\s)(?:fatal\s+)?error:|xcodebuild:\s*error|The following build commands failed|Command PhaseScriptExecution failed|PhaseScriptExecution|Command .* failed|CodeSign\b.*(?:failed|error:)|Provisioning profile.*(?:doesn't|does not|missing|not include|invalid|required)|No profiles|requires a provisioning profile|Undefined symbols|(?:^|\s)ld:|clang:\s*error|node: command not found|env: node|No such file or directory|Permission denied/i.test(t)},ca=e=>{let t=new Set,n=[];e.forEach((r,o)=>{ti(r)&&n.push(o)});for(let r of n){let o=/PhaseScriptExecution|Command PhaseScriptExecution failed|The following build commands failed/i.test(e[r])?18:8,s=/The following build commands failed/i.test(e[r])?18:10;for(let a=Math.max(0,r-o);a<=Math.min(e.length-1,r+s);a++)t.add(a)}if(t.size===0)return e.slice(-120);let i=Array.from(t).sort((r,o)=>r-o).map(r=>e[r]);return i.length>160?i.slice(-160):i},la=(e,t,n,i)=>{let r=ei(i).replace(/\r/g,`
364
364
  `).split(`
365
365
  `).map(c=>c.trimEnd()).filter(Boolean),o=r.filter(ti),s=o.length>0?ca(r):r.slice(-80),a=o.length>0?"Key failure output":"Last command output";return[`Command failed with code ${n}: ${e} ${t.join(" ")}`,s.length>0?`
366
366
  ${a}:
367
367
  ${s.join(`
368
- `)}`:""].join("")},da=e=>e==="xcodebuild"&&process.env.MACH_XCODE_FULL_LOGS!=="1",pa=e=>{let t=ei(e).trim();return!t||br(t)?!1:ti(t)||/ARCHIVE SUCCEEDED|ARCHIVE FAILED|EXPORT SUCCEEDED|EXPORT FAILED|Exported .* to:|\[IPA VALID\]/i.test(t)},Me=e=>{try{A.existsSync(e)&&A.rmSync(e,{recursive:!0,force:!0})}catch{}},ua=(e,t)=>{try{if(!A.existsSync(e))return;for(let n of A.readdirSync(e))t(n)&&Me(y.join(e,n))}catch{}},wt=e=>{E.info(w.dim("Clearing Metro/Hermes JS transform caches..."));let t=Ce.tmpdir();ua(t,n=>n==="metro-cache"||n.startsWith("metro-")||n.startsWith("haste-map-")||n.startsWith("react-native-packager-cache-")),Me(y.join(e,".expo")),Me(y.join(e,"node_modules/.cache/metro")),Me(y.join(Ce.homedir(),".cache/metro")),Me(y.join(Ce.homedir(),".cache/react-native-packager")),Me(y.join(Ce.homedir(),"Library/Caches/metro")),Me(y.join(Ce.homedir(),"Library/Caches/react-native-packager"))},fa=e=>/Internal inconsistency error|never received target ended message/i.test(String(e?.message||e)),ma=e=>{E.warn(w.yellow("Xcode build system hit an internal inconsistency. Clearing simulator build state and retrying once...")),Me(y.join(e,"Build")),Me(y.join(e,"Index.noindex")),Me(y.join(e,"ModuleCache.noindex")),Me(y.join(e,"SourcePackages"))},ga=e=>{let t=String(e?.message||e);return/Permission denied/i.test(t)&&/Pods\/.*\.sh/i.test(t)},Cr=e=>{let t=y.join(e,"Pods"),i=[y.join(t,"Target Support Files"),t].filter(a=>A.existsSync(a)),r=new Set,o=0,s=a=>{let c=a;try{c=A.realpathSync(a)}catch{}if(r.has(c))return;r.add(c);let l;try{l=A.readdirSync(a,{withFileTypes:!0})}catch{return}for(let d of l){let p=y.join(a,d.name);if(d.isDirectory()){s(p);continue}if(!(!d.isFile()||!d.name.endsWith(".sh")))try{let u=A.statSync(p),f=u.mode|493;f!==u.mode&&(A.chmodSync(p,f),o+=1)}catch{}}};for(let a of i)s(a);return o>0&&E.info(w.dim(`Repaired executable permissions on ${o} CocoaPods script${o===1?"":"s"}.`)),o},ha=(e,t,n,i,r)=>{let o=c=>{let l=c.filter(p=>p?.id&&String(p?.platform||"").includes("iOS Simulator")&&!p?.error),d=l.find(p=>/iphone/i.test(p.name||""))||l[0];return d?.id?`id=${d.id}`:void 0},s=c=>{let l=[],d=!1;for(let p of c.split(`
369
- `)){if(/Ineligible destinations/i.test(p)&&(d=!0),d||!p.includes("platform:iOS Simulator")||p.includes("error:"))continue;let u=p.match(/\bid:([^,}]+)/)?.[1]?.trim(),f=p.match(/\bname:([^,}]+)/)?.[1]?.trim();u&&l.push({id:u,name:f,platform:"iOS Simulator"})}return o(l)},a=[t?"-workspace":"-project",t||n,"-scheme",i,"-configuration",r,"-sdk","iphonesimulator","-showdestinations"];try{let c=He("xcodebuild",[...a,"-json"],{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}),l=JSON.parse(c),d=Array.isArray(l.destinations)?l.destinations:Array.isArray(l.availableDestinations)?l.availableDestinations:[],p=o(d);if(p)return p}catch{}try{let c=He("xcodebuild",a,{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return s(c)}catch{}},Ke=(e,t,n=process.cwd(),i={},r,o)=>new Promise((s,a)=>{let c="",l=da(e),d=Date.now(),p=new Map,u=[i.MACH_APP_ROOT?y.join(i.MACH_APP_ROOT,"node_modules/.bin"):"",i.MACH_SOURCE_ROOT?y.join(i.MACH_SOURCE_ROOT,"node_modules/.bin"):"","/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin",y.join(Ce.homedir(),".npm-global/bin")],m=[...(process.env.PATH||"").split(":"),...u].filter((C,v,L)=>C&&L.indexOf(C)===v).join(":");process.env[`${I.envPrefix}DEBUG`]&&console.log(w.magenta(`[${I.nameUpper}_DEBUG] Execution PATH: ${m}`));let N={...process.env,...i,PATH:m,LANG:"en_US.UTF-8",LC_ALL:"en_US.UTF-8"};r&&process.env[`${I.envPrefix}DEBUG`]&&(r(w.magenta(`[ENVIRONMENT] node: ${process.execPath}
370
- `)),r(w.magenta(`[ENVIRONMENT] PATH: ${m}
368
+ `)}`:""].join("")},da=e=>e==="xcodebuild"&&process.env.MACH_XCODE_FULL_LOGS!=="1",pa=e=>{let t=ei(e).trim();return!t||br(t)?!1:ti(t)||/ARCHIVE SUCCEEDED|ARCHIVE FAILED|EXPORT SUCCEEDED|EXPORT FAILED|Exported .* to:|\[IPA VALID\]/i.test(t)},Me=e=>{try{A.existsSync(e)&&A.rmSync(e,{recursive:!0,force:!0})}catch{}},ua=(e,t)=>{try{if(!A.existsSync(e))return;for(let n of A.readdirSync(e))t(n)&&Me(y.join(e,n))}catch{}},wt=e=>{E.info(w.dim("Clearing Metro/Hermes JS transform caches..."));let t=Ce.tmpdir();ua(t,n=>n==="metro-cache"||n.startsWith("metro-")||n.startsWith("haste-map-")||n.startsWith("react-native-packager-cache-")),Me(y.join(e,".expo")),Me(y.join(e,"node_modules/.cache/metro")),Me(y.join(Ce.homedir(),".cache/metro")),Me(y.join(Ce.homedir(),".cache/react-native-packager")),Me(y.join(Ce.homedir(),"Library/Caches/metro")),Me(y.join(Ce.homedir(),"Library/Caches/react-native-packager"))},fa=e=>/Internal inconsistency error|never received target ended message/i.test(String(e?.message||e)),ga=e=>{E.warn(w.yellow("Xcode build system hit an internal inconsistency. Clearing simulator build state and retrying once...")),Me(y.join(e,"Build")),Me(y.join(e,"Index.noindex")),Me(y.join(e,"ModuleCache.noindex")),Me(y.join(e,"SourcePackages"))},ma=e=>{let t=String(e?.message||e);return/Permission denied/i.test(t)&&/Pods\/.*\.sh/i.test(t)},Cr=e=>{let t=y.join(e,"Pods"),i=[y.join(t,"Target Support Files"),t].filter(a=>A.existsSync(a)),r=new Set,o=0,s=a=>{let c=a;try{c=A.realpathSync(a)}catch{}if(r.has(c))return;r.add(c);let l;try{l=A.readdirSync(a,{withFileTypes:!0})}catch{return}for(let p of l){let d=y.join(a,p.name);if(p.isDirectory()){s(d);continue}if(!(!p.isFile()||!p.name.endsWith(".sh")))try{let u=A.statSync(d),f=u.mode|493;f!==u.mode&&(A.chmodSync(d,f),o+=1)}catch{}}};for(let a of i)s(a);return o>0&&E.info(w.dim(`Repaired executable permissions on ${o} CocoaPods script${o===1?"":"s"}.`)),o},ha=(e,t,n,i,r)=>{let o=c=>{let l=c.filter(d=>d?.id&&String(d?.platform||"").includes("iOS Simulator")&&!d?.error),p=l.find(d=>/iphone/i.test(d.name||""))||l[0];return p?.id?`id=${p.id}`:void 0},s=c=>{let l=[],p=!1;for(let d of c.split(`
369
+ `)){if(/Ineligible destinations/i.test(d)&&(p=!0),p||!d.includes("platform:iOS Simulator")||d.includes("error:"))continue;let u=d.match(/\bid:([^,}]+)/)?.[1]?.trim(),f=d.match(/\bname:([^,}]+)/)?.[1]?.trim();u&&l.push({id:u,name:f,platform:"iOS Simulator"})}return o(l)},a=[t?"-workspace":"-project",t||n,"-scheme",i,"-configuration",r,"-sdk","iphonesimulator","-showdestinations"];try{let c=He("xcodebuild",[...a,"-json"],{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"]}),l=JSON.parse(c),p=Array.isArray(l.destinations)?l.destinations:Array.isArray(l.availableDestinations)?l.availableDestinations:[],d=o(p);if(d)return d}catch{}try{let c=He("xcodebuild",a,{cwd:e,encoding:"utf-8",stdio:["ignore","pipe","ignore"]});return s(c)}catch{}},Ke=(e,t,n=process.cwd(),i={},r,o)=>new Promise((s,a)=>{let c="",l=da(e),p=Date.now(),d=new Map,u=[i.MACH_APP_ROOT?y.join(i.MACH_APP_ROOT,"node_modules/.bin"):"",i.MACH_SOURCE_ROOT?y.join(i.MACH_SOURCE_ROOT,"node_modules/.bin"):"","/opt/homebrew/bin","/usr/local/bin","/usr/bin","/bin","/usr/sbin","/sbin",y.join(Ce.homedir(),".npm-global/bin")],g=[...(process.env.PATH||"").split(":"),...u].filter((C,v,L)=>C&&L.indexOf(C)===v).join(":");process.env[`${I.envPrefix}DEBUG`]&&console.log(w.magenta(`[${I.nameUpper}_DEBUG] Execution PATH: ${g}`));let N={...process.env,...i,PATH:g,LANG:"en_US.UTF-8",LC_ALL:"en_US.UTF-8"};r&&process.env[`${I.envPrefix}DEBUG`]&&(r(w.magenta(`[ENVIRONMENT] node: ${process.execPath}
370
+ `)),r(w.magenta(`[ENVIRONMENT] PATH: ${g}
371
371
  `)),r(w.magenta(`[ENVIRONMENT] command: ${e} ${t.join(" ")}
372
372
  `)));let b=e;if(["node","npm","npx","pod"].includes(e)){let C=y.dirname(process.execPath),v=y.join(C,e);A.existsSync(v)&&(b=v,r&&r(w.dim(`[EXEC] Using absolute path: ${b}
373
- `)))}let P=Ar(b,t,{stdio:"pipe",cwd:n,shell:!0,env:N,detached:process.platform!=="win32"});if(o){if(o.aborted){if(P.pid)try{process.kill(-P.pid,"SIGTERM")}catch{P.kill()}return a(new Error("Command aborted"))}o.addEventListener("abort",()=>{if(P.pid)try{process.kill(-P.pid,"SIGTERM")}catch{P.kill()}a(new Error("Command aborted"))})}let _=(C,v,L=!1)=>{if(!l)return C;let k=`${p.get(v)||""}${C.replace(/\r/g,`
373
+ `)))}let P=Ar(b,t,{stdio:"pipe",cwd:n,shell:!0,env:N,detached:process.platform!=="win32"});if(o){if(o.aborted){if(P.pid)try{process.kill(-P.pid,"SIGTERM")}catch{P.kill()}return a(new Error("Command aborted"))}o.addEventListener("abort",()=>{if(P.pid)try{process.kill(-P.pid,"SIGTERM")}catch{P.kill()}a(new Error("Command aborted"))})}let _=(C,v,L=!1)=>{if(!l)return C;let k=`${d.get(v)||""}${C.replace(/\r/g,`
374
374
  `)}`.split(`
375
- `),T=L?"":k.pop()||"";p.set(v,T);let H=k.filter(pa);if(H.length>0)return d=Date.now(),`${H.join(`
375
+ `),T=L?"":k.pop()||"";d.set(v,T);let H=k.filter(pa);if(H.length>0)return p=Date.now(),`${H.join(`
376
376
  `)}
377
- `;let R=Date.now();return R-d>3e4?(d=R,`[xcodebuild] still running; errors and milestones will appear here.
378
- `):""},S=(C,v,L=!1)=>{let B=_(C,v,L);B&&(v.write(B),r&&r(B))};P.stdout.on("data",C=>{let v=C.toString();c=hr(c,v),S(v,process.stdout)}),P.stderr.on("data",C=>{let v=C.toString();c=hr(c,v),S(v,process.stderr)}),P.on("close",C=>{S("",process.stdout,!0),S("",process.stderr,!0),C===0?s(C):a(new Error(la(e,t,C,c)))}),P.on("error",C=>a(C))}),cn=async(e,t,n,i,r)=>{try{await Ke("xcodebuild",e,t,n,i,r)}catch(o){if(!ga(o))throw o;E.warn(w.yellow("CocoaPods script permission denied. Repairing Pods script permissions and retrying xcodebuild once...")),Cr(t),await Ke("xcodebuild",e,t,n,i,r)}},ya=e=>{let t=Math.floor(e/1e3%60),n=Math.floor(e/(1e3*60)%60),i=Math.floor(e/(1e3*60*60)%24),r=[];return i>0&&r.push(`${i}h`),n>0&&r.push(`${n}m`),(t>0||r.length===0)&&r.push(`${t}s`),r.join(" ")},dt=(e,t)=>{let n=[];try{if(!A.existsSync(e))return n;let i=A.readdirSync(e);for(let r of i){let o=y.join(e,r);try{let s=A.statSync(o);if(t.some(c=>r.endsWith(c))){n.push(y.resolve(o));continue}s.isDirectory()&&(n=n.concat(dt(o,t)))}catch{}}}catch{}return n},wr=(e,t)=>{let n=Wt(e);if(!n)throw new Error(`Invalid iOS CFBundleVersion from ${t}: "${e||""}". Apple requires one to three period-separated integers, for example "42" or "1.2.3". If you see "[Decryption Failed]", fix/remove the broken BUILD_NUMBER secret and rebuild.`);return n},ni=(e,t)=>He("/usr/libexec/PlistBuddy",["-c",`Print :${t}`,e],{encoding:"utf-8"}).trim(),vt=(e,t)=>{try{return ni(e,t)}catch{return""}},yr=e=>String(e||"").replace(/\.app$/i,"").replace(/[^a-z0-9]/gi,"").toLowerCase(),Ia=e=>{try{return A.statSync(e).isDirectory()}catch{return!1}},Aa=(e,t,n)=>{if(!A.existsSync(e))throw new Error(`iOS simulator build output directory was not found: ${e}`);let i=A.readdirSync(e).filter(l=>l.endsWith(".app")).map(l=>y.join(e,l)).filter(Ia);if(i.length===0){let d=dt(e,[".app"]).map(p=>y.relative(e,p)).join(", ");throw new Error(`No top-level iOS simulator .app product was found in ${e}.`+(d?` Nested .app bundles found but ignored: ${d}`:""))}let r=new Set([t,n.iosScheme,n.scheme,n.appName].filter(Boolean).map(l=>yr(String(l))).filter(Boolean)),o=i.map(l=>{let d=y.join(l,"Info.plist"),p=A.existsSync(d)?vt(d,"CFBundleName"):"",u=A.existsSync(d)?vt(d,"CFBundleDisplayName"):"",f=A.existsSync(d)?vt(d,"CFBundleExecutable"):"",m=A.existsSync(d)?vt(d,"CFBundleIdentifier"):"",N=f?y.join(l,f):"";return{appPath:l,bundleIdentifier:m,executable:f,isValid:A.existsSync(d)&&!!f&&A.existsSync(N),names:[y.basename(l,".app"),p,u,f].map(yr).filter(Boolean)}}),s=o.filter(l=>l.isValid);if(s.length===0)throw new Error(`No valid iOS simulator .app product was found in ${e}. Candidates: `+o.map(l=>y.basename(l.appPath)).join(", "));let c=s.find(l=>l.names.some(d=>r.has(d)))||(s.length===1?s[0]:null);if(!c)throw new Error(`Multiple iOS simulator .app products were found in ${e}: `+s.map(l=>{let d=l.bundleIdentifier?` (${l.bundleIdentifier})`:"";return`${y.basename(l.appPath)}${d}`}).join(", ")+`. Set ios.scheme in ${I.configFileName} so ${I.name} can select the app target safely.`);return c.appPath},Sa=(e,t)=>{let n=y.join(e,"Info.plist");if(!A.existsSync(n))throw new Error(`Could not validate iOS build number: ${n} not found.`);let i=wr(ni(n,"CFBundleVersion"),n);return t?Mn(i,t,n):i},vr=(e,t=[])=>{if(!A.existsSync(e))return t;for(let n of A.readdirSync(e,{withFileTypes:!0})){if(!n.isDirectory()||n.isSymbolicLink())continue;let i=y.join(e,n.name);n.name!=="Frameworks"&&((n.name.endsWith(".app")||n.name.endsWith(".appex"))&&t.push(i),vr(i,t))}return t},Ir=(e,t)=>[e,...vr(e)].filter((i,r,o)=>o.indexOf(i)===r).map(i=>({bundlePath:i,buildNumber:Sa(i,t)})),Pr=e=>{let t=y.join(e,"Info.plist");if(!A.existsSync(t))throw new Error(`Could not validate iOS app executable: ${t} not found.`);let n=vt(t,"CFBundleExecutable");if(!n)throw new Error(`Could not validate iOS app executable: CFBundleExecutable missing in ${t}.`);let i=y.join(e,n);if(!A.existsSync(i))throw new Error(`Could not validate iOS app executable: ${i} not found.`);return i},ba=()=>process.arch==="arm64"?"arm64":"x86_64",Er=e=>{let t=Pr(e),n="";try{n=He("lipo",["-info",t],{encoding:"utf-8"}).trim()}catch(r){throw new Error(`Could not inspect iOS simulator executable architecture for ${y.basename(e)}: ${r.message}`)}let i=ba();if(!new RegExp(`\\b${i}\\b`).test(n))throw new Error(`iOS simulator app ${y.basename(e)} cannot be installed on this runner because its executable does not include the required ${i} simulator architecture. lipo output: ${n}. Check the React Native iOS project ARCHS/EXCLUDED_ARCHS settings for iphonesimulator builds.`);return n},Ca=e=>{try{return He("xcrun",["vtool","-show-build",e],{encoding:"utf-8"}).trim()}catch(t){throw new Error(`Could not inspect iOS executable build platform for ${y.basename(e)}: ${t.message}`)}},Rr=e=>{let t=Pr(e),n=Ca(t);if(!/\bplatform\s+IOSSIMULATOR\b/i.test(n))throw new Error(`iOS simulator app ${y.basename(e)} was built for the wrong Apple platform. A simulator artifact must contain PLATFORM IOSSIMULATOR, not an iPhone device binary. vtool output: ${n}`);return n},Nr=(e,t)=>{let i=He("unzip",["-Z1",e],{encoding:"utf-8"}).split(`
379
- `).map(o=>o.trim()).filter(o=>/^Payload\/.+\.(?:app|appex)\/Info\.plist$/.test(o)&&!o.includes("/Frameworks/"));if(i.length===0)throw new Error(`Could not validate iOS build number: ${y.basename(e)} has no Payload/*.app/Info.plist.`);let r=A.mkdtempSync(y.join(Ce.tmpdir(),`${I.nameLower}-ipa-plist-`));try{let o="";for(let[s,a]of i.entries()){let c=y.join(r,`Info-${s}.plist`),l=He("unzip",["-p",e,a]);A.writeFileSync(c,l);let d=`${y.basename(e)}:${a}`,p=wr(ni(c,"CFBundleVersion"),d);t&&Mn(p,t,d),/^Payload\/[^/]+\.app\/Info\.plist$/.test(a)&&(o=p)}if(!o)throw new Error(`Could not validate iOS build number: ${y.basename(e)} has no main application Info.plist.`);return o}finally{A.rmSync(r,{recursive:!0,force:!0})}},wa=e=>`'${e.replace(/'/g,"'\\''")}'`,va=()=>process.execPath&&A.existsSync(process.execPath)?process.execPath:He("which",["node"],{encoding:"utf-8"}).trim(),xr=(e,t,n)=>{if(!A.existsSync(e))return;let i=va();t.NODE_BINARY=i;let r=y.join(e,".xcode.env.local");A.writeFileSync(r,`export NODE_BINARY=${wa(i)}
377
+ `;let R=Date.now();return R-p>3e4?(p=R,`[xcodebuild] still running; errors and milestones will appear here.
378
+ `):""},S=(C,v,L=!1)=>{let B=_(C,v,L);B&&(v.write(B),r&&r(B))};P.stdout.on("data",C=>{let v=C.toString();c=hr(c,v),S(v,process.stdout)}),P.stderr.on("data",C=>{let v=C.toString();c=hr(c,v),S(v,process.stderr)}),P.on("close",C=>{S("",process.stdout,!0),S("",process.stderr,!0),C===0?s(C):a(new Error(la(e,t,C,c)))}),P.on("error",C=>a(C))}),cn=async(e,t,n,i,r)=>{try{await Ke("xcodebuild",e,t,n,i,r)}catch(o){if(!ma(o))throw o;E.warn(w.yellow("CocoaPods script permission denied. Repairing Pods script permissions and retrying xcodebuild once...")),Cr(t),await Ke("xcodebuild",e,t,n,i,r)}},ya=e=>{let t=Math.floor(e/1e3%60),n=Math.floor(e/(1e3*60)%60),i=Math.floor(e/(1e3*60*60)%24),r=[];return i>0&&r.push(`${i}h`),n>0&&r.push(`${n}m`),(t>0||r.length===0)&&r.push(`${t}s`),r.join(" ")},dt=(e,t)=>{let n=[];try{if(!A.existsSync(e))return n;let i=A.readdirSync(e);for(let r of i){let o=y.join(e,r);try{let s=A.statSync(o);if(t.some(c=>r.endsWith(c))){n.push(y.resolve(o));continue}s.isDirectory()&&(n=n.concat(dt(o,t)))}catch{}}}catch{}return n},wr=(e,t)=>{let n=Wt(e);if(!n)throw new Error(`Invalid iOS CFBundleVersion from ${t}: "${e||""}". Apple requires one to three period-separated integers, for example "42" or "1.2.3". If you see "[Decryption Failed]", fix/remove the broken BUILD_NUMBER secret and rebuild.`);return n},ni=(e,t)=>He("/usr/libexec/PlistBuddy",["-c",`Print :${t}`,e],{encoding:"utf-8"}).trim(),vt=(e,t)=>{try{return ni(e,t)}catch{return""}},yr=e=>String(e||"").replace(/\.app$/i,"").replace(/[^a-z0-9]/gi,"").toLowerCase(),Ia=e=>{try{return A.statSync(e).isDirectory()}catch{return!1}},Aa=(e,t,n)=>{if(!A.existsSync(e))throw new Error(`iOS simulator build output directory was not found: ${e}`);let i=A.readdirSync(e).filter(l=>l.endsWith(".app")).map(l=>y.join(e,l)).filter(Ia);if(i.length===0){let p=dt(e,[".app"]).map(d=>y.relative(e,d)).join(", ");throw new Error(`No top-level iOS simulator .app product was found in ${e}.`+(p?` Nested .app bundles found but ignored: ${p}`:""))}let r=new Set([t,n.iosScheme,n.scheme,n.appName].filter(Boolean).map(l=>yr(String(l))).filter(Boolean)),o=i.map(l=>{let p=y.join(l,"Info.plist"),d=A.existsSync(p)?vt(p,"CFBundleName"):"",u=A.existsSync(p)?vt(p,"CFBundleDisplayName"):"",f=A.existsSync(p)?vt(p,"CFBundleExecutable"):"",g=A.existsSync(p)?vt(p,"CFBundleIdentifier"):"",N=f?y.join(l,f):"";return{appPath:l,bundleIdentifier:g,executable:f,isValid:A.existsSync(p)&&!!f&&A.existsSync(N),names:[y.basename(l,".app"),d,u,f].map(yr).filter(Boolean)}}),s=o.filter(l=>l.isValid);if(s.length===0)throw new Error(`No valid iOS simulator .app product was found in ${e}. Candidates: `+o.map(l=>y.basename(l.appPath)).join(", "));let c=s.find(l=>l.names.some(p=>r.has(p)))||(s.length===1?s[0]:null);if(!c)throw new Error(`Multiple iOS simulator .app products were found in ${e}: `+s.map(l=>{let p=l.bundleIdentifier?` (${l.bundleIdentifier})`:"";return`${y.basename(l.appPath)}${p}`}).join(", ")+`. Set ios.scheme in ${I.configFileName} so ${I.name} can select the app target safely.`);return c.appPath},Sa=(e,t)=>{let n=y.join(e,"Info.plist");if(!A.existsSync(n))throw new Error(`Could not validate iOS build number: ${n} not found.`);let i=wr(ni(n,"CFBundleVersion"),n);return t?Mn(i,t,n):i},vr=(e,t=[])=>{if(!A.existsSync(e))return t;for(let n of A.readdirSync(e,{withFileTypes:!0})){if(!n.isDirectory()||n.isSymbolicLink())continue;let i=y.join(e,n.name);n.name!=="Frameworks"&&((n.name.endsWith(".app")||n.name.endsWith(".appex"))&&t.push(i),vr(i,t))}return t},Ir=(e,t)=>[e,...vr(e)].filter((i,r,o)=>o.indexOf(i)===r).map(i=>({bundlePath:i,buildNumber:Sa(i,t)})),Pr=e=>{let t=y.join(e,"Info.plist");if(!A.existsSync(t))throw new Error(`Could not validate iOS app executable: ${t} not found.`);let n=vt(t,"CFBundleExecutable");if(!n)throw new Error(`Could not validate iOS app executable: CFBundleExecutable missing in ${t}.`);let i=y.join(e,n);if(!A.existsSync(i))throw new Error(`Could not validate iOS app executable: ${i} not found.`);return i},ba=()=>process.arch==="arm64"?"arm64":"x86_64",Er=e=>{let t=Pr(e),n="";try{n=He("lipo",["-info",t],{encoding:"utf-8"}).trim()}catch(r){throw new Error(`Could not inspect iOS simulator executable architecture for ${y.basename(e)}: ${r.message}`)}let i=ba();if(!new RegExp(`\\b${i}\\b`).test(n))throw new Error(`iOS simulator app ${y.basename(e)} cannot be installed on this runner because its executable does not include the required ${i} simulator architecture. lipo output: ${n}. Check the React Native iOS project ARCHS/EXCLUDED_ARCHS settings for iphonesimulator builds.`);return n},Ca=e=>{try{return He("xcrun",["vtool","-show-build",e],{encoding:"utf-8"}).trim()}catch(t){throw new Error(`Could not inspect iOS executable build platform for ${y.basename(e)}: ${t.message}`)}},Rr=e=>{let t=Pr(e),n=Ca(t);if(!/\bplatform\s+IOSSIMULATOR\b/i.test(n))throw new Error(`iOS simulator app ${y.basename(e)} was built for the wrong Apple platform. A simulator artifact must contain PLATFORM IOSSIMULATOR, not an iPhone device binary. vtool output: ${n}`);return n},Nr=(e,t)=>{let i=He("unzip",["-Z1",e],{encoding:"utf-8"}).split(`
379
+ `).map(o=>o.trim()).filter(o=>/^Payload\/.+\.(?:app|appex)\/Info\.plist$/.test(o)&&!o.includes("/Frameworks/"));if(i.length===0)throw new Error(`Could not validate iOS build number: ${y.basename(e)} has no Payload/*.app/Info.plist.`);let r=A.mkdtempSync(y.join(Ce.tmpdir(),`${I.nameLower}-ipa-plist-`));try{let o="";for(let[s,a]of i.entries()){let c=y.join(r,`Info-${s}.plist`),l=He("unzip",["-p",e,a]);A.writeFileSync(c,l);let p=`${y.basename(e)}:${a}`,d=wr(ni(c,"CFBundleVersion"),p);t&&Mn(d,t,p),/^Payload\/[^/]+\.app\/Info\.plist$/.test(a)&&(o=d)}if(!o)throw new Error(`Could not validate iOS build number: ${y.basename(e)} has no main application Info.plist.`);return o}finally{A.rmSync(r,{recursive:!0,force:!0})}},wa=e=>`'${e.replace(/'/g,"'\\''")}'`,va=()=>process.execPath&&A.existsSync(process.execPath)?process.execPath:He("which",["node"],{encoding:"utf-8"}).trim(),xr=(e,t,n)=>{if(!A.existsSync(e))return;let i=va();t.NODE_BINARY=i;let r=y.join(e,".xcode.env.local");A.writeFileSync(r,`export NODE_BINARY=${wa(i)}
380
380
  `);let o=`[NODE] Xcode NODE_BINARY: ${i}
381
- `;n&&n(w.dim(o)),E.info(w.dim(o.trim()))},gp=async(e,t,n={},i,r={})=>{let o=ln(),s=Date.now(),a=e.platform,c=e.buildProfile||"production",l=jt(e.framework),d=St(process.cwd(),e.appDirectory,{requireAppDirectory:!0}),p=d.sourceRoot,u=d.appRoot;e.appDirectory=d.appDirectory;let f=()=>({...Bn(n,c,e),MACH_SOURCE_ROOT:p,MACH_APP_ROOT:u}),m=async(R,U={})=>{if(i)for(let F=1;F<=3;F++)try{await W.patch(`/builds/${i}/${t}`,{status:R,...U});return}catch(te){let Ae=te?.response?.data?.message||te?.message||String(te);console.error(`[reportStatus] attempt ${F}/3 failed (status=${R}): ${Ae}`),F<3&&await new Promise(ae=>setTimeout(ae,2e3))}},N=new AbortController,{signal:b}=N,P=null;i&&(P=setInterval(async()=>{try{(await W.get(`/builds/${i}/${t}`)).data.status==="cancelled"&&(E.warn(w.yellow(`
382
- \u{1F6D1} Build cancelled from dashboard. Terminating...`)),N.abort(),P&&clearInterval(P))}catch{}},5e3));let _=y.join(p,".mach-cache"),S="setup",C="",v=null,L=async()=>{if(!C||!i)return;let R=C;C="";try{let U=R;Object.values(n).forEach(F=>{if(F&&F.length>5){let te=F.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");U=U.replace(new RegExp(te,"g"),"[SECRET]")}}),await W.post(`/builds/${i}/${t}/logs`,{log:U,step:S})}catch{}},B=async()=>{v&&(clearTimeout(v),v=null),await L(),aa(_,t),P&&(clearInterval(P),P=null);try{let R=y.join(Ce.tmpdir(),`${I.buildPrefix}-${t}.keychain-db`);A.existsSync(R)&&(ee(`security delete-keychain "${R}"`,{stdio:"ignore"}),E.info(w.dim("\u{1F511} Build keychain deleted.")))}catch{}try{let R=y.join(Ce.homedir(),"Library/MobileDevice/Provisioning Profiles");if(A.existsSync(R)){let U=A.readdirSync(R).filter(F=>F.includes(t)||F.startsWith(`${I.nameLower}-temp-${t}`));for(let F of U)A.unlinkSync(y.join(R,F))}}catch{}},k=async R=>{i&&(C+=R,C.length>=8192?(v&&(clearTimeout(v),v=null),await L()):v||(v=setTimeout(()=>{v=null,L()},2e3)))},T=async R=>{S=R,await k(`[STEP_START:${R}] ${Math.floor(Date.now()/1e3)}
383
- `)},H=async(R,U,F,te)=>await Ke(R,U,F,te,Ae=>{k(Ae)},b);E.info(w.blue(`\u{1F680} Starting local build for ${a} (${c})...`));try{sa(_,t)}catch(R){throw await m("failed",{error:R.message,endTime:Date.now()}),R}await m("building"),await T("setup"),a==="ios"&&!e.simulator&&n.MACH_IOS_BUILD_NUMBER_LOCKED==="1"&&n.BUILD_NUMBER&&(E.info(w.dim(`Auto build number: ${n.BUILD_NUMBER}`)),await k(`[BUILD_NUMBER] ${n.BUILD_NUMBER}
384
- `)),await T("lock"),l.applyLocalProcessEnv(e);try{await T("clone"),E.info(w.dim("Preparing source...")),await T("read_config");let R=y.join(p,I.configFileName);if(A.existsSync(R)){let D=JSON.parse(A.readFileSync(R,"utf-8"))?.build?.[c]||{};await k(`[CONFIG] Profile: ${c}, distribution: ${D.distribution||"not set"}, simulator: ${D.simulator||!1}
381
+ `;n&&n(w.dim(o)),E.info(w.dim(o.trim()))},mp=async(e,t,n={},i,r={})=>{let o=ln(),s=Date.now(),a=e.platform,c=e.buildProfile||"production",l=jt(e.framework),p=St(process.cwd(),e.appDirectory,{requireAppDirectory:!0}),d=p.sourceRoot,u=p.appRoot;e.appDirectory=p.appDirectory;let f=()=>({...Bn(n,c,e),MACH_SOURCE_ROOT:d,MACH_APP_ROOT:u}),g=async(R,U={})=>{if(i)for(let F=1;F<=3;F++)try{await W.patch(`/builds/${i}/${t}`,{status:R,...U});return}catch(te){let Ae=te?.response?.data?.message||te?.message||String(te);console.error(`[reportStatus] attempt ${F}/3 failed (status=${R}): ${Ae}`),F<3&&await new Promise(ae=>setTimeout(ae,2e3))}},N=new AbortController,{signal:b}=N,P=null;i&&(P=setInterval(async()=>{try{(await W.get(`/builds/${i}/${t}`)).data.status==="cancelled"&&(E.warn(w.yellow(`
382
+ \u{1F6D1} Build cancelled from dashboard. Terminating...`)),N.abort(),P&&clearInterval(P))}catch{}},5e3));let _=y.join(d,".mach-cache"),S="setup",C="",v=null,L=async()=>{if(!C||!i)return;let R=C;C="";try{let U=R;Object.values(n).forEach(F=>{if(F&&F.length>5){let te=F.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");U=U.replace(new RegExp(te,"g"),"[SECRET]")}}),await W.post(`/builds/${i}/${t}/logs`,{log:U,step:S})}catch{}},B=async()=>{v&&(clearTimeout(v),v=null),await L(),aa(_,t),P&&(clearInterval(P),P=null);try{let R=y.join(Ce.tmpdir(),`${I.buildPrefix}-${t}.keychain-db`);A.existsSync(R)&&(ee(`security delete-keychain "${R}"`,{stdio:"ignore"}),E.info(w.dim("\u{1F511} Build keychain deleted.")))}catch{}try{let R=y.join(Ce.homedir(),"Library/MobileDevice/Provisioning Profiles");if(A.existsSync(R)){let U=A.readdirSync(R).filter(F=>F.includes(t)||F.startsWith(`${I.nameLower}-temp-${t}`));for(let F of U)A.unlinkSync(y.join(R,F))}}catch{}},k=async R=>{i&&(C+=R,C.length>=8192?(v&&(clearTimeout(v),v=null),await L()):v||(v=setTimeout(()=>{v=null,L()},2e3)))},T=async R=>{S=R,await k(`[STEP_START:${R}] ${Math.floor(Date.now()/1e3)}
383
+ `)},H=async(R,U,F,te)=>await Ke(R,U,F,te,Ae=>{k(Ae)},b);E.info(w.blue(`\u{1F680} Starting local build for ${a} (${c})...`));try{sa(_,t)}catch(R){throw await g("failed",{error:R.message,endTime:Date.now()}),R}await g("building"),await T("setup"),a==="ios"&&!e.simulator&&n.MACH_IOS_BUILD_NUMBER_LOCKED==="1"&&n.BUILD_NUMBER&&(E.info(w.dim(`Auto build number: ${n.BUILD_NUMBER}`)),await k(`[BUILD_NUMBER] ${n.BUILD_NUMBER}
384
+ `)),await T("lock"),l.applyLocalProcessEnv(e);try{await T("clone"),E.info(w.dim("Preparing source...")),await T("read_config");let R=y.join(d,I.configFileName);if(A.existsSync(R)){let D=JSON.parse(A.readFileSync(R,"utf-8"))?.build?.[c]||{};await k(`[CONFIG] Profile: ${c}, distribution: ${D.distribution||"not set"}, simulator: ${D.simulator||!1}
385
385
  `)}if(await T("read_package"),e.nodeVersion){let O=process.env.NVM_DIR||y.join(Ce.homedir(),".nvm"),D=y.join(O,"versions","node"),X;if(A.existsSync(D)){let x=A.readdirSync(D).sort().reverse(),j=e.nodeVersion.startsWith("v")?e.nodeVersion:`v${e.nodeVersion}`,G=x.find($=>$===j||$.startsWith(j+".")||$.startsWith(`v${e.nodeVersion}.`));G&&(X=y.join(D,G,"bin"))}if(X&&A.existsSync(X)){let x=process.env.PATH||"";process.env.PATH=`${X}:${x}`,await k(`[NODE] Switched to Node ${e.nodeVersion} \u2014 using ${X}
386
386
  `),E.info(w.green(`\u2713 Node switched to ${e.nodeVersion} (${X})`))}else await k(`[NODE] Warning: Node ${e.nodeVersion} not found in nvm. Run: nvm install ${e.nodeVersion} on the build machine.
387
- `),E.warn(w.yellow(`Node ${e.nodeVersion} not found in nvm \u2014 using system default`))}await T("deps"),o.start("Checking dependencies...");let U=ra(_),F=na(p),te=A.existsSync(y.join(p,"node_modules")),Ae=A.existsSync(y.join(p,"yarn.lock")),ae=A.existsSync(y.join(p,"bun.lockb"));te&&U.node&&U.node!==F&&(o.stop("Dependency fingerprint changed \u2014 clearing node_modules for clean install..."),await k(`[CACHE] package.json/lockfile changed \u2014 wiping node_modules
388
- `),A.rmSync(y.join(p,"node_modules"),{recursive:!0,force:!0}),te=!1);let $e="npm",ne=["install","--prefer-offline"];if(Ae?($e="yarn",ne=["install","--prefer-offline"]):ae&&($e="bun",ne=["install"]),te?o.stop("Cached node_modules found. Syncing dependencies..."):o.stop("No cached dependencies. Running fresh install..."),e.preBuild&&(E.info(w.blue("Running pre-install hook...")),E.info(w.dim(`> ${e.preBuild}`)),await T("prebuild"),await H("bash",[e.preBuild],p,f())),E.info(w.dim(`Running ${$e} ${ne.join(" ")}...`)),await H($e,ne,p,f()),U.node=F,mr(_,U),e.framework==="expo"){let O=n.MACH_OTA_RUNTIME_VERSION,D=n.MACH_OTA_CHANNEL,X=n.MACH_OTA_URL;if(O&&D&&X){let x=zi(p,{platform:a,runtimeVersion:O,channel:D,url:X}),j=Yi(x,{runtimeVersion:O,channel:D,url:X});if(j.length>0)throw new Error(`Expo OTA configuration mismatch after installing dependencies: ${j.join("; ")}. Run \`${I.nameLower} ota setup\` to update the local Expo plugin before building.`);E.info(w.green(`\u2713 Expo OTA configuration verified (${D})`))}}let we=await l.prepareLocalProject({platform:a,options:e,sourceRoot:p,appRoot:u,cacheMeta:U,cacheMetaDir:_,currentBuildEnv:f,reportStep:T,reportLog:k,loggedRun:H,configureXcodeNodeBinary:xr,podsFingerprint:ia,writeCacheMeta:mr}),ve=we.bundleId||e.iosBundleIdentifier||"",Re=we.appName||e.name||"",K=[];if(a==="android")await T("build"),K=await Pa(e,c,n,O=>k(O),b);else if(a==="ios"){await T("signing"),E.info(w.dim("Preparing credentials..."));let O=r?.distributionType;K=await Ea(e,t,c,n,i,D=>k(D),b,O,D=>T(D))}if(e.postBuild&&(E.info(w.blue("Running post-build hook...")),E.info(w.dim(`> ${e.postBuild}`)),await H(e.postBuild,[],p,f())),a==="ios"){let O=Wt(e.resolvedBuildNumber||n.BUILD_NUMBER);if(O)for(let D of K.filter(X=>X.endsWith(".ipa"))){let X=Nr(D,O);await k(`[IPA FINAL] CFBundleVersion ${X} matches MACH buildNumber ${O}
387
+ `),E.warn(w.yellow(`Node ${e.nodeVersion} not found in nvm \u2014 using system default`))}await T("deps"),o.start("Checking dependencies...");let U=ra(_),F=na(d),te=A.existsSync(y.join(d,"node_modules")),Ae=A.existsSync(y.join(d,"yarn.lock")),ae=A.existsSync(y.join(d,"bun.lockb"));te&&U.node&&U.node!==F&&(o.stop("Dependency fingerprint changed \u2014 clearing node_modules for clean install..."),await k(`[CACHE] package.json/lockfile changed \u2014 wiping node_modules
388
+ `),A.rmSync(y.join(d,"node_modules"),{recursive:!0,force:!0}),te=!1);let $e="npm",ne=["install","--prefer-offline"];if(Ae?($e="yarn",ne=["install","--prefer-offline"]):ae&&($e="bun",ne=["install"]),te?o.stop("Cached node_modules found. Syncing dependencies..."):o.stop("No cached dependencies. Running fresh install..."),e.preBuild&&(E.info(w.blue("Running pre-install hook...")),E.info(w.dim(`> ${e.preBuild}`)),await T("prebuild"),await H("bash",[e.preBuild],d,f())),E.info(w.dim(`Running ${$e} ${ne.join(" ")}...`)),await H($e,ne,d,f()),U.node=F,gr(_,U),e.framework==="expo"){let O=n.MACH_OTA_RUNTIME_VERSION,D=n.MACH_OTA_CHANNEL,X=n.MACH_OTA_URL;if(O&&D&&X){let x=zi(d,{platform:a,runtimeVersion:O,channel:D,url:X}),j=Yi(x,{runtimeVersion:O,channel:D,url:X});if(j.length>0)throw new Error(`Expo OTA configuration mismatch after installing dependencies: ${j.join("; ")}. Run \`${I.nameLower} ota setup\` to update the local Expo plugin before building.`);E.info(w.green(`\u2713 Expo OTA configuration verified (${D})`))}}let we=await l.prepareLocalProject({platform:a,options:e,sourceRoot:d,appRoot:u,cacheMeta:U,cacheMetaDir:_,currentBuildEnv:f,reportStep:T,reportLog:k,loggedRun:H,configureXcodeNodeBinary:xr,podsFingerprint:ia,writeCacheMeta:gr}),ve=we.bundleId||e.iosBundleIdentifier||"",Re=we.appName||e.name||"",K=[];if(a==="android")await T("build"),K=await Pa(e,c,n,O=>k(O),b);else if(a==="ios"){await T("signing"),E.info(w.dim("Preparing credentials..."));let O=r?.distributionType;K=await Ea(e,t,c,n,i,D=>k(D),b,O,D=>T(D))}if(e.postBuild&&(E.info(w.blue("Running post-build hook...")),E.info(w.dim(`> ${e.postBuild}`)),await H(e.postBuild,[],d,f())),a==="ios"){let O=Wt(e.resolvedBuildNumber||n.BUILD_NUMBER);if(O)for(let D of K.filter(X=>X.endsWith(".ipa"))){let X=Nr(D,O);await k(`[IPA FINAL] CFBundleVersion ${X} matches MACH buildNumber ${O}
389
389
  `)}}if(a==="android"){let O=e.resolvedVersionCode||n.ANDROID_VERSION_CODE;if(O){let D=We(O,"resolved MACH build assignment");if(K.length===0)throw new Error(`Android build produced no APK or AAB to verify against MACH versionCode ${D}.`);for(let X of K){let x=Zn(X,D);await k(`[ANDROID FINAL] ${y.basename(X)} versionCode ${x} matches MACH assignment
390
390
  `)}}}let le=ya(Date.now()-s);if(E.success(w.green(`
391
- \u2713 Local build completed successfully in ${le}`)),await m("building",{...ve&&{bundleId:ve},...Re&&{appName:Re}}),K.length>0&&(E.info(w.cyan(`
391
+ \u2713 Local build completed successfully in ${le}`)),await g("building",{...ve&&{bundleId:ve},...Re&&{appName:Re}}),K.length>0&&(E.info(w.cyan(`
392
392
  \u{1F4E6} Generated Artifacts:`)),K.forEach(O=>{let D=y.resolve(O);E.info(w.dim(` - ${O}`)),E.info(w.gray(` Path: ${D}`))}),e.interactive)){let O=await ea({message:"Install on connected device?"});if(!dn(O)&&O){if(a==="android"){let D=K.find(X=>X.endsWith(".apk"))||K[0];await Na(D,X=>k(X))}else if(a==="ios"){let D=K.find(x=>x.endsWith(".ipa"))||K.find(x=>x.endsWith(".app"))||K[0],X=Pt("ios");e.simulator?await xa(D,X||"",x=>k(x)):await ka(D,X||"",x=>k(x))}}}await T("upload");let Ne=[];for(let O of K)try{let D=y.join(Ce.tmpdir(),`${t}-${y.basename(O)}`);A.copyFileSync(O,D),Ne.push(D),E.info(w.dim(` \u{1F4CB} Preserved artifact: ${y.basename(O)}`))}catch{E.warn(w.yellow(` Failed to preserve artifact: ${y.basename(O)}`))}K=Ne,E.info(w.dim("\u{1F9F9} Cleaning workspace (preserving dependency cache)..."));try{let O=process.cwd(),D=new Set(["node_modules"]),X=A.readdirSync(O),x=0;for(let j of X)if(!D.has(j)){if(j==="ios"){let G=y.join(O,"ios"),$=A.readdirSync(G);for(let M of $)if(M!=="Pods")try{A.rmSync(y.join(G,M),{recursive:!0,force:!0}),x++}catch{}continue}try{A.rmSync(y.join(O,j),{recursive:!0,force:!0}),x++}catch{}}E.info(w.dim(` Cleaned ${x} items. Cached: node_modules${A.existsSync(y.join(O,"ios","Pods"))?", ios/Pods":""}`)),E.info(w.green("\u{1F512} Security: No source code retained on build server. Only public dependencies cached."))}catch{E.warn(w.yellow("Post-build cleanup encountered errors (non-fatal)."))}try{let D=y.join(Ce.homedir(),I.workspacesDir),X=ee(`df -k "${D}" | tail -1 | awk '{print $4}'`,{encoding:"utf8"}).trim(),x=parseInt(X,10)*1024;if(x<53687091200&&A.existsSync(D)){E.info(w.dim(` \u26A0\uFE0F Low disk space (${(x/1024/1024/1024).toFixed(0)} GB free). Running cache eviction...`));let j=y.basename(process.cwd()),G=A.readdirSync(D).filter($=>$!==j).map($=>{let M=y.join(D,$);try{let Q=A.statSync(M);return Q.isDirectory()?{name:$,dir:M,mtime:Q.mtimeMs}:null}catch{return null}}).filter(Boolean);G.sort(($,M)=>$.mtime-M.mtime);for(let $ of G){if(x>=53687091200)break;try{A.rmSync($.dir,{recursive:!0,force:!0}),E.info(w.dim(` \u{1F5D1}\uFE0F Evicted stale workspace: ${$.name}`));let M=ee(`df -k "${D}" | tail -1 | awk '{print $4}'`,{encoding:"utf8"}).trim();if(parseInt(M,10)*1024>=53687091200)break}catch{}}}}catch{}return await B(),K}catch(R){throw await B(),R.message==="Command aborted"?(E.warn(w.yellow(`
393
- \u274C Build aborted.`)),await m("failed",{error:"Aborted by user",endTime:Date.now()}),R):(E.error(w.red(`
394
- \u2717 Local build failed: ${R.message}`)),await m("failed",{error:R.message,endTime:Date.now()}),R)}},Pa=async(e,t,n={},i,r)=>{let o=St(process.cwd(),e.appDirectory,{requireAppDirectory:!0}),s=y.join(o.appRoot,"android"),a=y.join(o.appRoot,"gradlew"),c=y.join(s,"gradlew"),l=A.existsSync(c)?c:A.existsSync(a)?a:null;if(!l)throw new Error(`Could not find gradlew inside appDirectory "${o.appDirectory}".`);let d=e.developmentClient?"assembleDebug":"assembleRelease";!e.developmentClient&&e.distribution==="store"?d="bundleRelease":!e.developmentClient&&e.distribution==="internal"&&(d="assembleRelease");let p=e.buildCommand||d;E.info(w.blue(`Running Android build: ${p}...`));let u=l===c?s:o.appRoot,f="./gradlew",m=[p],N=jt(e.framework),b={...n,...N.localAndroidEnv(e,t),MACH_APP_NAME:e.appName||e.name||"App",MACH_APP_DIRECTORY:o.appDirectory,MACH_SOURCE_ROOT:o.sourceRoot,MACH_APP_ROOT:o.appRoot},P=e.resolvedVersionCode||n.ANDROID_VERSION_CODE,_=P?We(P,"resolved MACH build assignment"):null;_&&(m.push(`-Pandroid.injected.version.code=${_}`),b.ANDROID_VERSION_CODE=_,E.info(w.green(`\u2713 Applying Android versionCode ${_}`)));for(let v of["app/build","build",".cxx"]){let L=y.join(u,v);A.existsSync(L)&&A.rmSync(L,{recursive:!0,force:!0})}wt(o.appRoot),o.appRoot!==o.sourceRoot&&wt(o.sourceRoot),await Ke(f,m,u,b,i,r);let S=y.join(u,"app/build/outputs"),C=dt(S,[".apk",".aab"]);if(_&&C.length===0)throw new Error(`Android build produced no APK or AAB to verify against MACH versionCode ${_}.`);if(_)for(let v of C){let L=Zn(v,_);E.info(w.dim(`Validated Android versionCode ${L} in ${y.basename(v)}`)),i?.(`[ANDROID VALID] ${y.basename(v)} versionCode ${L} matches MACH assignment
395
- `)}return C},Ea=async(e,t,n,i={},r,o,s,a,c)=>{if(process.platform!=="darwin")throw new Error("iOS builds can only be run on macOS.");let l=St(process.cwd(),e.appDirectory,{requireAppDirectory:!0}),d=y.join(l.appRoot,"ios");if(!A.existsSync(d))throw new Error(`Could not find ios/ inside appDirectory "${l.appDirectory}".`);Cr(d);let p=A.readdirSync(d),u=p.find(B=>B.endsWith(".xcworkspace")),f=p.find(B=>B.endsWith(".xcodeproj")),m={...Bn(i,n,e),MACH_SOURCE_ROOT:l.sourceRoot,MACH_APP_ROOT:l.appRoot};xr(d,m,o);let N=e.resolvedBuildNumber||m.BUILD_NUMBER||m.CURRENT_PROJECT_VERSION,b=Wt(N);if(N&&!b)throw new Error(`Invalid iOS build number: "${N}". Apple requires one to three period-separated integers. Fix the Dashboard secret or remove it so Mach can use its auto build number.`);let P=b?[`BUILD_NUMBER=${b}`,`CURRENT_PROJECT_VERSION=${b}`,`INFOPLIST_KEY_CFBundleVersion=${b}`]:[];if(b&&(m.BUILD_NUMBER=b,m.CURRENT_PROJECT_VERSION=b,E.info(w.dim(`Using iOS build number: ${b}`))),!u&&!f)throw new Error("Could not find Xcode workspace or project in ios/ directory.");try{let B=ee("xcode-select -p").toString().trim();E.info(w.dim(`Using Xcode at: ${B}`))}catch{E.warn(w.dim("Could not detect Xcode path."))}E.info(w.blue("Running iOS build via xcodebuild..."));let _=u?u.replace(".xcworkspace",""):f?.replace(".xcodeproj",""),S=e.iosScheme||_||e.scheme,C=e.developmentClient?"Debug":e.iosConfiguration||"Release",v,L;try{if(b){v=Vi(d,b,{workspace:u,project:f,scheme:S,configuration:C});let F=v.plistPaths.length>0?`${v.plistPaths.length} Xcode target Info.plist file(s)`:"generated Info.plist build settings";E.info(w.green(`\u2713 Applied iOS buildNumber ${b} to ${F}`)),o&&o(`[VERSIONING] Applied iOS buildNumber ${b} to ${F}
396
- `)}let B=(r||"default").replace(/[^a-zA-Z0-9-_]/g,"_"),k=y.join(Ce.homedir(),`Library/Developer/Xcode/DerivedData/${I.nameLower}`,B);A.mkdirSync(k,{recursive:!0});let T=Fi(m),H=y.join(k,".mach-env-hash"),R=y.join(k,"Build"),U=A.existsSync(H)?A.readFileSync(H,"utf-8").trim():"";if(A.existsSync(R)){let F=U&&U!==T?"Build environment changed \u2014 clearing iOS DerivedData build products.":U?"Clearing iOS DerivedData build products to force a fresh JS bundle.":"DerivedData has no environment stamp \u2014 clearing iOS build products.";E.info(w.dim(F)),A.rmSync(R,{recursive:!0,force:!0})}if(A.writeFileSync(H,T),wt(l.appRoot),l.appRoot!==l.sourceRoot&&wt(l.sourceRoot),e.simulator){let F=ha(d,u,f,S,C),te=F||"generic/platform=iOS Simulator",Ae=["-destination",te];E.info(w.dim(F?`Building for simulator (Scheme: ${S}, Config: ${C}, Destination: ${te})...`:`Building for simulator (Scheme: ${S}, Config: ${C}, Destination: ${te})...`));let ae=[u?"-workspace":"-project",u||f,"-scheme",S,"-configuration",C,"-sdk","iphonesimulator",...Ae,"-derivedDataPath",k,...P,"COMPILER_INDEX_STORE_ENABLE=NO","CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","ONLY_ACTIVE_ARCH=NO","EXCLUDED_ARCHS=","SUPPORTED_PLATFORMS=iphonesimulator"];try{await cn(ae,d,m,o,s)}catch(D){if(!fa(D))throw D;ma(k),wt(l.appRoot),l.appRoot!==l.sourceRoot&&wt(l.sourceRoot),await cn(ae,d,m,o,s)}let $e=y.join(k,"Build/Products",`${C}-iphonesimulator`),ne=Aa($e,S,e),we=y.basename(ne,".app"),ve=vt(y.join(ne,"Info.plist"),"CFBundleIdentifier")||"unknown bundle",K=Ir(ne,b||void 0)[0].buildNumber,le=Er(ne),Ne=Rr(ne),O=y.join($e,`${we}_simulator.zip`);return E.info(w.dim(`Selected simulator app: ${y.relative($e,ne)} (${ve}, build ${K})`)),E.info(w.dim(`Simulator executable architecture: ${le}`)),E.info(w.dim(`Simulator executable platform: ${Ne.split(`
397
- `).find(D=>/\bplatform\b/i.test(D))?.trim()||"IOSSIMULATOR"}`)),E.info(w.dim(`Creating simulator artifact: ${O}...`)),Me(O),He("zip",["-r",O,y.basename(ne)],{cwd:y.dirname(ne),stdio:"pipe"}),[O]}else{E.info(w.dim(`Archiving (Scheme: ${S}, Config: ${C})...`));let F=y.join(d,"build.xcarchive"),te=y.join(d,"export");A.rmSync(F,{recursive:!0,force:!0}),A.rmSync(te,{recursive:!0,force:!0});let Ae=i.IOS_DIST_P12,ae=i.IOS_PROVISIONING_PROFILE,$e=i.IOS_P12_PASSWORD||"",ne=er(i.IOS_PROVISIONING_PROFILES),we=ne.length>1,ve=[],Re,K,le=[],Ne=[],O={isAppStore:!1,isDevelopment:!1};if(Ae&&ae){E.info(w.blue("\u{1F510} CI/CD Signing: Importing certificates..."));try{let Se=`${I.buildPrefix}-${t}.keychain-db`,xe=y.join(Ce.tmpdir(),Se),ft=I.keychainPassword;ee(`security create-keychain -p "${ft}" "${xe}" 2>/dev/null || true`),ee(`security set-keychain-settings -t 3600 -l "${xe}"`),ee(`security unlock-keychain -p "${ft}" "${xe}"`);let bn=y.join(Ce.tmpdir(),`cert-${t}.p12`),Nt=Buffer.from(Ae,"base64");A.writeFileSync(bn,Nt),E.info(w.dim(`P12 data size: ${Nt.length} bytes, first bytes: ${Nt.slice(0,4).toString("hex")}`)),(Nt.length<100||Nt[0]!==48)&&(E.warn(w.yellow("\u26A0\uFE0F P12 data looks corrupted or was not decrypted correctly.")),E.warn(w.yellow(" This usually means MACH_ENCRYPTION_KEY on the Remote API differs from when credentials were uploaded.")));let po=[$e,"",I.keychainPassword],yi=!1;for(let de of po)try{ee(`security import "${bn}" -k "${xe}" -P "${de}" -A -T /usr/bin/codesign -T /usr/bin/security`,{stdio:"pipe"}),yi=!0,E.info(w.dim(`\u2713 P12 imported successfully with password: ${de?"[set]":"[empty]"}`));break}catch(Ve){E.info(w.dim(` P12 import attempt with password ${de?`"${de.substring(0,3)}..."`:"[empty]"} failed: ${Ve.message?.split(`
393
+ \u274C Build aborted.`)),await g("failed",{error:"Aborted by user",endTime:Date.now()}),R):(E.error(w.red(`
394
+ \u2717 Local build failed: ${R.message}`)),await g("failed",{error:R.message,endTime:Date.now()}),R)}},Pa=async(e,t,n={},i,r)=>{let o=St(process.cwd(),e.appDirectory,{requireAppDirectory:!0}),s=y.join(o.appRoot,"android"),a=y.join(o.appRoot,"gradlew"),c=y.join(s,"gradlew"),l=A.existsSync(c)?c:A.existsSync(a)?a:null;if(!l)throw new Error(`Could not find gradlew inside appDirectory "${o.appDirectory}".`);let p=e.developmentClient?"assembleDebug":"assembleRelease";!e.developmentClient&&e.distribution==="store"?p="bundleRelease":!e.developmentClient&&e.distribution==="internal"&&(p="assembleRelease");let d=e.buildCommand||p;E.info(w.blue(`Running Android build: ${d}...`));let u=l===c?s:o.appRoot,f="./gradlew",g=[d],N=jt(e.framework),b={...n,...N.localAndroidEnv(e,t),MACH_APP_NAME:e.appName||e.name||"App",MACH_APP_DIRECTORY:o.appDirectory,MACH_SOURCE_ROOT:o.sourceRoot,MACH_APP_ROOT:o.appRoot},P=e.resolvedVersionCode||n.ANDROID_VERSION_CODE,_=P?We(P,"resolved MACH build assignment"):null;_&&(g.push(`-Pandroid.injected.version.code=${_}`),b.ANDROID_VERSION_CODE=_,E.info(w.green(`\u2713 Applying Android versionCode ${_}`)));for(let v of["app/build","build",".cxx"]){let L=y.join(u,v);A.existsSync(L)&&A.rmSync(L,{recursive:!0,force:!0})}wt(o.appRoot),o.appRoot!==o.sourceRoot&&wt(o.sourceRoot),await Ke(f,g,u,b,i,r);let S=y.join(u,"app/build/outputs"),C=dt(S,[".apk",".aab"]);if(_&&C.length===0)throw new Error(`Android build produced no APK or AAB to verify against MACH versionCode ${_}.`);if(_)for(let v of C){let L=Zn(v,_);E.info(w.dim(`Validated Android versionCode ${L} in ${y.basename(v)}`)),i?.(`[ANDROID VALID] ${y.basename(v)} versionCode ${L} matches MACH assignment
395
+ `)}return C},Ea=async(e,t,n,i={},r,o,s,a,c)=>{if(process.platform!=="darwin")throw new Error("iOS builds can only be run on macOS.");let l=St(process.cwd(),e.appDirectory,{requireAppDirectory:!0}),p=y.join(l.appRoot,"ios");if(!A.existsSync(p))throw new Error(`Could not find ios/ inside appDirectory "${l.appDirectory}".`);Cr(p);let d=A.readdirSync(p),u=d.find(B=>B.endsWith(".xcworkspace")),f=d.find(B=>B.endsWith(".xcodeproj")),g={...Bn(i,n,e),MACH_SOURCE_ROOT:l.sourceRoot,MACH_APP_ROOT:l.appRoot};xr(p,g,o);let N=e.resolvedBuildNumber||g.BUILD_NUMBER||g.CURRENT_PROJECT_VERSION,b=Wt(N);if(N&&!b)throw new Error(`Invalid iOS build number: "${N}". Apple requires one to three period-separated integers. Fix the Dashboard secret or remove it so Mach can use its auto build number.`);let P=b?[`BUILD_NUMBER=${b}`,`CURRENT_PROJECT_VERSION=${b}`,`INFOPLIST_KEY_CFBundleVersion=${b}`]:[];if(b&&(g.BUILD_NUMBER=b,g.CURRENT_PROJECT_VERSION=b,E.info(w.dim(`Using iOS build number: ${b}`))),!u&&!f)throw new Error("Could not find Xcode workspace or project in ios/ directory.");try{let B=ee("xcode-select -p").toString().trim();E.info(w.dim(`Using Xcode at: ${B}`))}catch{E.warn(w.dim("Could not detect Xcode path."))}E.info(w.blue("Running iOS build via xcodebuild..."));let _=u?u.replace(".xcworkspace",""):f?.replace(".xcodeproj",""),S=e.iosScheme||_||e.scheme,C=e.developmentClient?"Debug":e.iosConfiguration||"Release",v,L;try{if(b){v=Vi(p,b,{workspace:u,project:f,scheme:S,configuration:C});let F=v.plistPaths.length>0?`${v.plistPaths.length} Xcode target Info.plist file(s)`:"generated Info.plist build settings";E.info(w.green(`\u2713 Applied iOS buildNumber ${b} to ${F}`)),o&&o(`[VERSIONING] Applied iOS buildNumber ${b} to ${F}
396
+ `)}let B=(r||"default").replace(/[^a-zA-Z0-9-_]/g,"_"),k=y.join(Ce.homedir(),`Library/Developer/Xcode/DerivedData/${I.nameLower}`,B);A.mkdirSync(k,{recursive:!0});let T=Fi(g),H=y.join(k,".mach-env-hash"),R=y.join(k,"Build"),U=A.existsSync(H)?A.readFileSync(H,"utf-8").trim():"";if(A.existsSync(R)){let F=U&&U!==T?"Build environment changed \u2014 clearing iOS DerivedData build products.":U?"Clearing iOS DerivedData build products to force a fresh JS bundle.":"DerivedData has no environment stamp \u2014 clearing iOS build products.";E.info(w.dim(F)),A.rmSync(R,{recursive:!0,force:!0})}if(A.writeFileSync(H,T),wt(l.appRoot),l.appRoot!==l.sourceRoot&&wt(l.sourceRoot),e.simulator){let F=ha(p,u,f,S,C),te=F||"generic/platform=iOS Simulator",Ae=["-destination",te];E.info(w.dim(F?`Building for simulator (Scheme: ${S}, Config: ${C}, Destination: ${te})...`:`Building for simulator (Scheme: ${S}, Config: ${C}, Destination: ${te})...`));let ae=[u?"-workspace":"-project",u||f,"-scheme",S,"-configuration",C,"-sdk","iphonesimulator",...Ae,"-derivedDataPath",k,...P,"COMPILER_INDEX_STORE_ENABLE=NO","CODE_SIGNING_ALLOWED=NO","CODE_SIGNING_REQUIRED=NO","ONLY_ACTIVE_ARCH=NO","EXCLUDED_ARCHS=","SUPPORTED_PLATFORMS=iphonesimulator"];try{await cn(ae,p,g,o,s)}catch(D){if(!fa(D))throw D;ga(k),wt(l.appRoot),l.appRoot!==l.sourceRoot&&wt(l.sourceRoot),await cn(ae,p,g,o,s)}let $e=y.join(k,"Build/Products",`${C}-iphonesimulator`),ne=Aa($e,S,e),we=y.basename(ne,".app"),ve=vt(y.join(ne,"Info.plist"),"CFBundleIdentifier")||"unknown bundle",K=Ir(ne,b||void 0)[0].buildNumber,le=Er(ne),Ne=Rr(ne),O=y.join($e,`${we}_simulator.zip`);return E.info(w.dim(`Selected simulator app: ${y.relative($e,ne)} (${ve}, build ${K})`)),E.info(w.dim(`Simulator executable architecture: ${le}`)),E.info(w.dim(`Simulator executable platform: ${Ne.split(`
397
+ `).find(D=>/\bplatform\b/i.test(D))?.trim()||"IOSSIMULATOR"}`)),E.info(w.dim(`Creating simulator artifact: ${O}...`)),Me(O),He("zip",["-r",O,y.basename(ne)],{cwd:y.dirname(ne),stdio:"pipe"}),[O]}else{E.info(w.dim(`Archiving (Scheme: ${S}, Config: ${C})...`));let F=y.join(p,"build.xcarchive"),te=y.join(p,"export");A.rmSync(F,{recursive:!0,force:!0}),A.rmSync(te,{recursive:!0,force:!0});let Ae=i.IOS_DIST_P12,ae=i.IOS_PROVISIONING_PROFILE,$e=i.IOS_P12_PASSWORD||"",ne=er(i.IOS_PROVISIONING_PROFILES),we=ne.length>1,ve=[],Re,K,le=[],Ne=[],O={isAppStore:!1,isDevelopment:!1};if(Ae&&ae){E.info(w.blue("\u{1F510} CI/CD Signing: Importing certificates..."));try{let Se=`${I.buildPrefix}-${t}.keychain-db`,xe=y.join(Ce.tmpdir(),Se),ft=I.keychainPassword;ee(`security create-keychain -p "${ft}" "${xe}" 2>/dev/null || true`),ee(`security set-keychain-settings -t 3600 -l "${xe}"`),ee(`security unlock-keychain -p "${ft}" "${xe}"`);let bn=y.join(Ce.tmpdir(),`cert-${t}.p12`),Nt=Buffer.from(Ae,"base64");A.writeFileSync(bn,Nt),E.info(w.dim(`P12 data size: ${Nt.length} bytes, first bytes: ${Nt.slice(0,4).toString("hex")}`)),(Nt.length<100||Nt[0]!==48)&&(E.warn(w.yellow("\u26A0\uFE0F P12 data looks corrupted or was not decrypted correctly.")),E.warn(w.yellow(" This usually means MACH_ENCRYPTION_KEY on the Remote API differs from when credentials were uploaded.")));let po=[$e,"",I.keychainPassword],yi=!1;for(let de of po)try{ee(`security import "${bn}" -k "${xe}" -P "${de}" -A -T /usr/bin/codesign -T /usr/bin/security`,{stdio:"pipe"}),yi=!0,E.info(w.dim(`\u2713 P12 imported successfully with password: ${de?"[set]":"[empty]"}`));break}catch(Ve){E.info(w.dim(` P12 import attempt with password ${de?`"${de.substring(0,3)}..."`:"[empty]"} failed: ${Ve.message?.split(`
398
398
  `)[0]||"unknown"}`))}if(!yi)throw new Error("Failed to import P12.");A.unlinkSync(bn),ee(`security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k "${ft}" "${xe}"`);let uo=ee("security list-keychains -d user",{encoding:"utf-8"}).split(`
399
- `).map(de=>de.trim().replace(/^"|"$/g,"")).filter(de=>de.length>0),fo=[xe,...uo].map(de=>`"${de}"`).join(" ");if(ee(`security list-keychains -d user -s ${fo}`),ee(`security default-keychain -s "${xe}"`),we){le=dr({profiles:ne,buildId:t});let de=le.find(Ve=>Ve.isMainApplication)||le[0];K=de.uuid,O={isAppStore:de.isAppStore,isDevelopment:de.isDevelopment},Ne=le.map(Ve=>Ve.signingProfile),L=ur({iosDirectory:d,profiles:le,teamId:e.iosTeamId,temporaryLabel:t}),E.info(w.green(`\u2713 Applied target-specific signing to ${L.matchedTargets.length} Xcode targets`));for(let Ve of L.matchedTargets)E.info(w.dim(` - ${Ve}`))}else{let de=y.join(Ce.homedir(),"Library/MobileDevice/Provisioning Profiles");A.mkdirSync(de,{recursive:!0});let Ve=Buffer.from(ae,"base64"),mt=y.join(de,`${I.nameLower}-temp-${t}.mobileprovision`);A.writeFileSync(mt,Ve);let Ye=Ve.toString("utf-8"),xt=/<key>get-task-allow<\/key>\s*<true\/>/.test(Ye);O={isAppStore:!Ye.includes("<key>ProvisionedDevices</key>")&&!xt,isDevelopment:xt};try{let _t=ee(`security cms -D -i "${mt}"`,{encoding:"utf-8"}).match(/<key>UUID<\/key>\s*<string>([^<]+)<\/string>/);K=_t?_t[1]:void 0}catch{let _t=Ye.match(/<key>UUID<\/key>\s*<string>([^<]+)<\/string>/);K=_t?_t[1]:void 0}K||(E.warn("Could not extract UUID from provisioning profile. Using fallback."),K=`${I.nameLower}-${t}`);let Ot=y.join(de,`${K}.mobileprovision`);A.existsSync(Ot)&&A.unlinkSync(Ot),A.renameSync(mt,Ot);let rt=Ct(Ot);if(rt.uuid&&rt.uuid!==K){let $t=y.join(de,`${rt.uuid}.mobileprovision`);A.existsSync($t)&&A.unlinkSync($t),A.renameSync(Ot,$t),K=rt.uuid}O={isAppStore:rt.isAppStore,isDevelopment:rt.isDevelopment},Ne=[rt]}try{let de=ee(`security find-identity -v -p codesigning "${xe}"`,{encoding:"utf-8"}),Ve=ir(de),mt=Ne[0];if(!mt)throw new Error("No decoded provisioning profile is available for signing validation.");let Ye=rr(Ve,mt),xt=Ne.filter(kt=>!kt.certificateSha1s.includes(Ye.sha1));if(xt.length>0)throw new Error(`The selected P12 does not contain one certificate accepted by every provisioning profile. Mismatched profile(s): ${xt.map(kt=>kt.name||kt.uuid||"unknown").join(", ")}. Run \`mach credentials\` to regenerate those profiles with the selected certificate.`);Re=Ye.sha1,E.info(w.green(`\u2713 Signing identity verified against provisioning profile (${Ye.name}, ${Ye.sha1.slice(0,12)}\u2026).`))}catch(de){throw new Error(`iOS signing credential mismatch: ${de.message}`)}E.info(w.dim(`Profile type: ${O.isDevelopment?"Development":O.isAppStore?"App Store":"Ad-Hoc"}`)),E.info(w.dim(`Identity Detection: get-task-allow=${O.isDevelopment}, Selected Identity fingerprint=${Re}`)),ve.push("CODE_SIGN_STYLE=Manual"),ve.push(`CODE_SIGN_IDENTITY="${Re}"`),we||ve.push(`PROVISIONING_PROFILE_SPECIFIER=${K}`),e.iosTeamId&&ve.push(`DEVELOPMENT_TEAM=${e.iosTeamId}`)}catch(Se){throw E.error(`Signing setup failed: ${Se.message}`),Se}}else ve.push("-allowProvisioningUpdates"),e.iosTeamId&&ve.push(`DEVELOPMENT_TEAM=${e.iosTeamId}`);c&&await c("archive"),E.info(w.blue(`Archive detected Identity: "${Re}"`)),E.info(w.blue(`Archive detected UUID: "${K}"`)),await cn(["archive",u?"-workspace":"-project",u||f,"-scheme",S,"-configuration",C,"-archivePath",F,"-derivedDataPath",k,...P,...ve],d,m,o,s);let D=dt(y.join(F,"Products","Applications"),[".app"]);for(let Se of D)for(let xe of Ir(Se,b||void 0))E.info(w.dim(`Validated iOS CFBundleVersion ${xe.buildNumber} in ${y.basename(xe.bundlePath)}`));let X;K?(O.isAppStore?X="app-store":O.isDevelopment?X="development":X="ad-hoc",E.info(w.blue(`Export method from profile: "${X}"`))):(X=e.distribution==="store"?"app-store":e.distribution==="internal"?"ad-hoc":"development",E.warn(w.yellow(`No profile UUID detected. Export method from distribution flag: "${X}"`)));let x=e.iosExportMethod||X,j=e.iosBundleIdentifier||Pt("ios"),G=we?le:j&&K?[{bundleIdentifier:j,uuid:K}]:[],$=K&&Re?`<key>signingCertificate</key><string>${Re}</string>`:"",M=y.join(d,"ExportOptions.plist"),Q=`<?xml version="1.0" encoding="UTF-8"?>
399
+ `).map(de=>de.trim().replace(/^"|"$/g,"")).filter(de=>de.length>0),fo=[xe,...uo].map(de=>`"${de}"`).join(" ");if(ee(`security list-keychains -d user -s ${fo}`),ee(`security default-keychain -s "${xe}"`),we){le=dr({profiles:ne,buildId:t});let de=le.find(Ve=>Ve.isMainApplication)||le[0];K=de.uuid,O={isAppStore:de.isAppStore,isDevelopment:de.isDevelopment},Ne=le.map(Ve=>Ve.signingProfile),L=ur({iosDirectory:p,profiles:le,teamId:e.iosTeamId,temporaryLabel:t}),E.info(w.green(`\u2713 Applied target-specific signing to ${L.matchedTargets.length} Xcode targets`));for(let Ve of L.matchedTargets)E.info(w.dim(` - ${Ve}`))}else{let de=y.join(Ce.homedir(),"Library/MobileDevice/Provisioning Profiles");A.mkdirSync(de,{recursive:!0});let Ve=Buffer.from(ae,"base64"),gt=y.join(de,`${I.nameLower}-temp-${t}.mobileprovision`);A.writeFileSync(gt,Ve);let Ye=Ve.toString("utf-8"),xt=/<key>get-task-allow<\/key>\s*<true\/>/.test(Ye);O={isAppStore:!Ye.includes("<key>ProvisionedDevices</key>")&&!xt,isDevelopment:xt};try{let _t=ee(`security cms -D -i "${gt}"`,{encoding:"utf-8"}).match(/<key>UUID<\/key>\s*<string>([^<]+)<\/string>/);K=_t?_t[1]:void 0}catch{let _t=Ye.match(/<key>UUID<\/key>\s*<string>([^<]+)<\/string>/);K=_t?_t[1]:void 0}K||(E.warn("Could not extract UUID from provisioning profile. Using fallback."),K=`${I.nameLower}-${t}`);let Ot=y.join(de,`${K}.mobileprovision`);A.existsSync(Ot)&&A.unlinkSync(Ot),A.renameSync(gt,Ot);let rt=Ct(Ot);if(rt.uuid&&rt.uuid!==K){let $t=y.join(de,`${rt.uuid}.mobileprovision`);A.existsSync($t)&&A.unlinkSync($t),A.renameSync(Ot,$t),K=rt.uuid}O={isAppStore:rt.isAppStore,isDevelopment:rt.isDevelopment},Ne=[rt]}try{let de=ee(`security find-identity -v -p codesigning "${xe}"`,{encoding:"utf-8"}),Ve=ir(de),gt=Ne[0];if(!gt)throw new Error("No decoded provisioning profile is available for signing validation.");let Ye=rr(Ve,gt),xt=Ne.filter(kt=>!kt.certificateSha1s.includes(Ye.sha1));if(xt.length>0)throw new Error(`The selected P12 does not contain one certificate accepted by every provisioning profile. Mismatched profile(s): ${xt.map(kt=>kt.name||kt.uuid||"unknown").join(", ")}. Run \`mach credentials\` to regenerate those profiles with the selected certificate.`);Re=Ye.sha1,E.info(w.green(`\u2713 Signing identity verified against provisioning profile (${Ye.name}, ${Ye.sha1.slice(0,12)}\u2026).`))}catch(de){throw new Error(`iOS signing credential mismatch: ${de.message}`)}E.info(w.dim(`Profile type: ${O.isDevelopment?"Development":O.isAppStore?"App Store":"Ad-Hoc"}`)),E.info(w.dim(`Identity Detection: get-task-allow=${O.isDevelopment}, Selected Identity fingerprint=${Re}`)),ve.push("CODE_SIGN_STYLE=Manual"),ve.push(`CODE_SIGN_IDENTITY="${Re}"`),we||ve.push(`PROVISIONING_PROFILE_SPECIFIER=${K}`),e.iosTeamId&&ve.push(`DEVELOPMENT_TEAM=${e.iosTeamId}`)}catch(Se){throw E.error(`Signing setup failed: ${Se.message}`),Se}}else ve.push("-allowProvisioningUpdates"),e.iosTeamId&&ve.push(`DEVELOPMENT_TEAM=${e.iosTeamId}`);c&&await c("archive"),E.info(w.blue(`Archive detected Identity: "${Re}"`)),E.info(w.blue(`Archive detected UUID: "${K}"`)),await cn(["archive",u?"-workspace":"-project",u||f,"-scheme",S,"-configuration",C,"-archivePath",F,"-derivedDataPath",k,...P,...ve],p,g,o,s);let D=dt(y.join(F,"Products","Applications"),[".app"]);for(let Se of D)for(let xe of Ir(Se,b||void 0))E.info(w.dim(`Validated iOS CFBundleVersion ${xe.buildNumber} in ${y.basename(xe.bundlePath)}`));let X;K?(O.isAppStore?X="app-store":O.isDevelopment?X="development":X="ad-hoc",E.info(w.blue(`Export method from profile: "${X}"`))):(X=e.distribution==="store"?"app-store":e.distribution==="internal"?"ad-hoc":"development",E.warn(w.yellow(`No profile UUID detected. Export method from distribution flag: "${X}"`)));let x=e.iosExportMethod||X,j=e.iosBundleIdentifier||Pt("ios"),G=we?le:j&&K?[{bundleIdentifier:j,uuid:K}]:[],$=K&&Re?`<key>signingCertificate</key><string>${Re}</string>`:"",M=y.join(p,"ExportOptions.plist"),Q=`<?xml version="1.0" encoding="UTF-8"?>
400
400
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
401
401
  <plist version="1.0">
402
402
  <dict>
@@ -417,41 +417,41 @@ ${Q}`)),c&&await c("export"),E.info(w.blue(`Exporting with Bundle ID: "${j}"`)),
417
417
  [DIAGNOSTIC] Checking available signing identities...
418
418
  `));try{let Se=ee("security find-identity -v -p codesigning",{encoding:"utf-8"});o(w.magenta(`${Se}
419
419
  `))}catch(Se){o(w.red(`[DIAGNOSTIC] Failed to list identities: ${Se.message}
420
- `))}}await cn(["-exportArchive","-archivePath",F,"-exportPath",te,"-exportOptionsPlist",M],d,m,o,s),c&&await c("validate");let Je=dt(te,[".ipa"]);for(let Se of Je)try{ee(`unzip -t "${Se}"`,{stdio:"pipe"});let xe=Nr(Se,b||void 0);o&&o(`[IPA VALID] ${y.basename(Se)} \u2014 archive integrity OK
420
+ `))}}await cn(["-exportArchive","-archivePath",F,"-exportPath",te,"-exportOptionsPlist",M],p,g,o,s),c&&await c("validate");let Je=dt(te,[".ipa"]);for(let Se of Je)try{ee(`unzip -t "${Se}"`,{stdio:"pipe"});let xe=Nr(Se,b||void 0);o&&o(`[IPA VALID] ${y.basename(Se)} \u2014 archive integrity OK
421
421
  `),o&&o(`[IPA VALID] CFBundleVersion ${xe}
422
422
  `)}catch(xe){let ft=`IPA validation failed for ${y.basename(Se)}: ${xe.message||"archive may be corrupt"}`;throw o&&o(`[IPA CORRUPT] ${ft}
423
- `),new Error(ft)}return Je}}finally{L?.restore(),v?.restore()}},Pt=(e,t)=>{try{let n=y.join(process.cwd(),I.configFileName),i={};if(A.existsSync(n)){if(i=JSON.parse(A.readFileSync(n,"utf-8")),e==="android"&&i.android?.package)return i.android.package;if(e==="ios"&&i.ios?.bundleIdentifier)return i.ios.bundleIdentifier}let o=St(process.cwd(),t??i.appDirectory).appRoot;if(e==="android"){let s=["android/app/build.gradle","app/build.gradle","build.gradle"];for(let a of s){let c=y.join(o,a);if(A.existsSync(c)){let d=A.readFileSync(c,"utf-8").match(/applicationId\s+['"]([^'"]+)['"]/);if(d)return d[1]}}}else{let s=y.join(o,"ios"),a=A.existsSync(s)?s:o,c=dt(a,["Info.plist"]).filter(p=>!p.includes("/Pods/")&&!p.includes("/build/")&&!p.includes("/DerivedData/"));c.sort((p,u)=>u.split("/").length-p.split("/").length);for(let p of c){let f=A.readFileSync(p,"utf-8").match(/<key>CFBundleIdentifier<\/key>\s*<string>([^<]+)<\/string>/);if(f&&!f[1].includes("$"))return f[1]}let l=dt(a,[".xcodeproj"]);if(l.length>0){let p=y.join(l[0],"project.pbxproj");if(A.existsSync(p)){let f=A.readFileSync(p,"utf-8").match(/PRODUCT_BUNDLE_IDENTIFIER\s*=\s*"?([^";\s]+)"?;/);if(f)return f[1]}}let d=["app.json","app.config.json","app.config.js","app.config.ts"];for(let p of d){let u=y.join(o,p);if(A.existsSync(u)){let m=A.readFileSync(u,"utf-8").match(/"bundleIdentifier":\s*"([^"]+)"/);if(m)return m[1]}}}}catch{return null}return null},Ra=()=>{try{return ee("emulator -version",{stdio:"ignore"}),"emulator"}catch{let t=Ce.homedir(),n=[y.join(t,"Library/Android/sdk/emulator/emulator"),y.join(t,"Android/Sdk/emulator/emulator"),"/usr/local/lib/android/sdk/emulator/emulator"];for(let i of n)if(A.existsSync(i))return i}return"emulator"},Na=async(e,t)=>{let n=ln();try{if(ee("adb devices").toString().split(`
423
+ `),new Error(ft)}return Je}}finally{L?.restore(),v?.restore()}},Pt=(e,t)=>{try{let n=y.join(process.cwd(),I.configFileName),i={};if(A.existsSync(n)){if(i=JSON.parse(A.readFileSync(n,"utf-8")),e==="android"&&i.android?.package)return i.android.package;if(e==="ios"&&i.ios?.bundleIdentifier)return i.ios.bundleIdentifier}let o=St(process.cwd(),t??i.appDirectory).appRoot;if(e==="android"){let s=["android/app/build.gradle","app/build.gradle","build.gradle"];for(let c of s){let l=y.join(o,c);if(A.existsSync(l)){let d=A.readFileSync(l,"utf-8").match(/applicationId\s+['"]([^'"]+)['"]/);if(d)return d[1]}}let a=["app.json","app.config.json","app.config.js","app.config.ts"];for(let c of a){let l=y.join(o,c);if(!A.existsSync(l))continue;let d=A.readFileSync(l,"utf-8").match(/(?:["']package["']|\bpackage)\s*[:=]\s*["']([^"']+)["']/);if(d?.[1])return d[1]}}else{let s=y.join(o,"ios"),a=A.existsSync(s)?s:o,c=dt(a,["Info.plist"]).filter(d=>!d.includes("/Pods/")&&!d.includes("/build/")&&!d.includes("/DerivedData/"));c.sort((d,u)=>u.split("/").length-d.split("/").length);for(let d of c){let f=A.readFileSync(d,"utf-8").match(/<key>CFBundleIdentifier<\/key>\s*<string>([^<]+)<\/string>/);if(f&&!f[1].includes("$"))return f[1]}let l=dt(a,[".xcodeproj"]);if(l.length>0){let d=y.join(l[0],"project.pbxproj");if(A.existsSync(d)){let f=A.readFileSync(d,"utf-8").match(/PRODUCT_BUNDLE_IDENTIFIER\s*=\s*"?([^";\s]+)"?;/);if(f)return f[1]}}let p=["app.json","app.config.json","app.config.js","app.config.ts"];for(let d of p){let u=y.join(o,d);if(A.existsSync(u)){let g=A.readFileSync(u,"utf-8").match(/"bundleIdentifier":\s*"([^"]+)"/);if(g)return g[1]}}}}catch{return null}return null},Ra=()=>{try{return ee("emulator -version",{stdio:"ignore"}),"emulator"}catch{let t=Ce.homedir(),n=[y.join(t,"Library/Android/sdk/emulator/emulator"),y.join(t,"Android/Sdk/emulator/emulator"),"/usr/local/lib/android/sdk/emulator/emulator"];for(let i of n)if(A.existsSync(i))return i}return"emulator"},Na=async(e,t)=>{let n=ln();try{if(ee("adb devices").toString().split(`
424
424
  `).slice(1).map(s=>s.trim()).filter(s=>s.length>0&&!s.startsWith("*")).map(s=>s.split(" ")[0]).length===0){E.warn(w.yellow("No Android devices or emulators found."));let s=Ra(),a=[];try{a=ee(`${s} -list-avds`).toString().split(`
425
- `).filter(c=>c.trim().length>0)}catch{}if(a.length>0){let c=await qn({message:"Select an emulator to launch:",options:a.map(p=>({value:p,label:p}))});if(dn(c))return;n.start(`Launching emulator ${c}...`),Ar(s,["-avd",c],{detached:!0,stdio:"ignore"}).unref();let l=0,d=!1;for(;l<60;){try{if(ee("adb shell getprop sys.boot_completed",{stdio:"pipe"}).toString().trim()==="1"){d=!0;break}}catch{}await new Promise(p=>setTimeout(p,2e3)),l++}if(!d)throw n.stop("Emulator launch timed out."),new Error("Emulator launch timed out. Please try launching it manually.");n.stop("Emulator launched.")}else throw new Error("No devices found and no emulators available to launch. (Make sure Android SDK is installed)")}n.start("Installing APK on device..."),await Ke("adb",["install","-r",e],process.cwd(),{},t),n.stop("Installation complete.");let o=Pt("android");if(o){E.info(w.blue(`\u{1F680} Launching ${o}...`));try{ee(`adb shell dumpsys package ${o}`).toString().split(`
426
- `).find(c=>c.includes("android.intent.action.MAIN")&&c.includes("android.intent.category.LAUNCHER"))?ee(`adb shell monkey -p ${o} -c android.intent.category.LAUNCHER 1`,{stdio:"ignore"}):ee(`adb shell monkey -p ${o} -c android.intent.category.LAUNCHER 1`,{stdio:"ignore"})}catch{E.warn("Could not auto-launch app. You may need to open it manually.")}}}catch(i){n.stop("Installation failed."),E.error(w.red(`Failed to install APK: ${i.message}`))}},xa=async(e,t,n)=>{let i=ln();try{if(!ee("xcrun simctl list devices booted").toString().includes("(Booted)")){E.warn(w.yellow("No iOS Simulator is currently booted."));let o=ee("xcrun simctl list devices --json").toString(),s=JSON.parse(o).devices,a=[];Object.keys(s).forEach(p=>{s[p].forEach(u=>{u.isAvailable&&a.push({...u,runtime:p})})});let c=await qn({message:"Select a simulator to launch:",options:a.map(p=>({value:p.udid,label:`${p.name} (${p.runtime.split(".").pop()})`}))});if(dn(c))return;i.start(`Booting ${c}...`),ee(`xcrun simctl boot ${c}`),ee(`open -a Simulator --args -CurrentDeviceUDID ${c}`);let l=0,d=!1;for(;l<30;){try{if(ee("xcrun simctl list devices booted").toString().includes(c)){d=!0;break}}catch{}await new Promise(p=>setTimeout(p,2e3)),l++}if(!d)throw i.stop("Simulator boot timed out."),new Error("Simulator boot timed out.");i.stop("Simulator booted.")}i.start("Installing on iOS Simulator..."),Er(e),Rr(e),await Ke("xcrun",["simctl","install","booted",e],process.cwd(),{},n),i.stop("Installation complete."),E.info(w.blue(`\u{1F680} Launching ${t}...`)),await Ke("xcrun",["simctl","launch","booted",t],process.cwd(),{},n)}catch(r){i.stop("Installation failed."),E.error(w.red(`Failed to install on Simulator: ${r.message}`))}},ka=async(e,t,n)=>{let i=ln();i.start("Scanning for connected iOS devices...");try{let r=ee("xcrun devicectl list devices --json-output -").toString(),s=(JSON.parse(r).result?.devices||[]).filter(c=>c.connectionProperties?.transportType==="wired"||c.connectionProperties?.transportType==="localNetwork");if(s.length===0)throw i.stop("No connected iOS devices found."),new Error("Please connect your iPhone via USB or ensure it is on the same Wi-Fi for wireless debugging.");let a=s[0].identifier;if(s.length>1){i.stop();let c=await qn({message:"Select a device to install on:",options:s.map(l=>({value:l.identifier,label:`${l.deviceProperties?.name||l.name||l.model?.name} (${l.model?.name||"iPhone"}) - ${l.identifier}`}))});if(dn(c))return;a=c,i.start(`Installing on ${a}...`)}else i.message(`Installing on ${s[0].model.name}...`);await Ke("xcrun",["devicectl","device","install","app","--device",a,e],process.cwd(),{},n),i.stop("Installation complete."),E.info(w.blue(`\u{1F680} Launching ${t}...`)),await Ke("xcrun",["devicectl","device","launch","app","--device",a,t],process.cwd(),{},n)}catch(r){i.stop("Installation failed."),E.error(w.red(`Failed to install on device: ${r.message}`)),E.info(w.dim('Make sure your device is unlocked and "Developer Mode" is enabled in Settings -> Privacy & Security.'))}};import{createRequire as Oa}from"module";var $a=Oa(import.meta.url),_a=$a("../package.json"),ii=String(_a.version||"0.0.0");var Tr="https://mach-api.securejs.in",Fa=["google-services.json","android/app/google-services.json"],kr="0.1.4";function Da(){return Ee.join(process.cwd(),I.configFileName)}function un(){let e=bi();if(!e?.projectId)throw new Error(`No linked MACH project. Run \`${I.nameLower} link\` first.`);return e}function Fr(e){pe.writeFileSync(Da(),`${JSON.stringify(e,null,2)}
425
+ `).filter(c=>c.trim().length>0)}catch{}if(a.length>0){let c=await qn({message:"Select an emulator to launch:",options:a.map(d=>({value:d,label:d}))});if(dn(c))return;n.start(`Launching emulator ${c}...`),Ar(s,["-avd",c],{detached:!0,stdio:"ignore"}).unref();let l=0,p=!1;for(;l<60;){try{if(ee("adb shell getprop sys.boot_completed",{stdio:"pipe"}).toString().trim()==="1"){p=!0;break}}catch{}await new Promise(d=>setTimeout(d,2e3)),l++}if(!p)throw n.stop("Emulator launch timed out."),new Error("Emulator launch timed out. Please try launching it manually.");n.stop("Emulator launched.")}else throw new Error("No devices found and no emulators available to launch. (Make sure Android SDK is installed)")}n.start("Installing APK on device..."),await Ke("adb",["install","-r",e],process.cwd(),{},t),n.stop("Installation complete.");let o=Pt("android");if(o){E.info(w.blue(`\u{1F680} Launching ${o}...`));try{ee(`adb shell dumpsys package ${o}`).toString().split(`
426
+ `).find(c=>c.includes("android.intent.action.MAIN")&&c.includes("android.intent.category.LAUNCHER"))?ee(`adb shell monkey -p ${o} -c android.intent.category.LAUNCHER 1`,{stdio:"ignore"}):ee(`adb shell monkey -p ${o} -c android.intent.category.LAUNCHER 1`,{stdio:"ignore"})}catch{E.warn("Could not auto-launch app. You may need to open it manually.")}}}catch(i){n.stop("Installation failed."),E.error(w.red(`Failed to install APK: ${i.message}`))}},xa=async(e,t,n)=>{let i=ln();try{if(!ee("xcrun simctl list devices booted").toString().includes("(Booted)")){E.warn(w.yellow("No iOS Simulator is currently booted."));let o=ee("xcrun simctl list devices --json").toString(),s=JSON.parse(o).devices,a=[];Object.keys(s).forEach(d=>{s[d].forEach(u=>{u.isAvailable&&a.push({...u,runtime:d})})});let c=await qn({message:"Select a simulator to launch:",options:a.map(d=>({value:d.udid,label:`${d.name} (${d.runtime.split(".").pop()})`}))});if(dn(c))return;i.start(`Booting ${c}...`),ee(`xcrun simctl boot ${c}`),ee(`open -a Simulator --args -CurrentDeviceUDID ${c}`);let l=0,p=!1;for(;l<30;){try{if(ee("xcrun simctl list devices booted").toString().includes(c)){p=!0;break}}catch{}await new Promise(d=>setTimeout(d,2e3)),l++}if(!p)throw i.stop("Simulator boot timed out."),new Error("Simulator boot timed out.");i.stop("Simulator booted.")}i.start("Installing on iOS Simulator..."),Er(e),Rr(e),await Ke("xcrun",["simctl","install","booted",e],process.cwd(),{},n),i.stop("Installation complete."),E.info(w.blue(`\u{1F680} Launching ${t}...`)),await Ke("xcrun",["simctl","launch","booted",t],process.cwd(),{},n)}catch(r){i.stop("Installation failed."),E.error(w.red(`Failed to install on Simulator: ${r.message}`))}},ka=async(e,t,n)=>{let i=ln();i.start("Scanning for connected iOS devices...");try{let r=ee("xcrun devicectl list devices --json-output -").toString(),s=(JSON.parse(r).result?.devices||[]).filter(c=>c.connectionProperties?.transportType==="wired"||c.connectionProperties?.transportType==="localNetwork");if(s.length===0)throw i.stop("No connected iOS devices found."),new Error("Please connect your iPhone via USB or ensure it is on the same Wi-Fi for wireless debugging.");let a=s[0].identifier;if(s.length>1){i.stop();let c=await qn({message:"Select a device to install on:",options:s.map(l=>({value:l.identifier,label:`${l.deviceProperties?.name||l.name||l.model?.name} (${l.model?.name||"iPhone"}) - ${l.identifier}`}))});if(dn(c))return;a=c,i.start(`Installing on ${a}...`)}else i.message(`Installing on ${s[0].model.name}...`);await Ke("xcrun",["devicectl","device","install","app","--device",a,e],process.cwd(),{},n),i.stop("Installation complete."),E.info(w.blue(`\u{1F680} Launching ${t}...`)),await Ke("xcrun",["devicectl","device","launch","app","--device",a,t],process.cwd(),{},n)}catch(r){i.stop("Installation failed."),E.error(w.red(`Failed to install on device: ${r.message}`)),E.info(w.dim('Make sure your device is unlocked and "Developer Mode" is enabled in Settings -> Privacy & Security.'))}};import{createRequire as Oa}from"module";var $a=Oa(import.meta.url),_a=$a("../package.json"),ii=String(_a.version||"0.0.0");var Tr="https://mach-api.securejs.in",Fa=["google-services.json","android/app/google-services.json"],kr="0.1.4";function Da(){return Ee.join(process.cwd(),I.configFileName)}function un(){let e=bi();if(!e?.projectId)throw new Error(`No linked MACH project. Run \`${I.nameLower} link\` first.`);return e}function Fr(e){pe.writeFileSync(Da(),`${JSON.stringify(e,null,2)}
427
427
  `)}function Ba(){return ri(Ee.join(process.cwd(),"package.json"))}function ri(e){if(!pe.existsSync(e))return null;try{return JSON.parse(pe.readFileSync(e,"utf8"))}catch{return null}}function Va(e){let t=Ba();return!!(t?.dependencies?.[e]||t?.devDependencies?.[e])}function oi(e){let t=process.cwd(),n=ri(Ee.join(t,"node_modules",...e.split("/"),"package.json"));if(typeof n?.version=="string")return n.version;let r=ri(Ee.join(t,"package-lock.json"))?.packages?.[`node_modules/${e}`]?.version;return typeof r=="string"?r:void 0}function Ma(e,t){let n=o=>o.replace(/^v/,"").split(/[.-]/).slice(0,3).map(s=>Number.parseInt(s,10)||0),i=n(e),r=n(t);for(let o=0;o<3;o+=1)if(i[o]!==r[o])return i[o]>r[o]?1:-1;return 0}function Or(e,t){let n=oi(e);return!Va(e)||!n||Ma(n,t)<0}function ja(e,t=!1){let n=process.cwd();return pe.existsSync(Ee.join(n,"pnpm-lock.yaml"))?{command:"pnpm",args:["add",...t?["-D"]:[],e],label:`pnpm add ${t?"-D ":""}${e}`}:pe.existsSync(Ee.join(n,"yarn.lock"))?{command:"yarn",args:["add",...t?["-D"]:[],e],label:`yarn add ${t?"-D ":""}${e}`}:pe.existsSync(Ee.join(n,"bun.lock"))||pe.existsSync(Ee.join(n,"bun.lockb"))?{command:"bun",args:["add",...t?["-d"]:[],e],label:`bun add ${t?"-d ":""}${e}`}:{command:"npm",args:["install",...t?["--save-dev"]:["--save"],"--no-audit","--no-fund",e],label:`npm install ${t?"--save-dev ":"--save "}${e} --no-audit --no-fund`}}function $r(e,t=!1){let n=ja(e,t);console.log(re.dim(`Installing dependency: ${n.label}`));let i=Ta(n.command,n.args,{cwd:process.cwd(),stdio:"inherit",timeout:12e4,env:{...process.env,NPM_CONFIG_AUDIT:"false",NPM_CONFIG_FUND:"false"}});return i.signal==="SIGTERM"?{ok:!1,note:`${n.label} timed out after 120s. Run it manually, or re-run \`${I.nameLower} push setup --skip-install\` to only generate files.`}:i.error||i.status!==0?{ok:!1,note:`${n.label} failed${i.error?`: ${i.error.message}`:` with code ${i.status}`}.`}:{ok:!0,note:`Installed with ${n.label}.`}}function Wa(e,t){let n=[];if(t)return n.push("Dependency installation skipped."),n;if(Or("@radhya/mach-push-react-native",kr)){let i=$r(`@radhya/mach-push-react-native@${kr}`);if(!i.ok)throw new Error(`${i.note} No application files were wired.`);n.push(i.note)}else n.push(`@radhya/mach-push-react-native is already current (${oi("@radhya/mach-push-react-native")}).`);if(e==="expo")if(Or("@radhya/mach",ii)){let i=$r(`@radhya/mach@${ii}`,!0);if(!i.ok)throw new Error(`${i.note} No Expo configuration was changed.`);n.push(i.note)}else n.push(`@radhya/mach is already current for the Expo config (${oi("@radhya/mach")}).`);return n}function Za(e,t){return e||t||["google-services.json","android/app/google-services.json"].find(n=>pe.existsSync(Ee.join(process.cwd(),n)))}function Dr(e){let t={enabled:!0};return e.appId&&e.publishableKey&&(t.appId=e.appId,t.publishableKey=e.publishableKey),e.apiUrl&&e.apiUrl!==Tr&&(t.apiUrl=e.apiUrl),e.environment&&e.environment!=="production"&&(t.environment=e.environment),e.googleServicesFile&&!Fa.includes(e.googleServicesFile)&&(t.googleServicesFile=e.googleServicesFile),t}function Ua(e){return e==="development"?"development":"production"}function Br(e){let t=process.cwd(),n=e==="ios"?"bundleIdentifier":"package";for(let i of["app.json","app.config.json"]){let r=Ee.join(t,i);if(pe.existsSync(r))try{let o=JSON.parse(pe.readFileSync(r,"utf8")),a=(o.expo&&typeof o.expo=="object"?o.expo:o)?.[e]?.[n];if(typeof a=="string"&&a.trim())return a.trim()}catch{}}for(let i of["app.config.ts","app.config.js"]){let r=Ee.join(t,i);if(!pe.existsSync(r))continue;let s=pe.readFileSync(r,"utf8").match(new RegExp(`${n}\\s*:\\s*['"]([^'"]+)['"]`));if(s?.[1])return s[1]}}function Vr(e,t){return t||ze(e)||Br("ios")||Pt("ios")||void 0}function Mr(e,t){return t||ht(e)||Br("android")||Pt("android")||void 0}function Ga(e,t){let n=pe.readFileSync(e,"utf8");if(n.includes(t))return"already";let i=/(^[ \t]*)plugins\s*:\s*\[([\s\S]*?)\]/m.exec(n);if(!i||i.index===void 0)return"manual";let r=n.includes(`\r
428
428
  `)?`\r
429
429
  `:`
430
- `,o=i[1]||"",s=i[2]||"",a=s.match(/\r?\n([ \t]+)\S/)?.[1]||`${o} `,c=s.trim().length===0?`${r}${a}'${t}',${r}${o}`:`${r}${a}'${t}',${s}`,l=i[0].indexOf("["),d=`${i[0].slice(0,l+1)}${c}]`;return pe.writeFileSync(e,`${n.slice(0,i.index)}${d}${n.slice(i.index+i[0].length)}`),"inserted"}function jr(){let e="@radhya/mach/expo-plugin",t=["app.config.ts","app.config.js"].find(c=>pe.existsSync(Ee.join(process.cwd(),c)));if(t){let c=Ga(Ee.join(process.cwd(),t),e);return c==="inserted"?`${t} now includes ${e}.`:c==="already"?`${t} already includes ${e}.`:`Add "${e}" to the plugins array in ${t}; MACH could not safely edit its computed configuration.`}let n=["app.config.json","app.json"].find(c=>pe.existsSync(Ee.join(process.cwd(),c)));if(!n)return`Add "${e}" to the Expo plugins array.`;let i=Ee.join(process.cwd(),n),r=JSON.parse(pe.readFileSync(i,"utf8")),o=r.expo&&typeof r.expo=="object"?r.expo:r,s=Array.isArray(o.plugins)?o.plugins:[];return s.some(c=>(Array.isArray(c)?c[0]:c)===e)?`${n} already includes ${e}.`:(o.plugins=[...s,e],pe.writeFileSync(i,`${JSON.stringify(r,null,2)}
430
+ `,o=i[1]||"",s=i[2]||"",a=s.match(/\r?\n([ \t]+)\S/)?.[1]||`${o} `,c=s.trim().length===0?`${r}${a}'${t}',${r}${o}`:`${r}${a}'${t}',${s}`,l=i[0].indexOf("["),p=`${i[0].slice(0,l+1)}${c}]`;return pe.writeFileSync(e,`${n.slice(0,i.index)}${p}${n.slice(i.index+i[0].length)}`),"inserted"}function jr(){let e="@radhya/mach/expo-plugin",t=["app.config.ts","app.config.js"].find(c=>pe.existsSync(Ee.join(process.cwd(),c)));if(t){let c=Ga(Ee.join(process.cwd(),t),e);return c==="inserted"?`${t} now includes ${e}.`:c==="already"?`${t} already includes ${e}.`:`Add "${e}" to the plugins array in ${t}; MACH could not safely edit its computed configuration.`}let n=["app.config.json","app.json"].find(c=>pe.existsSync(Ee.join(process.cwd(),c)));if(!n)return`Add "${e}" to the Expo plugins array.`;let i=Ee.join(process.cwd(),n),r=JSON.parse(pe.readFileSync(i,"utf8")),o=r.expo&&typeof r.expo=="object"?r.expo:r,s=Array.isArray(o.plugins)?o.plugins:[];return s.some(c=>(Array.isArray(c)?c[0]:c)===e)?`${n} already includes ${e}.`:(o.plugins=[...s,e],pe.writeFileSync(i,`${JSON.stringify(r,null,2)}
431
431
  `),`${n} now includes ${e}.`)}async function Wr(e){let t=un(),n=e.app||t.push?.appId,i=e.environment||t.push?.environment||"production";if(n)return{config:t,appId:n,environment:i};let{data:r}=await W.get(`/projects/${t.projectId}/push/overview?days=1`),s=(r?.apps||[]).filter(a=>a.status!=="disabled").sort((a,c)=>(c.updatedAt||0)-(a.updatedAt||0))[0]?.appId;if(!s)throw new Error(`Push is not configured. Run \`${I.nameLower} push setup\` first.`);return{config:t,appId:s,environment:i}}function _r(e){let t=Ee.resolve(e);if(!pe.existsSync(t))throw new Error(`File not found: ${t}`);return t}function Xt(e){let t=e?.response?.data?.message||e?.message||"Unknown error";console.error(re.red(t)),process.exitCode=1}async function kp(e){let t=pn();try{let n=un();if(Cn(n)==="flutter")throw new Error("MACH Push currently supports Expo and bare React Native. Flutter push support is planned for a later release.");let r=Vr(n,e.iosBundle),o=Mr(n,e.androidPackage);if(!r&&!o)throw new Error(`Add ios.bundleIdentifier or android.package to ${I.configFileName}, or pass --ios-bundle/--android-package.`);t.start("Creating MACH Push app..."),await W.post(`/projects/${n.projectId}/push/apps`,{name:e.name||n.name||"Mobile app",iosBundleId:r,androidPackageName:o});let s=e.environment||"production";n.push=Dr({environment:s,googleServicesFile:e.googleServicesFile}),Fr(n);let a=n.framework==="expo"?jr():void 0;t.stop(re.green("MACH Push app created.")),console.log(["",`${re.bold("Client config:")} ${I.configFileName} \u2192 push`,"","Install the mobile SDK:"," npm install @radhya/mach-push-react-native",...n.framework==="expo"?[" npm install --save-dev @radhya/mach",` ${a}`," Run npx expo prebuild."]:[],"",`Next: run \`${I.nameLower} credentials\` and choose Push Notifications.`].join(`
432
- `))}catch(n){t.stop(re.red("MACH Push setup failed.")),Xt(n)}}async function Op(e){let t=pn();try{let n=un(),i=Cn(n);if(i==="flutter")throw new Error("MACH Push currently supports Expo and bare React Native. Flutter push support is planned for a later release.");let r=Vr(n,e.iosBundle),o=Mr(n,e.androidPackage);if(!r&&!o)throw new Error(`Add ios.bundleIdentifier or android.package to ${I.configFileName}, or pass --ios-bundle/--android-package.`);let s;t.start("Checking the MACH Push app...");let l=((await W.get(`/projects/${n.projectId}/push/overview?days=1`)).data?.apps||[]).filter(S=>S.status!=="disabled").sort((S,C)=>(C.updatedAt||0)-(S.updatedAt||0)).find(S=>(!r||S.iosBundleId===r)&&(!o||S.androidPackageName===o));if(l)s=l.appId,t.stop(re.green("Existing MACH Push app linked."));else{let{data:S}=await W.post(`/projects/${n.projectId}/push/apps`,{name:e.name||n.name||"Mobile app",iosBundleId:r,androidPackageName:o});s=S.app.appId,t.stop(re.green("MACH Push app created."))}if(!s)throw new Error("MACH Push did not return a usable application.");let d=n.push,p=e.environment||d?.environment||"production",u=d?.apiUrl||Tr,f=Za(e.googleServicesFile,d?.googleServicesFile);n.push=Dr({apiUrl:u,environment:p,googleServicesFile:f}),Fr(n);let m=Wa(i,!!e.skipInstall),N=i==="expo"?jr():void 0;if(N?.startsWith('Add "'))throw new Error(N);let b={projectId:n.projectId,apiUrl:u,environment:p},P=xi(process.cwd(),i,b);if(!P.entryFile)throw new Error(P.notes[0]||"MACH could not locate the application entry point.");let _=i==="expo"?{written:[],notes:[]}:Oi(process.cwd(),{iosBundleId:r,iosEnvironment:Ua(p),googleServicesFile:f});console.log(["",re.green.bold("MACH Push basic setup is ready."),`${re.bold("Framework:")} ${i}`,`${re.bold("Client config:")} ${I.configFileName} \u2192 push`,`${re.bold("Automatic startup:")} ${P.entryFile||"manual entry import required"}`,`${re.bold("Customize callbacks:")} ${P.editableFile||"see the setup notes below"}`,"",...m.map(S=>`\u2022 ${S}`),...N?[`\u2022 ${N}`]:[],...P.notes.map(S=>`\u2022 ${S}`),..._.notes.map(S=>`\u2022 ${S}`),...[...P.written,..._.written].map(S=>`\u2022 Updated ${S}.`),"",`Next: run \`${I.nameLower} credentials\` and choose Push Notifications, then create one new native build.`].join(`
433
- `))}catch(n){t.stop(re.red("MACH Push setup failed.")),Xt(n)}}async function fn(e,t){let n=pn();try{let{config:i,appId:r,environment:o}=await Wr(t),s;if(e==="apns"){if(!t.teamId||!t.keyId)throw new Error("APNs requires --team-id and --key-id.");let a=t.privateKey||(t.file?pe.readFileSync(_r(t.file),"utf8"):"");if(!a)throw new Error("APNs requires --file or a generated private key.");let c=t.bundleId||ze(i);if(!c)throw new Error("APNs requires --bundle-id.");s={environment:o,teamId:t.teamId,keyId:t.keyId,bundleId:c,privateKey:a}}else{let a=t.serviceAccount||(t.file?JSON.parse(pe.readFileSync(_r(t.file),"utf8")):void 0);if(!a)throw new Error("FCM requires --file or a generated service account.");s={serviceAccount:a}}n.start(`Configuring ${e.toUpperCase()}...`),await W.put(`/projects/${i.projectId}/push/apps/${r}/credentials/${e}`,s),n.stop(re.green(`${e.toUpperCase()} is ready.`))}catch(i){n.stop(re.red(`${e.toUpperCase()} setup failed.`)),Xt(i)}}async function $p(e){let t=pn(),n=!1;try{let{config:i,appId:r,environment:o}=await Wr(e),s=e.all?{all:!0,platform:e.platform}:e.token?.length?{machPushTokens:e.token}:e.user?.length?{externalUserIds:e.user}:null;if(!s)throw new Error('Choose --token, --user, or --all. Example: mach push send --all --title "Hello" --body "World"');let a;if(e.data){let p=JSON.parse(e.data);if(!p||typeof p!="object"||Array.isArray(p))throw new Error("--data must be a JSON object.");a=Object.fromEntries(Object.entries(p).map(([u,f])=>[u,String(f)]))}let c=e.badge===void 0?void 0:Number(e.badge),l=e.ttl===void 0?void 0:Number(e.ttl);t.start("Queueing notification..."),n=!0;let{data:d}=await W.post(`/projects/${i.projectId}/push/send`,{appId:r,environment:o,target:s,notification:{title:e.title,body:e.body,data:a},options:{sound:e.sound,badge:c,ttlSeconds:l,collapseKey:e.collapseKey,androidChannelId:e.androidChannelId}});t.stop(re.green(`Notification queued: ${d.requestId}`))}catch(i){n?t.stop(re.red("Notification was not queued.")):console.error(re.red("Notification was not queued.")),Xt(i)}}async function _p(e){try{let t=un(),n=Math.min(Math.max(Number(e.days||30),1),90),{data:i}=await W.get(`/projects/${t.projectId}/push/overview?days=${n}`),r=i.totals,o=r.requested>0?`${(r.accepted/r.requested*100).toFixed(1)}%`:"\u2014";console.log([`${re.bold("Active devices:")} ${i.activeDevices}`,`${re.bold("Queued requests:")} ${r.queuedRequests}`,`${re.bold("Requested:")} ${r.requested}`,`${re.bold("Provider accepted:")} ${r.accepted}`,`${re.bold("Failed:")} ${r.failed}`,`${re.bold("Retried:")} ${r.retried}`,`${re.bold("Invalid devices:")} ${r.invalidDevices}`,`${re.bold("Acceptance:")} ${o}`].join(`
434
- `))}catch(t){Xt(t)}}import Qr from"axios";import h from"chalk";import{execSync as je,spawnSync as ye}from"child_process";import{createRequire as Ja}from"module";import gn from"crypto";import V from"fs";import J from"path";import ut from"os";import Ya from"adm-zip";var Ze=e=>typeof e!="string"?void 0:e.trim()||void 0,si=e=>(Ze(e?.teamId)||Ze(e?.developerTeamId)||Ze(e?.issuerId)||Ze(e?.meta?.teamId)||Ze(e?.meta?.developerTeamId)||Ze(e?.meta?.issuerId))?.toUpperCase(),ai=e=>Ze(e?.keyId)||Ze(e?.meta?.keyId),La=(e,t)=>{let n=Ze(e)?.toLowerCase().replace(/_/g,"-");return t==="development"?n==="development"||n==="dev":t==="adhoc"?["adhoc","ad-hoc","internal","staging","stage","preview"].includes(n||""):["store","app-store","appstore","production","prod"].includes(n||"")},Zr=async({storedPassword:e,tryPassword:t,requestPassword:n})=>{if(e&&await t(e))return{status:"unlocked",password:e,source:"stored"};if(await t(""))return{status:"unlocked",password:"",source:"legacy-empty"};let i=await n();return i===void 0?{status:"cancelled"}:await t(i)?{status:"unlocked",password:i,source:"prompt"}:{status:"failed"}},ci=(e,t,n)=>e?.type!=="ios_cert"||e?.platform&&e.platform!=="ios"||!Ze(e?.s3Key)||!La(e?.distributionType,n)?!1:si(e)===t.trim().toUpperCase();var Ur=(e,t,n,i,r,o)=>{let s=["sigh","renew"];return e==="development"&&s.push("--development"),e==="adhoc"&&s.push("--adhoc"),s.push("--app_identifier",t,"--provisioning_name",n,"--cert_id",i,"--force","--output_path",r,"--filename",o),s};var za=Ja(import.meta.url);Qr.defaults.proxy=!1;function hn(e,t){if(!V.existsSync(e))return;let n=V.readdirSync(e);for(let i of n){let r=J.join(e,i);if(V.statSync(r).isDirectory()){let s=hn(r,t);if(s)return s}else if(t.test(i))return r}}var Et=e=>String(e||"").trim().toLowerCase().replace(/_/g,"-"),Gr=e=>String(e||"unknown").trim().replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown",Qa=(e,t)=>`ios-certificates/${Gr(e)}/${Gr(t)}/`;function qa(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function Rt(...e){let t=e.join(`
432
+ `))}catch(n){t.stop(re.red("MACH Push setup failed.")),Xt(n)}}async function Op(e){let t=pn();try{let n=un(),i=Cn(n);if(i==="flutter")throw new Error("MACH Push currently supports Expo and bare React Native. Flutter push support is planned for a later release.");let r=Vr(n,e.iosBundle),o=Mr(n,e.androidPackage);if(!r&&!o)throw new Error(`Add ios.bundleIdentifier or android.package to ${I.configFileName}, or pass --ios-bundle/--android-package.`);let s;t.start("Checking the MACH Push app...");let l=((await W.get(`/projects/${n.projectId}/push/overview?days=1`)).data?.apps||[]).filter(S=>S.status!=="disabled").sort((S,C)=>(C.updatedAt||0)-(S.updatedAt||0)).find(S=>(!r||S.iosBundleId===r)&&(!o||S.androidPackageName===o));if(l)s=l.appId,t.stop(re.green("Existing MACH Push app linked."));else{let{data:S}=await W.post(`/projects/${n.projectId}/push/apps`,{name:e.name||n.name||"Mobile app",iosBundleId:r,androidPackageName:o});s=S.app.appId,t.stop(re.green("MACH Push app created."))}if(!s)throw new Error("MACH Push did not return a usable application.");let p=n.push,d=e.environment||p?.environment||"production",u=p?.apiUrl||Tr,f=Za(e.googleServicesFile,p?.googleServicesFile);n.push=Dr({apiUrl:u,environment:d,googleServicesFile:f}),Fr(n);let g=Wa(i,!!e.skipInstall),N=i==="expo"?jr():void 0;if(N?.startsWith('Add "'))throw new Error(N);let b={projectId:n.projectId,apiUrl:u,environment:d},P=xi(process.cwd(),i,b);if(!P.entryFile)throw new Error(P.notes[0]||"MACH could not locate the application entry point.");let _=i==="expo"?{written:[],notes:[]}:Oi(process.cwd(),{iosBundleId:r,iosEnvironment:Ua(d),googleServicesFile:f});console.log(["",re.green.bold("MACH Push basic setup is ready."),`${re.bold("Framework:")} ${i}`,`${re.bold("Client config:")} ${I.configFileName} \u2192 push`,`${re.bold("Automatic startup:")} ${P.entryFile||"manual entry import required"}`,`${re.bold("Customize callbacks:")} ${P.editableFile||"see the setup notes below"}`,"",...g.map(S=>`\u2022 ${S}`),...N?[`\u2022 ${N}`]:[],...P.notes.map(S=>`\u2022 ${S}`),..._.notes.map(S=>`\u2022 ${S}`),...[...P.written,..._.written].map(S=>`\u2022 Updated ${S}.`),"",`Next: run \`${I.nameLower} credentials\` and choose Push Notifications, then create one new native build.`].join(`
433
+ `))}catch(n){t.stop(re.red("MACH Push setup failed.")),Xt(n)}}async function fn(e,t){let n=pn();try{let{config:i,appId:r,environment:o}=await Wr(t),s;if(e==="apns"){if(!t.teamId||!t.keyId)throw new Error("APNs requires --team-id and --key-id.");let a=t.privateKey||(t.file?pe.readFileSync(_r(t.file),"utf8"):"");if(!a)throw new Error("APNs requires --file or a generated private key.");let c=t.bundleId||ze(i);if(!c)throw new Error("APNs requires --bundle-id.");s={environment:o,teamId:t.teamId,keyId:t.keyId,bundleId:c,privateKey:a}}else{let a=t.serviceAccount||(t.file?JSON.parse(pe.readFileSync(_r(t.file),"utf8")):void 0);if(!a)throw new Error("FCM requires --file or a generated service account.");s={serviceAccount:a}}n.start(`Configuring ${e.toUpperCase()}...`),await W.put(`/projects/${i.projectId}/push/apps/${r}/credentials/${e}`,s),n.stop(re.green(`${e.toUpperCase()} is ready.`))}catch(i){n.stop(re.red(`${e.toUpperCase()} setup failed.`)),Xt(i)}}async function $p(e){let t=pn(),n=!1;try{let{config:i,appId:r,environment:o}=await Wr(e),s=e.all?{all:!0,platform:e.platform}:e.token?.length?{machPushTokens:e.token}:e.user?.length?{externalUserIds:e.user}:null;if(!s)throw new Error('Choose --token, --user, or --all. Example: mach push send --all --title "Hello" --body "World"');let a;if(e.data){let d=JSON.parse(e.data);if(!d||typeof d!="object"||Array.isArray(d))throw new Error("--data must be a JSON object.");a=Object.fromEntries(Object.entries(d).map(([u,f])=>[u,String(f)]))}let c=e.badge===void 0?void 0:Number(e.badge),l=e.ttl===void 0?void 0:Number(e.ttl);t.start("Queueing notification..."),n=!0;let{data:p}=await W.post(`/projects/${i.projectId}/push/send`,{appId:r,environment:o,target:s,notification:{title:e.title,body:e.body,data:a},options:{sound:e.sound,badge:c,ttlSeconds:l,collapseKey:e.collapseKey,androidChannelId:e.androidChannelId}});t.stop(re.green(`Notification queued: ${p.requestId}`))}catch(i){n?t.stop(re.red("Notification was not queued.")):console.error(re.red("Notification was not queued.")),Xt(i)}}async function _p(e){try{let t=un(),n=Math.min(Math.max(Number(e.days||30),1),90),{data:i}=await W.get(`/projects/${t.projectId}/push/overview?days=${n}`),r=i.totals,o=r.requested>0?`${(r.accepted/r.requested*100).toFixed(1)}%`:"\u2014";console.log([`${re.bold("Active devices:")} ${i.activeDevices}`,`${re.bold("Queued requests:")} ${r.queuedRequests}`,`${re.bold("Requested:")} ${r.requested}`,`${re.bold("Provider accepted:")} ${r.accepted}`,`${re.bold("Failed:")} ${r.failed}`,`${re.bold("Retried:")} ${r.retried}`,`${re.bold("Invalid devices:")} ${r.invalidDevices}`,`${re.bold("Acceptance:")} ${o}`].join(`
434
+ `))}catch(t){Xt(t)}}import Qr from"axios";import h from"chalk";import{execSync as je,spawnSync as ye}from"child_process";import{createRequire as Ja}from"module";import mn from"crypto";import V from"fs";import J from"path";import ut from"os";import Ya from"adm-zip";var Ze=e=>typeof e!="string"?void 0:e.trim()||void 0,si=e=>(Ze(e?.teamId)||Ze(e?.developerTeamId)||Ze(e?.issuerId)||Ze(e?.meta?.teamId)||Ze(e?.meta?.developerTeamId)||Ze(e?.meta?.issuerId))?.toUpperCase(),ai=e=>Ze(e?.keyId)||Ze(e?.meta?.keyId),La=(e,t)=>{let n=Ze(e)?.toLowerCase().replace(/_/g,"-");return t==="development"?n==="development"||n==="dev":t==="adhoc"?["adhoc","ad-hoc","internal","staging","stage","preview"].includes(n||""):["store","app-store","appstore","production","prod"].includes(n||"")},Zr=async({storedPassword:e,tryPassword:t,requestPassword:n})=>{if(e&&await t(e))return{status:"unlocked",password:e,source:"stored"};if(await t(""))return{status:"unlocked",password:"",source:"legacy-empty"};let i=await n();return i===void 0?{status:"cancelled"}:await t(i)?{status:"unlocked",password:i,source:"prompt"}:{status:"failed"}},ci=(e,t,n)=>e?.type!=="ios_cert"||e?.platform&&e.platform!=="ios"||!Ze(e?.s3Key)||!La(e?.distributionType,n)?!1:si(e)===t.trim().toUpperCase();var Ur=(e,t,n,i,r,o)=>{let s=["sigh","renew"];return e==="development"&&s.push("--development"),e==="adhoc"&&s.push("--adhoc"),s.push("--app_identifier",t,"--provisioning_name",n,"--cert_id",i,"--force","--output_path",r,"--filename",o),s};var za=Ja(import.meta.url);Qr.defaults.proxy=!1;function hn(e,t){if(!V.existsSync(e))return;let n=V.readdirSync(e);for(let i of n){let r=J.join(e,i);if(V.statSync(r).isDirectory()){let s=hn(r,t);if(s)return s}else if(t.test(i))return r}}var Et=e=>String(e||"").trim().toLowerCase().replace(/_/g,"-"),Gr=e=>String(e||"unknown").trim().replace(/[^a-zA-Z0-9._-]/g,"_")||"unknown",Qa=(e,t)=>`ios-certificates/${Gr(e)}/${Gr(t)}/`;function qa(e){return"'"+e.replace(/'/g,"'\\''")+"'"}function Rt(...e){let t=e.join(`
435
435
  `).split(/\r?\n/).map(n=>n.trim()).filter(Boolean);return t.length>0?t.slice(-8).join(`
436
436
  `):void 0}function ec(e,t,n){let i=ye(e,t,{env:n,encoding:"utf-8"});if(!(i.error||i.status!==0))return(i.stdout||i.stderr||"").trim()||void 0}function tc(e,t,n,i,r=!1){let o=[`${e} match ${t}`];return n&&o.push(`--app_identifier "${n}"`),i&&o.push(`--profile_name "${i}"`),r&&(t==="adhoc"||t==="development")&&o.push("--force_for_new_devices"),o.join(" ")}function nc(e){let t=e?.match(/ruby\s+(\d+)\.(\d+)/);return t?{major:Number(t[1]),minor:Number(t[2])}:null}function ic(e,t,n){let i=nc(e);return i?i.major!==t?i.major<t:i.minor<n:!1}function li(e){let t=process.env.HOME||ut.homedir(),n=process.env.FASTLANE_GEM_HOME||J.join(t,".local/share/fastlane/3.4.0"),i=[process.env.FASTLANE_BINARY,"/usr/local/bin/fastlane","/opt/homebrew/bin/fastlane","/usr/local/Cellar/fastlane/2.227.0/libexec/bin/fastlane","/opt/homebrew/Cellar/fastlane/2.227.0/libexec/bin/fastlane",J.join(n,"bin/fastlane"),"fastlane"].filter(Boolean);for(let r of i){if(r.includes("/")&&!V.existsSync(r))continue;let o=ye(r,["--version"],{env:e,stdio:"ignore"});if(!o.error&&o.status===0)return{command:r,shellCommand:qa(r),env:e}}return null}function rc(e){if(process.env.MACH_SKIP_FASTLANE_INSTALL==="1")return{ok:!1,detail:"Automatic install skipped because MACH_SKIP_FASTLANE_INSTALL=1."};let t=ye("gem",["--version"],{env:e,encoding:"utf-8"});if(t.error||t.status!==0)return{ok:!1,detail:Rt(t.stdout,t.stderr)||"RubyGems is not available."};let n=ec("ruby",["-v"],e);if(ic(n,3,2))return{ok:!1,detail:[n?`Detected Ruby: ${n}`:void 0,"The latest fastlane dependency tree now requires Ruby >= 3.2.","Mach skipped automatic gem install because macOS system Ruby is too old for it."].filter(Boolean).join(`
437
- `)};let i=process.env.HOME||ut.homedir(),r=process.env.FASTLANE_GEM_HOME||J.join(i,".local/share/fastlane/3.4.0"),o=J.join(r,"bin");V.mkdirSync(o,{recursive:!0}),g.info(h.dim("fastlane not found. Installing fastlane into the local Mach cache..."));let s=ye("gem",["install","fastlane","--no-document","--install-dir",r,"--bindir",o],{env:{...e,GEM_HOME:r,GEM_PATH:[r,e.GEM_PATH].filter(Boolean).join(":")},encoding:"utf-8"});if(s.error||s.status!==0){let a=Rt(s.stdout,s.stderr);return g.warn(h.yellow("Automatic fastlane install failed.")),a&&g.warn(h.dim(a)),{ok:!1,detail:[n?`Detected Ruby: ${n}`:void 0,a].filter(Boolean).join(`
438
- `)||void 0}}return g.success(h.green("\u2713 fastlane installed into the local Mach cache.")),{ok:!0}}function oc(){return!process.env.CI&&process.stdin.isTTY&&process.stdout.isTTY}function sc(e){let t=ye("brew",["--version"],{env:e,encoding:"utf-8"});if(t.error||t.status!==0)return{ok:!1,detail:"Homebrew is not available on PATH."};g.info(h.dim("Installing fastlane with Homebrew..."));let n=ye("brew",["install","fastlane"],{env:e,stdio:"inherit"});return n.error||n.status!==0?{ok:!1,detail:"brew install fastlane failed."}:(g.success(h.green("\u2713 fastlane installed with Homebrew.")),{ok:!0})}async function ac(e){if(!oc())return!1;g.warn(h.yellow("fastlane is required for iOS certificate/profile sync, but it was not found.")),e&&g.info(h.dim(e));let t=await fi({message:"Install fastlane now with Homebrew?",initialValue:!0});return Z(t)?(z("Operation cancelled"),!1):!!t}async function cc(){let e=yt(),t=li(e);if(t)return t;let n=rc(e);e=yt();let i=li(e);if(i)return i;if(await ac(n.detail)){let r=sc(e);e=yt();let o=li(e);if(o)return o;throw new Error(["fastlane is required for iOS certificate/profile sync, but it was still not found after Homebrew install.",r.detail?`Homebrew install failed:
437
+ `)};let i=process.env.HOME||ut.homedir(),r=process.env.FASTLANE_GEM_HOME||J.join(i,".local/share/fastlane/3.4.0"),o=J.join(r,"bin");V.mkdirSync(o,{recursive:!0}),m.info(h.dim("fastlane not found. Installing fastlane into the local Mach cache..."));let s=ye("gem",["install","fastlane","--no-document","--install-dir",r,"--bindir",o],{env:{...e,GEM_HOME:r,GEM_PATH:[r,e.GEM_PATH].filter(Boolean).join(":")},encoding:"utf-8"});if(s.error||s.status!==0){let a=Rt(s.stdout,s.stderr);return m.warn(h.yellow("Automatic fastlane install failed.")),a&&m.warn(h.dim(a)),{ok:!1,detail:[n?`Detected Ruby: ${n}`:void 0,a].filter(Boolean).join(`
438
+ `)||void 0}}return m.success(h.green("\u2713 fastlane installed into the local Mach cache.")),{ok:!0}}function oc(){return!process.env.CI&&process.stdin.isTTY&&process.stdout.isTTY}function sc(e){let t=ye("brew",["--version"],{env:e,encoding:"utf-8"});if(t.error||t.status!==0)return{ok:!1,detail:"Homebrew is not available on PATH."};m.info(h.dim("Installing fastlane with Homebrew..."));let n=ye("brew",["install","fastlane"],{env:e,stdio:"inherit"});return n.error||n.status!==0?{ok:!1,detail:"brew install fastlane failed."}:(m.success(h.green("\u2713 fastlane installed with Homebrew.")),{ok:!0})}async function ac(e){if(!oc())return!1;m.warn(h.yellow("fastlane is required for iOS certificate/profile sync, but it was not found.")),e&&m.info(h.dim(e));let t=await fi({message:"Install fastlane now with Homebrew?",initialValue:!0});return Z(t)?(z("Operation cancelled"),!1):!!t}async function cc(){let e=yt(),t=li(e);if(t)return t;let n=rc(e);e=yt();let i=li(e);if(i)return i;if(await ac(n.detail)){let r=sc(e);e=yt();let o=li(e);if(o)return o;throw new Error(["fastlane is required for iOS certificate/profile sync, but it was still not found after Homebrew install.",r.detail?`Homebrew install failed:
439
439
  ${r.detail}`:void 0,"Try running manually: brew install fastlane","Then run mach credentials again."].filter(Boolean).join(`
440
440
  `))}throw new Error(["fastlane is required for iOS certificate/profile sync, but it was not found on PATH.",n.detail?`Automatic install failed:
441
441
  ${n.detail}`:void 0,"Recommended fix: brew install fastlane","Alternative: install Ruby 3.x, then run: gem install fastlane --no-document","Then run mach credentials again."].filter(Boolean).join(`
442
- `))}var oe=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},mi=e=>oe(e.password)||oe(e.p12Password)||oe(e.certificatePassword)||oe(e.meta?.password)||oe(e.meta?.p12Password)||oe(e.meta?.certificatePassword),qr=e=>oe(e.keystorePassword)||oe(e.storePassword)||oe(e.meta?.keystorePassword)||oe(e.meta?.storePassword),eo=e=>oe(e.keyPassword)||oe(e.meta?.keyPassword),lc=e=>oe(e.alias)||oe(e.meta?.alias),yn=e=>e.credentialId||e.id,In=e=>e.bundleId||e.bundleIdentifier||e.meta?.bundleId||e.meta?.bundleIdentifier,Ht=e=>e.distributionType||e.meta?.distributionType,Lr=e=>!!mi(e)||!!qr(e)||!!eo(e),to=async(e,t,n)=>{if(!["ios_cert","android_keystore"].includes(n.type)||Lr(n))return n;let i=In(n),r=Ht(n);if(!i||!r)return n;try{let s=(await W.get("/credentials/resolve",{params:{projectId:e,platform:t,bundleId:i,distributionType:r}})).data.credentials||[],a=yn(n),c=s.find(l=>{if(l.type!==n.type)return!1;let d=yn(l);return a&&d===a?!0:In(l)===i&&Et(Ht(l))===Et(r)&&Lr(l)});return c?{...n,...c,meta:{...n.meta,...c.meta}}:n}catch{return n}},dc=e=>{let t=Et(e);return t==="store"||t==="app-store"?"PRODUCTION":["adhoc","ad-hoc","internal","staging","stage"].includes(t)?"STAGING":"DEVELOPMENT"},no=(e,t)=>{let n=mi(e);if(n)return n;let i=dc(e.distributionType);return["IOS_P12_PASSWORD",`${I.envPrefix}P12_PASSWORD`,`IOS_P12_PASSWORD_${i}`,`P12_PASSWORD_${i}`,"MACH_P12_PASSWORD","P12_PASSWORD","CERT_PASSWORD"].map(o=>oe(t[o])).find(Boolean)||""},pc=(e,t)=>{let n=Et(e.distributionType),i=n==="store"?"PRODUCTION":["internal","adhoc","ad-hoc","staging","stage"].includes(n)?"STAGING":"DEVELOPMENT",r=["PRODUCTION","STORE","INTERNAL","STAGING","DEVELOPMENT","RELEASE","DEBUG"],o=[`KEYSTORE_PASSWORD_${i}`,`KEYSTORE_PASSWORD_${String(e.distributionType||"").toUpperCase()}`,...r.map(p=>`KEYSTORE_PASSWORD_${p}`),"ANDROID_STORE_PASSWORD","ANDROID_KEYSTORE_PASSWORD","ANDROID_KEYSTONE_PASSWORD","KEYSTORE_PASSWORD"],s=[`KEY_PASSWORD_${i}`,`KEY_PASSWORD_${String(e.distributionType||"").toUpperCase()}`,"ANDROID_KEY_PASSWORD","KEY_PASSWORD"],a=[`KEYSTORE_ALIAS_${i}`,`KEYSTORE_ALIAS_${String(e.distributionType||"").toUpperCase()}`,...r.map(p=>`KEYSTORE_ALIAS_${p}`),"ANDROID_KEY_ALIAS","KEYSTORE_ALIAS"],c=qr(e)||mi(e)||o.map(p=>oe(t[p])).find(Boolean)||"",l=eo(e)||s.map(p=>oe(t[p])).find(Boolean)||c;return{alias:lc(e)||a.map(p=>oe(t[p])).find(Boolean)||"",keystorePassword:c,keyPassword:l}},Xr=(e,t,n)=>{let i=e.includes(".")?e.replace(/\.[^.]+$/i,".zip"):`${e}.zip`,r=J.basename(e),o=new Ya;return o.addLocalFile(e,void 0,r),o.addFile(t,Buffer.from(n.endsWith(`
442
+ `))}var oe=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},gi=e=>oe(e.password)||oe(e.p12Password)||oe(e.certificatePassword)||oe(e.meta?.password)||oe(e.meta?.p12Password)||oe(e.meta?.certificatePassword),qr=e=>oe(e.keystorePassword)||oe(e.storePassword)||oe(e.meta?.keystorePassword)||oe(e.meta?.storePassword),eo=e=>oe(e.keyPassword)||oe(e.meta?.keyPassword),lc=e=>oe(e.alias)||oe(e.meta?.alias),yn=e=>e.credentialId||e.id,In=e=>e.bundleId||e.bundleIdentifier||e.meta?.bundleId||e.meta?.bundleIdentifier,Ht=e=>e.distributionType||e.meta?.distributionType,Lr=e=>!!gi(e)||!!qr(e)||!!eo(e),to=async(e,t,n)=>{if(!["ios_cert","android_keystore"].includes(n.type)||Lr(n))return n;let i=In(n),r=Ht(n);if(!i||!r)return n;try{let s=(await W.get("/credentials/resolve",{params:{projectId:e,platform:t,bundleId:i,distributionType:r}})).data.credentials||[],a=yn(n),c=s.find(l=>{if(l.type!==n.type)return!1;let p=yn(l);return a&&p===a?!0:In(l)===i&&Et(Ht(l))===Et(r)&&Lr(l)});return c?{...n,...c,meta:{...n.meta,...c.meta}}:n}catch{return n}},dc=e=>{let t=Et(e);return t==="store"||t==="app-store"?"PRODUCTION":["adhoc","ad-hoc","internal","staging","stage"].includes(t)?"STAGING":"DEVELOPMENT"},no=(e,t)=>{let n=gi(e);if(n)return n;let i=dc(e.distributionType);return["IOS_P12_PASSWORD",`${I.envPrefix}P12_PASSWORD`,`IOS_P12_PASSWORD_${i}`,`P12_PASSWORD_${i}`,"MACH_P12_PASSWORD","P12_PASSWORD","CERT_PASSWORD"].map(o=>oe(t[o])).find(Boolean)||""},pc=(e,t)=>{let n=Et(e.distributionType),i=n==="store"?"PRODUCTION":["internal","adhoc","ad-hoc","staging","stage"].includes(n)?"STAGING":"DEVELOPMENT",r=["PRODUCTION","STORE","INTERNAL","STAGING","DEVELOPMENT","RELEASE","DEBUG"],o=[`KEYSTORE_PASSWORD_${i}`,`KEYSTORE_PASSWORD_${String(e.distributionType||"").toUpperCase()}`,...r.map(d=>`KEYSTORE_PASSWORD_${d}`),"ANDROID_STORE_PASSWORD","ANDROID_KEYSTORE_PASSWORD","ANDROID_KEYSTONE_PASSWORD","KEYSTORE_PASSWORD"],s=[`KEY_PASSWORD_${i}`,`KEY_PASSWORD_${String(e.distributionType||"").toUpperCase()}`,"ANDROID_KEY_PASSWORD","KEY_PASSWORD"],a=[`KEYSTORE_ALIAS_${i}`,`KEYSTORE_ALIAS_${String(e.distributionType||"").toUpperCase()}`,...r.map(d=>`KEYSTORE_ALIAS_${d}`),"ANDROID_KEY_ALIAS","KEYSTORE_ALIAS"],c=qr(e)||gi(e)||o.map(d=>oe(t[d])).find(Boolean)||"",l=eo(e)||s.map(d=>oe(t[d])).find(Boolean)||c;return{alias:lc(e)||a.map(d=>oe(t[d])).find(Boolean)||"",keystorePassword:c,keyPassword:l}},Xr=(e,t,n)=>{let i=e.includes(".")?e.replace(/\.[^.]+$/i,".zip"):`${e}.zip`,r=J.basename(e),o=new Ya;return o.addLocalFile(e,void 0,r),o.addFile(t,Buffer.from(n.endsWith(`
443
443
  `)?n:`${n}
444
- `,"utf8")),o.writeZip(i),i},uc=e=>{let t=e.toLowerCase();return t==="production"||t==="prod"||t.includes("store")||t.endsWith("-production")||t.endsWith("-prod")},fc=(e,t)=>{let n=gt(e,t)||{},i=Et(n.distribution),r=Et(n.environment);return i==="store"||r==="production"||r==="store"||uc(t)?"store":"internal"},mc=["development","preview","production"],gc="U27F4V844T",di=null;function Sn(){return di||(di=za("@expo/apple-utils")),di}function Hr(e){let t=n=>n.replace(/^.*The password is only used to authenticate with Apple and never stored on Expo servers.*(?:\r?\n)?/gm,"").replace(/^.*Learn more\..*(?:\r?\n)?/gm,"");if(typeof e=="string")return t(e);if(Buffer.isBuffer(e)){let n=e.toString("utf-8"),i=t(n);return i===n?e:Buffer.from(i,"utf-8")}return e}async function hc(e){let t=process.stdout.write.bind(process.stdout),n=process.stderr.write.bind(process.stderr);process.stdout.write=(i,...r)=>t(Hr(i),...r),process.stderr.write=(i,...r)=>n(Hr(i),...r);try{return await e()}finally{process.stdout.write=t,process.stderr.write=n}}function io(e){return V.existsSync(J.resolve(e))?void 0:"File not found"}function yc(){try{let e=`./${I.configFileName}`;return V.existsSync(e)?JSON.parse(V.readFileSync(e,"utf-8")):{}}catch{return{}}}function Ic(e,t){let n=String(e.name||t||"Mobile app").trim().replace(/\s+/g," ")||"Mobile app",i=new Date,r=[i.getFullYear(),String(i.getMonth()+1).padStart(2,"0"),String(i.getDate()).padStart(2,"0")].join(""),o=gn.randomBytes(2).toString("hex").toUpperCase(),s=` ${r}-${o}`;return`${`MACH Push ${n}`.slice(0,Math.max(1,50-s.length))}${s}`}async function Ac(e){let t=e.submit?.production?.ios?.appleId||e.submit?.preview?.ios?.appleId||e.submit?.development?.ios?.appleId,n=await Oe({message:"Apple ID (for Apple Developer Portal):",initialValue:t,validate:i=>i.includes("@")?void 0:"Enter a valid Apple ID email"});return Z(n)&&(z("Operation cancelled"),process.exit(0)),n}async function Sc(e){let t=await pt({message:`Apple password for ${e} (used only for Apple login, not stored):`,validate:n=>n.trim()?void 0:"Password is required"});return Z(t)&&(z("Operation cancelled"),process.exit(0)),t}function bc(e){return(Array.isArray(e?.services)?e.services:[]).some(n=>n?.id===gc||/apple push notification|apns/i.test(String(n?.name||"")))}async function Cc(e){let{Keys:t}=Sn(),n=it();try{n.start("Fetching existing APNs keys from Apple...");let i=await t.getKeysAsync(e),o=(await Promise.all(i.map(async s=>{try{return await t.getKeyInfoAsync(e,{id:s.id})}catch{return s}}))).filter(bc);return n.stop(h.green(`Found ${o.length} APNs key${o.length===1?"":"s"}.`)),o}catch(i){throw n.stop(h.red("Could not fetch APNs keys from Apple.")),i}}async function wc(e){let{Keys:t}=Sn(),i=(await Cc(e)).filter(c=>c.canRevoke!==!1);if(i.length===0)return g.warn(h.yellow("No revokable APNs keys were found for this Apple team.")),!1;let r=await Ie({message:"Select an APNs key to revoke:",options:i.map(c=>({value:c.id,label:`${c.name||"Untitled APNs key"} (${c.id})`,hint:c.canDownload?"APNs key, private key may still be downloadable":"APNs key"}))});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=i.find(c=>c.id===r);g.warn(h.yellow("Revoking this key can break push notifications for any service currently using it."));let s=await fi({message:`Revoke "${o?.name||"Untitled APNs key"}" (${r})? This cannot be undone.`,initialValue:!1});if(Z(s)&&(z("Operation cancelled"),process.exit(0)),!s)return g.info(h.dim("APNs key was not revoked.")),!1;let a=it();try{return a.start(`Revoking APNs key ${r}...`),await t.revokeKeyAsync(e,{id:r}),a.stop(h.green(`Revoked APNs key ${r}.`)),!0}catch(c){throw a.stop(h.red(`Could not revoke APNs key ${r}.`)),c}}async function vc(e,t){let{Keys:n}=Sn(),i=0;for(;;){let r=t(),o=it();try{o.start(`Creating APNs auth key (${r})...`);let s=await n.createKeyAsync(e,{name:r,isApns:!0});o.message("Downloading APNs private key...");let a=await n.downloadKeyAsync(e,{id:s.id});if(!a)throw new Error("Apple did not return the APNs private key.");return o.stop(h.green(`APNs key generated: ${s.id}`)),{keyId:s.id,keyName:r,privateKey:a}}catch(s){if(o.stop(h.red("APNs key generation failed.")),Ec(s)&&i<3){i+=1,g.warn(h.yellow("Apple says that APNs key name already exists. Retrying with a new generated name..."));continue}if(!ro(s))throw s;oo(s);let a=await Ie({message:"Apple APNs key limit reached. What do you want to do?",options:[{value:"revoke",label:"List and revoke an existing APNs key",hint:"Then Mach will create a new key"},{value:"retry",label:"Try creating again"},{value:"exit",label:"Exit"}]});if((Z(a)||a==="exit")&&(z("Operation cancelled"),process.exit(0)),a==="revoke"&&await wc(e))continue}}}async function Pc(e,t){let n=await Ac(e);try{let i=await Sc(n),{Auth:r}=Sn();g.info(h.dim("Signing in to Apple Developer Portal..."));let o=await hc(()=>r.loginAsync({username:n,password:i},{autoResolveProvider:!0})),s=String(o?.context?.teamId||"").trim().toUpperCase(),a=await vc(o.context,()=>Ic(e,t));return{keyId:a.keyId,teamId:s,privateKey:a.privateKey}}catch(i){throw g.error(h.red("APNs key generation failed.")),i}}function ro(e){let t=[e?.message,e?.response?.data,e?.cause?.message].filter(Boolean).join(`
444
+ `,"utf8")),o.writeZip(i),i},uc=e=>{let t=e.toLowerCase();return t==="production"||t==="prod"||t.includes("store")||t.endsWith("-production")||t.endsWith("-prod")},fc=(e,t)=>{let n=mt(e,t)||{},i=Et(n.distribution),r=Et(n.environment);return i==="store"||r==="production"||r==="store"||uc(t)?"store":"internal"},gc=["development","preview","production"],mc="U27F4V844T",di=null;function Sn(){return di||(di=za("@expo/apple-utils")),di}function Hr(e){let t=n=>n.replace(/^.*The password is only used to authenticate with Apple and never stored on Expo servers.*(?:\r?\n)?/gm,"").replace(/^.*Learn more\..*(?:\r?\n)?/gm,"");if(typeof e=="string")return t(e);if(Buffer.isBuffer(e)){let n=e.toString("utf-8"),i=t(n);return i===n?e:Buffer.from(i,"utf-8")}return e}async function hc(e){let t=process.stdout.write.bind(process.stdout),n=process.stderr.write.bind(process.stderr);process.stdout.write=(i,...r)=>t(Hr(i),...r),process.stderr.write=(i,...r)=>n(Hr(i),...r);try{return await e()}finally{process.stdout.write=t,process.stderr.write=n}}function io(e){return V.existsSync(J.resolve(e))?void 0:"File not found"}function yc(){try{let e=`./${I.configFileName}`;return V.existsSync(e)?JSON.parse(V.readFileSync(e,"utf-8")):{}}catch{return{}}}function Ic(e,t){let n=String(e.name||t||"Mobile app").trim().replace(/\s+/g," ")||"Mobile app",i=new Date,r=[i.getFullYear(),String(i.getMonth()+1).padStart(2,"0"),String(i.getDate()).padStart(2,"0")].join(""),o=mn.randomBytes(2).toString("hex").toUpperCase(),s=` ${r}-${o}`;return`${`MACH Push ${n}`.slice(0,Math.max(1,50-s.length))}${s}`}async function Ac(e){let t=e.submit?.production?.ios?.appleId||e.submit?.preview?.ios?.appleId||e.submit?.development?.ios?.appleId,n=await Oe({message:"Apple ID (for Apple Developer Portal):",initialValue:t,validate:i=>i.includes("@")?void 0:"Enter a valid Apple ID email"});return Z(n)&&(z("Operation cancelled"),process.exit(0)),n}async function Sc(e){let t=await pt({message:`Apple password for ${e} (used only for Apple login, not stored):`,validate:n=>n.trim()?void 0:"Password is required"});return Z(t)&&(z("Operation cancelled"),process.exit(0)),t}function bc(e){return(Array.isArray(e?.services)?e.services:[]).some(n=>n?.id===mc||/apple push notification|apns/i.test(String(n?.name||"")))}async function Cc(e){let{Keys:t}=Sn(),n=it();try{n.start("Fetching existing APNs keys from Apple...");let i=await t.getKeysAsync(e),o=(await Promise.all(i.map(async s=>{try{return await t.getKeyInfoAsync(e,{id:s.id})}catch{return s}}))).filter(bc);return n.stop(h.green(`Found ${o.length} APNs key${o.length===1?"":"s"}.`)),o}catch(i){throw n.stop(h.red("Could not fetch APNs keys from Apple.")),i}}async function wc(e){let{Keys:t}=Sn(),i=(await Cc(e)).filter(c=>c.canRevoke!==!1);if(i.length===0)return m.warn(h.yellow("No revokable APNs keys were found for this Apple team.")),!1;let r=await Ie({message:"Select an APNs key to revoke:",options:i.map(c=>({value:c.id,label:`${c.name||"Untitled APNs key"} (${c.id})`,hint:c.canDownload?"APNs key, private key may still be downloadable":"APNs key"}))});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=i.find(c=>c.id===r);m.warn(h.yellow("Revoking this key can break push notifications for any service currently using it."));let s=await fi({message:`Revoke "${o?.name||"Untitled APNs key"}" (${r})? This cannot be undone.`,initialValue:!1});if(Z(s)&&(z("Operation cancelled"),process.exit(0)),!s)return m.info(h.dim("APNs key was not revoked.")),!1;let a=it();try{return a.start(`Revoking APNs key ${r}...`),await t.revokeKeyAsync(e,{id:r}),a.stop(h.green(`Revoked APNs key ${r}.`)),!0}catch(c){throw a.stop(h.red(`Could not revoke APNs key ${r}.`)),c}}async function vc(e,t){let{Keys:n}=Sn(),i=0;for(;;){let r=t(),o=it();try{o.start(`Creating APNs auth key (${r})...`);let s=await n.createKeyAsync(e,{name:r,isApns:!0});o.message("Downloading APNs private key...");let a=await n.downloadKeyAsync(e,{id:s.id});if(!a)throw new Error("Apple did not return the APNs private key.");return o.stop(h.green(`APNs key generated: ${s.id}`)),{keyId:s.id,keyName:r,privateKey:a}}catch(s){if(o.stop(h.red("APNs key generation failed.")),Ec(s)&&i<3){i+=1,m.warn(h.yellow("Apple says that APNs key name already exists. Retrying with a new generated name..."));continue}if(!ro(s))throw s;oo(s);let a=await Ie({message:"Apple APNs key limit reached. What do you want to do?",options:[{value:"revoke",label:"List and revoke an existing APNs key",hint:"Then Mach will create a new key"},{value:"retry",label:"Try creating again"},{value:"exit",label:"Exit"}]});if((Z(a)||a==="exit")&&(z("Operation cancelled"),process.exit(0)),a==="revoke"&&await wc(e))continue}}}async function Pc(e,t){let n=await Ac(e);try{let i=await Sc(n),{Auth:r}=Sn();m.info(h.dim("Signing in to Apple Developer Portal..."));let o=await hc(()=>r.loginAsync({username:n,password:i},{autoResolveProvider:!0})),s=String(o?.context?.teamId||"").trim().toUpperCase(),a=await vc(o.context,()=>Ic(e,t));return{keyId:a.keyId,teamId:s,privateKey:a.privateKey}}catch(i){throw m.error(h.red("APNs key generation failed.")),i}}function ro(e){let t=[e?.message,e?.response?.data,e?.cause?.message].filter(Boolean).join(`
445
445
  `);return/maximum allowed number.*keys/i.test(t)||/already reached the maximum/i.test(t)}function Ec(e){let t=[e?.message,e?.response?.data,e?.cause?.message].filter(Boolean).join(`
446
- `);return/another key with same name exists/i.test(t)||/same name already exists/i.test(t)}function oo(e){if(g.warn(h.yellow(e?.message||"Could not generate APNs key automatically.")),ro(e)){g.info(h.dim("Apple rejected the request because this team is already at its APNs auth-key limit.")),g.info(h.dim("If you saved an existing .p8 file, upload it here. If not, delete an unused APNs key in Apple Developer, then generate again.")),g.info(h.dim("Apple only lets you download an APNs .p8 private key when the key is first created."));return}g.info(h.dim("You can upload an existing .p8 key, retry generation, or exit and try again later."))}async function pi(){let e=await Ie({message:"Where should Mach save this APNs key?",options:[{value:"all",label:"All environments",hint:"Recommended \u2014 one APNs key works for sandbox and production"},{value:"development",label:"Development only"},{value:"preview",label:"Preview only"},{value:"production",label:"Production only"}]});return Z(e)&&(z("Operation cancelled"),process.exit(0)),e==="all"?mc:[e]}async function Rc(e,t,n,i){let r=i.teamId||e.teamId;if(!r){let o=await Oe({message:"Apple Team ID:",validate:s=>/^[A-Z0-9]{10}$/i.test(s.trim())?void 0:"Team ID must be exactly 10 letters/numbers"});Z(o)&&(z("Operation cancelled"),process.exit(0)),r=o.trim().toUpperCase()}for(let o of t)await fn("apns",{...e,environment:o,privateKey:i.privateKey,teamId:r,keyId:i.keyId,bundleId:n})}async function Kr(e,t,n){let i=await Oe({message:"Path to APNs auth key (.p8):",validate:io});Z(i)&&(z("Operation cancelled"),process.exit(0));let r=await Oe({message:"Apple Team ID:",initialValue:e.teamId,validate:s=>s.trim()?void 0:"Team ID is required"});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=await Oe({message:"APNs Key ID:",initialValue:e.keyId,validate:s=>s.trim()?void 0:"Key ID is required"});Z(o)&&(z("Operation cancelled"),process.exit(0));for(let s of t)await fn("apns",{...e,environment:s,file:i,teamId:r,keyId:o,bundleId:n})}async function Nc(e){let t=yc(),n=e.bundleId||ze(t)||t.push?.iosBundleId;for(;;){let i=await Ie({message:"How do you want to configure APNs?",options:[{value:"generate",label:"Generate new APNs key with Apple",hint:"Mach creates, downloads once, and uploads it securely"},{value:"upload",label:"Upload existing .p8 key",hint:"Use a key you already downloaded from Apple"}]});if(Z(i)&&(z("Operation cancelled"),process.exit(0)),i==="upload"){let r=await pi();await Kr(e,r,n);return}try{let r=await Pc(t,n),o=await pi();await Rc(e,o,n,r);return}catch(r){oo(r);let o=await Ie({message:"APNs key was not created. What do you want to do?",options:[{value:"upload",label:"Upload existing .p8 key"},{value:"retry",label:"Try generating again"},{value:"exit",label:"Exit"}]});if((Z(o)||o==="exit")&&(z("Operation cancelled"),process.exit(0)),o==="upload"){let s=await pi();await Kr(e,s,n);return}}}}async function xc(e){let t=await Oe({message:"Path to Firebase service account JSON:",validate:io});Z(t)&&(z("Operation cancelled"),process.exit(0));let n;try{n=JSON.parse(V.readFileSync(t,"utf8"))}catch(i){z(`Invalid Firebase service account JSON: ${i.message}`),process.exit(1)}await fn("fcm",{...e,serviceAccount:n})}async function kc(e,t){if(t==="ios"){await Nc(e);return}await xc(e)}function Oc(e,t,n){let i=V.readFileSync(n,"utf8"),r=Math.floor(Date.now()/1e3),o=Buffer.from(JSON.stringify({alg:"ES256",kid:e,typ:"JWT"})).toString("base64url"),s=Buffer.from(JSON.stringify({iss:t,iat:r,exp:r+1200,aud:"appstoreconnect-v1"})).toString("base64url"),a=`${o}.${s}`,c=gn.createSign("SHA256");c.update(a);let l=c.sign({key:i,dsaEncoding:"ieee-p1363"}).toString("base64url");return`${a}.${l}`}async function $c(e,t,n,i){let r=Oc(t,n,i),o=(await import("axios")).default;for(let s of e)try{await o.post("https://api.appstoreconnect.apple.com/v1/devices",{data:{type:"devices",attributes:{name:s.name,udid:s.udid,platform:"IOS"}}},{headers:{Authorization:`Bearer ${r}`,"Content-Type":"application/json"}}),g.info(h.dim(` \u2713 Registered: ${s.name}`))}catch(a){let c=a.response?.data?.errors;c?.some(d=>d.code==="ENTITY_ERROR.ATTRIBUTE.INVALID.DUPLICATE"||d.detail?.toLowerCase().includes("already registered")||d.detail?.toLowerCase().includes("already exists"))?g.info(h.dim(` Already on Portal: ${s.name}`)):g.warn(h.yellow(` Could not register ${s.name}: ${c?.[0]?.detail||a.message}`))}}var _c=async e=>{Xa(h.bgCyan.black(I.cliTag("Credentials")));let t=await Ie({message:"Select platform:",options:[{value:"ios",label:"iOS"},{value:"android",label:"Android"}]});Z(t)&&(z("Operation cancelled"),process.exit(0));let n=await Ie({message:"What do you want to do?",options:[{value:"setup",label:"Build Credentials (Certs/Profiles)",hint:"Manage everything needed to build your project"},{value:"download",label:"Download credentials (credentials.json)",hint:"Sync credentials from Dashboard to local project"},{value:"service",label:"App Store Connect API Key (Magic)",hint:"Manage your API Key for automated submission"},{value:"push",label:"Push Notifications",hint:t==="ios"?"Upload APNs key":"Upload Firebase service account"},{value:"back",label:"Go back"},{value:"exit",label:"Exit"}].filter(i=>(t==="android"&&i.value==="service"&&(i.label="Google Service Account (JSON)"),!0))});if((Z(n)||n==="exit")&&(z("Operation cancelled"),process.exit(0)),n==="back")return _c(e);n==="setup"?await Tc({...e,platform:t}):n==="download"?await Jc({...e,platform:t}):n==="service"?await Ri({...e,platform:t}):n==="push"&&await kc(e,t),Ha(h.green("Done!"))},Tc=async e=>{let t=it(),n=e.platform,i=e.profile,r=e.credentialType;if(r&&!Tt(r)){g.error("Credential type must be development, adhoc, or store.");return}if(!i&&r){let c=Tt(r);i=c==="store"?"production":c==="adhoc"?"staging":"development"}if(!i){let c=await Ie({message:"Select credential type:",options:[{value:"development",label:"Development",hint:"Local testing & simulators"},{value:"staging",label:"Ad Hoc / Staging",hint:"Internal distribution & device testing"},{value:"production",label:"Production / App Store",hint:"App Store & Play Store submission"}]});Z(c)&&(z("Operation cancelled"),process.exit(0)),i=c,r=c==="production"?"store":c==="staging"?"adhoc":"development"}let o=`./${I.configFileName}`;if(!V.existsSync(o)){g.error(`No ${I.configFileName} found. Run \`${I.nameLower} init\` or \`${I.nameLower} link\` first.`);return}let s=JSON.parse(V.readFileSync(o,"utf-8")),{projectId:a}=s;if(!a){g.error(`${I.configFileName} is missing projectId.`);return}if(e.awsProfile&&g.warn(h.yellow(`Ignoring --aws-profile. Authenticating with ${I.name} Cloud...`)),g.info(h.dim(`Setting up credentials for: ${i}`)),n==="ios")await Fc(a,i,e,s,r);else{let c=fc(s,i);await Kc(a,i,c,e,s)}};async function Fc(e,t,n,i,r){let o=n.bundleId;if(!o){let l=i.submit?.[t]?.ios?.bundleIdentifier||i.submit?.[t]?.ios?.bundleId||ze(i,t),d=[];try{let u=(await W.get(`/credentials/${e}`)).data.credentials||[];d=[...new Set(u.filter(f=>f.platform==="ios"&&f.bundleId&&f.bundleId!=="*").map(f=>f.bundleId))]}catch{}if(l&&!d.includes(l)&&d.unshift(l),d.length>0){let p=[...d.map(f=>({value:f,label:f,hint:f===l?"from config":void 0})),{value:"__new__",label:"+ Enter a new Bundle ID"}],u=await Ie({message:"Which Bundle ID are you setting up credentials for?",options:p});if(Z(u)&&(z("Operation cancelled"),process.exit(0)),u==="__new__"){let f=await Oe({message:"iOS Bundle ID (e.g. com.example.app):",placeholder:"com.example.app",validate:m=>m.includes(".")?void 0:"Please enter a valid Bundle ID"});Z(f)&&(z("Operation cancelled"),process.exit(0)),o=f}else o=u}else{let p=await Oe({message:"iOS Bundle ID (e.g. com.example.app):",placeholder:"com.example.app",validate:u=>u.includes(".")?void 0:"Please enter a valid Bundle ID"});Z(p)&&(z("Operation cancelled"),process.exit(0)),o=p}}g.info(h.dim(`Bundle ID: ${o}`));let s=Ii({buildProfile:t,profile:gt(i,t)||{},requestedCredentialType:r});g.info(h.dim(`Credential storage type: ${s}`));let a=i.submit?.production?.ios?.appleId;a&&g.info(h.dim(`Using Apple ID from config: ${a}`)),await Hc(e,o,t,s,s==="store"?"appstore":s==="adhoc"?"adhoc":"development",n,i,a)}var gi=e=>oe(e.expiresAt)||oe(e.expires)||oe(e.expirationDate)||oe(e.meta?.expiresAt)||oe(e.meta?.expires),Dc=e=>{let t=Tt(Ht(e));return t==="development"?"Development":t==="adhoc"?"Ad Hoc":t==="store"?"App Store":Ht(e)||"Unknown signing type"},Bc=e=>{let t=e.credential,n=In(t)||"all apps",i=Dc(t),r=gi(t);return[e.projectName,i,n,r?`expires ${r}`:void 0].filter(Boolean).join(" \xB7 ")},Kt=e=>e==="development"?"Apple Development":"Apple Distribution",so=e=>e==="development"?"Development":e==="adhoc"?"Ad Hoc":"App Store",hi=e=>{let t=gi(e);if(!t)return!1;let n=Date.parse(t);return Number.isFinite(n)&&n<=Date.now()},Vc=(e,t,n,i)=>{if(e?.type!=="ios_profile"||e?.platform&&e.platform!=="ios"||!oe(e?.s3Key)||hi(e)||In(e)!==n||Tt(Ht(e))!==(i==="appstore"?"store":i))return!1;let o=si(e);return!o||o===t.trim().toUpperCase()},Mc=e=>oe(e?.certificateSha1)||oe(e?.meta?.certificateSha1),jc=e=>{let t=e?.profileCertificateSha1s??e?.meta?.profileCertificateSha1s;return Array.isArray(t)?t.filter(n=>typeof n=="string").map(n=>n.replace(/[^a-fA-F0-9]/g,"").toUpperCase()).filter(Boolean):[]},Wc=(e,t)=>{let n=Mc(t)?.replace(/[^a-fA-F0-9]/g,"").toUpperCase();return!!n&&jc(e).includes(n)};async function Zc(e,t,n,i){let o=(await W.get(`/credentials/${e}`)).data.credentials||[],s=o.filter(c=>ci(c,t,i)&&!hi(c)).map(c=>({projectId:e,projectName:"This project",credential:c,certificateId:ai(c),teamId:t})),a=o.filter(c=>Vc(c,t,n,i));return{certificates:s,profiles:a}}async function Jr(e,t,n){let r=((await W.get("/projects")).data.projects||[]).filter(a=>a.projectId!==n),o=(await Promise.all(r.map(async a=>{if(!a.projectId)return[];try{return((await W.get(`/credentials/${a.projectId}`)).data.credentials||[]).filter(d=>ci(d,e,t)&&!hi(d)).map(d=>({projectId:a.projectId,projectName:a.name||a.slug||a.projectId,credential:d,certificateId:ai(d),teamId:e}))}catch{return[]}}))).flat(),s=new Map;for(let a of o){let c=`${a.projectId}:${a.certificateId||yn(a.credential)}`,l=s.get(c);(!l||String(a.credential.createdAt||"")>String(l.credential.createdAt||""))&&s.set(c,a)}return[...s.values()]}var ui=e=>String(e||"").replace(/[^a-zA-Z0-9]/g,"").toUpperCase();async function Uc(e,t,n,i,r,o){let s=await An(r,i,o);if(s.length===0)throw new Error(`No active ${Kt(i)} certificates were returned by the Apple Developer Portal.`);let a=Lt(t,n),c=new Set(a.map(u=>u.serial)),l=s.filter(u=>c.has(ui(u.serial)));if(e.certificateId){let u=s.find(f=>f.id===e.certificateId);if(u&&c.has(ui(u.serial)))return u.id;if(u&&l.length===1)return g.warn(h.yellow("The saved Apple certificate ID is stale. Mach matched the selected P12 to the active portal certificate by serial number instead.")),l[0].id}if(l.length===1)return g.info(h.dim(`Matched the selected saved P12 to Apple certificate ${l[0].name||l[0].id}.`)),l[0].id;if(l.length===0)throw new Error("The selected .p12 does not contain an active certificate returned by the Apple Developer Portal. Mach will not create a profile with a different certificate; choose another P12 or create a new Apple certificate.");let d=Kt(i);g.warn(h.yellow("The selected P12 contains multiple active Apple certificates. Select the exact certificate to use below."));let p=await Ie({message:`Which ${d} certificate matches the selected saved P12?`,options:[...l.map(u=>({value:u.id,label:[u.name||`${d} certificate`,u.expires].filter(Boolean).join(" \xB7 "),hint:u.serial?`serial ${u.serial}`:void 0})),{value:"cancel",label:"Cancel"}]});if(!(Z(p)||p==="cancel"))return p}async function Gc(e,t,n){let i="";for(let o=1;o<=5;o++)try{let s=await W.get(`/credentials/${t}/download`,{params:{projectId:e,format:"proxy"},responseType:"arraybuffer"});V.writeFileSync(n,Buffer.from(s.data));return}catch(s){if(i=s?.response?.data?.message||s?.message||String(s),!co(i)||o>=5)break;let c=Math.min(15e3,1e3*Math.pow(2,o-1));g.warn(h.yellow(`Certificate download was interrupted (${i}). Retrying with a fresh secure link in ${Math.round(c/1e3)}s\u2026 (${o}/5)`)),await ao(c)}throw new Error(`Could not download the saved Mach certificate after 5 attempts: ${i||"Unknown network error"}`)}async function Lc({targetProjectId:e,targetBundleId:t,targetDistributionType:n,matchType:i,candidate:r,fastlane:o,matchEnv:s,keychainPath:a,keychainPassword:c,teamMeta:l}){let d=await to(r.projectId,"ios",r.credential),p=no(d,{})||void 0,u=V.mkdtempSync(J.join(ut.tmpdir(),`${I.nameLower}-reuse-cert-`)),f=J.join(u,"selected-signing-certificate.p12"),m=`${I.nameLower} ${i} ${t}`,N=`${I.nameLower}-${i}-${Date.now()}.mobileprovision`;try{g.info(h.dim(`Downloading the selected certificate from ${r.projectName}\u2026`));let b=yn(d);if(!b)throw new Error("The selected Mach certificate no longer has a credential ID.");await Gc(r.projectId,b,f),g.info(h.dim("Importing the selected certificate into Mach\u2019s team keychain\u2026"));let P=F=>ye("security",["import",f,"-k",a,"-P",F,"-T","/usr/bin/codesign"],{encoding:"utf-8"}),_,S=await Zr({storedPassword:p,tryPassword:F=>(F===""&&p&&g.warn(h.dim("Saved P12 did not unlock with its stored password; trying the legacy empty-password format\u2026")),_=P(F),!_.error&&_.status===0),requestPassword:async()=>{g.warn(h.yellow("This saved P12 is password protected, but Mach does not have its password."));let F=await pt({message:`P12 password for ${r.projectName}'s saved certificate:`,validate:te=>te.length>0?void 0:"The certificate password is required"});return Z(F)?void 0:F}});if(S.status==="cancelled")return!1;if(S.status==="failed")throw new Error(Rt(_?.stdout,_?.stderr)||"Could not import the selected .p12 certificate. Check its password.");let C=S.password,v=ye("security",["set-key-partition-list","-S","apple-tool:,apple:,codesign:","-s","-k",c,a],{encoding:"utf-8"});if(v.error||v.status!==0)throw new Error(Rt(v.stdout,v.stderr)||"Could not grant codesign access to the imported certificate.");let L=await Uc(r,f,C,i,s,o.shellCommand);if(!L)return!1;g.info(h.blue(`Creating a new ${so(i)} profile for ${t}\u2026`));let B=ye(o.command,Ur(i,t,m,L,u,N),{cwd:process.cwd(),env:s,stdio:"inherit"});if(B.error||B.status!==0)throw new Error("Apple could not create the provisioning profile with the selected certificate.");let k=hn(u,/\.mobileprovision$/);if(!k)throw new Error("The new provisioning profile was not produced by fastlane.");let T=Ct(k);sn(T,{bundleIdentifier:t,teamId:l.teamId,distributionType:n});let H=on(Lt(f,C),T),R={certificateSha1:H.sha1,certificateSha256:H.sha256,certificateSerial:H.serial,profileCertificateSha1s:T.certificateSha1s,profileCertificateSha256s:T.certificateSha256s},U=gi(d);return await nt(e,f,"ios_cert",t,n,void 0,U,l.teamId,L,C,void 0,void 0,l.teamId,l.teamName,l.developerTeamId||l.teamId,l.appStoreConnectTeamId,l.providerId,l.providerName,R),await nt(e,k,"ios_profile",t,n,void 0,void 0,l.teamId,void 0,void 0,void 0,void 0,l.teamId,l.teamName,l.developerTeamId||l.teamId,l.appStoreConnectTeamId,l.providerId,l.providerName,R),g.success(h.green(`\u2713 Reused the saved certificate and created credentials for ${t}.`)),!0}finally{try{V.rmSync(u,{recursive:!0,force:!0})}catch{}}}async function mn({savedCertificates:e,targetProjectId:t,targetBundleId:n,targetDistributionType:i,matchType:r,fastlane:o,matchEnv:s,keychainPath:a,keychainPassword:c,teamMeta:l}){let d=Kt(r),p=await Ie({message:`Select a saved ${d} certificate to reuse:`,options:[...e.map((f,m)=>({value:String(m),label:Bc(f),hint:f.certificateId?`Apple Team ${f.teamId}`:`Apple Team ${f.teamId} \xB7 legacy record; Apple certificate matching may be requested`})),{value:"cancel",label:"Cancel"}]});if(Z(p)||p==="cancel")return!1;let u=e[Number(p)];if(!u)throw new Error("The selected saved certificate is no longer available.");return Lc({targetProjectId:t,targetBundleId:n,targetDistributionType:i,matchType:r,candidate:u,fastlane:o,matchEnv:s,keychainPath:a,keychainPassword:c,teamMeta:l})}async function Xc(e){let t="MATCH_ENCRYPTION_PASSPHRASE";try{let s=((await W.get(`/projects/${e}/secrets/export?env=development`)).data.secrets||{})[t];if(s&&!s.includes("[Decryption Failed]"))return g.info(h.dim("Using existing encryption passphrase from Dashboard")),s;if(s&&s.includes("[Decryption Failed]")){g.warn(h.yellow("\u26A0\uFE0F Existing MATCH_PASSWORD could not be decrypted (encryption key changed).")),g.info(h.dim("Generating a fresh passphrase and cleaning old certificates..."));let a=gn.randomBytes(32).toString("base64");try{await W.post(`/projects/${e}/secrets`,{key:t,value:a,type:"managed",description:"Encryption passphrase for iOS certificates (fastlane match)",visibility:"secret"}),g.success(h.green("\u2713 New encryption passphrase generated and saved"))}catch{}try{await W.post("/credentials/clean-match-storage",{projectId:e}),g.success(h.green("\u2713 Cleaned old certificates from storage"))}catch{}return a}}catch(r){g.info(h.dim(`Could not fetch existing passphrase from Dashboard: ${r.message}`))}let n=await Ie({message:"No active encryption passphrase found on Dashboard. What would you like to do?",options:[{value:"generate",label:"Generate a new secure passphrase",hint:"Safe for first-time setup"},{value:"enter",label:"Enter existing passphrase manually",hint:"Required if you already have certs in S3"},{value:"cancel",label:"Cancel",hint:"Quit"}]});if((Z(n)||n==="cancel")&&(z("Operation cancelled"),process.exit(0)),n==="enter"){let r=await pt({message:"Enter your MATCH_PASSWORD (encryption passphrase):",validate:s=>s.length>0?void 0:"Passphrase is required"});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=r;try{await W.post(`/projects/${e}/secrets`,{key:t,value:o,type:"managed",description:"Encryption passphrase for iOS certificates (fastlane match)"}),g.success(h.green("\u2713 Saved passphrase to Dashboard"))}catch{}return o}let i=gn.randomBytes(32).toString("base64");try{await W.post(`/projects/${e}/secrets`,{key:t,value:i,type:"managed",description:"Encryption passphrase for iOS certificates (fastlane match)",visibility:"secret"}),g.success(h.green("\u2713 Generated and saved encryption passphrase to Dashboard"))}catch(r){g.warn(h.yellow(`Could not save passphrase to Dashboard: ${r.message}`))}return i}async function Hc(e,t,n,i,r,o,s,a){let c=it(),l=!1,d=b=>{c.start(b),l=!0},p=b=>{l&&(c.stop(b),l=!1)};g.info(h.blue("Configuring iOS certificate management..."));let u,f,m=Ft(s,n),N=m;if(!a){let b=await Oe({message:"Apple ID (for Apple Developer Portal):",placeholder:"your-email@example.com",validate:P=>P.includes("@")?void 0:"Please enter a valid email"});Z(b)&&(z("Operation cancelled"),process.exit(0)),a=b}try{let b=await Xc(e),P="",_="";try{let R=await W.post("/credentials/build-server-token",{projectId:e});R.data.status==="success"&&R.data.credentials&&(process.env.AWS_ACCESS_KEY_ID=R.data.credentials.accessKeyId,process.env.AWS_SECRET_ACCESS_KEY=R.data.credentials.secretAccessKey,R.data.credentials.sessionToken&&(process.env.AWS_SESSION_TOKEN=R.data.credentials.sessionToken),_=R.data.credentials.region||"ap-south-1",P=R.data.credentials.bucket||I.bucketPrefix,process.env.AWS_REGION=_,delete process.env.AWS_PROFILE)}catch(R){throw g.error(`Failed to authenticate with ${I.name} Cloud.`),R}if(!P||!_){g.error(`Failed to resolve S3 configuration from ${I.name} Cloud.`);return}let S=o.teamId||m.teamId||s.submit?.production?.ios?.appleTeamId;if(!S)try{let U=(await W.get(`/projects/${e}/secrets`)).data.secrets?.find(F=>F.key==="APPLE_TEAM_ID");U&&(S=U.value,g.info(h.dim(`Using Team ID from Dashboard: ${S}`)))}catch{}S&&S===s.submit?.production?.ios?.appleTeamId&&g.info(h.dim(`Using Apple Team ID from config: ${S}`));let C=await Dt({appleId:a,config:s,profile:n,initialTeam:{...m,teamId:S,developerTeamId:m.developerTeamId||S},promptToPersistConfig:!S,saveTeamId:S?void 0:R=>Yr(e,R)});if(!C?.teamId)return;S=C.teamId;let v={...m,...C,teamId:S,developerTeamId:C.developerTeamId||m.developerTeamId||S};N=v;let L=Qa(e,S);g.info(h.dim(`Using match storage prefix: ${L}`));let B=await cc(),k={...B.env};process.env.CI||delete k.CI,d(`Preparing ${r} certificate sync...`),p("Starting certificate sync...");let T=`${I.buildPrefix}-${S}-${r}.keychain-db`,H=I.keychainPassword;try{let U=`${process.env.HOME||"/Users/"+(process.env.USER||I.nameLower)}/Library/Keychains/${T}`;g.info(h.dim(`Ensuring keychain exists: ${T}`));try{je(`security create-keychain -p ${H} ${T} 2>/dev/null || true`),je(`security unlock-keychain -p ${H} ${T}`),je(`security set-keychain-settings ${T}`);let x=je("security list-keychains -d user").toString();if(!x.includes(T)){g.info(h.dim(`Adding ${T} to search list`));let G=[...x.replace(/"/g,"").split(`
447
- `).map($=>$.trim()).filter($=>$.length>0),U].join(" ");je(`security list-keychains -d user -s ${G}`)}}catch(x){g.warn(h.dim("Keychain setup warning (non-critical): "+x.message))}let F,te;try{let j=((await W.get(`/credentials/${e}`)).data.credentials||[]).find(G=>G.type==="asc_api_key"&&G.issuerId);if(j){let G=await W.get(`/credentials/${j.credentialId}/download`,{params:{projectId:e,format:"raw"}});if(G.data.downloadUrl){let M=await(await import("axios")).default.get(G.data.downloadUrl,{responseType:"arraybuffer"}),Q=J.join(ut.tmpdir(),`mach-asc-${Date.now()}`);V.mkdirSync(Q,{recursive:!0}),u=J.join(Q,`AuthKey_${j.keyId}.p8`),V.writeFileSync(u,Buffer.from(M.data)),F=j.keyId,te=j.issuerId,g.success(h.green("\u2713 ASC API key loaded \u2014 no 2FA required for Portal operations"))}}}catch(x){g.warn(h.dim(`Could not load ASC API key: ${x.message}. Will fall back to Apple ID auth.`))}g.info(h.dim("Generating secure P12 export password..."));let Ae=lo();g.success(h.green("\u2713 Secure P12 password generated.")),f=V.mkdtempSync(J.join(ut.tmpdir(),`${I.nameLower}-match-${r}-`));let ae={...k,AWS_REGION:process.env.AWS_REGION||"ap-south-1",AWS_ACCESS_KEY_ID:process.env.AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY:process.env.AWS_SECRET_ACCESS_KEY,SSL_CERT_FILE:"/etc/ssl/cert.pem",AWS_CA_BUNDLE:"/etc/ssl/cert.pem",FASTLANE_SSL_CA_CERT:"/etc/ssl/cert.pem",MATCH_PASSWORD:b,FASTLANE_USER:a,FASTLANE_SKIP_UPDATE_CHECK:"1",FASTLANE_TEAM_ID:S,MATCH_KEYCHAIN_NAME:U,MATCH_KEYCHAIN_PASSWORD:H,TERM:process.env.TERM||"xterm-256color",SHELL:process.env.SHELL||"/bin/zsh",MATCH_OUTPUT_PATH:f,MATCH_STORAGE_MODE:"s3",MATCH_S3_REGION:_,MATCH_S3_BUCKET:P,MATCH_S3_OBJECT_PREFIX:L,MATCH_USERNAME:a,MATCH_APP_IDENTIFIER:t,MATCH_TYPE:r,[`${I.envPrefix}P12_PASSWORD`]:Ae,...u&&F&&te?{APP_STORE_CONNECT_API_KEY_KEY_ID:F,APP_STORE_CONNECT_API_KEY_ISSUER_ID:te,APP_STORE_CONNECT_API_KEY_KEY_FILEPATH:u,FASTLANE_SKIP_2FA:"1"}:{}};if(o.force){g.warn(h.yellow(`
448
- \u26A0\uFE0F Force flag detected: Hard resetting ${r} certificates...`)),g.info(h.dim("Detected decryption failure loop. Clearing remote storage directly to allow fresh generation.")),g.info(h.dim(`Cleaning match storage for Team ID: ${S}...`));try{(await W.post("/credentials/clean-match-storage",{projectId:e,teamId:S,storagePrefix:L})).data.status==="success"&&g.success(h.green(`\u2713 Cleared S3 storage for Team ID: ${S}`))}catch(x){g.warn(h.yellow(`S3 cleanup via API failed: ${x.message}`)),g.info(h.dim("Continuing to attempt standard nuke..."))}try{je(`${B.shellCommand} match nuke ${r} --skip_confirmation`,{stdio:"inherit",cwd:process.cwd(),env:ae}),g.success(h.green(`\u2713 Nuked existing ${r} credentials`))}catch{g.warn(h.yellow("Standard nuke failed (likely due to password mismatch).")),g.info(h.dim("Since S3 was cleared manually, proceeding to generation..."))}}let $e=r==="adhoc"||r==="development";if(r==="adhoc"||r==="development")try{g.info(h.blue("Fetching registered devices..."));let j=(await W.get("/devices",S?{params:{teamId:S}}:void 0)).data.devices||[];if(S)try{let G=await W.get("/devices",{params:{teamId:"LEGACY"}}),$=new Map;for(let M of[...j,...G.data.devices||[]])$.set(M.udid,M);j=Array.from($.values())}catch{}if(j.length===0)g.warn(h.yellow("No registered devices found. Profile will only include devices already on the Apple Developer Portal.")),g.info(h.dim(`Register devices with: ${I.nameLower} device register`));else{let{multiselect:G}=await import("@clack/prompts"),$=await G({message:`Select devices to include in the ${r} profile:`,options:j.map(M=>({value:M.udid,label:`${M.name} (${M.udid.substring(0,12)}...)`,hint:M.model||M.platform})),initialValues:j.map(M=>M.udid)});if(!Z($)&&$.length>0){let M=j.filter(Q=>$.includes(Q.udid));if(g.info(h.blue(`Registering ${M.length} device(s) on Apple Developer Portal...`)),S&&await Promise.all(M.filter(Q=>!Q.teamId).map(Q=>W.post("/devices",{udid:Q.udid,name:Q.name,platform:"ios",addedVia:Q.addedVia||"cli",teamId:S,teamName:v.teamName}).catch(()=>{}))),u&&F&&te)await $c(M,F,te,u);else{g.info(h.dim("You will be prompted for a 2FA code once \u2014 type it and press Enter."));for(let Q of M){let Je=Q.name.replace(/"/g,'\\"');ye(`${B.shellCommand} run register_device name:"${Je}" udid:"${Q.udid}"`,{shell:!0,env:ae,stdio:"inherit",cwd:process.cwd()})}}g.info(h.green("\u2713 Device registration complete.")),$e=!0}}}catch(x){g.warn(h.yellow(`Could not fetch registered devices: ${x.message}`)),g.info(h.dim("Continuing without explicit device registration."))}let ne=r,we={certificates:[],profiles:[]};try{we=await Zc(e,S,t,ne)}catch{}let ve=Kt(ne),Re=so(ne),K=we.certificates.some(x=>we.profiles.some(j=>Wc(j,x.credential)));if(!o.force&&K){g.success(h.green(`\u2713 Existing ${ve} certificate and ${Re} profile pair verified in Mach for ${t}.`));let x=await Ie({message:`What should Mach do with the existing ${Re} profile?`,options:[{value:"refresh_profile",label:`Recreate the ${Re} profile with the saved certificate`,hint:"Recommended \u2014 refreshes the Apple profile without creating another certificate"},{value:"reuse_profile",label:"Reuse the verified profile unchanged",hint:"Skips Apple Portal changes when the registered devices and entitlements are unchanged"},{value:"sync",label:"Continue with normal certificate sync",hint:"Use only when you need a different signing identity"}],initialValue:"refresh_profile"});if(Z(x)){z("Operation cancelled");return}if(x==="reuse_profile"){g.info(h.dim("Reusing the verified certificate and profile pair; no Apple Portal changes were made."));return}if(x==="refresh_profile"){if(await mn({savedCertificates:we.certificates,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw new Error("Provisioning profile refresh was cancelled or could not be completed. No new certificate was requested.")}}if(we.certificates.length>0&&!o.force){we.profiles.length>0&&g.warn(h.yellow("Existing iOS credential records do not prove that the profile was generated with the saved certificate. Mach will safely regenerate the profile from the selected P12."));let x=await Ie({message:`A saved ${ve} certificate already exists in this Mach project.`,options:[{value:"reuse",label:`Create or refresh the ${Re} profile with the saved certificate`,hint:"Recommended \u2014 no new Apple certificate is requested"},{value:"sync",label:"Continue with normal certificate sync",hint:"May ask Apple to create another certificate if Match storage is incomplete"}]});if(Z(x)){z("Operation cancelled");return}if(x==="reuse"){if(await mn({savedCertificates:we.certificates,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw new Error("Saved certificate reuse was cancelled or could not be completed. No new certificate was requested.")}}let le=[];try{le=await Jr(S,ne,e)}catch{}if(le.length>0){let x=await Ie({message:`Saved ${ve} certificate${le.length===1?"":"s"} found for Apple Team ${S}.`,options:[{value:"reuse",label:"Reuse a saved certificate",hint:`${le.length} compatible certificate${le.length===1?"":"s"} found \u2014 no new Apple certificate is requested`},{value:"sync",label:"Continue with normal certificate sync",hint:"Use this only when you need a different signing identity"}]});if(Z(x)){z("Operation cancelled");return}if(x==="reuse"){if(await mn({savedCertificates:le,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw new Error("Saved certificate reuse was cancelled or could not be completed. No new certificate was requested.")}}try{let x=`${I.nameLower} ${r} ${t}`,j=tc(B.shellCommand,r,t,x,$e);$e&&g.info(h.dim(`Refreshing ${r} provisioning profile when device list changes (--force_for_new_devices).`));let G=ye(j,{shell:!0,cwd:process.cwd(),env:ae,stdio:"inherit",encoding:"utf-8"});if(G.status!==0){g.warn(h.yellow(`
449
- Certificate sync failed. Attempting to create App ID and retry...`));try{je(`${B.shellCommand} produce --app_identifier "${t}" --app_name "${t}" --skip_itc`,{stdio:"inherit",env:ae}),g.success(h.green("\u2713 App ID created successfully")),g.info(h.blue("Retrying certificate sync...")),G=ye(j,{shell:!0,cwd:process.cwd(),env:ae,stdio:"inherit",encoding:"utf-8"})}catch{}if(G.status!==0)throw new Error("fastlane match failed")}}catch(x){let j=Kt(ne);if(g.warn(h.yellow(`
450
- Certificate sync failed. This can be caused by an incorrect encryption passphrase, an expired Apple session, or the ${j} certificate limit.`)),le.length===0)try{le=await Jr(S,ne,e)}catch{}let G=await Ie({message:"What would you like to do?",options:[...le.length>0?[{value:"reuse_saved",label:"Reuse a saved Mach certificate",hint:`${le.length} compatible certificate${le.length===1?"":"s"} found \u2014 no certificate is revoked`}]:[],{value:"retry_password",label:"Retry with a different MATCH_PASSWORD",hint:"Manually enter the decryption passphrase"},{value:"check_portal",label:"Check Apple Portal",hint:"Inspect certificate limits or explicitly revoke an old certificate"},{value:"manual",label:"Fallback to manual upload",hint:"Provide .p12 and .mobileprovision files"},{value:"cancel",label:"Cancel",hint:"Go back"}]});if(Z(G)||G==="cancel")throw x;if(G==="reuse_saved"){if(await mn({savedCertificates:le,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw x}else if(G==="retry_password"){g.info(h.dim(`
451
- You are overriding the dashboard passphrase for this session.`));let $=await pt({message:"Enter the correct MATCH_PASSWORD for this project:"});if($&&!Z($)){b=$,g.info(h.blue("Retrying with provided passphrase..."));let M={...ae,MATCH_PASSWORD:b};if(ye(`${B.shellCommand} match ${r}`,{shell:!0,stdio:"inherit",cwd:process.cwd(),env:M}).status===0)await W.post(`/projects/${e}/secrets`,{key:"MATCH_ENCRYPTION_PASSPHRASE",value:b,description:"Encryption passphrase for iOS certificates (fastlane match)",visibility:"secret"}),g.success(h.green("\u2713 Dashboard passphrase updated."));else throw new Error("Sync failed again with provided passphrase.")}else throw x}else if(G==="check_portal")try{let $=await An(ae,r,B.shellCommand);if($.length>0){if(g.info(h.dim(`Found ${$.length} existing ${r} certificates on the portal.`)),await zc(r,ae,e,B.shellCommand,$)&&(g.info(h.blue("Retrying certificate sync...")),ye(`${B.shellCommand} match ${r}`,{shell:!0,stdio:"inherit",cwd:process.cwd(),env:ae}).status!==0))throw new Error("Retry failed")}else throw g.error(h.red("No existing certificates found on portal to resolve.")),x}catch($){throw g.warn(h.dim(`Portal check warning: ${$.message}`)),x}else throw x}g.success(h.green("\u2713 Certificates fetched and synced"));let Ne=f,O=J.join(Ne,`${I.fastlanePrefix}_export.p12`),D=hn(Ne,/\.mobileprovision$/);try{let j=`${process.env.HOME||"/Users/"+(process.env.USER||I.nameLower)}/Library/Keychains/${T}`;V.existsSync(Ne)||V.mkdirSync(Ne,{recursive:!0}),g.info(h.dim("Exporting certificate from keychain for dashboard upload..."));let G=je(`security find-identity -v -p codesigning "${j}"`,{encoding:"utf-8"});g.info(h.dim(`Identities in keychain:
452
- ${G.trim()}`));let $=ye("security",["export","-k",j,"-t","identities","-f","pkcs12","-o",O,"-P",Ae],{encoding:"utf-8"});if($.error||$.status!==0)throw new Error(Rt($.stdout,$.stderr)||"security could not export the signing certificate.");try{let M=ye("openssl",["pkcs12","-in",O,"-nokeys","-passin",`pass:${Ae}`,"-legacy"],{encoding:"utf-8"});if((M.error||M.status!==0)&&(M=ye("openssl",["pkcs12","-in",O,"-nokeys","-passin",`pass:${Ae}`],{encoding:"utf-8"})),M.error||M.status!==0)throw new Error(Rt(M.stdout,M.stderr)||"openssl could not read the exported P12.");let Q=M.stdout||"";if(!Q.includes(S))throw new Error(`Exported P12 does not contain identity for team ${S}. Found: ${Q.substring(0,200)}`);g.success(h.green(`\u2713 P12 verified \u2014 contains correct team identity (${S})`))}catch(M){throw new Error(`P12 verification failed: ${M.message}`)}}catch{g.warn(h.dim("Could not export certificate from keychain."))}o.teamId&&!S&&await Yr(e,o.teamId);let X=V.existsSync(O)?O:hn(Ne,/\.p12$/);if(X&&D){let x,j,G,$;try{$=Ct(D),sn($,{bundleIdentifier:t,teamId:v.teamId||o.teamId||S,distributionType:i}),G=on(Lt(X,Ae),$),g.success(h.green(`\u2713 Provisioning profile verified against signing certificate (${G.sha1.slice(0,12)}\u2026).`))}catch(Q){throw new Error(`Refusing to upload an iOS certificate/profile mismatch: ${Q.message}`)}let M={certificateSha1:G.sha1,certificateSha256:G.sha256,certificateSerial:G.serial,profileCertificateSha1s:$.certificateSha1s,profileCertificateSha256s:$.certificateSha256s};try{let Je=(await An(ae,r,B.shellCommand)).find(Se=>ui(Se.serial)===G.serial);Je?(x=Je.expires,j=Je.id):g.warn(h.yellow("The matching certificate could not be identified on the Apple portal, so Mach will save the verified fingerprint without a portal ID."))}catch{g.warn(h.dim("Could not fetch expiration date or ID for dashboard record."))}await nt(e,X,"ios_cert",t,i,void 0,x,o.teamId||S,j,Ae,void 0,void 0,v.teamId,v.teamName,v.developerTeamId,v.appStoreConnectTeamId,v.providerId,v.providerName,M),await nt(e,D,"ios_profile",t,i,void 0,x,o.teamId||S,void 0,void 0,void 0,void 0,v.teamId,v.teamName,v.developerTeamId,v.appStoreConnectTeamId,v.providerId,v.providerName,M),g.success(h.green("\u2713 Both iOS certificate and provisioning profile uploaded successfully"))}else g.warn(h.yellow("Certificates generated but not found in expected location.")),g.info(h.dim("Falling back to manual upload...")),await zr(e,t,i,N)}catch(R){p("Certificate fetch failed"),g.error(h.red(`Error: ${R.message}`)),g.info(h.dim("Falling back to manual upload...")),await zr(e,t,i,N)}}catch(b){p("iOS setup failed"),g.error(h.red(`Error: ${b.message}`))}finally{if(u)try{V.rmSync(J.dirname(u),{recursive:!0,force:!0})}catch{}if(f)try{V.rmSync(f,{recursive:!0,force:!0})}catch{}}}async function Yr(e,t){try{await W.post(`/projects/${e}/secrets`,{key:"APPLE_TEAM_ID",value:t,description:"Apple Developer Team ID (used for iOS signing)"}),g.success(h.green(`\u2713 Saved Team ID ${t} to Dashboard`))}catch(n){g.warn(h.yellow(`Could not save Team ID to Dashboard: ${n.message}`))}}async function zr(e,t,n,i={}){g.info(h.yellow(`
453
- Manual Upload Mode`)),g.info("Please provide your certificate and provisioning profile:");let r=await Oe({message:"Path to .p12 certificate file:",validate:f=>V.existsSync(f)?void 0:"File not found"});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=await Oe({message:"Path to .mobileprovision file:",validate:f=>V.existsSync(f)?void 0:"File not found"});Z(o)&&(z("Operation cancelled"),process.exit(0));let s=await pt({message:"P12 password (leave empty only when the certificate has no password):"});Z(s)&&(z("Operation cancelled"),process.exit(0));let a=r,c=o,l,d;try{d=Ct(c),sn(d,{bundleIdentifier:t,teamId:i.teamId,distributionType:n}),l=on(Lt(a,s),d)}catch(f){throw new Error(`The selected .p12 and .mobileprovision do not form a valid signing pair: ${f.message}`)}let p={certificateSha1:l.sha1,certificateSha256:l.sha256,certificateSerial:l.serial,profileCertificateSha1s:d.certificateSha1s,profileCertificateSha256s:d.certificateSha256s},u=it();u.start(`Uploading to ${I.name} Dashboard...`);try{await nt(e,a,"ios_cert",t,n,s,void 0,i.teamId,void 0,void 0,void 0,void 0,i.teamId,i.teamName,i.developerTeamId||i.teamId,i.appStoreConnectTeamId,i.providerId,i.providerName,p),await nt(e,c,"ios_profile",t,n,void 0,void 0,i.teamId,void 0,void 0,void 0,void 0,i.teamId,i.teamName,i.developerTeamId||i.teamId,i.appStoreConnectTeamId,i.providerId,i.providerName,p),u.stop("Upload complete"),g.success(h.green("\u2713 iOS credentials uploaded successfully"))}catch(f){throw u.stop("Upload failed"),f}}async function Kc(e,t,n,i,r){let o=it();g.step(h.blue("Android Credential Setup"));let s=i.bundleId;if(!s){let p=ht(r,t),u=[];try{let m=(await W.get(`/credentials/${e}`)).data.credentials||[];u=[...new Set(m.filter(N=>N.platform==="android"&&N.bundleId&&N.bundleId!=="*").map(N=>N.bundleId))]}catch{}if(p&&!u.includes(p)&&u.unshift(p),u.length>0){let f=[...u.map(N=>({value:N,label:N,hint:N===p?"from config":void 0})),{value:"__new__",label:"+ Enter a new Package Name"}],m=await Ie({message:"Which Package Name are you setting up credentials for?",options:f});if(Z(m)&&(z("Operation cancelled"),process.exit(0)),m==="__new__"){let N=await Oe({message:"Android Package Name (e.g. com.example.app):",placeholder:"com.example.app",validate:b=>b.includes(".")?void 0:"Please enter a valid package name"});Z(N)&&(z("Operation cancelled"),process.exit(0)),s=N}else s=m}else{let f=await Oe({message:"Android Package Name (e.g. com.example.app):",placeholder:"com.example.app",validate:m=>m.includes(".")?void 0:"Please enter a valid package name"});Z(f)&&(z("Operation cancelled"),process.exit(0)),s=f}}try{let f=((await W.get(`/credentials/${e}`)).data.credentials||[]).find(m=>m.platform==="android"&&m.distributionType===n&&m.bundleId===s);if(f){g.warn(h.yellow(`\u26A0\uFE0F Existing Android credentials found for ${n}`));let m=await Oe({message:"What would you like to do? (use/new/cancel)",validate:N=>{let b=N.toLowerCase();if(!(b==="use"||b==="new"||b==="cancel"))return"Please type: use, new, or cancel"}});if(Z(m)||m.toLowerCase()==="cancel")return;if(m.toLowerCase()==="use"){g.success(h.green("\u2713 Using existing credentials."));return}await W.delete(`/credentials/${f.credentialId}?projectId=${e}`)}}catch{}let a="./android/app/my-release-key.jks";if(V.existsSync(a)){let p=await fi({message:"Upload existing keystore?"});if(p&&!Z(p)){let u=await Oe({message:"Key alias:",initialValue:"my-key-alias"});if(Z(u))return;let f=await pt({message:"Keystore password:"});if(Z(f))return;let m=await pt({message:"Key password (leave blank if same as keystore password):"});if(Z(m))return;let N=m.trim()||f;await nt(e,a,"android_keystore",s,n,u,void 0,void 0,void 0,void 0,f,N),g.success(h.green("\u2713 Keystore uploaded"));return}}g.info(h.blue("Generating new Android keystore..."));let c=i.keyAlias||`${I.nameLower}-${Yc()}`,l=lo(),d=`./${I.nameLower}-${t}.jks`;V.existsSync(d)&&V.unlinkSync(d),o.start("Generating keystore...");try{let p=l.replace(/'/g,"'\\''");je(`keytool -genkeypair -v -keystore "${d}" -alias "${c}" -keyalg RSA -keysize 2048 -validity 10000 -storepass '${p}' -keypass '${p}' -dname "CN=${I.name} Build, OU=Mobile, O=Company, L=City, S=State, C=US"`,{stdio:"inherit"}),o.stop("Keystore generated"),await nt(e,d,"android_keystore",s,n,c,void 0,void 0,void 0,void 0,l,l),g.success(h.green("\u2713 Android credentials uploaded successfully")),g.info(h.cyan(`Key Alias: ${c}`))}catch(p){throw o.stop("Generation failed"),new Error(`Keystore generation failed: ${p.message}`)}}var ao=e=>new Promise(t=>setTimeout(t,e));function co(e){return/ECONNRESET|ETIMEDOUT|EAI_AGAIN|ENOTFOUND|ECONNABORTED|socket hang up|network|timeout|temporar/i.test(e)||/API_ERROR:\s*(408|409|425|429|5\d\d)/i.test(e)}async function nt(e,t,n,i,r,o,s,a,c,l,d,p,u,f,m,N,b,P,_){let S=J.basename(t);g.info(h.dim(`Uploading ${S} (Isolated process)...`));let C=new URL(import.meta.url),v=J.dirname(C.pathname),B=[J.join(v,"commands","isolated-upload.js"),e,t,n,i,r,o||"undefined",s||"undefined",a||"undefined",c||"undefined",l||"undefined",d||"undefined",p||"undefined",u||"undefined",f||"undefined",m||"undefined",N||"undefined",b||"undefined",P||"undefined",_?JSON.stringify(_):"undefined"],k="",T=5;for(let H=1;H<=T;H++){let R=ye("node",B,{stdio:"pipe",encoding:"utf-8",env:{...process.env,AT_CLI_ISOLATED:"1"}});if(R.status===0&&R.stdout.includes("SUCCESS")){g.info(h.dim(`\u2713 ${S} uploaded and registered.`));return}if(R.status===0){g.warn(h.yellow(`Isolated upload finished but success not confirmed: ${R.stdout}`));return}if(k=(R.stderr||R.stdout||R.error?.message||"Unknown isolated upload failure").trim(),!co(k)||H>=T)throw g.error(h.red(`Isolated Upload Failed: ${k}`)),new Error(k);let F=Math.min(3e4,1500*Math.pow(2,H-1));g.warn(h.yellow(`Upload failed with a transient error. Retrying ${S} in ${Math.round(F/1e3)}s... (${H}/${T})`)),await ao(F)}throw new Error(k||"Unknown isolated upload failure")}async function Jc(e){let t=it(),n=e.platform,i=`./${I.configFileName}`;if(!V.existsSync(i)){g.error(`No ${I.configFileName} found. Run \`${I.nameLower} init\` or \`${I.nameLower} link\` first.`);return}let r=JSON.parse(V.readFileSync(i,"utf-8")),{projectId:o}=r;if(!o){g.error(`${I.configFileName} is missing projectId.`);return}try{t.start("Fetching project secrets...");let a=(await W.get(`/projects/${o}/secrets/export?env=all`)).data.secrets||{};t.stop("Secrets fetched and merged."),t.start("Fetching credentials...");let l=(await W.get(`/credentials/${o}`)).data.credentials||[];t.stop(`Found ${l.length} metadata records.`);let d=l.filter(m=>m.platform===n);if(d.length===0){g.info(`No ${n} credentials found on Dashboard.`);return}let p="./credentials.json",u={};if(V.existsSync(p))try{u=JSON.parse(V.readFileSync(p,"utf-8"))}catch{g.warn("Could not parse existing credentials.json, creating a new one.")}u[n]||(u[n]={});let f=J.join(process.cwd(),"credentials",n);V.existsSync(f)||V.mkdirSync(f,{recursive:!0});for(let m of d){t.start(`Downloading ${m.type} (${m.distributionType})...`);try{let N=await W.get(`/credentials/${m.credentialId}/download`,{params:{projectId:o,format:"raw"}});if(N.data.status==="success"&&N.data.downloadUrl){let b=J.join(process.cwd(),"credentials",n,m.distributionType);V.existsSync(b)||V.mkdirSync(b,{recursive:!0});let P=m.s3Key?.split(".").pop()||(m.type.includes("keystore")?"jks":m.type.includes("cert")?"p12":"mobileprovision"),_=`${m.type}.${P}`,S=J.join(b,_),C=await Qr.get(N.data.downloadUrl,{responseType:"arraybuffer"});V.writeFileSync(S,Buffer.from(C.data));let v=J.join("credentials",n,m.distributionType,_),L="",B="",k={alias:"",keystorePassword:"",keyPassword:""};if(n==="ios"&&m.type==="ios_cert"||n==="android"&&m.type==="android_keystore"){let T=await to(o,n,m);if(n==="ios"&&m.type==="ios_cert"&&P.toLowerCase()==="p12"){if(L=no(T,a),L){let H=Xr(S,`${J.basename(S,J.extname(S))}-password.txt`,L);B=J.join("credentials",n,m.distributionType,J.basename(H))}}else if(n==="android"&&m.type==="android_keystore"&&(k=pc(T,a),k.keystorePassword||k.keyPassword)){let H=[k.alias?`keyAlias=${k.alias}`:void 0,k.keystorePassword?`keystorePassword=${k.keystorePassword}`:void 0,k.keyPassword?`keyPassword=${k.keyPassword}`:void 0].filter(Boolean).join(`
454
- `),R=Xr(S,`${J.basename(S,J.extname(S))}-passwords.txt`,H);B=J.join("credentials",n,m.distributionType,J.basename(R))}}if(n==="android")m.type==="android_keystore"&&(u.android.keystore={keystorePath:v,keystorePassword:k.keystorePassword,keyAlias:k.alias,keyPassword:k.keyPassword},B&&(u.android.keystore.keystoreArchivePath=B));else if(n==="ios"){let T=m.distributionType==="store"?"production":m.distributionType==="adhoc"?"staging":"development";u.ios[T]||(u.ios[T]={}),m.type==="ios_cert"?(u.ios[T].certificatePath=v,u.ios[T].certificatePassword=L,B&&(u.ios[T].certificateArchivePath=B)):m.type==="ios_profile"&&(u.ios[T].provisioningProfilePath=v)}t.stop(`\u2713 ${m.type} (${m.distributionType}) saved${B?" with password archive":""}.`)}}catch(N){let b=N.response?.data?.message||N.message;t.stop(h.dim(`- Skipped ${m.type} (${m.distributionType}): ${b}`))}}V.writeFileSync(p,JSON.stringify(u,null,2)),g.success(h.green("\u2713 Local credentials.json updated.")),Ka("Credentials have been synced to your local machine. Ensure credentials.json and credentials/ is added to your .gitignore.","Sync Complete")}catch(s){t.stop(h.red("Sync failed.")),g.error(`Error: ${s.message}`)}}function lo(){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_+=",t="";for(let n=0;n<24;n++)t+=e.charAt(Math.floor(Math.random()*e.length));return t}function Yc(e=8){let t="abcdefghijklmnopqrstuvwxyz0123456789",n="";for(let i=0;i<e;i++)n+=t.charAt(Math.floor(Math.random()*t.length));return n}async function zc(e,t,n,i,r){let o=r||await An(t,e,i);if(!o||o.length===0)return!1;let s=await Ie({message:"Select a certificate to revoke:",options:[...o.map(a=>({value:`revoke:${a.id}`,label:`Revoke: ${a.name} (${a.expires})`})),{value:"nuke",label:"Revoke All"},{value:"cancel",label:"Cancel"}]});return Z(s)||s==="cancel"?!1:s==="nuke"?(je(`${i} match nuke ${e}`,{stdio:"inherit",cwd:process.cwd(),env:t}),!0):typeof s=="string"&&s.startsWith("revoke:")?(await Qc(t,s.split(":")[1],i),!0):!1}async function An(e,t,n){let i=t==="development"?"development":"distribution",r=`
446
+ `);return/another key with same name exists/i.test(t)||/same name already exists/i.test(t)}function oo(e){if(m.warn(h.yellow(e?.message||"Could not generate APNs key automatically.")),ro(e)){m.info(h.dim("Apple rejected the request because this team is already at its APNs auth-key limit.")),m.info(h.dim("If you saved an existing .p8 file, upload it here. If not, delete an unused APNs key in Apple Developer, then generate again.")),m.info(h.dim("Apple only lets you download an APNs .p8 private key when the key is first created."));return}m.info(h.dim("You can upload an existing .p8 key, retry generation, or exit and try again later."))}async function pi(){let e=await Ie({message:"Where should Mach save this APNs key?",options:[{value:"all",label:"All environments",hint:"Recommended \u2014 one APNs key works for sandbox and production"},{value:"development",label:"Development only"},{value:"preview",label:"Preview only"},{value:"production",label:"Production only"}]});return Z(e)&&(z("Operation cancelled"),process.exit(0)),e==="all"?gc:[e]}async function Rc(e,t,n,i){let r=i.teamId||e.teamId;if(!r){let o=await Oe({message:"Apple Team ID:",validate:s=>/^[A-Z0-9]{10}$/i.test(s.trim())?void 0:"Team ID must be exactly 10 letters/numbers"});Z(o)&&(z("Operation cancelled"),process.exit(0)),r=o.trim().toUpperCase()}for(let o of t)await fn("apns",{...e,environment:o,privateKey:i.privateKey,teamId:r,keyId:i.keyId,bundleId:n})}async function Kr(e,t,n){let i=await Oe({message:"Path to APNs auth key (.p8):",validate:io});Z(i)&&(z("Operation cancelled"),process.exit(0));let r=await Oe({message:"Apple Team ID:",initialValue:e.teamId,validate:s=>s.trim()?void 0:"Team ID is required"});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=await Oe({message:"APNs Key ID:",initialValue:e.keyId,validate:s=>s.trim()?void 0:"Key ID is required"});Z(o)&&(z("Operation cancelled"),process.exit(0));for(let s of t)await fn("apns",{...e,environment:s,file:i,teamId:r,keyId:o,bundleId:n})}async function Nc(e){let t=yc(),n=e.bundleId||ze(t)||t.push?.iosBundleId;for(;;){let i=await Ie({message:"How do you want to configure APNs?",options:[{value:"generate",label:"Generate new APNs key with Apple",hint:"Mach creates, downloads once, and uploads it securely"},{value:"upload",label:"Upload existing .p8 key",hint:"Use a key you already downloaded from Apple"}]});if(Z(i)&&(z("Operation cancelled"),process.exit(0)),i==="upload"){let r=await pi();await Kr(e,r,n);return}try{let r=await Pc(t,n),o=await pi();await Rc(e,o,n,r);return}catch(r){oo(r);let o=await Ie({message:"APNs key was not created. What do you want to do?",options:[{value:"upload",label:"Upload existing .p8 key"},{value:"retry",label:"Try generating again"},{value:"exit",label:"Exit"}]});if((Z(o)||o==="exit")&&(z("Operation cancelled"),process.exit(0)),o==="upload"){let s=await pi();await Kr(e,s,n);return}}}}async function xc(e){let t=await Oe({message:"Path to Firebase service account JSON:",validate:io});Z(t)&&(z("Operation cancelled"),process.exit(0));let n;try{n=JSON.parse(V.readFileSync(t,"utf8"))}catch(i){z(`Invalid Firebase service account JSON: ${i.message}`),process.exit(1)}await fn("fcm",{...e,serviceAccount:n})}async function kc(e,t){if(t==="ios"){await Nc(e);return}await xc(e)}function Oc(e,t,n){let i=V.readFileSync(n,"utf8"),r=Math.floor(Date.now()/1e3),o=Buffer.from(JSON.stringify({alg:"ES256",kid:e,typ:"JWT"})).toString("base64url"),s=Buffer.from(JSON.stringify({iss:t,iat:r,exp:r+1200,aud:"appstoreconnect-v1"})).toString("base64url"),a=`${o}.${s}`,c=mn.createSign("SHA256");c.update(a);let l=c.sign({key:i,dsaEncoding:"ieee-p1363"}).toString("base64url");return`${a}.${l}`}async function $c(e,t,n,i){let r=Oc(t,n,i),o=(await import("axios")).default;for(let s of e)try{await o.post("https://api.appstoreconnect.apple.com/v1/devices",{data:{type:"devices",attributes:{name:s.name,udid:s.udid,platform:"IOS"}}},{headers:{Authorization:`Bearer ${r}`,"Content-Type":"application/json"}}),m.info(h.dim(` \u2713 Registered: ${s.name}`))}catch(a){let c=a.response?.data?.errors;c?.some(p=>p.code==="ENTITY_ERROR.ATTRIBUTE.INVALID.DUPLICATE"||p.detail?.toLowerCase().includes("already registered")||p.detail?.toLowerCase().includes("already exists"))?m.info(h.dim(` Already on Portal: ${s.name}`)):m.warn(h.yellow(` Could not register ${s.name}: ${c?.[0]?.detail||a.message}`))}}var _c=async e=>{Xa(h.bgCyan.black(I.cliTag("Credentials")));let t=await Ie({message:"Select platform:",options:[{value:"ios",label:"iOS"},{value:"android",label:"Android"}]});Z(t)&&(z("Operation cancelled"),process.exit(0));let n=await Ie({message:"What do you want to do?",options:[{value:"setup",label:"Build Credentials (Certs/Profiles)",hint:"Manage everything needed to build your project"},{value:"download",label:"Download credentials (credentials.json)",hint:"Sync credentials from Dashboard to local project"},{value:"service",label:"App Store Connect API Key (Magic)",hint:"Manage your API Key for automated submission"},{value:"push",label:"Push Notifications",hint:t==="ios"?"Upload APNs key":"Upload Firebase service account"},{value:"back",label:"Go back"},{value:"exit",label:"Exit"}].filter(i=>(t==="android"&&i.value==="service"&&(i.label="Google Service Account (JSON)"),!0))});if((Z(n)||n==="exit")&&(z("Operation cancelled"),process.exit(0)),n==="back")return _c(e);n==="setup"?await Tc({...e,platform:t}):n==="download"?await Jc({...e,platform:t}):n==="service"?await Ri({...e,platform:t}):n==="push"&&await kc(e,t),Ha(h.green("Done!"))},Tc=async e=>{let t=it(),n=e.platform,i=e.profile,r=e.credentialType;if(r&&!Tt(r)){m.error("Credential type must be development, adhoc, or store.");return}if(!i&&r){let c=Tt(r);i=c==="store"?"production":c==="adhoc"?"staging":"development"}if(!i){let c=await Ie({message:"Select credential type:",options:[{value:"development",label:"Development",hint:"Local testing & simulators"},{value:"staging",label:"Ad Hoc / Staging",hint:"Internal distribution & device testing"},{value:"production",label:"Production / App Store",hint:"App Store & Play Store submission"}]});Z(c)&&(z("Operation cancelled"),process.exit(0)),i=c,r=c==="production"?"store":c==="staging"?"adhoc":"development"}let o=`./${I.configFileName}`;if(!V.existsSync(o)){m.error(`No ${I.configFileName} found. Run \`${I.nameLower} init\` or \`${I.nameLower} link\` first.`);return}let s=JSON.parse(V.readFileSync(o,"utf-8")),{projectId:a}=s;if(!a){m.error(`${I.configFileName} is missing projectId.`);return}if(e.awsProfile&&m.warn(h.yellow(`Ignoring --aws-profile. Authenticating with ${I.name} Cloud...`)),m.info(h.dim(`Setting up credentials for: ${i}`)),n==="ios")await Fc(a,i,e,s,r);else{let c=fc(s,i);await Kc(a,i,c,e,s)}};async function Fc(e,t,n,i,r){let o=n.bundleId;if(!o){let l=i.submit?.[t]?.ios?.bundleIdentifier||i.submit?.[t]?.ios?.bundleId||ze(i,t),p=[];try{let u=(await W.get(`/credentials/${e}`)).data.credentials||[];p=[...new Set(u.filter(f=>f.platform==="ios"&&f.bundleId&&f.bundleId!=="*").map(f=>f.bundleId))]}catch{}if(l&&!p.includes(l)&&p.unshift(l),p.length>0){let d=[...p.map(f=>({value:f,label:f,hint:f===l?"from config":void 0})),{value:"__new__",label:"+ Enter a new Bundle ID"}],u=await Ie({message:"Which Bundle ID are you setting up credentials for?",options:d});if(Z(u)&&(z("Operation cancelled"),process.exit(0)),u==="__new__"){let f=await Oe({message:"iOS Bundle ID (e.g. com.example.app):",placeholder:"com.example.app",validate:g=>g.includes(".")?void 0:"Please enter a valid Bundle ID"});Z(f)&&(z("Operation cancelled"),process.exit(0)),o=f}else o=u}else{let d=await Oe({message:"iOS Bundle ID (e.g. com.example.app):",placeholder:"com.example.app",validate:u=>u.includes(".")?void 0:"Please enter a valid Bundle ID"});Z(d)&&(z("Operation cancelled"),process.exit(0)),o=d}}m.info(h.dim(`Bundle ID: ${o}`));let s=Ii({buildProfile:t,profile:mt(i,t)||{},requestedCredentialType:r});m.info(h.dim(`Credential storage type: ${s}`));let a=i.submit?.production?.ios?.appleId;a&&m.info(h.dim(`Using Apple ID from config: ${a}`)),await Hc(e,o,t,s,s==="store"?"appstore":s==="adhoc"?"adhoc":"development",n,i,a)}var mi=e=>oe(e.expiresAt)||oe(e.expires)||oe(e.expirationDate)||oe(e.meta?.expiresAt)||oe(e.meta?.expires),Dc=e=>{let t=Tt(Ht(e));return t==="development"?"Development":t==="adhoc"?"Ad Hoc":t==="store"?"App Store":Ht(e)||"Unknown signing type"},Bc=e=>{let t=e.credential,n=In(t)||"all apps",i=Dc(t),r=mi(t);return[e.projectName,i,n,r?`expires ${r}`:void 0].filter(Boolean).join(" \xB7 ")},Kt=e=>e==="development"?"Apple Development":"Apple Distribution",so=e=>e==="development"?"Development":e==="adhoc"?"Ad Hoc":"App Store",hi=e=>{let t=mi(e);if(!t)return!1;let n=Date.parse(t);return Number.isFinite(n)&&n<=Date.now()},Vc=(e,t,n,i)=>{if(e?.type!=="ios_profile"||e?.platform&&e.platform!=="ios"||!oe(e?.s3Key)||hi(e)||In(e)!==n||Tt(Ht(e))!==(i==="appstore"?"store":i))return!1;let o=si(e);return!o||o===t.trim().toUpperCase()},Mc=e=>oe(e?.certificateSha1)||oe(e?.meta?.certificateSha1),jc=e=>{let t=e?.profileCertificateSha1s??e?.meta?.profileCertificateSha1s;return Array.isArray(t)?t.filter(n=>typeof n=="string").map(n=>n.replace(/[^a-fA-F0-9]/g,"").toUpperCase()).filter(Boolean):[]},Wc=(e,t)=>{let n=Mc(t)?.replace(/[^a-fA-F0-9]/g,"").toUpperCase();return!!n&&jc(e).includes(n)};async function Zc(e,t,n,i){let o=(await W.get(`/credentials/${e}`)).data.credentials||[],s=o.filter(c=>ci(c,t,i)&&!hi(c)).map(c=>({projectId:e,projectName:"This project",credential:c,certificateId:ai(c),teamId:t})),a=o.filter(c=>Vc(c,t,n,i));return{certificates:s,profiles:a}}async function Jr(e,t,n){let r=((await W.get("/projects")).data.projects||[]).filter(a=>a.projectId!==n),o=(await Promise.all(r.map(async a=>{if(!a.projectId)return[];try{return((await W.get(`/credentials/${a.projectId}`)).data.credentials||[]).filter(p=>ci(p,e,t)&&!hi(p)).map(p=>({projectId:a.projectId,projectName:a.name||a.slug||a.projectId,credential:p,certificateId:ai(p),teamId:e}))}catch{return[]}}))).flat(),s=new Map;for(let a of o){let c=`${a.projectId}:${a.certificateId||yn(a.credential)}`,l=s.get(c);(!l||String(a.credential.createdAt||"")>String(l.credential.createdAt||""))&&s.set(c,a)}return[...s.values()]}var ui=e=>String(e||"").replace(/[^a-zA-Z0-9]/g,"").toUpperCase();async function Uc(e,t,n,i,r,o){let s=await An(r,i,o);if(s.length===0)throw new Error(`No active ${Kt(i)} certificates were returned by the Apple Developer Portal.`);let a=Lt(t,n),c=new Set(a.map(u=>u.serial)),l=s.filter(u=>c.has(ui(u.serial)));if(e.certificateId){let u=s.find(f=>f.id===e.certificateId);if(u&&c.has(ui(u.serial)))return u.id;if(u&&l.length===1)return m.warn(h.yellow("The saved Apple certificate ID is stale. Mach matched the selected P12 to the active portal certificate by serial number instead.")),l[0].id}if(l.length===1)return m.info(h.dim(`Matched the selected saved P12 to Apple certificate ${l[0].name||l[0].id}.`)),l[0].id;if(l.length===0)throw new Error("The selected .p12 does not contain an active certificate returned by the Apple Developer Portal. Mach will not create a profile with a different certificate; choose another P12 or create a new Apple certificate.");let p=Kt(i);m.warn(h.yellow("The selected P12 contains multiple active Apple certificates. Select the exact certificate to use below."));let d=await Ie({message:`Which ${p} certificate matches the selected saved P12?`,options:[...l.map(u=>({value:u.id,label:[u.name||`${p} certificate`,u.expires].filter(Boolean).join(" \xB7 "),hint:u.serial?`serial ${u.serial}`:void 0})),{value:"cancel",label:"Cancel"}]});if(!(Z(d)||d==="cancel"))return d}async function Gc(e,t,n){let i="";for(let o=1;o<=5;o++)try{let s=await W.get(`/credentials/${t}/download`,{params:{projectId:e,format:"proxy"},responseType:"arraybuffer"});V.writeFileSync(n,Buffer.from(s.data));return}catch(s){if(i=s?.response?.data?.message||s?.message||String(s),!co(i)||o>=5)break;let c=Math.min(15e3,1e3*Math.pow(2,o-1));m.warn(h.yellow(`Certificate download was interrupted (${i}). Retrying with a fresh secure link in ${Math.round(c/1e3)}s\u2026 (${o}/5)`)),await ao(c)}throw new Error(`Could not download the saved Mach certificate after 5 attempts: ${i||"Unknown network error"}`)}async function Lc({targetProjectId:e,targetBundleId:t,targetDistributionType:n,matchType:i,candidate:r,fastlane:o,matchEnv:s,keychainPath:a,keychainPassword:c,teamMeta:l}){let p=await to(r.projectId,"ios",r.credential),d=no(p,{})||void 0,u=V.mkdtempSync(J.join(ut.tmpdir(),`${I.nameLower}-reuse-cert-`)),f=J.join(u,"selected-signing-certificate.p12"),g=`${I.nameLower} ${i} ${t}`,N=`${I.nameLower}-${i}-${Date.now()}.mobileprovision`;try{m.info(h.dim(`Downloading the selected certificate from ${r.projectName}\u2026`));let b=yn(p);if(!b)throw new Error("The selected Mach certificate no longer has a credential ID.");await Gc(r.projectId,b,f),m.info(h.dim("Importing the selected certificate into Mach\u2019s team keychain\u2026"));let P=F=>ye("security",["import",f,"-k",a,"-P",F,"-T","/usr/bin/codesign"],{encoding:"utf-8"}),_,S=await Zr({storedPassword:d,tryPassword:F=>(F===""&&d&&m.warn(h.dim("Saved P12 did not unlock with its stored password; trying the legacy empty-password format\u2026")),_=P(F),!_.error&&_.status===0),requestPassword:async()=>{m.warn(h.yellow("This saved P12 is password protected, but Mach does not have its password."));let F=await pt({message:`P12 password for ${r.projectName}'s saved certificate:`,validate:te=>te.length>0?void 0:"The certificate password is required"});return Z(F)?void 0:F}});if(S.status==="cancelled")return!1;if(S.status==="failed")throw new Error(Rt(_?.stdout,_?.stderr)||"Could not import the selected .p12 certificate. Check its password.");let C=S.password,v=ye("security",["set-key-partition-list","-S","apple-tool:,apple:,codesign:","-s","-k",c,a],{encoding:"utf-8"});if(v.error||v.status!==0)throw new Error(Rt(v.stdout,v.stderr)||"Could not grant codesign access to the imported certificate.");let L=await Uc(r,f,C,i,s,o.shellCommand);if(!L)return!1;m.info(h.blue(`Creating a new ${so(i)} profile for ${t}\u2026`));let B=ye(o.command,Ur(i,t,g,L,u,N),{cwd:process.cwd(),env:s,stdio:"inherit"});if(B.error||B.status!==0)throw new Error("Apple could not create the provisioning profile with the selected certificate.");let k=hn(u,/\.mobileprovision$/);if(!k)throw new Error("The new provisioning profile was not produced by fastlane.");let T=Ct(k);sn(T,{bundleIdentifier:t,teamId:l.teamId,distributionType:n});let H=on(Lt(f,C),T),R={certificateSha1:H.sha1,certificateSha256:H.sha256,certificateSerial:H.serial,profileCertificateSha1s:T.certificateSha1s,profileCertificateSha256s:T.certificateSha256s},U=mi(p);return await nt(e,f,"ios_cert",t,n,void 0,U,l.teamId,L,C,void 0,void 0,l.teamId,l.teamName,l.developerTeamId||l.teamId,l.appStoreConnectTeamId,l.providerId,l.providerName,R),await nt(e,k,"ios_profile",t,n,void 0,void 0,l.teamId,void 0,void 0,void 0,void 0,l.teamId,l.teamName,l.developerTeamId||l.teamId,l.appStoreConnectTeamId,l.providerId,l.providerName,R),m.success(h.green(`\u2713 Reused the saved certificate and created credentials for ${t}.`)),!0}finally{try{V.rmSync(u,{recursive:!0,force:!0})}catch{}}}async function gn({savedCertificates:e,targetProjectId:t,targetBundleId:n,targetDistributionType:i,matchType:r,fastlane:o,matchEnv:s,keychainPath:a,keychainPassword:c,teamMeta:l}){let p=Kt(r),d=await Ie({message:`Select a saved ${p} certificate to reuse:`,options:[...e.map((f,g)=>({value:String(g),label:Bc(f),hint:f.certificateId?`Apple Team ${f.teamId}`:`Apple Team ${f.teamId} \xB7 legacy record; Apple certificate matching may be requested`})),{value:"cancel",label:"Cancel"}]});if(Z(d)||d==="cancel")return!1;let u=e[Number(d)];if(!u)throw new Error("The selected saved certificate is no longer available.");return Lc({targetProjectId:t,targetBundleId:n,targetDistributionType:i,matchType:r,candidate:u,fastlane:o,matchEnv:s,keychainPath:a,keychainPassword:c,teamMeta:l})}async function Xc(e){let t="MATCH_ENCRYPTION_PASSPHRASE";try{let s=((await W.get(`/projects/${e}/secrets/export?env=development`)).data.secrets||{})[t];if(s&&!s.includes("[Decryption Failed]"))return m.info(h.dim("Using existing encryption passphrase from Dashboard")),s;if(s&&s.includes("[Decryption Failed]")){m.warn(h.yellow("\u26A0\uFE0F Existing MATCH_PASSWORD could not be decrypted (encryption key changed).")),m.info(h.dim("Generating a fresh passphrase and cleaning old certificates..."));let a=mn.randomBytes(32).toString("base64");try{await W.post(`/projects/${e}/secrets`,{key:t,value:a,type:"managed",description:"Encryption passphrase for iOS certificates (fastlane match)",visibility:"secret"}),m.success(h.green("\u2713 New encryption passphrase generated and saved"))}catch{}try{await W.post("/credentials/clean-match-storage",{projectId:e}),m.success(h.green("\u2713 Cleaned old certificates from storage"))}catch{}return a}}catch(r){m.info(h.dim(`Could not fetch existing passphrase from Dashboard: ${r.message}`))}let n=await Ie({message:"No active encryption passphrase found on Dashboard. What would you like to do?",options:[{value:"generate",label:"Generate a new secure passphrase",hint:"Safe for first-time setup"},{value:"enter",label:"Enter existing passphrase manually",hint:"Required if you already have certs in S3"},{value:"cancel",label:"Cancel",hint:"Quit"}]});if((Z(n)||n==="cancel")&&(z("Operation cancelled"),process.exit(0)),n==="enter"){let r=await pt({message:"Enter your MATCH_PASSWORD (encryption passphrase):",validate:s=>s.length>0?void 0:"Passphrase is required"});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=r;try{await W.post(`/projects/${e}/secrets`,{key:t,value:o,type:"managed",description:"Encryption passphrase for iOS certificates (fastlane match)"}),m.success(h.green("\u2713 Saved passphrase to Dashboard"))}catch{}return o}let i=mn.randomBytes(32).toString("base64");try{await W.post(`/projects/${e}/secrets`,{key:t,value:i,type:"managed",description:"Encryption passphrase for iOS certificates (fastlane match)",visibility:"secret"}),m.success(h.green("\u2713 Generated and saved encryption passphrase to Dashboard"))}catch(r){m.warn(h.yellow(`Could not save passphrase to Dashboard: ${r.message}`))}return i}async function Hc(e,t,n,i,r,o,s,a){let c=it(),l=!1,p=b=>{c.start(b),l=!0},d=b=>{l&&(c.stop(b),l=!1)};m.info(h.blue("Configuring iOS certificate management..."));let u,f,g=Ft(s,n),N=g;if(!a){let b=await Oe({message:"Apple ID (for Apple Developer Portal):",placeholder:"your-email@example.com",validate:P=>P.includes("@")?void 0:"Please enter a valid email"});Z(b)&&(z("Operation cancelled"),process.exit(0)),a=b}try{let b=await Xc(e),P="",_="";try{let R=await W.post("/credentials/build-server-token",{projectId:e});R.data.status==="success"&&R.data.credentials&&(process.env.AWS_ACCESS_KEY_ID=R.data.credentials.accessKeyId,process.env.AWS_SECRET_ACCESS_KEY=R.data.credentials.secretAccessKey,R.data.credentials.sessionToken&&(process.env.AWS_SESSION_TOKEN=R.data.credentials.sessionToken),_=R.data.credentials.region||"ap-south-1",P=R.data.credentials.bucket||I.bucketPrefix,process.env.AWS_REGION=_,delete process.env.AWS_PROFILE)}catch(R){throw m.error(`Failed to authenticate with ${I.name} Cloud.`),R}if(!P||!_){m.error(`Failed to resolve S3 configuration from ${I.name} Cloud.`);return}let S=o.teamId||g.teamId||s.submit?.production?.ios?.appleTeamId;if(!S)try{let U=(await W.get(`/projects/${e}/secrets`)).data.secrets?.find(F=>F.key==="APPLE_TEAM_ID");U&&(S=U.value,m.info(h.dim(`Using Team ID from Dashboard: ${S}`)))}catch{}S&&S===s.submit?.production?.ios?.appleTeamId&&m.info(h.dim(`Using Apple Team ID from config: ${S}`));let C=await Dt({appleId:a,config:s,profile:n,initialTeam:{...g,teamId:S,developerTeamId:g.developerTeamId||S},promptToPersistConfig:!S,saveTeamId:S?void 0:R=>Yr(e,R)});if(!C?.teamId)return;S=C.teamId;let v={...g,...C,teamId:S,developerTeamId:C.developerTeamId||g.developerTeamId||S};N=v;let L=Qa(e,S);m.info(h.dim(`Using match storage prefix: ${L}`));let B=await cc(),k={...B.env};process.env.CI||delete k.CI,p(`Preparing ${r} certificate sync...`),d("Starting certificate sync...");let T=`${I.buildPrefix}-${S}-${r}.keychain-db`,H=I.keychainPassword;try{let U=`${process.env.HOME||"/Users/"+(process.env.USER||I.nameLower)}/Library/Keychains/${T}`;m.info(h.dim(`Ensuring keychain exists: ${T}`));try{je(`security create-keychain -p ${H} ${T} 2>/dev/null || true`),je(`security unlock-keychain -p ${H} ${T}`),je(`security set-keychain-settings ${T}`);let x=je("security list-keychains -d user").toString();if(!x.includes(T)){m.info(h.dim(`Adding ${T} to search list`));let G=[...x.replace(/"/g,"").split(`
447
+ `).map($=>$.trim()).filter($=>$.length>0),U].join(" ");je(`security list-keychains -d user -s ${G}`)}}catch(x){m.warn(h.dim("Keychain setup warning (non-critical): "+x.message))}let F,te;try{let j=((await W.get(`/credentials/${e}`)).data.credentials||[]).find(G=>G.type==="asc_api_key"&&G.issuerId);if(j){let G=await W.get(`/credentials/${j.credentialId}/download`,{params:{projectId:e,format:"raw"}});if(G.data.downloadUrl){let M=await(await import("axios")).default.get(G.data.downloadUrl,{responseType:"arraybuffer"}),Q=J.join(ut.tmpdir(),`mach-asc-${Date.now()}`);V.mkdirSync(Q,{recursive:!0}),u=J.join(Q,`AuthKey_${j.keyId}.p8`),V.writeFileSync(u,Buffer.from(M.data)),F=j.keyId,te=j.issuerId,m.success(h.green("\u2713 ASC API key loaded \u2014 no 2FA required for Portal operations"))}}}catch(x){m.warn(h.dim(`Could not load ASC API key: ${x.message}. Will fall back to Apple ID auth.`))}m.info(h.dim("Generating secure P12 export password..."));let Ae=lo();m.success(h.green("\u2713 Secure P12 password generated.")),f=V.mkdtempSync(J.join(ut.tmpdir(),`${I.nameLower}-match-${r}-`));let ae={...k,AWS_REGION:process.env.AWS_REGION||"ap-south-1",AWS_ACCESS_KEY_ID:process.env.AWS_ACCESS_KEY_ID,AWS_SECRET_ACCESS_KEY:process.env.AWS_SECRET_ACCESS_KEY,SSL_CERT_FILE:"/etc/ssl/cert.pem",AWS_CA_BUNDLE:"/etc/ssl/cert.pem",FASTLANE_SSL_CA_CERT:"/etc/ssl/cert.pem",MATCH_PASSWORD:b,FASTLANE_USER:a,FASTLANE_SKIP_UPDATE_CHECK:"1",FASTLANE_TEAM_ID:S,MATCH_KEYCHAIN_NAME:U,MATCH_KEYCHAIN_PASSWORD:H,TERM:process.env.TERM||"xterm-256color",SHELL:process.env.SHELL||"/bin/zsh",MATCH_OUTPUT_PATH:f,MATCH_STORAGE_MODE:"s3",MATCH_S3_REGION:_,MATCH_S3_BUCKET:P,MATCH_S3_OBJECT_PREFIX:L,MATCH_USERNAME:a,MATCH_APP_IDENTIFIER:t,MATCH_TYPE:r,[`${I.envPrefix}P12_PASSWORD`]:Ae,...u&&F&&te?{APP_STORE_CONNECT_API_KEY_KEY_ID:F,APP_STORE_CONNECT_API_KEY_ISSUER_ID:te,APP_STORE_CONNECT_API_KEY_KEY_FILEPATH:u,FASTLANE_SKIP_2FA:"1"}:{}};if(o.force){m.warn(h.yellow(`
448
+ \u26A0\uFE0F Force flag detected: Hard resetting ${r} certificates...`)),m.info(h.dim("Detected decryption failure loop. Clearing remote storage directly to allow fresh generation.")),m.info(h.dim(`Cleaning match storage for Team ID: ${S}...`));try{(await W.post("/credentials/clean-match-storage",{projectId:e,teamId:S,storagePrefix:L})).data.status==="success"&&m.success(h.green(`\u2713 Cleared S3 storage for Team ID: ${S}`))}catch(x){m.warn(h.yellow(`S3 cleanup via API failed: ${x.message}`)),m.info(h.dim("Continuing to attempt standard nuke..."))}try{je(`${B.shellCommand} match nuke ${r} --skip_confirmation`,{stdio:"inherit",cwd:process.cwd(),env:ae}),m.success(h.green(`\u2713 Nuked existing ${r} credentials`))}catch{m.warn(h.yellow("Standard nuke failed (likely due to password mismatch).")),m.info(h.dim("Since S3 was cleared manually, proceeding to generation..."))}}let $e=r==="adhoc"||r==="development";if(r==="adhoc"||r==="development")try{m.info(h.blue("Fetching registered devices..."));let j=(await W.get("/devices",S?{params:{teamId:S}}:void 0)).data.devices||[];if(S)try{let G=await W.get("/devices",{params:{teamId:"LEGACY"}}),$=new Map;for(let M of[...j,...G.data.devices||[]])$.set(M.udid,M);j=Array.from($.values())}catch{}if(j.length===0)m.warn(h.yellow("No registered devices found. Profile will only include devices already on the Apple Developer Portal.")),m.info(h.dim(`Register devices with: ${I.nameLower} device register`));else{let{multiselect:G}=await import("@clack/prompts"),$=await G({message:`Select devices to include in the ${r} profile:`,options:j.map(M=>({value:M.udid,label:`${M.name} (${M.udid.substring(0,12)}...)`,hint:M.model||M.platform})),initialValues:j.map(M=>M.udid)});if(!Z($)&&$.length>0){let M=j.filter(Q=>$.includes(Q.udid));if(m.info(h.blue(`Registering ${M.length} device(s) on Apple Developer Portal...`)),S&&await Promise.all(M.filter(Q=>!Q.teamId).map(Q=>W.post("/devices",{udid:Q.udid,name:Q.name,platform:"ios",addedVia:Q.addedVia||"cli",teamId:S,teamName:v.teamName}).catch(()=>{}))),u&&F&&te)await $c(M,F,te,u);else{m.info(h.dim("You will be prompted for a 2FA code once \u2014 type it and press Enter."));for(let Q of M){let Je=Q.name.replace(/"/g,'\\"');ye(`${B.shellCommand} run register_device name:"${Je}" udid:"${Q.udid}"`,{shell:!0,env:ae,stdio:"inherit",cwd:process.cwd()})}}m.info(h.green("\u2713 Device registration complete.")),$e=!0}}}catch(x){m.warn(h.yellow(`Could not fetch registered devices: ${x.message}`)),m.info(h.dim("Continuing without explicit device registration."))}let ne=r,we={certificates:[],profiles:[]};try{we=await Zc(e,S,t,ne)}catch{}let ve=Kt(ne),Re=so(ne),K=we.certificates.some(x=>we.profiles.some(j=>Wc(j,x.credential)));if(!o.force&&K){m.success(h.green(`\u2713 Existing ${ve} certificate and ${Re} profile pair verified in Mach for ${t}.`));let x=await Ie({message:`What should Mach do with the existing ${Re} profile?`,options:[{value:"refresh_profile",label:`Recreate the ${Re} profile with the saved certificate`,hint:"Recommended \u2014 refreshes the Apple profile without creating another certificate"},{value:"reuse_profile",label:"Reuse the verified profile unchanged",hint:"Skips Apple Portal changes when the registered devices and entitlements are unchanged"},{value:"sync",label:"Continue with normal certificate sync",hint:"Use only when you need a different signing identity"}],initialValue:"refresh_profile"});if(Z(x)){z("Operation cancelled");return}if(x==="reuse_profile"){m.info(h.dim("Reusing the verified certificate and profile pair; no Apple Portal changes were made."));return}if(x==="refresh_profile"){if(await gn({savedCertificates:we.certificates,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw new Error("Provisioning profile refresh was cancelled or could not be completed. No new certificate was requested.")}}if(we.certificates.length>0&&!o.force){we.profiles.length>0&&m.warn(h.yellow("Existing iOS credential records do not prove that the profile was generated with the saved certificate. Mach will safely regenerate the profile from the selected P12."));let x=await Ie({message:`A saved ${ve} certificate already exists in this Mach project.`,options:[{value:"reuse",label:`Create or refresh the ${Re} profile with the saved certificate`,hint:"Recommended \u2014 no new Apple certificate is requested"},{value:"sync",label:"Continue with normal certificate sync",hint:"May ask Apple to create another certificate if Match storage is incomplete"}]});if(Z(x)){z("Operation cancelled");return}if(x==="reuse"){if(await gn({savedCertificates:we.certificates,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw new Error("Saved certificate reuse was cancelled or could not be completed. No new certificate was requested.")}}let le=[];try{le=await Jr(S,ne,e)}catch{}if(le.length>0){let x=await Ie({message:`Saved ${ve} certificate${le.length===1?"":"s"} found for Apple Team ${S}.`,options:[{value:"reuse",label:"Reuse a saved certificate",hint:`${le.length} compatible certificate${le.length===1?"":"s"} found \u2014 no new Apple certificate is requested`},{value:"sync",label:"Continue with normal certificate sync",hint:"Use this only when you need a different signing identity"}]});if(Z(x)){z("Operation cancelled");return}if(x==="reuse"){if(await gn({savedCertificates:le,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw new Error("Saved certificate reuse was cancelled or could not be completed. No new certificate was requested.")}}try{let x=`${I.nameLower} ${r} ${t}`,j=tc(B.shellCommand,r,t,x,$e);$e&&m.info(h.dim(`Refreshing ${r} provisioning profile when device list changes (--force_for_new_devices).`));let G=ye(j,{shell:!0,cwd:process.cwd(),env:ae,stdio:"inherit",encoding:"utf-8"});if(G.status!==0){m.warn(h.yellow(`
449
+ Certificate sync failed. Attempting to create App ID and retry...`));try{je(`${B.shellCommand} produce --app_identifier "${t}" --app_name "${t}" --skip_itc`,{stdio:"inherit",env:ae}),m.success(h.green("\u2713 App ID created successfully")),m.info(h.blue("Retrying certificate sync...")),G=ye(j,{shell:!0,cwd:process.cwd(),env:ae,stdio:"inherit",encoding:"utf-8"})}catch{}if(G.status!==0)throw new Error("fastlane match failed")}}catch(x){let j=Kt(ne);if(m.warn(h.yellow(`
450
+ Certificate sync failed. This can be caused by an incorrect encryption passphrase, an expired Apple session, or the ${j} certificate limit.`)),le.length===0)try{le=await Jr(S,ne,e)}catch{}let G=await Ie({message:"What would you like to do?",options:[...le.length>0?[{value:"reuse_saved",label:"Reuse a saved Mach certificate",hint:`${le.length} compatible certificate${le.length===1?"":"s"} found \u2014 no certificate is revoked`}]:[],{value:"retry_password",label:"Retry with a different MATCH_PASSWORD",hint:"Manually enter the decryption passphrase"},{value:"check_portal",label:"Check Apple Portal",hint:"Inspect certificate limits or explicitly revoke an old certificate"},{value:"manual",label:"Fallback to manual upload",hint:"Provide .p12 and .mobileprovision files"},{value:"cancel",label:"Cancel",hint:"Go back"}]});if(Z(G)||G==="cancel")throw x;if(G==="reuse_saved"){if(await gn({savedCertificates:le,targetProjectId:e,targetBundleId:t,targetDistributionType:i,matchType:ne,fastlane:B,matchEnv:ae,keychainPath:U,keychainPassword:H,teamMeta:v}))return;throw x}else if(G==="retry_password"){m.info(h.dim(`
451
+ You are overriding the dashboard passphrase for this session.`));let $=await pt({message:"Enter the correct MATCH_PASSWORD for this project:"});if($&&!Z($)){b=$,m.info(h.blue("Retrying with provided passphrase..."));let M={...ae,MATCH_PASSWORD:b};if(ye(`${B.shellCommand} match ${r}`,{shell:!0,stdio:"inherit",cwd:process.cwd(),env:M}).status===0)await W.post(`/projects/${e}/secrets`,{key:"MATCH_ENCRYPTION_PASSPHRASE",value:b,description:"Encryption passphrase for iOS certificates (fastlane match)",visibility:"secret"}),m.success(h.green("\u2713 Dashboard passphrase updated."));else throw new Error("Sync failed again with provided passphrase.")}else throw x}else if(G==="check_portal")try{let $=await An(ae,r,B.shellCommand);if($.length>0){if(m.info(h.dim(`Found ${$.length} existing ${r} certificates on the portal.`)),await zc(r,ae,e,B.shellCommand,$)&&(m.info(h.blue("Retrying certificate sync...")),ye(`${B.shellCommand} match ${r}`,{shell:!0,stdio:"inherit",cwd:process.cwd(),env:ae}).status!==0))throw new Error("Retry failed")}else throw m.error(h.red("No existing certificates found on portal to resolve.")),x}catch($){throw m.warn(h.dim(`Portal check warning: ${$.message}`)),x}else throw x}m.success(h.green("\u2713 Certificates fetched and synced"));let Ne=f,O=J.join(Ne,`${I.fastlanePrefix}_export.p12`),D=hn(Ne,/\.mobileprovision$/);try{let j=`${process.env.HOME||"/Users/"+(process.env.USER||I.nameLower)}/Library/Keychains/${T}`;V.existsSync(Ne)||V.mkdirSync(Ne,{recursive:!0}),m.info(h.dim("Exporting certificate from keychain for dashboard upload..."));let G=je(`security find-identity -v -p codesigning "${j}"`,{encoding:"utf-8"});m.info(h.dim(`Identities in keychain:
452
+ ${G.trim()}`));let $=ye("security",["export","-k",j,"-t","identities","-f","pkcs12","-o",O,"-P",Ae],{encoding:"utf-8"});if($.error||$.status!==0)throw new Error(Rt($.stdout,$.stderr)||"security could not export the signing certificate.");try{let M=ye("openssl",["pkcs12","-in",O,"-nokeys","-passin",`pass:${Ae}`,"-legacy"],{encoding:"utf-8"});if((M.error||M.status!==0)&&(M=ye("openssl",["pkcs12","-in",O,"-nokeys","-passin",`pass:${Ae}`],{encoding:"utf-8"})),M.error||M.status!==0)throw new Error(Rt(M.stdout,M.stderr)||"openssl could not read the exported P12.");let Q=M.stdout||"";if(!Q.includes(S))throw new Error(`Exported P12 does not contain identity for team ${S}. Found: ${Q.substring(0,200)}`);m.success(h.green(`\u2713 P12 verified \u2014 contains correct team identity (${S})`))}catch(M){throw new Error(`P12 verification failed: ${M.message}`)}}catch{m.warn(h.dim("Could not export certificate from keychain."))}o.teamId&&!S&&await Yr(e,o.teamId);let X=V.existsSync(O)?O:hn(Ne,/\.p12$/);if(X&&D){let x,j,G,$;try{$=Ct(D),sn($,{bundleIdentifier:t,teamId:v.teamId||o.teamId||S,distributionType:i}),G=on(Lt(X,Ae),$),m.success(h.green(`\u2713 Provisioning profile verified against signing certificate (${G.sha1.slice(0,12)}\u2026).`))}catch(Q){throw new Error(`Refusing to upload an iOS certificate/profile mismatch: ${Q.message}`)}let M={certificateSha1:G.sha1,certificateSha256:G.sha256,certificateSerial:G.serial,profileCertificateSha1s:$.certificateSha1s,profileCertificateSha256s:$.certificateSha256s};try{let Je=(await An(ae,r,B.shellCommand)).find(Se=>ui(Se.serial)===G.serial);Je?(x=Je.expires,j=Je.id):m.warn(h.yellow("The matching certificate could not be identified on the Apple portal, so Mach will save the verified fingerprint without a portal ID."))}catch{m.warn(h.dim("Could not fetch expiration date or ID for dashboard record."))}await nt(e,X,"ios_cert",t,i,void 0,x,o.teamId||S,j,Ae,void 0,void 0,v.teamId,v.teamName,v.developerTeamId,v.appStoreConnectTeamId,v.providerId,v.providerName,M),await nt(e,D,"ios_profile",t,i,void 0,x,o.teamId||S,void 0,void 0,void 0,void 0,v.teamId,v.teamName,v.developerTeamId,v.appStoreConnectTeamId,v.providerId,v.providerName,M),m.success(h.green("\u2713 Both iOS certificate and provisioning profile uploaded successfully"))}else m.warn(h.yellow("Certificates generated but not found in expected location.")),m.info(h.dim("Falling back to manual upload...")),await zr(e,t,i,N)}catch(R){d("Certificate fetch failed"),m.error(h.red(`Error: ${R.message}`)),m.info(h.dim("Falling back to manual upload...")),await zr(e,t,i,N)}}catch(b){d("iOS setup failed"),m.error(h.red(`Error: ${b.message}`))}finally{if(u)try{V.rmSync(J.dirname(u),{recursive:!0,force:!0})}catch{}if(f)try{V.rmSync(f,{recursive:!0,force:!0})}catch{}}}async function Yr(e,t){try{await W.post(`/projects/${e}/secrets`,{key:"APPLE_TEAM_ID",value:t,description:"Apple Developer Team ID (used for iOS signing)"}),m.success(h.green(`\u2713 Saved Team ID ${t} to Dashboard`))}catch(n){m.warn(h.yellow(`Could not save Team ID to Dashboard: ${n.message}`))}}async function zr(e,t,n,i={}){m.info(h.yellow(`
453
+ Manual Upload Mode`)),m.info("Please provide your certificate and provisioning profile:");let r=await Oe({message:"Path to .p12 certificate file:",validate:f=>V.existsSync(f)?void 0:"File not found"});Z(r)&&(z("Operation cancelled"),process.exit(0));let o=await Oe({message:"Path to .mobileprovision file:",validate:f=>V.existsSync(f)?void 0:"File not found"});Z(o)&&(z("Operation cancelled"),process.exit(0));let s=await pt({message:"P12 password (leave empty only when the certificate has no password):"});Z(s)&&(z("Operation cancelled"),process.exit(0));let a=r,c=o,l,p;try{p=Ct(c),sn(p,{bundleIdentifier:t,teamId:i.teamId,distributionType:n}),l=on(Lt(a,s),p)}catch(f){throw new Error(`The selected .p12 and .mobileprovision do not form a valid signing pair: ${f.message}`)}let d={certificateSha1:l.sha1,certificateSha256:l.sha256,certificateSerial:l.serial,profileCertificateSha1s:p.certificateSha1s,profileCertificateSha256s:p.certificateSha256s},u=it();u.start(`Uploading to ${I.name} Dashboard...`);try{await nt(e,a,"ios_cert",t,n,s,void 0,i.teamId,void 0,void 0,void 0,void 0,i.teamId,i.teamName,i.developerTeamId||i.teamId,i.appStoreConnectTeamId,i.providerId,i.providerName,d),await nt(e,c,"ios_profile",t,n,void 0,void 0,i.teamId,void 0,void 0,void 0,void 0,i.teamId,i.teamName,i.developerTeamId||i.teamId,i.appStoreConnectTeamId,i.providerId,i.providerName,d),u.stop("Upload complete"),m.success(h.green("\u2713 iOS credentials uploaded successfully"))}catch(f){throw u.stop("Upload failed"),f}}async function Kc(e,t,n,i,r){let o=it();m.step(h.blue("Android Credential Setup"));let s=i.bundleId;if(!s){let d=ht(r,t),u=[];try{let g=(await W.get(`/credentials/${e}`)).data.credentials||[];u=[...new Set(g.filter(N=>N.platform==="android"&&N.bundleId&&N.bundleId!=="*").map(N=>N.bundleId))]}catch{}if(d&&!u.includes(d)&&u.unshift(d),u.length>0){let f=[...u.map(N=>({value:N,label:N,hint:N===d?"from config":void 0})),{value:"__new__",label:"+ Enter a new Package Name"}],g=await Ie({message:"Which Package Name are you setting up credentials for?",options:f});if(Z(g)&&(z("Operation cancelled"),process.exit(0)),g==="__new__"){let N=await Oe({message:"Android Package Name (e.g. com.example.app):",placeholder:"com.example.app",validate:b=>b.includes(".")?void 0:"Please enter a valid package name"});Z(N)&&(z("Operation cancelled"),process.exit(0)),s=N}else s=g}else{let f=await Oe({message:"Android Package Name (e.g. com.example.app):",placeholder:"com.example.app",validate:g=>g.includes(".")?void 0:"Please enter a valid package name"});Z(f)&&(z("Operation cancelled"),process.exit(0)),s=f}}try{let f=((await W.get(`/credentials/${e}`)).data.credentials||[]).find(g=>g.platform==="android"&&g.distributionType===n&&g.bundleId===s);if(f){m.warn(h.yellow(`\u26A0\uFE0F Existing Android credentials found for ${n}`));let g=await Oe({message:"What would you like to do? (use/new/cancel)",validate:N=>{let b=N.toLowerCase();if(!(b==="use"||b==="new"||b==="cancel"))return"Please type: use, new, or cancel"}});if(Z(g)||g.toLowerCase()==="cancel")return;if(g.toLowerCase()==="use"){m.success(h.green("\u2713 Using existing credentials."));return}await W.delete(`/credentials/${f.credentialId}?projectId=${e}`)}}catch{}let a="./android/app/my-release-key.jks";if(V.existsSync(a)){let d=await fi({message:"Upload existing keystore?"});if(d&&!Z(d)){let u=await Oe({message:"Key alias:",initialValue:"my-key-alias"});if(Z(u))return;let f=await pt({message:"Keystore password:"});if(Z(f))return;let g=await pt({message:"Key password (leave blank if same as keystore password):"});if(Z(g))return;let N=g.trim()||f;await nt(e,a,"android_keystore",s,n,u,void 0,void 0,void 0,void 0,f,N),m.success(h.green("\u2713 Keystore uploaded"));return}}m.info(h.blue("Generating new Android keystore..."));let c=i.keyAlias||`${I.nameLower}-${Yc()}`,l=lo(),p=`./${I.nameLower}-${t}.jks`;V.existsSync(p)&&V.unlinkSync(p),o.start("Generating keystore...");try{let d=l.replace(/'/g,"'\\''");je(`keytool -genkeypair -v -keystore "${p}" -alias "${c}" -keyalg RSA -keysize 2048 -validity 10000 -storepass '${d}' -keypass '${d}' -dname "CN=${I.name} Build, OU=Mobile, O=Company, L=City, S=State, C=US"`,{stdio:"inherit"}),o.stop("Keystore generated"),await nt(e,p,"android_keystore",s,n,c,void 0,void 0,void 0,void 0,l,l),m.success(h.green("\u2713 Android credentials uploaded successfully")),m.info(h.cyan(`Key Alias: ${c}`))}catch(d){throw o.stop("Generation failed"),new Error(`Keystore generation failed: ${d.message}`)}}var ao=e=>new Promise(t=>setTimeout(t,e));function co(e){return/ECONNRESET|ETIMEDOUT|EAI_AGAIN|ENOTFOUND|ECONNABORTED|socket hang up|network|timeout|temporar/i.test(e)||/API_ERROR:\s*(408|409|425|429|5\d\d)/i.test(e)}async function nt(e,t,n,i,r,o,s,a,c,l,p,d,u,f,g,N,b,P,_){let S=J.basename(t);m.info(h.dim(`Uploading ${S} (Isolated process)...`));let C=new URL(import.meta.url),v=J.dirname(C.pathname),B=[J.join(v,"commands","isolated-upload.js"),e,t,n,i,r,o||"undefined",s||"undefined",a||"undefined",c||"undefined",l||"undefined",p||"undefined",d||"undefined",u||"undefined",f||"undefined",g||"undefined",N||"undefined",b||"undefined",P||"undefined",_?JSON.stringify(_):"undefined"],k="",T=5;for(let H=1;H<=T;H++){let R=ye("node",B,{stdio:"pipe",encoding:"utf-8",env:{...process.env,AT_CLI_ISOLATED:"1"}});if(R.status===0&&R.stdout.includes("SUCCESS")){m.info(h.dim(`\u2713 ${S} uploaded and registered.`));return}if(R.status===0){m.warn(h.yellow(`Isolated upload finished but success not confirmed: ${R.stdout}`));return}if(k=(R.stderr||R.stdout||R.error?.message||"Unknown isolated upload failure").trim(),!co(k)||H>=T)throw m.error(h.red(`Isolated Upload Failed: ${k}`)),new Error(k);let F=Math.min(3e4,1500*Math.pow(2,H-1));m.warn(h.yellow(`Upload failed with a transient error. Retrying ${S} in ${Math.round(F/1e3)}s... (${H}/${T})`)),await ao(F)}throw new Error(k||"Unknown isolated upload failure")}async function Jc(e){let t=it(),n=e.platform,i=`./${I.configFileName}`;if(!V.existsSync(i)){m.error(`No ${I.configFileName} found. Run \`${I.nameLower} init\` or \`${I.nameLower} link\` first.`);return}let r=JSON.parse(V.readFileSync(i,"utf-8")),{projectId:o}=r;if(!o){m.error(`${I.configFileName} is missing projectId.`);return}try{t.start("Fetching project secrets...");let a=(await W.get(`/projects/${o}/secrets/export?env=all`)).data.secrets||{};t.stop("Secrets fetched and merged."),t.start("Fetching credentials...");let l=(await W.get(`/credentials/${o}`)).data.credentials||[];t.stop(`Found ${l.length} metadata records.`);let p=l.filter(g=>g.platform===n);if(p.length===0){m.info(`No ${n} credentials found on Dashboard.`);return}let d="./credentials.json",u={};if(V.existsSync(d))try{u=JSON.parse(V.readFileSync(d,"utf-8"))}catch{m.warn("Could not parse existing credentials.json, creating a new one.")}u[n]||(u[n]={});let f=J.join(process.cwd(),"credentials",n);V.existsSync(f)||V.mkdirSync(f,{recursive:!0});for(let g of p){t.start(`Downloading ${g.type} (${g.distributionType})...`);try{let N=await W.get(`/credentials/${g.credentialId}/download`,{params:{projectId:o,format:"raw"}});if(N.data.status==="success"&&N.data.downloadUrl){let b=J.join(process.cwd(),"credentials",n,g.distributionType);V.existsSync(b)||V.mkdirSync(b,{recursive:!0});let P=g.s3Key?.split(".").pop()||(g.type.includes("keystore")?"jks":g.type.includes("cert")?"p12":"mobileprovision"),_=`${g.type}.${P}`,S=J.join(b,_),C=await Qr.get(N.data.downloadUrl,{responseType:"arraybuffer"});V.writeFileSync(S,Buffer.from(C.data));let v=J.join("credentials",n,g.distributionType,_),L="",B="",k={alias:"",keystorePassword:"",keyPassword:""};if(n==="ios"&&g.type==="ios_cert"||n==="android"&&g.type==="android_keystore"){let T=await to(o,n,g);if(n==="ios"&&g.type==="ios_cert"&&P.toLowerCase()==="p12"){if(L=no(T,a),L){let H=Xr(S,`${J.basename(S,J.extname(S))}-password.txt`,L);B=J.join("credentials",n,g.distributionType,J.basename(H))}}else if(n==="android"&&g.type==="android_keystore"&&(k=pc(T,a),k.keystorePassword||k.keyPassword)){let H=[k.alias?`keyAlias=${k.alias}`:void 0,k.keystorePassword?`keystorePassword=${k.keystorePassword}`:void 0,k.keyPassword?`keyPassword=${k.keyPassword}`:void 0].filter(Boolean).join(`
454
+ `),R=Xr(S,`${J.basename(S,J.extname(S))}-passwords.txt`,H);B=J.join("credentials",n,g.distributionType,J.basename(R))}}if(n==="android")g.type==="android_keystore"&&(u.android.keystore={keystorePath:v,keystorePassword:k.keystorePassword,keyAlias:k.alias,keyPassword:k.keyPassword},B&&(u.android.keystore.keystoreArchivePath=B));else if(n==="ios"){let T=g.distributionType==="store"?"production":g.distributionType==="adhoc"?"staging":"development";u.ios[T]||(u.ios[T]={}),g.type==="ios_cert"?(u.ios[T].certificatePath=v,u.ios[T].certificatePassword=L,B&&(u.ios[T].certificateArchivePath=B)):g.type==="ios_profile"&&(u.ios[T].provisioningProfilePath=v)}t.stop(`\u2713 ${g.type} (${g.distributionType}) saved${B?" with password archive":""}.`)}}catch(N){let b=N.response?.data?.message||N.message;t.stop(h.dim(`- Skipped ${g.type} (${g.distributionType}): ${b}`))}}V.writeFileSync(d,JSON.stringify(u,null,2)),m.success(h.green("\u2713 Local credentials.json updated.")),Ka("Credentials have been synced to your local machine. Ensure credentials.json and credentials/ is added to your .gitignore.","Sync Complete")}catch(s){t.stop(h.red("Sync failed.")),m.error(`Error: ${s.message}`)}}function lo(){let e="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_+=",t="";for(let n=0;n<24;n++)t+=e.charAt(Math.floor(Math.random()*e.length));return t}function Yc(e=8){let t="abcdefghijklmnopqrstuvwxyz0123456789",n="";for(let i=0;i<e;i++)n+=t.charAt(Math.floor(Math.random()*t.length));return n}async function zc(e,t,n,i,r){let o=r||await An(t,e,i);if(!o||o.length===0)return!1;let s=await Ie({message:"Select a certificate to revoke:",options:[...o.map(a=>({value:`revoke:${a.id}`,label:`Revoke: ${a.name} (${a.expires})`})),{value:"nuke",label:"Revoke All"},{value:"cancel",label:"Cancel"}]});return Z(s)||s==="cancel"?!1:s==="nuke"?(je(`${i} match nuke ${e}`,{stdio:"inherit",cwd:process.cwd(),env:t}),!0):typeof s=="string"&&s.startsWith("revoke:")?(await Qc(t,s.split(":")[1],i),!0):!1}async function An(e,t,n){let i=t==="development"?"development":"distribution",r=`
455
455
  lane :${I.fastlanePrefix}_list_certs do
456
456
  require 'spaceship'
457
457
  require 'json'
@@ -498,4 +498,4 @@ lane :${I.fastlanePrefix}_revoke_cert do
498
498
  $stderr.puts "ERROR: #{e.message}"
499
499
  exit 1
500
500
  end
501
- end`,r=J.join(ut.tmpdir(),`/tmp/${I.nameLower}-revoke-cert-${Date.now()}`),o=J.join(r,"fastlane"),s=J.join(o,"Fastfile");try{V.existsSync(o)||V.mkdirSync(o,{recursive:!0}),V.writeFileSync(s,i),je(`${n} ${I.fastlanePrefix}_revoke_cert`,{env:{...e,CI:"1",FASTLANE_FASTFILE:s},cwd:r,stdio:["inherit","pipe","inherit"]})}finally{V.existsSync(r)&&V.rmSync(r,{recursive:!0,force:!0})}}export{nl as a,ho as b,Cn as c,Ft as d,bi as e,gt as f,ht as g,ze as h,il as i,jl as j,Wl as k,Zl as l,Ul as m,Ti as n,Gl as o,jt as p,Bn as q,Fi as r,Di as s,od as t,sd as u,ad as v,cd as w,wd as x,vd as y,$s as z,St as A,Pd as B,kd as C,Yi as D,zi as E,Od as F,Dd as G,Bd as H,Ct as I,Lt as J,on as K,gp as L,Pt as M,Ri as N,ii as O,kp as P,Op as Q,fn as R,$p as S,_p as T,_c as U,Tc as V,Jc as W};
501
+ end`,r=J.join(ut.tmpdir(),`/tmp/${I.nameLower}-revoke-cert-${Date.now()}`),o=J.join(r,"fastlane"),s=J.join(o,"Fastfile");try{V.existsSync(o)||V.mkdirSync(o,{recursive:!0}),V.writeFileSync(s,i),je(`${n} ${I.fastlanePrefix}_revoke_cert`,{env:{...e,CI:"1",FASTLANE_FASTFILE:s},cwd:r,stdio:["inherit","pipe","inherit"]})}finally{V.existsSync(r)&&V.rmSync(r,{recursive:!0,force:!0})}}export{nl as a,ho as b,Cn as c,Ft as d,bi as e,mt as f,ht as g,ze as h,il as i,jl as j,Wl as k,Zl as l,Ul as m,Ti as n,Gl as o,jt as p,Bn as q,Fi as r,Di as s,od as t,sd as u,ad as v,cd as w,wd as x,vd as y,$s as z,St as A,Pd as B,kd as C,Yi as D,zi as E,Od as F,Dd as G,Bd as H,Ct as I,Lt as J,on as K,mp as L,Pt as M,Ri as N,ii as O,kp as P,Op as Q,fn as R,$p as S,_p as T,_c as U,Tc as V,Jc as W};