@absolutejs/absolute 0.20.0-beta.30 → 0.20.0-beta.32

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (43) hide show
  1. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  2. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  3. package/dist/angular/index.js +5 -1
  4. package/dist/angular/index.js.map +3 -3
  5. package/dist/angular/server.js +5 -1
  6. package/dist/angular/server.js.map +3 -3
  7. package/dist/build.js +7 -1
  8. package/dist/build.js.map +4 -4
  9. package/dist/cli/config/server.js +4 -0
  10. package/dist/cli/index.js +9 -0
  11. package/dist/dev/client/hmrClient.ts +5 -2
  12. package/dist/dev/client/hmrTiming.ts +2 -0
  13. package/dist/index.js +284 -204
  14. package/dist/index.js.map +10 -9
  15. package/dist/mobile/index.js +394 -31
  16. package/dist/mobile/index.js.map +11 -6
  17. package/dist/mobile/remoteMacAgentEntry.js +5 -5
  18. package/dist/mobile/shellBootstrap.js +205 -0
  19. package/dist/react/index.js +5 -1
  20. package/dist/react/index.js.map +3 -3
  21. package/dist/react/server.js +5 -1
  22. package/dist/react/server.js.map +3 -3
  23. package/dist/src/cli/config/server.d.ts +1 -1
  24. package/dist/src/core/prepare.d.ts +340 -0
  25. package/dist/src/mobile/index.d.ts +2 -0
  26. package/dist/src/mobile/mobilePreview.d.ts +174 -0
  27. package/dist/src/mobile/mobilePreviewClient.d.ts +1 -0
  28. package/dist/src/mobile/shellHttp.d.ts +2 -0
  29. package/dist/src/plugins/imageOptimizer.d.ts +1 -1
  30. package/dist/src/react/hooks/useMediaQuery.d.ts +1 -1
  31. package/dist/src/utils/logger.d.ts +1 -0
  32. package/dist/src/utils/startupBanner.d.ts +1 -0
  33. package/dist/src/utils/userAgentFunctions.d.ts +1 -1
  34. package/dist/svelte/index.js +5 -1
  35. package/dist/svelte/index.js.map +3 -3
  36. package/dist/svelte/server.js +5 -1
  37. package/dist/svelte/server.js.map +3 -3
  38. package/dist/types/messages.d.ts +1 -1
  39. package/dist/vue/index.js +5 -1
  40. package/dist/vue/index.js.map +3 -3
  41. package/dist/vue/server.js +5 -1
  42. package/dist/vue/server.js.map +3 -3
  43. package/package.json +2 -1
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- import{readFile as pb}from"fs/promises";import{join as tb}from"path";import{createInterface as ob}from"readline";import{resolve as bw}from"path";var yw=/^[A-Za-z][\w]*(?:\.[A-Za-z][\w]*)+$/,fw=/^[a-z][a-z0-9+.-]*$/,dw=/^[A-Z0-9]{10}$/,Pw=/^[0-9A-F]{64}$/,gw=/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(?:\.(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?))*$/,v=(w,b,$)=>{let A=bw(w),S=bw(A,b);if(S!==A&&!S.startsWith(`${A}/`))throw TypeError(`${$} must remain inside the project root.`);return S},V=(w,b)=>{let $=w.trim();if(!$)throw TypeError(`${b} must not be empty.`);return $},hw=(w)=>{let b=V(w??"/","mobile.entry");if(!b.startsWith("/")||b.startsWith("//"))throw TypeError("mobile.entry must be an absolute application path.");return b},mw=(w)=>{let b=new URL(V(w,"mobile.server.productionOrigin")),$=b.protocol==="http:"&&(b.hostname==="localhost"||b.hostname==="127.0.0.1"||b.hostname==="[::1]");if(b.protocol!=="https:"&&!$)throw TypeError("mobile.server.productionOrigin must use HTTPS, except for a loopback development origin.");if(b.username||b.password||b.pathname!=="/"||b.search||b.hash)throw TypeError("mobile.server.productionOrigin must be an origin without credentials, path, query, or hash.");return b.origin},lw=(w)=>{let b=[...new Set(w??["ios","android"])];if(b.length===0)throw TypeError("mobile.platforms must contain at least one platform.");return b},jw=(w,b)=>{let $=(M)=>{let O=V(M,"mobile.deepLinks.hosts").toLowerCase();if(!gw.test(O))throw TypeError("mobile.deepLinks.hosts entries must be valid hostnames without ports, wildcards, or paths.");return O},A=new URL(b).hostname,S=new Set(A==="[::1]"?[]:[$(A)]);for(let M of w??[])S.add($(M));return[...S].sort()},uw=(w)=>{if(w===void 0)return;let b=V(w,"mobile.deepLinks.apple.appIdPrefix").toUpperCase();if(!dw.test(b))throw TypeError("mobile.deepLinks.apple.appIdPrefix must contain ten letters or digits.");return b},vw=(w)=>{if(w===void 0)return;let b=V(w,"mobile.ios.version");if(!/^\d+(?:\.\d+){0,2}$/u.test(b))throw TypeError("mobile.ios.version must contain one to three dot-separated integer components, for example 1.4.0.");return b},cw=(w)=>[...new Set((w??[]).map((b)=>V(b,"mobile.deepLinks.android.sha256CertificateFingerprints").replaceAll(":","").toUpperCase()).map((b)=>{if(!Pw.test(b))throw TypeError("mobile.deepLinks.android.sha256CertificateFingerprints entries must be SHA-256 certificate fingerprints.");return b.match(/.{2}/g)?.join(":")??b}))].sort(),$w=(w,b)=>{let $=V(w.appId,"mobile.appId");if(!yw.test($))throw TypeError("mobile.appId must use reverse-domain notation, for example com.example.app.");let A=mw(w.server.productionOrigin),S=(w.deepLinks?.scheme??$).trim().toLowerCase();if(S&&!fw.test(S))throw TypeError("mobile.deepLinks.scheme is not a valid URL scheme.");return{androidCertificateFingerprints:cw(w.deepLinks?.android?.sha256CertificateFingerprints),appId:$,appleAppIdPrefix:uw(w.deepLinks?.apple?.appIdPrefix),appName:V(w.appName,"mobile.appName"),bundleDirectory:v(b,w.bundleDirectory??".absolutejs/mobile/web","mobile.bundleDirectory"),deepLinkHosts:jw(w.deepLinks?.hosts,A),deepLinkScheme:S,engine:"capacitor",entry:hw(w.entry),iosVersion:vw(w.ios?.version),nativeProjectDirectory:v(b,w.nativeProject?.directory??"mobile","mobile.nativeProject.directory"),platforms:lw(w.platforms),productionOrigin:A,pushAndroidGoogleServicesFile:v(b,w.pushNotifications?.android?.googleServicesFile??"google-services.json","mobile.pushNotifications.android.googleServicesFile")}};import{createHash as Nb,randomUUID as Wb}from"crypto";import{access as _b,copyFile as _w,mkdir as f,readFile as j,rename as Ib,rm as n,writeFile as Z}from"fs/promises";import{dirname as Gw,isAbsolute as Ub,join as I,relative as Xb,resolve as u,sep as Hb}from"path";import{access as sw}from"fs/promises";import{homedir as Mw}from"os";import{join as q}from"path";import{existsSync as _$,readFileSync as aw}from"fs";var k=1000;var Aw=60000;var c=2;var h=(w)=>{let b;if(w<k)b=`${w.toFixed(c)}ms`;else if(w<Aw)b=`${(w/k).toFixed(c)}s`;else{let $=Math.round(w/k),A=Math.floor($/60),S=$%60;b=S===0?`${A}m`:`${A}m ${S}s`}return b};var Sw=()=>{try{let w=aw("/proc/version","utf-8");return/microsoft|wsl/i.test(w)}catch{return!1}};var Ow="AbsoluteJS_API_36",nw=(w)=>{try{let b=Bun.spawnSync(w,{stderr:"ignore",stdout:"pipe"});return{exitCode:b.exitCode,stdout:b.stdout.toString()}}catch{return{exitCode:1,stdout:""}}},rw=(w)=>{try{let b=JSON.parse(w);if(typeof b!=="object"||b===null)return!1;let $=Reflect.get(b,"runtimes");if(!Array.isArray($))return!1;return $.some((A)=>typeof A==="object"&&A!==null&&Reflect.get(A,"isAvailable")===!0&&typeof Reflect.get(A,"identifier")==="string"&&String(Reflect.get(A,"identifier")).includes("iOS"))}catch{return!1}},iw=(w)=>{let b=/^([a-z]):[\\/](.*)$/i.exec(w.trim());if(!b)return w.trim().replaceAll("\\","/");return`/mnt/${b[1]?.toLowerCase()}/${b[2]?.replaceAll("\\","/")}`},pw=()=>{try{let w=Bun.spawnSync(["cmd.exe","/d","/c","echo","%LOCALAPPDATA%"],{stderr:"ignore",stdout:"pipe"});if(w.exitCode!==0)return;let b=w.stdout.toString().trim();if(!b||b==="%LOCALAPPDATA%")return;return iw(b)}catch{return}},tw=(w,b=process.env)=>{if(w==="windows")return q(b.LOCALAPPDATA??q(Mw(),"AppData","Local"),"AbsoluteJS","Android","Sdk");if(w==="wsl"){let $=pw();if($)return q($,"AbsoluteJS","Android","Sdk")}return q(Mw(),".absolutejs","android-sdk")},ow=async(w)=>{try{return await sw(w),!0}catch{return!1}},m=(w=process.platform,b=Sw())=>{if(w==="darwin")return"macos";if(w==="win32")return"windows";if(w==="linux"&&b)return"wsl";return"linux"},ew=(w,b)=>{if(w==="wsl")return[`${b}.exe`,`${b}.bat`,b];if(w==="windows")return[b,`${b}.exe`,`${b}.bat`];return[b]},Q=async(w,b,$,A)=>{let M=(await Promise.all(b.map(async(O)=>await $.exists(O)?O:void 0))).find((O)=>O!==void 0);if(M)return M;for(let O of ew(A,w)){let J=$.which(O);if(J)return J}return},T=(w,b,$,A,S)=>A?{id:w,label:b,path:A,platform:$,status:"pass"}:{id:w,label:b,platform:$,remediation:S,status:"fail"},Dw=async(w={})=>{let b=w.env??process.env,$=w.host??m(),A=w.exists??ow,S=w.which??((N)=>Bun.which(N)),M=w.capture??nw,O=w.androidRoot===null?void 0:w.androidRoot??b.ANDROID_HOME??b.ANDROID_SDK_ROOT??tw($,b),J=$==="windows"||$==="wsl",D=(N)=>O?q(O,...N):void 0,C=(N)=>N.filter((B)=>Boolean(B)),x=await Q("adb",C([D(["platform-tools",J?"adb.exe":"adb"])]),{exists:A,which:S},$),K=await Q("emulator",C([D(["emulator",J?"emulator.exe":"emulator"])]),{exists:A,which:S},$),Y=await Q("sdkmanager",C([D(["cmdline-tools","latest","bin",J?"sdkmanager.bat":"sdkmanager"])]),{exists:A,which:S},$),d=await Q("avdmanager",C([D(["cmdline-tools","latest","bin",J?"avdmanager.bat":"avdmanager"])]),{exists:A,which:S},$),U=await Q("java",[],{exists:A,which:S},$),_=[{id:"host",label:`Development host: ${$}`,platform:"host",status:"pass"},T("android.adb","Android Debug Bridge","android",x,"Install Android SDK Platform Tools or expose adb on PATH."),T("android.emulator","Android Emulator","android",K,"Install the Android Emulator from Android Studio SDK Manager."),T("android.sdkmanager","Android SDK Manager","android",Y,"Install Android SDK Command-line Tools (latest)."),T("android.avdmanager","Android Virtual Device Manager","android",d,"Install Android SDK Command-line Tools (latest)."),T("android.java","Java runtime","android",U,"Install the JDK required by the configured Android Gradle plugin.")];if(K){let N=M([K,"-list-avds"]),B=N.exitCode===0&&N.stdout.split(/\r?\n/).includes(Ow);_.push({id:"android.avd",label:`AbsoluteJS Android emulator (${Ow})`,platform:"android",remediation:B?void 0:"Run absolute mobile doctor android --fix to provision the managed emulator.",status:B?"pass":"fail"})}if($==="wsl")_.push({id:"android.virtualization",label:x?.endsWith(".exe")?"Windows-host Android bridge available to WSL":"WSL requires a Windows-host emulator bridge or Linux KVM",platform:"android",remediation:x?.endsWith(".exe")?void 0:"Expose the Windows Android SDK adb.exe to WSL, or enable /dev/kvm for a Linux SDK.",status:x?.endsWith(".exe")?"pass":"warn"});else if($==="linux"){let N=await A("/dev/kvm");_.push({id:"android.virtualization",label:"Linux KVM acceleration",platform:"android",remediation:N?void 0:"Enable KVM and grant the current user access to /dev/kvm.",status:N?"pass":"warn"})}if($!=="macos")return _.push({id:"ios.simulator",label:"iOS Simulator requires macOS and Xcode",platform:"ios",status:"skip"}),_;let G=await Q("xcrun",[],{exists:A,which:S},$),W=await Q("xcodebuild",[],{exists:A,which:S},$);if(_.push(T("ios.xcrun","Xcode command runner","ios",G,"Install Xcode and select it with xcode-select."),T("ios.xcodebuild","Xcode build system","ios",W,"Install Xcode and select it with xcode-select.")),G){let N=M([G,"simctl","list","runtimes","--json"]),B=N.exitCode===0&&rw(N.stdout);_.push({id:"ios.runtime",label:"iOS Simulator runtime",platform:"ios",remediation:B?void 0:"Run absolute mobile doctor ios --fix to download an iOS Simulator runtime.",status:B?"pass":"fail"})}return _};import{access as wb,readFile as bb,rename as $b,writeFile as Ab}from"fs/promises";import{relative as Sb,resolve as Cw}from"path";var Jw="capacitor.config.ts",a=(w,b)=>Sb(w,b).replaceAll("\\","/"),Mb=(w,b)=>`import type { CapacitorConfig } from '@capacitor/cli';
2
+ import{readFile as pb}from"fs/promises";import{join as tb}from"path";import{createInterface as ob}from"readline";import{resolve as bw}from"path";var yw=/^[A-Za-z][\w]*(?:\.[A-Za-z][\w]*)+$/,fw=/^[a-z][a-z0-9+.-]*$/,Pw=/^[A-Z0-9]{10}$/,dw=/^[0-9A-F]{64}$/,gw=/^(?=.{1,253}$)(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?)(?:\.(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?))*$/,v=(w,b,$)=>{let A=bw(w),S=bw(A,b);if(S!==A&&!S.startsWith(`${A}/`))throw TypeError(`${$} must remain inside the project root.`);return S},V=(w,b)=>{let $=w.trim();if(!$)throw TypeError(`${b} must not be empty.`);return $},lw=(w)=>{let b=V(w??"/","mobile.entry");if(!b.startsWith("/")||b.startsWith("//"))throw TypeError("mobile.entry must be an absolute application path.");return b},hw=(w)=>{let b=new URL(V(w,"mobile.server.productionOrigin")),$=b.protocol==="http:"&&(b.hostname==="localhost"||b.hostname==="127.0.0.1"||b.hostname==="[::1]");if(b.protocol!=="https:"&&!$)throw TypeError("mobile.server.productionOrigin must use HTTPS, except for a loopback development origin.");if(b.username||b.password||b.pathname!=="/"||b.search||b.hash)throw TypeError("mobile.server.productionOrigin must be an origin without credentials, path, query, or hash.");return b.origin},mw=(w)=>{let b=[...new Set(w??["ios","android"])];if(b.length===0)throw TypeError("mobile.platforms must contain at least one platform.");return b},jw=(w,b)=>{let $=(M)=>{let O=V(M,"mobile.deepLinks.hosts").toLowerCase();if(!gw.test(O))throw TypeError("mobile.deepLinks.hosts entries must be valid hostnames without ports, wildcards, or paths.");return O},A=new URL(b).hostname,S=new Set(A==="[::1]"?[]:[$(A)]);for(let M of w??[])S.add($(M));return[...S].sort()},uw=(w)=>{if(w===void 0)return;let b=V(w,"mobile.deepLinks.apple.appIdPrefix").toUpperCase();if(!Pw.test(b))throw TypeError("mobile.deepLinks.apple.appIdPrefix must contain ten letters or digits.");return b},vw=(w)=>{if(w===void 0)return;let b=V(w,"mobile.ios.version");if(!/^\d+(?:\.\d+){0,2}$/u.test(b))throw TypeError("mobile.ios.version must contain one to three dot-separated integer components, for example 1.4.0.");return b},cw=(w)=>[...new Set((w??[]).map((b)=>V(b,"mobile.deepLinks.android.sha256CertificateFingerprints").replaceAll(":","").toUpperCase()).map((b)=>{if(!dw.test(b))throw TypeError("mobile.deepLinks.android.sha256CertificateFingerprints entries must be SHA-256 certificate fingerprints.");return b.match(/.{2}/g)?.join(":")??b}))].sort(),$w=(w,b)=>{let $=V(w.appId,"mobile.appId");if(!yw.test($))throw TypeError("mobile.appId must use reverse-domain notation, for example com.example.app.");let A=hw(w.server.productionOrigin),S=(w.deepLinks?.scheme??$).trim().toLowerCase();if(S&&!fw.test(S))throw TypeError("mobile.deepLinks.scheme is not a valid URL scheme.");return{androidCertificateFingerprints:cw(w.deepLinks?.android?.sha256CertificateFingerprints),appId:$,appleAppIdPrefix:uw(w.deepLinks?.apple?.appIdPrefix),appName:V(w.appName,"mobile.appName"),bundleDirectory:v(b,w.bundleDirectory??".absolutejs/mobile/web","mobile.bundleDirectory"),deepLinkHosts:jw(w.deepLinks?.hosts,A),deepLinkScheme:S,engine:"capacitor",entry:lw(w.entry),iosVersion:vw(w.ios?.version),nativeProjectDirectory:v(b,w.nativeProject?.directory??"mobile","mobile.nativeProject.directory"),platforms:mw(w.platforms),productionOrigin:A,pushAndroidGoogleServicesFile:v(b,w.pushNotifications?.android?.googleServicesFile??"google-services.json","mobile.pushNotifications.android.googleServicesFile")}};import{createHash as Nb,randomUUID as Wb}from"crypto";import{access as Ub,copyFile as Uw,mkdir as f,readFile as j,rename as _b,rm as n,writeFile as Z}from"fs/promises";import{dirname as Gw,isAbsolute as Ib,join as _,relative as Xb,resolve as u,sep as Hb}from"path";import{access as sw}from"fs/promises";import{homedir as Mw}from"os";import{join as q}from"path";import{existsSync as U$,readFileSync as aw}from"fs";var k=1000;var Aw=60000;var c=2;var l=(w)=>{let b;if(w<k)b=`${w.toFixed(c)}ms`;else if(w<Aw)b=`${(w/k).toFixed(c)}s`;else{let $=Math.round(w/k),A=Math.floor($/60),S=$%60;b=S===0?`${A}m`:`${A}m ${S}s`}return b};var Sw=()=>{try{let w=aw("/proc/version","utf-8");return/microsoft|wsl/i.test(w)}catch{return!1}};var Ow="AbsoluteJS_API_36",nw=(w)=>{try{let b=Bun.spawnSync(w,{stderr:"ignore",stdout:"pipe"});return{exitCode:b.exitCode,stdout:b.stdout.toString()}}catch{return{exitCode:1,stdout:""}}},rw=(w)=>{try{let b=JSON.parse(w);if(typeof b!=="object"||b===null)return!1;let $=Reflect.get(b,"runtimes");if(!Array.isArray($))return!1;return $.some((A)=>typeof A==="object"&&A!==null&&Reflect.get(A,"isAvailable")===!0&&typeof Reflect.get(A,"identifier")==="string"&&String(Reflect.get(A,"identifier")).includes("iOS"))}catch{return!1}},iw=(w)=>{let b=/^([a-z]):[\\/](.*)$/i.exec(w.trim());if(!b)return w.trim().replaceAll("\\","/");return`/mnt/${b[1]?.toLowerCase()}/${b[2]?.replaceAll("\\","/")}`},pw=()=>{try{let w=Bun.spawnSync(["cmd.exe","/d","/c","echo","%LOCALAPPDATA%"],{stderr:"ignore",stdout:"pipe"});if(w.exitCode!==0)return;let b=w.stdout.toString().trim();if(!b||b==="%LOCALAPPDATA%")return;return iw(b)}catch{return}},tw=(w,b=process.env)=>{if(w==="windows")return q(b.LOCALAPPDATA??q(Mw(),"AppData","Local"),"AbsoluteJS","Android","Sdk");if(w==="wsl"){let $=pw();if($)return q($,"AbsoluteJS","Android","Sdk")}return q(Mw(),".absolutejs","android-sdk")},ow=async(w)=>{try{return await sw(w),!0}catch{return!1}},h=(w=process.platform,b=Sw())=>{if(w==="darwin")return"macos";if(w==="win32")return"windows";if(w==="linux"&&b)return"wsl";return"linux"},ew=(w,b)=>{if(w==="wsl")return[`${b}.exe`,`${b}.bat`,b];if(w==="windows")return[b,`${b}.exe`,`${b}.bat`];return[b]},Q=async(w,b,$,A)=>{let M=(await Promise.all(b.map(async(O)=>await $.exists(O)?O:void 0))).find((O)=>O!==void 0);if(M)return M;for(let O of ew(A,w)){let J=$.which(O);if(J)return J}return},T=(w,b,$,A,S)=>A?{id:w,label:b,path:A,platform:$,status:"pass"}:{id:w,label:b,platform:$,remediation:S,status:"fail"},Dw=async(w={})=>{let b=w.env??process.env,$=w.host??h(),A=w.exists??ow,S=w.which??((N)=>Bun.which(N)),M=w.capture??nw,O=w.androidRoot===null?void 0:w.androidRoot??b.ANDROID_HOME??b.ANDROID_SDK_ROOT??tw($,b),J=$==="windows"||$==="wsl",D=(N)=>O?q(O,...N):void 0,C=(N)=>N.filter((B)=>Boolean(B)),x=await Q("adb",C([D(["platform-tools",J?"adb.exe":"adb"])]),{exists:A,which:S},$),K=await Q("emulator",C([D(["emulator",J?"emulator.exe":"emulator"])]),{exists:A,which:S},$),Y=await Q("sdkmanager",C([D(["cmdline-tools","latest","bin",J?"sdkmanager.bat":"sdkmanager"])]),{exists:A,which:S},$),P=await Q("avdmanager",C([D(["cmdline-tools","latest","bin",J?"avdmanager.bat":"avdmanager"])]),{exists:A,which:S},$),I=await Q("java",[],{exists:A,which:S},$),U=[{id:"host",label:`Development host: ${$}`,platform:"host",status:"pass"},T("android.adb","Android Debug Bridge","android",x,"Install Android SDK Platform Tools or expose adb on PATH."),T("android.emulator","Android Emulator","android",K,"Install the Android Emulator from Android Studio SDK Manager."),T("android.sdkmanager","Android SDK Manager","android",Y,"Install Android SDK Command-line Tools (latest)."),T("android.avdmanager","Android Virtual Device Manager","android",P,"Install Android SDK Command-line Tools (latest)."),T("android.java","Java runtime","android",I,"Install the JDK required by the configured Android Gradle plugin.")];if(K){let N=M([K,"-list-avds"]),B=N.exitCode===0&&N.stdout.split(/\r?\n/).includes(Ow);U.push({id:"android.avd",label:`AbsoluteJS Android emulator (${Ow})`,platform:"android",remediation:B?void 0:"Run absolute mobile doctor android --fix to provision the managed emulator.",status:B?"pass":"fail"})}if($==="wsl")U.push({id:"android.virtualization",label:x?.endsWith(".exe")?"Windows-host Android bridge available to WSL":"WSL requires a Windows-host emulator bridge or Linux KVM",platform:"android",remediation:x?.endsWith(".exe")?void 0:"Expose the Windows Android SDK adb.exe to WSL, or enable /dev/kvm for a Linux SDK.",status:x?.endsWith(".exe")?"pass":"warn"});else if($==="linux"){let N=await A("/dev/kvm");U.push({id:"android.virtualization",label:"Linux KVM acceleration",platform:"android",remediation:N?void 0:"Enable KVM and grant the current user access to /dev/kvm.",status:N?"pass":"warn"})}if($!=="macos")return U.push({id:"ios.simulator",label:"iOS Simulator requires macOS and Xcode",platform:"ios",status:"skip"}),U;let G=await Q("xcrun",[],{exists:A,which:S},$),W=await Q("xcodebuild",[],{exists:A,which:S},$);if(U.push(T("ios.xcrun","Xcode command runner","ios",G,"Install Xcode and select it with xcode-select."),T("ios.xcodebuild","Xcode build system","ios",W,"Install Xcode and select it with xcode-select.")),G){let N=M([G,"simctl","list","runtimes","--json"]),B=N.exitCode===0&&rw(N.stdout);U.push({id:"ios.runtime",label:"iOS Simulator runtime",platform:"ios",remediation:B?void 0:"Run absolute mobile doctor ios --fix to download an iOS Simulator runtime.",status:B?"pass":"fail"})}return U};import{access as wb,readFile as bb,rename as $b,writeFile as Ab}from"fs/promises";import{relative as Sb,resolve as Cw}from"path";var Jw="capacitor.config.ts",a=(w,b)=>Sb(w,b).replaceAll("\\","/"),Mb=(w,b)=>`import type { CapacitorConfig } from '@capacitor/cli';
3
3
 
4
4
  const config: CapacitorConfig = {
5
5
  appId: ${JSON.stringify(w.appId)},
@@ -14,16 +14,16 @@ const config: CapacitorConfig = {
14
14
  };
15
15
 
16
16
  export default config;
17
- `,Ob=async(w)=>{try{return await wb(w),!0}catch{return!1}},xw=async(w,b)=>{let $=Cw(b.projectRoot),A=Cw($,Jw),S=Mb(w,$);if(await Ob(A)){if(await bb(A,"utf8")===S)return{changed:!1,path:A};if(!b.force)throw TypeError(`${Jw} already exists and differs; rerun with --force only after reviewing it.`)}let M=`${A}.${crypto.randomUUID()}.tmp`;return await Ab(M,S,{flag:"wx"}),await $b(M,A),{changed:!0,path:A}};import{createHash as Db}from"crypto";import{access as L$,copyFile as k$,mkdir as q$,mkdtemp as z$,readdir as Cb,readFile as Jb,rename as R$,rm as y$,stat as f$,writeFile as d$}from"fs/promises";import{dirname as g$,isAbsolute as h$,join as xb,relative as Kw,resolve as m$,sep as l$}from"path";var Kb=new Set(["Pods","DerivedData","build","xcuserdata"]),Nw=async(w,b=w)=>{let $=await Cb(b,{withFileTypes:!0});return(await Promise.all($.sort((S,M)=>S.name.localeCompare(M.name)).map(async(S)=>{let M=xb(b,S.name),O=Kw(w,M).replaceAll("\\","/");if(S.isDirectory()&&(Kb.has(S.name)||O==="App/App/public"))return[];if(S.isDirectory())return Nw(w,M);return S.isFile()?[M]:[]}))).flat()},Ww=async(w)=>{let b=Db("sha256"),$=await Nw(w),A=await Promise.all($.map((S)=>Jb(S)));return $.forEach((S,M)=>{b.update(Kw(w,S).replaceAll("\\","/")),b.update("\x00"),b.update(A[M]??new Uint8Array),b.update("\x00")}),b.digest("hex")};var s="AbsoluteJS iPhone",Iw=180000,Bb=1000,r=1,Vw=1,X=(w)=>typeof w==="object"&&w!==null&&!Array.isArray(w),F=async(w)=>{try{return await _b(w),!0}catch{return!1}},R=(w)=>w?.throwIfAborted(),Gb=(w,b={})=>{try{let $=Bun.spawnSync(w,{cwd:b.cwd,env:b.env,stderr:"pipe",stdin:"ignore",stdout:"pipe"});return{exitCode:$.exitCode,stderr:$.stderr.toString(),stdout:$.stdout.toString()}}catch($){return{exitCode:1,stderr:$ instanceof Error?$.message:String($),stdout:""}}},Yw=async(w,b={})=>{return Bun.spawn(w,{cwd:b.cwd,env:b.env,signal:b.signal,stderr:"inherit",stdin:"inherit",stdout:"inherit"}).exited},Vb=(w,b={})=>{Bun.spawn(w,{cwd:b.cwd,env:b.env,signal:b.signal,stderr:"ignore",stdin:"ignore",stdout:"ignore"})},Uw=async(w,b)=>{let $=w.getReader(),A=new TextDecoder,S="",M=async()=>{let{done:O,value:J}=await $.read();if(O)return;S+=A.decode(J,{stream:!0});let D=S.split(/\r?\n/u);S=D.pop()??"",D.forEach(b),await M()};try{if(await M(),S+=A.decode(),S)b(S)}finally{$.releaseLock()}},Yb=(w,b,$)=>{let A=Bun.spawn(w,{cwd:b.cwd,env:b.env,signal:b.signal,stderr:"pipe",stdin:"ignore",stdout:"pipe"});return Uw(A.stdout,$),Uw(A.stderr,$),{close:async()=>{try{A.kill()}catch{}await A.exited.catch(()=>{return})}}},E=async(w,b,$,A)=>{let S=await $(w,A);if(S!==0)throw Error(`${b} failed with status ${S}.`)},y=(w,b)=>{if(w.exitCode!==0)throw Error(`${b} failed: ${w.stderr.trim()||w.stdout.trim()||`status ${w.exitCode}`}`);return w.stdout.trim()},i=(w,b)=>{try{let $=JSON.parse(w);if(X($))return $}catch{}throw Error(`Invalid ${b} JSON from simctl.`)},Qb=(w)=>{let $=i(w,"device type").devicetypes;if(!Array.isArray($))return[];return $.flatMap((A)=>{if(!X(A))return[];let{identifier:S}=A,{name:M}=A;return typeof S==="string"&&typeof M==="string"?[{identifier:S,name:M}]:[]})},Tb=(w)=>{let b=i(w,"runtime"),{runtimes:$}=b;if(!Array.isArray($))return[];return $.flatMap((A)=>{if(!X(A))return[];let{identifier:S}=A,{name:M}=A,{version:O}=A;if(typeof S!=="string"||typeof M!=="string"||typeof O!=="string")return[];return[{identifier:S,isAvailable:A.isAvailable!==!1,name:M,version:O}]})},Zb=(w)=>{let b=i(w,"device"),{devices:$}=b;if(!X($))return[];return Object.entries($).flatMap(([A,S])=>{if(!Array.isArray(S))return[];return S.flatMap((M)=>{if(!X(M))return[];let{name:O}=M,{state:J}=M,{udid:D}=M;if(typeof O!=="string"||typeof J!=="string"||typeof D!=="string")return[];return[{isAvailable:M.isAvailable!==!1,name:O,runtime:A,state:J,udid:D}]})})},Xw=(w)=>w.split(".").map((b)=>Number(b)),Eb=(w,b)=>{let $=Xw(w),A=Xw(b),S=Math.max($.length,A.length);for(let M=0;M<S;M++){let O=($[M]??0)-(A[M]??0);if(O!==0)return O}return 0},Fb=(w)=>w.filter((b)=>b.isAvailable&&b.identifier.includes("SimRuntime.iOS-")).sort((b,$)=>Eb($.version,b.version))[0],Hw=(w)=>Number(/iPhone\s+(\d+)/u.exec(w)?.[1]??0),Lb=(w)=>w.filter((b)=>b.name.startsWith("iPhone")).sort((b,$)=>{let A=Hw($.name)-Hw(b.name);if(A!==0)return A;let S=$.name.includes("Pro")?1:0,M=b.name.includes("Pro")?1:0;return S-M})[0],Qw=(w)=>{let b=I(w,".absolutejs","mobile","ios-dev-session");return{configBackup:I(b,"capacitor-config.backup"),infoBackup:I(b,"Info.plist.backup"),journal:I(b,"journal.json"),root:b}},Tw=(w)=>I(w,".absolutejs","mobile","ios-native-cache.json"),z=(w,b)=>{let $=Xb(u(w),u(b));return $===""||!$.startsWith(`..${Hb}`)&&$!==".."&&!Ub($)},kb=(w)=>{if(!X(w)||w.format!==r)return null;let{configBackupPath:b}=w,{infoBackupPath:$}=w,{infoPath:A}=w,{nativeConfigPath:S}=w;if(typeof b!=="string"||typeof $!=="string"||typeof A!=="string"||typeof S!=="string")return null;return{configBackupPath:b,format:r,infoBackupPath:$,infoPath:A,nativeConfigPath:S}},l=async(w)=>{let b=Qw(w);if(!await F(b.journal))return await n(b.root,{force:!0,recursive:!0}),!1;let $=await j(b.journal,"utf8").then((A)=>kb(JSON.parse(A))).catch(()=>null);if(!$||!z(w,$.nativeConfigPath)||!z(w,$.infoPath)||!z(b.root,$.configBackupPath)||!z(b.root,$.infoBackupPath))throw Error(`Refusing unsafe or invalid iOS dev journal at ${b.journal}.`);if(await F($.configBackupPath))await _w($.configBackupPath,$.nativeConfigPath);if(await F($.infoBackupPath))await _w($.infoBackupPath,$.infoPath);return await n(b.root,{force:!0,recursive:!0}),!0},qb=(w,b)=>{if(!b)return w;let $=/(<key>NSAllowsArbitraryLoads<\/key>\s*)<false\s*\/>/u;if($.test(w))return w.replace($,"$1<true/>");if(/<key>NSAllowsArbitraryLoads<\/key>\s*<true\s*\/>/u.test(w))return w;let A=/(<key>NSAppTransportSecurity<\/key>\s*<dict>)/u;if(A.test(w))return w.replace(A,`$1
17
+ `,Ob=async(w)=>{try{return await wb(w),!0}catch{return!1}},xw=async(w,b)=>{let $=Cw(b.projectRoot),A=Cw($,Jw),S=Mb(w,$);if(await Ob(A)){if(await bb(A,"utf8")===S)return{changed:!1,path:A};if(!b.force)throw TypeError(`${Jw} already exists and differs; rerun with --force only after reviewing it.`)}let M=`${A}.${crypto.randomUUID()}.tmp`;return await Ab(M,S,{flag:"wx"}),await $b(M,A),{changed:!0,path:A}};import{createHash as Db}from"crypto";import{access as L$,copyFile as k$,mkdir as q$,mkdtemp as z$,readdir as Cb,readFile as Jb,rename as R$,rm as y$,stat as f$,writeFile as P$}from"fs/promises";import{dirname as g$,isAbsolute as l$,join as xb,relative as Kw,resolve as h$,sep as m$}from"path";var Kb=new Set(["Pods","DerivedData","build","xcuserdata"]),Nw=async(w,b=w)=>{let $=await Cb(b,{withFileTypes:!0});return(await Promise.all($.sort((S,M)=>S.name.localeCompare(M.name)).map(async(S)=>{let M=xb(b,S.name),O=Kw(w,M).replaceAll("\\","/");if(S.isDirectory()&&(Kb.has(S.name)||O==="App/App/public"))return[];if(S.isDirectory())return Nw(w,M);return S.isFile()?[M]:[]}))).flat()},Ww=async(w)=>{let b=Db("sha256"),$=await Nw(w),A=await Promise.all($.map((S)=>Jb(S)));return $.forEach((S,M)=>{b.update(Kw(w,S).replaceAll("\\","/")),b.update("\x00"),b.update(A[M]??new Uint8Array),b.update("\x00")}),b.digest("hex")};var s="AbsoluteJS iPhone",_w=180000,Bb=1000,r=1,Vw=1,X=(w)=>typeof w==="object"&&w!==null&&!Array.isArray(w),F=async(w)=>{try{return await Ub(w),!0}catch{return!1}},R=(w)=>w?.throwIfAborted(),Gb=(w,b={})=>{try{let $=Bun.spawnSync(w,{cwd:b.cwd,env:b.env,stderr:"pipe",stdin:"ignore",stdout:"pipe"});return{exitCode:$.exitCode,stderr:$.stderr.toString(),stdout:$.stdout.toString()}}catch($){return{exitCode:1,stderr:$ instanceof Error?$.message:String($),stdout:""}}},Yw=async(w,b={})=>{return Bun.spawn(w,{cwd:b.cwd,env:b.env,signal:b.signal,stderr:"inherit",stdin:"inherit",stdout:"inherit"}).exited},Vb=(w,b={})=>{Bun.spawn(w,{cwd:b.cwd,env:b.env,signal:b.signal,stderr:"ignore",stdin:"ignore",stdout:"ignore"})},Iw=async(w,b)=>{let $=w.getReader(),A=new TextDecoder,S="",M=async()=>{let{done:O,value:J}=await $.read();if(O)return;S+=A.decode(J,{stream:!0});let D=S.split(/\r?\n/u);S=D.pop()??"",D.forEach(b),await M()};try{if(await M(),S+=A.decode(),S)b(S)}finally{$.releaseLock()}},Yb=(w,b,$)=>{let A=Bun.spawn(w,{cwd:b.cwd,env:b.env,signal:b.signal,stderr:"pipe",stdin:"ignore",stdout:"pipe"});return Iw(A.stdout,$),Iw(A.stderr,$),{close:async()=>{try{A.kill()}catch{}await A.exited.catch(()=>{return})}}},E=async(w,b,$,A)=>{let S=await $(w,A);if(S!==0)throw Error(`${b} failed with status ${S}.`)},y=(w,b)=>{if(w.exitCode!==0)throw Error(`${b} failed: ${w.stderr.trim()||w.stdout.trim()||`status ${w.exitCode}`}`);return w.stdout.trim()},i=(w,b)=>{try{let $=JSON.parse(w);if(X($))return $}catch{}throw Error(`Invalid ${b} JSON from simctl.`)},Qb=(w)=>{let $=i(w,"device type").devicetypes;if(!Array.isArray($))return[];return $.flatMap((A)=>{if(!X(A))return[];let{identifier:S}=A,{name:M}=A;return typeof S==="string"&&typeof M==="string"?[{identifier:S,name:M}]:[]})},Tb=(w)=>{let b=i(w,"runtime"),{runtimes:$}=b;if(!Array.isArray($))return[];return $.flatMap((A)=>{if(!X(A))return[];let{identifier:S}=A,{name:M}=A,{version:O}=A;if(typeof S!=="string"||typeof M!=="string"||typeof O!=="string")return[];return[{identifier:S,isAvailable:A.isAvailable!==!1,name:M,version:O}]})},Zb=(w)=>{let b=i(w,"device"),{devices:$}=b;if(!X($))return[];return Object.entries($).flatMap(([A,S])=>{if(!Array.isArray(S))return[];return S.flatMap((M)=>{if(!X(M))return[];let{name:O}=M,{state:J}=M,{udid:D}=M;if(typeof O!=="string"||typeof J!=="string"||typeof D!=="string")return[];return[{isAvailable:M.isAvailable!==!1,name:O,runtime:A,state:J,udid:D}]})})},Xw=(w)=>w.split(".").map((b)=>Number(b)),Eb=(w,b)=>{let $=Xw(w),A=Xw(b),S=Math.max($.length,A.length);for(let M=0;M<S;M++){let O=($[M]??0)-(A[M]??0);if(O!==0)return O}return 0},Fb=(w)=>w.filter((b)=>b.isAvailable&&b.identifier.includes("SimRuntime.iOS-")).sort((b,$)=>Eb($.version,b.version))[0],Hw=(w)=>Number(/iPhone\s+(\d+)/u.exec(w)?.[1]??0),Lb=(w)=>w.filter((b)=>b.name.startsWith("iPhone")).sort((b,$)=>{let A=Hw($.name)-Hw(b.name);if(A!==0)return A;let S=$.name.includes("Pro")?1:0,M=b.name.includes("Pro")?1:0;return S-M})[0],Qw=(w)=>{let b=_(w,".absolutejs","mobile","ios-dev-session");return{configBackup:_(b,"capacitor-config.backup"),infoBackup:_(b,"Info.plist.backup"),journal:_(b,"journal.json"),root:b}},Tw=(w)=>_(w,".absolutejs","mobile","ios-native-cache.json"),z=(w,b)=>{let $=Xb(u(w),u(b));return $===""||!$.startsWith(`..${Hb}`)&&$!==".."&&!Ib($)},kb=(w)=>{if(!X(w)||w.format!==r)return null;let{configBackupPath:b}=w,{infoBackupPath:$}=w,{infoPath:A}=w,{nativeConfigPath:S}=w;if(typeof b!=="string"||typeof $!=="string"||typeof A!=="string"||typeof S!=="string")return null;return{configBackupPath:b,format:r,infoBackupPath:$,infoPath:A,nativeConfigPath:S}},m=async(w)=>{let b=Qw(w);if(!await F(b.journal))return await n(b.root,{force:!0,recursive:!0}),!1;let $=await j(b.journal,"utf8").then((A)=>kb(JSON.parse(A))).catch(()=>null);if(!$||!z(w,$.nativeConfigPath)||!z(w,$.infoPath)||!z(b.root,$.configBackupPath)||!z(b.root,$.infoBackupPath))throw Error(`Refusing unsafe or invalid iOS dev journal at ${b.journal}.`);if(await F($.configBackupPath))await Uw($.configBackupPath,$.nativeConfigPath);if(await F($.infoBackupPath))await Uw($.infoBackupPath,$.infoPath);return await n(b.root,{force:!0,recursive:!0}),!0},qb=(w,b)=>{if(!b)return w;let $=/(<key>NSAllowsArbitraryLoads<\/key>\s*)<false\s*\/>/u;if($.test(w))return w.replace($,"$1<true/>");if(/<key>NSAllowsArbitraryLoads<\/key>\s*<true\s*\/>/u.test(w))return w;let A=/(<key>NSAppTransportSecurity<\/key>\s*<dict>)/u;if(A.test(w))return w.replace(A,`$1
18
18
  <key>NSAllowsArbitraryLoads</key>
19
19
  <true/>`);return w.replace(/<dict>/u,`<dict>
20
20
  <key>NSAppTransportSecurity</key>
21
21
  <dict>
22
22
  <key>NSAllowsArbitraryLoads</key>
23
23
  <true/>
24
- </dict>`)},zb=async(w,b,$)=>{let A=Qw(w.projectRoot);await l(w.projectRoot);let S=I(w.nativeDirectory,"App","App","capacitor.config.json"),M=I(w.nativeDirectory,"App","App","Info.plist"),[O,J]=await Promise.all([j(S,"utf8"),j(M,"utf8")]),D=JSON.parse(O);if(!X(D))throw Error(`Invalid Capacitor native config at ${S}.`);await f(A.root,{recursive:!0}),await Promise.all([Z(A.configBackup,O,{flag:"wx"}),Z(A.infoBackup,J,{flag:"wx"})]);let C={configBackupPath:A.configBackup,format:r,infoBackupPath:A.infoBackup,infoPath:M,nativeConfigPath:S};await Z(A.journal,`${JSON.stringify(C,null,"\t")}
24
+ </dict>`)},zb=async(w,b,$)=>{let A=Qw(w.projectRoot);await m(w.projectRoot);let S=_(w.nativeDirectory,"App","App","capacitor.config.json"),M=_(w.nativeDirectory,"App","App","Info.plist"),[O,J]=await Promise.all([j(S,"utf8"),j(M,"utf8")]),D=JSON.parse(O);if(!X(D))throw Error(`Invalid Capacitor native config at ${S}.`);await f(A.root,{recursive:!0}),await Promise.all([Z(A.configBackup,O,{flag:"wx"}),Z(A.infoBackup,J,{flag:"wx"})]);let C={configBackupPath:A.configBackup,format:r,infoBackupPath:A.infoBackup,infoPath:M,nativeConfigPath:S};await Z(A.journal,`${JSON.stringify(C,null,"\t")}
25
25
  `,{flag:"wx"});let x=new URL(`${$?"https":"http"}://localhost:${b}${w.config.entry}`);x.searchParams.set("__absolute_target","capacitor-ios");let K=D.server;D.server={...X(K)?K:{},cleartext:!$,url:x.href},await Promise.all([Z(S,`${JSON.stringify(D,null,"\t")}
26
26
  `),Z(M,qb(J,!$))])},Rb=(w)=>{if(!X(w))return null;let{appId:b,fingerprint:$,format:A,installations:S}=w;if(A!==Vw||typeof b!=="string"||typeof $!=="string"||!X(S)||!Object.values(S).every((M)=>typeof M==="string"))return null;return{appId:b,fingerprint:$,format:A,installations:Object.fromEntries(Object.entries(S).map(([M,O])=>[M,String(O)]))}},yb=(w)=>j(Tw(w),"utf8").then((b)=>Rb(JSON.parse(b))).catch(()=>null),fb=async(w,b)=>{let $=Tw(w),A=`${$}.${process.pid}.${Wb()}.tmp`;await f(Gw($),{recursive:!0});try{await Z(A,`${JSON.stringify(b,null,"\t")}
27
- `,{flag:"wx"}),await Ib(A,$)}finally{await n(A,{force:!0}).catch(()=>{return})}},db=async(w)=>Ww(w.nativeDirectory),Zw=(w,b)=>{let $=b([w,"simctl","list","devices","available","-j"]);return Zb(y($,"iOS simulator discovery"))},Pb=async(w,b)=>{let $=Tb(y(b([w.xcrun,"simctl","list","runtimes","-j"]),"iOS runtime discovery")),A=Fb($);if(!A)throw Error("No available iOS Simulator runtime. Run absolute mobile doctor ios --fix.");let[S]=Zw(w.xcrun,b).filter((D)=>D.isAvailable&&D.name===s&&D.runtime===A.identifier).sort((D,C)=>Number(C.state==="Booted")-Number(D.state==="Booted"));if(S)return{created:!1,device:S};let M=Qb(y(b([w.xcrun,"simctl","list","devicetypes","-j"]),"iOS device-type discovery")),O=Lb(M);if(!O)throw Error("Xcode did not report an iPhone simulator type.");let[J]=y(b([w.xcrun,"simctl","create",s,O.identifier,A.identifier]),"iOS simulator creation").split(/\s/u);if(!J)throw Error("simctl did not return the created simulator UDID.");return{created:!0,device:{isAvailable:!0,name:s,runtime:A.identifier,state:"Shutdown",udid:J}}},gb=async(w,b,$,A,S)=>{let M=Date.now()+Iw,O=async()=>{if(R(S),Zw(w.xcrun,$).find((D)=>D.udid===b)?.state==="Booted")return;if(Date.now()>M)throw Error(`iOS simulator ${b} did not finish booting within ${Iw/1000}s.`);await A(Bb),await O()};return O()},hb=(w,b,$)=>{if(b.state==="Booted")return;y($([w.xcrun,"simctl","boot",b.udid]),"iOS simulator boot")},Bw=(w,b,$)=>{let A=$([w.xcrun,"simctl","get_app_container",b,w.config.appId,"app"]);return A.exitCode===0&&A.stdout.trim()?A.stdout.trim():void 0},mb=async(w,b,$,A,S)=>{let M=I(w.projectRoot,".absolutejs","mobile","ios-derived-data",Nb("sha256").update(w.config.appId).digest("hex").slice(0,16));await f(M,{recursive:!0}),await E([w.xcodebuild,"-workspace",I(w.nativeDirectory,"App","App.xcworkspace"),"-scheme","App","-configuration","Debug","-destination",`platform=iOS Simulator,id=${b}`,"-derivedDataPath",M,"build"],"iOS simulator build",A,{cwd:w.nativeDirectory,signal:S});let O=I(M,"Build","Products","Debug-iphonesimulator","App.app");if(!await F(O))throw Error(`Xcode did not produce the simulator app at ${O}.`);return O},lb=async(w)=>{let b=Bw(w.project,w.udid,w.capture);if(w.cache?.appId===w.project.config.appId&&w.cache.fingerprint===w.fingerprint&&b!==void 0&&w.cache.installations[w.udid]===b)return w.log(`iOS native app is unchanged on ${w.udid}; skipped Xcode build and install.`),!0;w.log("iOS native inputs changed or the installed app is stale; rebuilding."),w.transition("building");let A=await mb(w.project,w.udid,w.fingerprint,w.run,w.signal);R(w.signal),w.transition("installing"),await E([w.project.xcrun,"simctl","install",w.udid,A],"iOS simulator app installation",w.run,{signal:w.signal});let S=Bw(w.project,w.udid,w.capture);if(S)await fb(w.project.projectRoot,{appId:w.project.config.appId,fingerprint:w.fingerprint,format:Vw,installations:{[w.udid]:S}}).catch((M)=>w.log(`iOS native cache could not be saved: ${M instanceof Error?M.message:String(M)}`));return!1},jb=/((?:authorization|cookie|password|secret|token|oauth[_-]?code)\s*[:=]\s*)([^\s,;]+)/giu,ub=new RegExp(String.raw`\bBearer\s+[A-Za-z0-9._~+/-]+=*`,"giu"),vb=/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gu,cb=new RegExp(String.raw`\s(Debug|Info|Notice|Error|Fault)\s+.*?\[[^\]]+\]\s+\[([^\]]+)\]\s*(.*)$`,"iu"),ab=(w)=>{let b=sb(w).trim();if(!b)return null;let $=cb.exec(b),A=$?.[1]?.toLowerCase();return{level:A==="debug"||A==="error"||A==="fault"||A==="notice"?A:"info",message:$?.[3]?.trim()||b,tag:$?.[2]?.trim()||"App"}},sb=(w)=>w.replaceAll(ub,"Bearer [REDACTED]").replaceAll(vb,"[REDACTED_JWT]").replaceAll(jb,"$1[REDACTED]").replaceAll(/\p{C}/gu,""),nb=(w,b,$)=>{if(!$.nativeLog)return null;return($.startNativeLogs??Yb)([w.xcrun,"simctl","spawn",b,"log","stream","--style","compact","--level","debug","--predicate",'process == "App"'],{signal:$.signal},(S)=>{let M=ab(S);if(M)$.nativeLog?.(M)})},rb=[["syncing","Capacitor sync"],["configuring","dev config"],["fingerprinting","fingerprint"],["booting","simulator"],["connecting","device ready"],["checking-native","app check"],["building","Xcode"],["installing","install"],["launching","launch"],["streaming-logs","logs"]],ib=(w)=>rb.map(([b,$])=>{let A=w[b];return A===void 0?null:`${$} ${h(A)}`}).filter((b)=>b!==null).join(", "),Ew=async(w,b)=>{if(m()!=="macos")throw Error("iOS simulation requires macOS and Xcode.");let $=u(b.projectRoot),A=await Dw({host:"macos"}),S=A.filter((x)=>x.platform==="ios"&&(x.status==="fail"||x.status==="warn"));if(S.length>0)throw Error(`iOS simulation is not ready: ${S.map(({label:x})=>x).join(", ")}.`);let M=A.find((x)=>x.id==="ios.xcrun")?.path,O=A.find((x)=>x.id==="ios.xcodebuild")?.path;if(!M||!O)throw Error("Xcode tools disappeared after readiness checks.");let J=I($,"node_modules",".bin","cap");if(!await F(J))throw Error("Capacitor CLI is not installed. Run absolute mobile init first.");await xw(w,{projectRoot:$}),await f(w.bundleDirectory,{recursive:!0});let D=I(w.bundleDirectory,"index.html");if(!await F(D))await Z(D,`<!doctype html><title>AbsoluteJS mobile development</title>
28
- `);let C=I(w.nativeProjectDirectory,"ios");if(!await F(C)){if(!b.createNativeProject)throw Error("iOS native project has not been created.");if(await(b.run??Yw)([J,"add","ios"],{cwd:$})!==0)throw Error("Capacitor iOS project creation failed.")}return{cap:J,config:w,nativeDirectory:C,projectRoot:$,xcodebuild:O,xcrun:M}},p=async(w)=>{let{project:b}=w,$=w.capture??Gb,A=w.run??Yw,S=w.sleep??Bun.sleep,M=w.spawn??Vb,O=w.log??console.log,J=performance.now(),D=performance.now(),C={},x="syncing",K=(U)=>{if(U===x){w.onStateChange?.(U);return}let _=performance.now(),G=_-D;C[x]=(C[x]??0)+G,w.onPhaseTiming?.({durationMs:G,phase:x,totalMs:_-J}),x=U,D=_,w.onStateChange?.(U)},Y=null,d=async()=>{let U=Y;Y=null,await U?.close().catch(()=>{return})};try{await l(b.projectRoot),R(w.signal),K("syncing"),await E([b.cap,"sync","ios"],"Capacitor iOS synchronization",A,{cwd:b.projectRoot,signal:w.signal}),K("configuring"),await zb(b,w.port,w.https===!0),R(w.signal);let U=performance.now(),_=db(b).then((L)=>{return C.fingerprinting=performance.now()-U,L});K("booting");let{created:G,device:W}=await Pb(b,$),N=G||W.state!=="Booted";hb(b,W,$),M(["open","-a","Simulator","--args","-CurrentDeviceUDID",W.udid]),K("connecting"),await gb(b,W.udid,$,S,w.signal),await E([b.xcrun,"simctl","bootstatus",W.udid,"-b"],"iOS simulator boot readiness",A,{signal:w.signal});let B=await _;K("checking-native");let e=await lb({cache:await yb(b.projectRoot),capture:$,fingerprint:B,log:O,project:b,run:A,signal:w.signal,transition:K,udid:W.udid});if(R(w.signal),w.nativeLog)K("streaming-logs");Y=nb(b,W.udid,w),K("launching"),await E([b.xcrun,"simctl","launch","--terminate-running-process",W.udid,b.config.appId],"iOS app launch",A,{signal:w.signal}),K("ready"),C.total=performance.now()-J,O(`iOS simulator connected (${W.udid}) with HMR on port ${w.port} in ${h(C.total)} (${e?"native cache hit":"native build installed"}).`),O(`iOS startup: ${ib(C)}.`);let P=!1,ww=async()=>{if(P)return;P=!0,K("closing"),await d(),await l(b.projectRoot),K("closed")};return{close:ww,nativeCacheHit:e,startedSimulator:N,timings:{...C},udid:W.udid,rebuild:async()=>{if(P)throw Error("iOS development session is closed.");return O("iOS native inputs changed; rebuilding without restarting the dev server."),await ww(),p(w)},relaunch:async()=>{if(P)throw Error("iOS development session is closed.");K("launching");try{await E([b.xcrun,"simctl","launch","--terminate-running-process",W.udid,b.config.appId],"iOS app relaunch",A,{signal:w.signal}),K("ready"),O(`iOS app relaunched on ${W.udid}.`)}catch(L){throw K("failed"),L}},screenshot:async(L)=>{let g=u(b.projectRoot,L);if(!z(b.projectRoot,g))throw Error("iOS screenshot destination must remain inside the project.");return await f(Gw(g),{recursive:!0}),await E([b.xcrun,"simctl","io",W.udid,"screenshot",g],"iOS simulator screenshot",A,{signal:w.signal}),g},get state(){return x}}}catch(U){throw K("failed"),await d(),await l(b.projectRoot),U}};var Fw="ABSOLUTE_REMOTE_MAC\t",t=1;var H=(w)=>process.stdout.write(`${Fw}${JSON.stringify({...w,v:t})}
27
+ `,{flag:"wx"}),await _b(A,$)}finally{await n(A,{force:!0}).catch(()=>{return})}},Pb=async(w)=>Ww(w.nativeDirectory),Zw=(w,b)=>{let $=b([w,"simctl","list","devices","available","-j"]);return Zb(y($,"iOS simulator discovery"))},db=async(w,b)=>{let $=Tb(y(b([w.xcrun,"simctl","list","runtimes","-j"]),"iOS runtime discovery")),A=Fb($);if(!A)throw Error("No available iOS Simulator runtime. Run absolute mobile doctor ios --fix.");let[S]=Zw(w.xcrun,b).filter((D)=>D.isAvailable&&D.name===s&&D.runtime===A.identifier).sort((D,C)=>Number(C.state==="Booted")-Number(D.state==="Booted"));if(S)return{created:!1,device:S};let M=Qb(y(b([w.xcrun,"simctl","list","devicetypes","-j"]),"iOS device-type discovery")),O=Lb(M);if(!O)throw Error("Xcode did not report an iPhone simulator type.");let[J]=y(b([w.xcrun,"simctl","create",s,O.identifier,A.identifier]),"iOS simulator creation").split(/\s/u);if(!J)throw Error("simctl did not return the created simulator UDID.");return{created:!0,device:{isAvailable:!0,name:s,runtime:A.identifier,state:"Shutdown",udid:J}}},gb=async(w,b,$,A,S)=>{let M=Date.now()+_w,O=async()=>{if(R(S),Zw(w.xcrun,$).find((D)=>D.udid===b)?.state==="Booted")return;if(Date.now()>M)throw Error(`iOS simulator ${b} did not finish booting within ${_w/1000}s.`);await A(Bb),await O()};return O()},lb=(w,b,$)=>{if(b.state==="Booted")return;y($([w.xcrun,"simctl","boot",b.udid]),"iOS simulator boot")},Bw=(w,b,$)=>{let A=$([w.xcrun,"simctl","get_app_container",b,w.config.appId,"app"]);return A.exitCode===0&&A.stdout.trim()?A.stdout.trim():void 0},hb=async(w,b,$,A,S)=>{let M=_(w.projectRoot,".absolutejs","mobile","ios-derived-data",Nb("sha256").update(w.config.appId).digest("hex").slice(0,16));await f(M,{recursive:!0}),await E([w.xcodebuild,"-workspace",_(w.nativeDirectory,"App","App.xcworkspace"),"-scheme","App","-configuration","Debug","-destination",`platform=iOS Simulator,id=${b}`,"-derivedDataPath",M,"build"],"iOS simulator build",A,{cwd:w.nativeDirectory,signal:S});let O=_(M,"Build","Products","Debug-iphonesimulator","App.app");if(!await F(O))throw Error(`Xcode did not produce the simulator app at ${O}.`);return O},mb=async(w)=>{let b=Bw(w.project,w.udid,w.capture);if(w.cache?.appId===w.project.config.appId&&w.cache.fingerprint===w.fingerprint&&b!==void 0&&w.cache.installations[w.udid]===b)return w.log(`iOS native app is unchanged on ${w.udid}; skipped Xcode build and install.`),!0;w.log("iOS native inputs changed or the installed app is stale; rebuilding."),w.transition("building");let A=await hb(w.project,w.udid,w.fingerprint,w.run,w.signal);R(w.signal),w.transition("installing"),await E([w.project.xcrun,"simctl","install",w.udid,A],"iOS simulator app installation",w.run,{signal:w.signal});let S=Bw(w.project,w.udid,w.capture);if(S)await fb(w.project.projectRoot,{appId:w.project.config.appId,fingerprint:w.fingerprint,format:Vw,installations:{[w.udid]:S}}).catch((M)=>w.log(`iOS native cache could not be saved: ${M instanceof Error?M.message:String(M)}`));return!1},jb=/((?:authorization|cookie|password|secret|token|oauth[_-]?code)\s*[:=]\s*)([^\s,;]+)/giu,ub=new RegExp(String.raw`\bBearer\s+[A-Za-z0-9._~+/-]+=*`,"giu"),vb=/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gu,cb=new RegExp(String.raw`\s(Debug|Info|Notice|Error|Fault)\s+.*?\[[^\]]+\]\s+\[([^\]]+)\]\s*(.*)$`,"iu"),ab=(w)=>{let b=sb(w).trim();if(!b)return null;let $=cb.exec(b),A=$?.[1]?.toLowerCase();return{level:A==="debug"||A==="error"||A==="fault"||A==="notice"?A:"info",message:$?.[3]?.trim()||b,tag:$?.[2]?.trim()||"App"}},sb=(w)=>w.replaceAll(ub,"Bearer [REDACTED]").replaceAll(vb,"[REDACTED_JWT]").replaceAll(jb,"$1[REDACTED]").replaceAll(/\p{C}/gu,""),nb=(w,b,$)=>{if(!$.nativeLog)return null;return($.startNativeLogs??Yb)([w.xcrun,"simctl","spawn",b,"log","stream","--style","compact","--level","debug","--predicate",'process == "App"'],{signal:$.signal},(S)=>{let M=ab(S);if(M)$.nativeLog?.(M)})},rb=[["syncing","Capacitor sync"],["configuring","dev config"],["fingerprinting","fingerprint"],["booting","simulator"],["connecting","device ready"],["checking-native","app check"],["building","Xcode"],["installing","install"],["launching","launch"],["streaming-logs","logs"]],ib=(w)=>rb.map(([b,$])=>{let A=w[b];return A===void 0?null:`${$} ${l(A)}`}).filter((b)=>b!==null).join(", "),Ew=async(w,b)=>{if(h()!=="macos")throw Error("iOS simulation requires macOS and Xcode.");let $=u(b.projectRoot),A=await Dw({host:"macos"}),S=A.filter((x)=>x.platform==="ios"&&(x.status==="fail"||x.status==="warn"));if(S.length>0)throw Error(`iOS simulation is not ready: ${S.map(({label:x})=>x).join(", ")}.`);let M=A.find((x)=>x.id==="ios.xcrun")?.path,O=A.find((x)=>x.id==="ios.xcodebuild")?.path;if(!M||!O)throw Error("Xcode tools disappeared after readiness checks.");let J=_($,"node_modules",".bin","cap");if(!await F(J))throw Error("Capacitor CLI is not installed. Run absolute mobile init first.");await xw(w,{projectRoot:$}),await f(w.bundleDirectory,{recursive:!0});let D=_(w.bundleDirectory,"index.html");if(!await F(D))await Z(D,`<!doctype html><title>AbsoluteJS mobile development</title>
28
+ `);let C=_(w.nativeProjectDirectory,"ios");if(!await F(C)){if(!b.createNativeProject)throw Error("iOS native project has not been created.");if(await(b.run??Yw)([J,"add","ios"],{cwd:$})!==0)throw Error("Capacitor iOS project creation failed.")}return{cap:J,config:w,nativeDirectory:C,projectRoot:$,xcodebuild:O,xcrun:M}},p=async(w)=>{let{project:b}=w,$=w.capture??Gb,A=w.run??Yw,S=w.sleep??Bun.sleep,M=w.spawn??Vb,O=w.log??console.log,J=performance.now(),D=performance.now(),C={},x="syncing",K=(I)=>{if(I===x){w.onStateChange?.(I);return}let U=performance.now(),G=U-D;C[x]=(C[x]??0)+G,w.onPhaseTiming?.({durationMs:G,phase:x,totalMs:U-J}),x=I,D=U,w.onStateChange?.(I)},Y=null,P=async()=>{let I=Y;Y=null,await I?.close().catch(()=>{return})};try{await m(b.projectRoot),R(w.signal),K("syncing"),await E([b.cap,"sync","ios"],"Capacitor iOS synchronization",A,{cwd:b.projectRoot,signal:w.signal}),K("configuring"),await zb(b,w.port,w.https===!0),R(w.signal);let I=performance.now(),U=Pb(b).then((L)=>{return C.fingerprinting=performance.now()-I,L});K("booting");let{created:G,device:W}=await db(b,$),N=G||W.state!=="Booted";lb(b,W,$),M(["open","-a","Simulator","--args","-CurrentDeviceUDID",W.udid]),K("connecting"),await gb(b,W.udid,$,S,w.signal),await E([b.xcrun,"simctl","bootstatus",W.udid,"-b"],"iOS simulator boot readiness",A,{signal:w.signal});let B=await U;K("checking-native");let e=await mb({cache:await yb(b.projectRoot),capture:$,fingerprint:B,log:O,project:b,run:A,signal:w.signal,transition:K,udid:W.udid});if(R(w.signal),w.nativeLog)K("streaming-logs");Y=nb(b,W.udid,w),K("launching"),await E([b.xcrun,"simctl","launch","--terminate-running-process",W.udid,b.config.appId],"iOS app launch",A,{signal:w.signal}),K("ready"),C.total=performance.now()-J,O(`iOS simulator connected (${W.udid}) with HMR on port ${w.port} in ${l(C.total)} (${e?"native cache hit":"native build installed"}).`),O(`iOS startup: ${ib(C)}.`);let d=!1,ww=async()=>{if(d)return;d=!0,K("closing"),await P(),await m(b.projectRoot),K("closed")};return{close:ww,nativeCacheHit:e,startedSimulator:N,timings:{...C},udid:W.udid,rebuild:async()=>{if(d)throw Error("iOS development session is closed.");return O("iOS native inputs changed; rebuilding without restarting the dev server."),await ww(),p(w)},relaunch:async()=>{if(d)throw Error("iOS development session is closed.");K("launching");try{await E([b.xcrun,"simctl","launch","--terminate-running-process",W.udid,b.config.appId],"iOS app relaunch",A,{signal:w.signal}),K("ready"),O(`iOS app relaunched on ${W.udid}.`)}catch(L){throw K("failed"),L}},screenshot:async(L)=>{let g=u(b.projectRoot,L);if(!z(b.projectRoot,g))throw Error("iOS screenshot destination must remain inside the project.");return await f(Gw(g),{recursive:!0}),await E([b.xcrun,"simctl","io",W.udid,"screenshot",g],"iOS simulator screenshot",A,{signal:w.signal}),g},get state(){return x}}}catch(I){throw K("failed"),await P(),await m(b.projectRoot),I}};var Fw="ABSOLUTE_REMOTE_MAC\t",t=1;var H=(w)=>process.stdout.write(`${Fw}${JSON.stringify({...w,v:t})}
29
29
  `),o=(w)=>w instanceof Error?w.message:String(w),zw=(w,b)=>{let $=w.indexOf(b);return $<0?void 0:w[$+1]},eb=(w)=>{let b=Number(zw(w,"--port"));if(!Number.isInteger(b)||b<1||b>65535)throw TypeError("Remote iOS agent requires a valid --port.");return b},w$=(w)=>{let b=zw(w,"--mobile-config");if(!b)throw TypeError("Remote iOS agent requires --mobile-config.");let $=JSON.parse(Buffer.from(b,"base64url").toString("utf8"));if(typeof $!=="object"||$===null)throw TypeError("Remote iOS agent received an invalid mobile config.");return $},Lw=async(w,b)=>{let $=w.getReader(),A=new TextDecoder,S="";try{while(!0){let{done:M,value:O}=await $.read();if(M)break;S+=A.decode(O,{stream:!0});let J=S.split(/\r?\n/u);S=J.pop()??"",J.forEach(b)}}finally{$.releaseLock()}},kw=async(w,b={})=>{let $=Bun.spawn(w,{cwd:b.cwd,env:b.env,signal:b.signal,stderr:"pipe",stdin:"ignore",stdout:"pipe"});return Lw($.stdout,(A)=>H({message:A,type:"log"})),Lw($.stderr,(A)=>H({message:A,type:"log"})),$.exited},b$=(w,b={})=>{try{let $=Bun.spawnSync(w,{cwd:b.cwd,env:b.env,stderr:"pipe",stdin:"ignore",stdout:"pipe"});return{exitCode:$.exitCode,stderr:$.stderr.toString(),stdout:$.stdout.toString()}}catch($){return{exitCode:1,stderr:o($),stdout:""}}},qw=(w)=>({nativeCacheHit:w.nativeCacheHit,startedSimulator:w.startedSimulator,timings:w.timings,type:"ready",udid:w.udid}),$$=async(w)=>{if(process.platform!=="darwin")throw Error("The AbsoluteJS remote iOS agent can run only on macOS.");let b=process.cwd(),$=$w(w$(w),b),A=eb(w),S=await Ew($,{createNativeProject:!1,projectRoot:b,run:kw}),M={capture:b$,https:w.includes("--https"),port:A,project:S,run:kw,log:(D)=>H({message:D,type:"log"}),nativeLog:(D)=>H({entry:D,type:"native-log"}),onPhaseTiming:(D)=>H({...D,type:"timing"}),onStateChange:(D)=>H({state:D,type:"state"}),spawn:(D,C={})=>{Bun.spawn(D,{cwd:C.cwd,env:C.env,signal:C.signal,stderr:"ignore",stdin:"ignore",stdout:"ignore"})}},O=await p(M);H(qw(O));let J=ob({input:process.stdin,terminal:!1});try{for await(let D of J){let C;try{if(C=JSON.parse(D),C.v!==t||typeof C.id!=="string")throw Error("Invalid remote Mac request.");let x;if(C.command==="close")await O.close();else if(C.command==="relaunch")await O.relaunch();else if(C.command==="rebuild")O=await O.rebuild(),x=qw(O);else if(C.command==="screenshot"){let K=tb(".absolutejs","mobile","remote-screenshot.png"),Y=await O.screenshot(K);x={data:(await pb(Y)).toString("base64")}}else throw Error("Unknown remote Mac request.");if(H({id:C.id,ok:!0,result:x,type:"response"}),C.command==="close")return}catch(x){H({error:o(x),id:C?.id??"",ok:!1,type:"response"})}}}finally{J.close(),await O.close().catch(()=>{return})}},Rw=async(w)=>{try{await $$(w)}catch(b){H({error:o(b),type:"fatal"}),process.exitCode=1}};await Rw(process.argv.slice(2));
@@ -433,6 +433,210 @@ var installAbsoluteMobileStaticDocument = async (manifest, page, localUrl) => {
433
433
  await ready;
434
434
  };
435
435
 
436
+ // node_modules/@absolutejs/http/dist/index.js
437
+ class AbsoluteHttpError extends Error {
438
+ code;
439
+ cause;
440
+ status;
441
+ url;
442
+ constructor(code, message, options = {}) {
443
+ super(message);
444
+ this.name = "AbsoluteHttpError";
445
+ this.code = code;
446
+ this.cause = options.cause;
447
+ this.status = options.status;
448
+ this.url = options.url;
449
+ }
450
+ }
451
+ var loopbackHosts = new Set(["127.0.0.1", "[::1]", "localhost"]);
452
+ var normalizeAbsoluteHttpOrigin = (value) => {
453
+ let url;
454
+ try {
455
+ url = new URL(value);
456
+ } catch (cause) {
457
+ throw new AbsoluteHttpError("origin", "HTTP origin is invalid.", {
458
+ cause
459
+ });
460
+ }
461
+ const loopback = url.protocol === "http:" && loopbackHosts.has(url.hostname);
462
+ if (url.protocol !== "https:" && !loopback)
463
+ throw new AbsoluteHttpError("origin", "HTTP origin must use HTTPS outside loopback development.");
464
+ if (url.username || url.password || url.pathname !== "/" || url.search || url.hash)
465
+ throw new AbsoluteHttpError("origin", "HTTP origin cannot contain credentials, a path, query, or fragment.");
466
+ return url.origin;
467
+ };
468
+ var resolveAbsoluteHttpUrl = (target, origin) => {
469
+ let url;
470
+ try {
471
+ url = new URL(String(target), `${origin}/`);
472
+ } catch (cause) {
473
+ throw new AbsoluteHttpError("origin", "HTTP request URL is invalid.", {
474
+ cause
475
+ });
476
+ }
477
+ if (url.username || url.password)
478
+ throw new AbsoluteHttpError("origin", "HTTP request URLs cannot contain credentials.");
479
+ if (url.origin !== origin)
480
+ throw new AbsoluteHttpError("origin", "Absolute HTTP refused a request outside the configured application origin.", { url: url.href });
481
+ url.hash = "";
482
+ return url;
483
+ };
484
+ var createAbsoluteHttpTransport = ({
485
+ fetch: fetchImpl = globalThis.fetch,
486
+ origin,
487
+ runtime
488
+ }) => ({
489
+ fetch: fetchImpl,
490
+ origin: normalizeAbsoluteHttpOrigin(origin),
491
+ runtime
492
+ });
493
+ var createWebHttpTransport = (options = {}) => {
494
+ const origin = options.origin ?? globalThis.location?.origin;
495
+ if (!origin)
496
+ throw new TypeError("The web HTTP transport requires a browser origin or explicit origin.");
497
+ return createAbsoluteHttpTransport({
498
+ ...options.fetch ? { fetch: options.fetch } : {},
499
+ origin,
500
+ runtime: "web"
501
+ });
502
+ };
503
+ var RUNTIME_REGISTRY = Symbol.for("@absolutejs/http/runtime");
504
+ var registryHost = globalThis;
505
+ var isRuntimeRegistry = (value) => typeof value === "object" && value !== null && Array.isArray(Reflect.get(value, "installations"));
506
+ var runtimeRegistry = (() => {
507
+ const existing = registryHost[RUNTIME_REGISTRY];
508
+ if (isRuntimeRegistry(existing))
509
+ return existing;
510
+ const created = { installations: [] };
511
+ Object.defineProperty(registryHost, RUNTIME_REGISTRY, {
512
+ configurable: false,
513
+ enumerable: false,
514
+ value: created,
515
+ writable: false
516
+ });
517
+ return created;
518
+ })();
519
+ var fallbackTransport = () => {
520
+ if (typeof location !== "undefined" && location.origin)
521
+ return createWebHttpTransport();
522
+ throw new AbsoluteHttpError("not-configured", "Absolute HTTP requires a request-scoped SSR transport outside a browser.");
523
+ };
524
+ var getAbsoluteHttpTransport = () => runtimeRegistry.installations.at(-1)?.transport ?? (runtimeRegistry.fallback ??= fallbackTransport());
525
+ var installAbsoluteHttpTransport = (transport) => {
526
+ const installation = { transport };
527
+ runtimeRegistry.installations.push(installation);
528
+ return () => {
529
+ const index = runtimeRegistry.installations.indexOf(installation);
530
+ if (index >= 0)
531
+ runtimeRegistry.installations.splice(index, 1);
532
+ };
533
+ };
534
+ var forbiddenCredentialHeaders = new Set([
535
+ "authorization",
536
+ "cookie",
537
+ "proxy-authorization"
538
+ ]);
539
+ var transportFor = (configured) => configured ?? getAbsoluteHttpTransport();
540
+ var safeHeaders = (input) => {
541
+ const headers = new Headers(input);
542
+ for (const name of forbiddenCredentialHeaders) {
543
+ if (headers.has(name))
544
+ throw new AbsoluteHttpError("origin", `Absolute HTTP owns the ${name} credential header for trusted transports.`);
545
+ }
546
+ return headers;
547
+ };
548
+ var requestFor = (target, options, transport) => {
549
+ const source = target instanceof Request ? target : undefined;
550
+ const requestedUrl = source ? source.url : target;
551
+ const url = resolveAbsoluteHttpUrl(requestedUrl, transport.origin);
552
+ const headers = safeHeaders(options?.headers ?? source?.headers);
553
+ return new Request(source ?? url, {
554
+ ...options,
555
+ credentials: transport.runtime === "web" ? "same-origin" : "omit",
556
+ headers,
557
+ redirect: "error"
558
+ });
559
+ };
560
+ var normalizeFetchError = (caught, url) => {
561
+ if (caught instanceof AbsoluteHttpError)
562
+ return caught;
563
+ if (caught instanceof DOMException && (caught.name === "AbortError" || caught.name === "TimeoutError"))
564
+ return new AbsoluteHttpError("aborted", "HTTP request was aborted.", {
565
+ cause: caught,
566
+ url
567
+ });
568
+ return new AbsoluteHttpError("network", "HTTP request failed.", {
569
+ cause: caught,
570
+ url
571
+ });
572
+ };
573
+ var requireOk = (response) => {
574
+ if (!response.ok)
575
+ throw new AbsoluteHttpError("http", `HTTP request failed with status ${response.status}.`, { status: response.status, url: response.url });
576
+ return response;
577
+ };
578
+ var parseJson = async (response) => {
579
+ const text = await response.text();
580
+ if (text === "")
581
+ return;
582
+ try {
583
+ return JSON.parse(text);
584
+ } catch (cause) {
585
+ throw new AbsoluteHttpError("response", "HTTP response is not valid JSON.", {
586
+ cause,
587
+ status: response.status,
588
+ url: response.url
589
+ });
590
+ }
591
+ };
592
+ var jsonOptions = (method, body, options) => {
593
+ const headers = new Headers(options?.headers);
594
+ if (body !== undefined && !headers.has("content-type"))
595
+ headers.set("content-type", "application/json");
596
+ let encoded;
597
+ try {
598
+ encoded = body === undefined ? undefined : JSON.stringify(body);
599
+ } catch (cause) {
600
+ throw new AbsoluteHttpError("body", "HTTP body is not JSON serializable.", {
601
+ cause
602
+ });
603
+ }
604
+ return encoded === undefined ? { ...options, headers, method } : { ...options, body: encoded, headers, method };
605
+ };
606
+ var createAbsoluteHttpClient = (options = {}) => {
607
+ const fetchTrusted = async (input, init) => {
608
+ const transport = transportFor(options.transport);
609
+ const request2 = requestFor(input, init, transport);
610
+ try {
611
+ return await transport.fetch(request2);
612
+ } catch (caught) {
613
+ throw normalizeFetchError(caught, request2.url);
614
+ }
615
+ };
616
+ const request = (target, requestOptions) => fetchTrusted(target, requestOptions);
617
+ const json = async (target, requestOptions) => parseJson(requireOk(await request(target, requestOptions)));
618
+ const jsonMethod = (method, target, body, requestOptions) => json(target, jsonOptions(method, body, requestOptions));
619
+ return {
620
+ delete: (target, requestOptions) => {
621
+ const { body, ...optionsWithoutBody } = requestOptions ?? {};
622
+ return jsonMethod("DELETE", target, body, optionsWithoutBody);
623
+ },
624
+ fetch: fetchTrusted,
625
+ get: (target, requestOptions) => json(target, { ...requestOptions, method: "GET" }),
626
+ json,
627
+ origin: () => transportFor(options.transport).origin,
628
+ patch: (target, body, requestOptions) => jsonMethod("PATCH", target, body, requestOptions),
629
+ post: (target, body, requestOptions) => jsonMethod("POST", target, body, requestOptions),
630
+ put: (target, body, requestOptions) => jsonMethod("PUT", target, body, requestOptions),
631
+ request,
632
+ text: async (target, requestOptions) => requireOk(await request(target, requestOptions)).text()
633
+ };
634
+ };
635
+ var http = createAbsoluteHttpClient();
636
+
637
+ // src/mobile/shellHttp.ts
638
+ var installAbsoluteMobileShellHttp = (origin, fetch2 = globalThis.fetch) => installAbsoluteHttpTransport(createAbsoluteHttpTransport({ fetch: fetch2, origin, runtime: "native" }));
639
+
436
640
  // src/mobile/shellBootstrap.ts
437
641
  var MANIFEST_PATH = "./absolute-mobile-manifest.json";
438
642
  var STATUS_ID = "absolute-mobile-status";
@@ -574,6 +778,7 @@ var startAbsoluteMobileShell = async (options = {}) => {
574
778
  const auth = manifest.auth && options.createAuth ? await options.createAuth(manifest.auth, {
575
779
  beforeSignOut: options.beforeSignOut
576
780
  }) : undefined;
781
+ installAbsoluteMobileShellHttp(manifest.productionOrigin, auth?.fetch ?? globalThis.fetch);
577
782
  if (auth)
578
783
  options.connectPush?.(auth);
579
784
  if (auth && manifest.sync?.socketTickets)
@@ -941,6 +941,7 @@ var colors, MONTHS, formatTimestamp = () => {
941
941
  port,
942
942
  host,
943
943
  networkUrl,
944
+ mobilePreviewUrl,
944
945
  protocol = "http"
945
946
  } = options;
946
947
  const name = `${colors.cyan}${colors.bold}ABSOLUTEJS${colors.reset}`;
@@ -954,6 +955,9 @@ var colors, MONTHS, formatTimestamp = () => {
954
955
  if (networkUrl) {
955
956
  console.log(` ${colors.green}\u279C${colors.reset} ${colors.bold}Network:${colors.reset} ${networkUrl}`);
956
957
  }
958
+ if (mobilePreviewUrl) {
959
+ console.log(` ${colors.green}\u279C${colors.reset} ${colors.bold}Mobile:${colors.reset} ${mobilePreviewUrl}`);
960
+ }
957
961
  console.log("");
958
962
  };
959
963
  var init_startupBanner = __esm(() => {
@@ -4910,5 +4914,5 @@ export {
4910
4914
  Island
4911
4915
  };
4912
4916
 
4913
- //# debugId=7CE6A5979AFA5A9664756E2164756E21
4917
+ //# debugId=D93F1B4F7925234C64756E2164756E21
4914
4918
  //# sourceMappingURL=index.js.map