@otalan/cli 1.1.0 → 1.1.1

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.
package/CHANGELOG.md CHANGED
@@ -2,6 +2,13 @@
2
2
 
3
3
  All notable changes to `@otalan/cli` will be documented in this file.
4
4
 
5
+ ## 1.1.1 - 2026-05-07
6
+
7
+ ### Changed
8
+
9
+ - Remove unsupported target mentions from public documentation, CLI help, and package metadata.
10
+ - Document official support for Capacitor 7 and 8, and Expo SDK 54 and 55.
11
+
5
12
  ## 1.1.0 - 2026-05-07
6
13
 
7
14
  ### Added
@@ -13,7 +20,7 @@ All notable changes to `@otalan/cli` will be documented in this file.
13
20
  - Let `otalan login` reuse the saved API URL and keep the saved CI key from a masked prompt.
14
21
  - Export Expo bundles into a project-local `.otalan/expo-export-*` folder so Expo accepts the output path.
15
22
  - Fall back to the resolved native version when Expo runtimeVersion is not configured or present in export metadata.
16
- - Clarify Capacitor and Expo / React Native bundling behavior in CLI help and README.
23
+ - Clarify Capacitor and Expo bundling behavior in CLI help and README.
17
24
 
18
25
  ## 1.0.9 - 2026-05-06
19
26
 
@@ -87,7 +94,7 @@ Initial public release of the Otalan CLI.
87
94
  ### Added
88
95
 
89
96
  - Capacitor OTA bundle packaging from built web assets.
90
- - Expo / React Native OTA bundle packaging through `expo export`.
97
+ - Expo OTA bundle packaging through `expo export`.
91
98
  - Release publishing with rollout metadata and server-side validation polling.
92
99
  - Bundle listing, active bundle status, and rollback commands.
93
100
  - CI key login, project initialization, and API connectivity doctor checks.
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # `@otalan/cli`
2
2
 
3
- Otalan CLI for bundling and publishing OTA update releases for Capacitor and Expo / React Native apps.
3
+ Otalan CLI for bundling and publishing OTA update releases for Capacitor and Expo apps.
4
4
 
5
5
  Website: [otalan.com](https://otalan.com)
6
6
 
@@ -21,6 +21,15 @@ The npm package ships a Bun-based CLI entrypoint, not standalone native binaries
21
21
  - Windows support is experimental until the CLI release flow is validated on Windows.
22
22
  - Native compile scripts exist for macOS, Linux, and Windows maintainers, but the compiled binaries are not included in the npm package.
23
23
 
24
+ ## App Framework Support
25
+
26
+ Officially supported app targets and versions:
27
+
28
+ - Capacitor 7 and 8 with `--target capacitor`
29
+ - Expo SDK 54 and 55 with `--target expo`
30
+
31
+ Other app targets and older framework versions may work, but they are not officially supported for the moment.
32
+
24
33
  ## Install
25
34
 
26
35
  Recommended:
@@ -70,7 +79,7 @@ otalan publish --channel production
70
79
  `otalan bundle --target capacitor` packages existing built web assets. By default it reads `dist/` first, then `www/`; pass `--input-dir <path>` if your build outputs somewhere else. Your app build must run first.
71
80
  `otalan publish` waits for server-side validation to finish before it returns.
72
81
 
73
- ### Expo / React Native
82
+ ### Expo
74
83
 
75
84
  1. Log in with your CI key:
76
85
 
@@ -126,7 +135,7 @@ otalan publish --channel production
126
135
 
127
136
  Use your normal app build command before `otalan bundle`. The CLI then packages the built web output from `dist/` or `www/` by default; pass `--input-dir <path>` if your Capacitor web output uses another folder.
128
137
 
129
- ### CI/CD Example: Expo / React Native
138
+ ### CI/CD Example: Expo
130
139
 
131
140
  ```bash
132
141
  bun install --frozen-lockfile
@@ -137,7 +146,7 @@ otalan bundle --target expo --platform ios --bundle-from-package
137
146
  otalan publish --channel production
138
147
  ```
139
148
 
140
- This runs `bunx expo export` through the CLI, using a temporary project-local `.otalan/expo-export-*` folder, packages the exported OTA assets, and publishes the resulting bundle through Otalan's validation pipeline. Do not add a separate web build step just to create `dist/` or `www/` for Expo / React Native.
149
+ This runs `bunx expo export` through the CLI, using a temporary project-local `.otalan/expo-export-*` folder, packages the exported OTA assets, and publishes the resulting bundle through Otalan's validation pipeline. Do not add a separate web build step just to create `dist/` or `www/` for Expo.
141
150
 
142
151
  ### GitHub Actions Example
143
152
 
@@ -173,7 +182,7 @@ jobs:
173
182
  Adjust the build step and bundle target for your app:
174
183
 
175
184
  - Capacitor: keep your web build step and use `--target capacitor`
176
- - Expo / React Native: remove the web build step if not needed and use `--target expo`
185
+ - Expo: remove the web build step if not needed and use `--target expo`
177
186
 
178
187
  ## What It Does
179
188
 
@@ -181,7 +190,7 @@ Adjust the build step and bundle target for your app:
181
190
  - checks API connectivity and CI key context
182
191
  - generates CI and OTA key material locally for dashboard import
183
192
  - links the current repo to an Otalan app
184
- - bundles Capacitor or Expo / React Native OTA output
193
+ - bundles Capacitor or Expo OTA output
185
194
  - publishes a bundle with rollout metadata
186
195
  - lists published bundles
187
196
  - rolls back to an older bundle
@@ -311,7 +320,7 @@ otalan bundle --target capacitor --platform ios
311
320
  otalan bundle --target capacitor --platform ios --input-dir build
312
321
  ```
313
322
 
314
- Expo / React Native:
323
+ Expo:
315
324
 
316
325
  ```bash
317
326
  otalan bundle --target expo --platform ios
@@ -319,11 +328,13 @@ otalan bundle --target expo --platform ios
319
328
 
320
329
  Current behavior:
321
330
 
331
+ - Official support covers Capacitor 7 and 8, and Expo SDK 54 and 55
332
+ - Other app targets and older framework versions may work, but they are not officially supported for the moment
322
333
  - Capacitor packages prebuilt web assets; it does not run your app build command
323
334
  - without `--input-dir`, Capacitor checks `dist/` first and then `www/`
324
335
  - pass `--input-dir <path>` to package a different Capacitor web output folder
325
- - Expo / React Native runs `bunx expo export --platform <platform>` into a temporary project-local `.otalan/expo-export-*` folder
326
- - Expo / React Native does not require a prebuilt `dist/` or `www/` folder
336
+ - Expo runs `bunx expo export --platform <platform>` into a temporary project-local `.otalan/expo-export-*` folder
337
+ - Expo does not require a prebuilt `dist/` or `www/` folder
327
338
  - Expo stores the resolved Expo app config in `.otalan/bundle/manifest.json` so publish can forward it for `extra.expoClient`
328
339
  - both outputs produce a ZIP plus `manifest.json`
329
340
  - `--platform` is required so the CLI exports the selected platform and resolves the correct native/runtime version
@@ -521,7 +532,7 @@ bun pm pack --dry-run
521
532
  ## Notes
522
533
 
523
534
  - This is a Bun-based CLI published on npm.
524
- - Expo / React Native bundling uses `bunx expo ...`.
535
+ - Expo bundling uses `bunx expo ...`.
525
536
  - Default API URL is `https://api.otalan.com`.
526
537
  - Publishing, rollback, status, and `bundles` expect a CI key and an active app.
527
538
  - Release commands print the organization and project resolved from the CI key before continuing.
package/dist/bin.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
3
  var PN=Object.defineProperty;var LN=(r)=>r;function WN(r,$){this[r]=LN.bind(null,$)}var Gr=(r,$)=>{for(var v in $)PN(r,v,{get:$[v],enumerable:!0,configurable:!0,set:WN.bind($,v)})};function yo(r){let[$,v,...i]=r,n=$==="bundles"&&Boolean(v)&&!v.startsWith("-"),g=n?v:void 0,u=n?i:[v,...i].filter(Boolean),I={};for(let U=0;U<u.length;U+=1){let o=u[U];if(!o.startsWith("-"))continue;if(o.startsWith("--")){let S=o.slice(2),O=u[U+1];if(!O||O.startsWith("-")){I[S]=!0;continue}I[S]=O,U+=1;continue}if(o.length>2){for(let S of o.slice(1))I[S]=!0;continue}let D=o.slice(1);I[D]=!0}return{command:$,subcommand:g,options:I}}function z(r,$){let v=r[$];return typeof v==="string"?v:void 0}function gn(r,$,v=!1){let i=r[$];if(typeof i==="boolean")return i;if(typeof i==="string")return i==="true";return v}function ao(r){console.log(JSON.stringify(r,null,2))}function po(r){switch(r){case"flag":return"Using bundle ID from --bundle-id.";case"prompt":return"Using bundle ID from prompt.";case"native-version":return"Using bundle ID from nativeVersion with a hash suffix.";case"package-json":return"Using bundle ID from package.json version.";default:return"Using fallback bundle ID."}}function ho(r,$){if(r&&r!==$)return`${r} (${$})`;return $}function so(r){return[`Organization: ${ho(r.organizationName,r.organizationSlug)}`,`Project: ${ho(r.projectName,r.projectSlug)}`].join(`
4
- `)}function un(r,$={}){let v=[["help","","Show help."],["version","","Show CLI version."],["login","[--api-key ...] [--api-url ...]","Save project CI key auth locally."],["init","[--app-id ...]","Select and link this repo to an active app."],["doctor","[--api-key ...] [--api-url ...]","Check API connectivity and CI key context."],["keygen","[--kind ci|ota]","Generate an Otalan key locally without calling the API."],["bundle","[--target capacitor|expo] [--platform ios|android]","Build bundle.zip and manifest.json for Capacitor or Expo/React Native apps."],["","[--input-dir path] [--output-dir .otalan/bundle]",""],["","[--bundle-from-package] [--bundle-id 1.0.5]",""],["","[--native-version 1.0.0] [--runtime-version 1.0.0] [--channel production]",""],["publish","[--output-dir .otalan/bundle] [--channel production]","Publish the current bundle ZIP with rollout metadata."],["",'[--release-notes "..."] [--optional] [--rollout-percent 100]',""],["bundles","[--platform ios|android]","List published bundles for a release tuple."],["","[--channel production] [--native-version 1.0.0]",""],["rollback","--bundle-id ... [--platform ios|android]","Reactivate a published bundle."],["","[--channel production] [--native-version 1.0.0]",""],["status","[--platform ios|android] [--channel production]","Show the active bundle for a release tuple."],["","[--native-version 1.0.0]",""]],i=["Capacitor packages prebuilt web assets from dist/ or www/ by default; use --input-dir for another folder.","Expo/React Native runs `bunx expo export` into .otalan/expo-export-*; no dist/ or www/ build is required first.","Expo runtimeVersion comes from --runtime-version, Expo config/export metadata, or the native version fallback.","Run `otalan login` to authenticate to a project; `otalan init` selects an active app in that project.","Otalan validates release ZIPs before `otalan publish` succeeds.","Release commands require the configured app to be active, not archived."],n=12,g=$.includeNotes??!0;if(console.log(`Otalan CLI ${r}`),console.log(""),console.log("Usage: otalan <command> [options]"),console.log(""),console.log("Commands:"),v.forEach(([u,I,U],o)=>{if(u&&o>0)console.log("");let D=u?` ${u.padEnd(12," ")} ${I}`.trimEnd():` ${"".padEnd(12," ")} ${I}`.trimEnd();if(U)console.log(`${D.padEnd(78," ")} ${U}`);else console.log(D)}),g){console.log(""),console.log("Notes:");for(let u of i)console.log(` ${u}`)}console.log(""),console.log("Run `otalan <command> --help` to show this help text.")}function Xg(r){let $=[`Bundle ID: ${r.bundleId}`,`Platform: ${r.platform}`,`Channel: ${r.channel}`,`Native version: ${r.nativeVersion}`];if(r.rolloutPercent!==void 0)$.push(`Rollout: ${r.rolloutPercent}%`);if(r.rolloutState)$.push(`State: ${r.rolloutState}`);if(r.createdAt)$.push(`Published at: ${r.createdAt}`);if(r.selectable!==void 0)$.push(`Selectable: ${r.selectable?"yes":"no"}`);if(r.releaseNotes)$.push(`Release notes: ${r.releaseNotes}`);return $.join(`
4
+ `)}function un(r,$={}){let v=[["help","","Show help."],["version","","Show CLI version."],["login","[--api-key ...] [--api-url ...]","Save project CI key auth locally."],["init","[--app-id ...]","Select and link this repo to an active app."],["doctor","[--api-key ...] [--api-url ...]","Check API connectivity and CI key context."],["keygen","[--kind ci|ota]","Generate an Otalan key locally without calling the API."],["bundle","[--target capacitor|expo] [--platform ios|android]","Build bundle.zip and manifest.json for Capacitor or Expo apps."],["","[--input-dir path] [--output-dir .otalan/bundle]",""],["","[--bundle-from-package] [--bundle-id 1.0.5]",""],["","[--native-version 1.0.0] [--runtime-version 1.0.0] [--channel production]",""],["publish","[--output-dir .otalan/bundle] [--channel production]","Publish the current bundle ZIP with rollout metadata."],["",'[--release-notes "..."] [--optional] [--rollout-percent 100]',""],["bundles","[--platform ios|android]","List published bundles for a release tuple."],["","[--channel production] [--native-version 1.0.0]",""],["rollback","--bundle-id ... [--platform ios|android]","Reactivate a published bundle."],["","[--channel production] [--native-version 1.0.0]",""],["status","[--platform ios|android] [--channel production]","Show the active bundle for a release tuple."],["","[--native-version 1.0.0]",""]],i=["Official app support: Capacitor 7/8 and Expo SDK 54/55.","Capacitor packages prebuilt web assets from dist/ or www/ by default; use --input-dir for another folder.","Expo runs `bunx expo export` into .otalan/expo-export-*; no dist/ or www/ build is required first.","Expo runtimeVersion comes from --runtime-version, Expo config/export metadata, or the native version fallback.","Run `otalan login` to authenticate to a project; `otalan init` selects an active app in that project.","Otalan validates release ZIPs before `otalan publish` succeeds.","Release commands require the configured app to be active, not archived."],n=12,g=$.includeNotes??!0;if(console.log(`Otalan CLI ${r}`),console.log(""),console.log("Usage: otalan <command> [options]"),console.log(""),console.log("Commands:"),v.forEach(([u,I,U],o)=>{if(u&&o>0)console.log("");let D=u?` ${u.padEnd(12," ")} ${I}`.trimEnd():` ${"".padEnd(12," ")} ${I}`.trimEnd();if(U)console.log(`${D.padEnd(78," ")} ${U}`);else console.log(D)}),g){console.log(""),console.log("Notes:");for(let u of i)console.log(` ${u}`)}console.log(""),console.log("Run `otalan <command> --help` to show this help text.")}function Xg(r){let $=[`Bundle ID: ${r.bundleId}`,`Platform: ${r.platform}`,`Channel: ${r.channel}`,`Native version: ${r.nativeVersion}`];if(r.rolloutPercent!==void 0)$.push(`Rollout: ${r.rolloutPercent}%`);if(r.rolloutState)$.push(`State: ${r.rolloutState}`);if(r.createdAt)$.push(`Published at: ${r.createdAt}`);if(r.selectable!==void 0)$.push(`Selectable: ${r.selectable?"yes":"no"}`);if(r.releaseNotes)$.push(`Release notes: ${r.releaseNotes}`);return $.join(`
5
5
  `)}function rU(r){let $=[`Bundle ID: ${r.bundleId}`,`Platform: ${r.platform}`,`Channel: ${r.channel}`,`Native version: ${r.nativeVersion}`,`Rollout: ${r.rolloutPercent}%`,`Mandatory: ${r.mandatory?"yes":"no"}`];if(r.releaseNotes)$.push(`Release notes: ${r.releaseNotes}`);return $.join(`
6
6
  `)}function zg(r){let $=[`Ingest ID: ${r.ingest.id}`,`Status: ${r.ingest.status}`,`Size: ${r.ingest.fileSizeBytes} bytes`,`Queued at: ${r.ingest.createdAt}`];if(r.ingest.processedAt)$.push(`Processed at: ${r.ingest.processedAt}`);if(r.ingest.checksum)$.push(`Checksum: ${r.ingest.checksum}`);if(r.ingest.failureReason)$.push(`Failure reason: ${r.ingest.failureReason}`);return $.join(`
7
7
  `)}function fo(r,$){return r.length>=$?r.slice(0,$):r.padEnd($," ")}function Gg(r){let $=r.map((n)=>[n.isActive?"yes":"no",n.resolvedDownloadUrl?"yes":"no",n.resolvedDownloadUrl?"available":"deleted",n.bundleId,n.nativeVersion,n.platform,n.channel,`${n.rolloutPercent}%`,n.rolloutState,n.createdAt.slice(0,19).replace("T"," ")]),v=["active","selectable","archive","bundleId","nativeVersion","platform","channel","rollout","state","createdAt"],i=v.map((n,g)=>Math.min(32,Math.max(n.length,...$.map((u)=>u[g]?.length??0))));console.log(v.map((n,g)=>fo(n,i[g])).join(" ")),console.log(i.map((n)=>"".padEnd(n,"-")).join(" "));for(let n of $)console.log(n.map((g,u)=>fo(g,i[u])).join(" "));if(r.some((n)=>!n.resolvedDownloadUrl))console.log(""),console.log('Rows with archive "deleted" are shown for history, but they are not selectable for rollback.')}import{chmod as NO,mkdir as SO,writeFile as kO}from"fs/promises";import OO from"os";import og from"path";var Er={};Gr(Er,{xor:()=>AD,xid:()=>nD,void:()=>QD,uuidv7:()=>yU,uuidv6:()=>mU,uuidv4:()=>eU,uuid:()=>lU,util:()=>J,url:()=>hU,uppercase:()=>Jn,unknown:()=>dr,union:()=>vg,undefined:()=>zD,ulid:()=>rD,uint64:()=>ED,uint32:()=>PD,tuple:()=>yI,trim:()=>zn,treeifyError:()=>bg,transform:()=>ig,toUpperCase:()=>Qn,toLowerCase:()=>Gn,toJSONSchema:()=>Fv,templateLiteral:()=>mD,symbol:()=>XD,superRefine:()=>Wo,success:()=>cD,stringbool:()=>r1,stringFormat:()=>SD,string:()=>S$,strictObject:()=>FD,startsWith:()=>Ln,slugify:()=>Yn,size:()=>yr,setErrorMap:()=>nO,set:()=>RD,safeParseAsync:()=>WI,safeParse:()=>LI,safeEncodeAsync:()=>qI,safeEncode:()=>QI,safeDecodeAsync:()=>KI,safeDecode:()=>YI,registry:()=>nv,regexes:()=>ir,regex:()=>wn,refine:()=>Lo,record:()=>hI,readonly:()=>Oo,property:()=>Qv,promise:()=>yD,prettifyError:()=>Zg,preprocess:()=>$1,prefault:()=>uo,positive:()=>Ev,pipe:()=>Rv,partialRecord:()=>TD,parseAsync:()=>PI,parse:()=>JI,overwrite:()=>kr,optional:()=>O$,object:()=>KD,number:()=>HI,nullish:()=>CD,nullable:()=>j$,null:()=>BI,normalize:()=>Xn,nonpositive:()=>zv,nonoptional:()=>Io,nonnegative:()=>Gv,never:()=>$g,negative:()=>Xv,nativeEnum:()=>bD,nanoid:()=>aU,nan:()=>tD,multipleOf:()=>Rr,minSize:()=>Lr,minLength:()=>Yr,mime:()=>En,meta:()=>pD,maxSize:()=>br,maxLength:()=>hr,map:()=>BD,mac:()=>gD,lte:()=>ur,lt:()=>Jr,lowercase:()=>_n,looseRecord:()=>VD,looseObject:()=>HD,locales:()=>o$,literal:()=>ZD,length:()=>fr,lazy:()=>_o,ksuid:()=>$D,keyof:()=>qD,jwt:()=>ND,json:()=>n1,iso:()=>Fn,ipv6:()=>iD,ipv4:()=>vD,invertCodec:()=>eD,intersection:()=>eI,int64:()=>WD,int32:()=>JD,int:()=>Bv,instanceof:()=>sD,includes:()=>Pn,httpUrl:()=>fU,hostname:()=>kD,hex:()=>OD,hash:()=>jD,guid:()=>tU,gte:()=>d,gt:()=>Pr,globalRegistry:()=>C,getErrorMap:()=>$O,function:()=>hD,fromJSONSchema:()=>g1,formatError:()=>an,float64:()=>_D,float32:()=>wD,flattenError:()=>dn,file:()=>xD,exactOptional:()=>no,enum:()=>gg,endsWith:()=>Wn,encodeAsync:()=>zI,encode:()=>EI,emoji:()=>dU,email:()=>cU,e164:()=>DD,discriminatedUnion:()=>MD,describe:()=>aD,decodeAsync:()=>GI,decode:()=>XI,date:()=>YD,custom:()=>dD,cuid2:()=>sU,cuid:()=>pU,core:()=>qr,config:()=>R,coerce:()=>Xo,codec:()=>lD,clone:()=>h,cidrv6:()=>ID,cidrv4:()=>uD,check:()=>fD,catch:()=>Do,boolean:()=>AI,bigint:()=>LD,base64url:()=>UD,base64:()=>oD,array:()=>P$,any:()=>GD,_function:()=>hD,_default:()=>go,_ZodString:()=>bv,ZodXor:()=>cI,ZodXID:()=>ev,ZodVoid:()=>xI,ZodUnknown:()=>bI,ZodUnion:()=>W$,ZodUndefined:()=>TI,ZodUUID:()=>Wr,ZodURL:()=>_$,ZodULID:()=>lv,ZodType:()=>G,ZodTuple:()=>mI,ZodTransform:()=>sI,ZodTemplateLiteral:()=>jo,ZodSymbol:()=>MI,ZodSuccess:()=>oo,ZodStringFormat:()=>V,ZodString:()=>Mn,ZodSet:()=>dI,ZodRecord:()=>Hn,ZodRealError:()=>$r,ZodReadonly:()=>ko,ZodPromise:()=>Jo,ZodPreprocess:()=>So,ZodPrefault:()=>io,ZodPipe:()=>E$,ZodOptional:()=>ug,ZodObject:()=>L$,ZodNumberFormat:()=>ar,ZodNumber:()=>Vn,ZodNullable:()=>$o,ZodNull:()=>VI,ZodNonOptional:()=>Ig,ZodNever:()=>ZI,ZodNanoID:()=>Cv,ZodNaN:()=>No,ZodMap:()=>fI,ZodMAC:()=>FI,ZodLiteral:()=>aI,ZodLazy:()=>wo,ZodKSUID:()=>mv,ZodJWT:()=>rg,ZodIssueCode:()=>rO,ZodIntersection:()=>lI,ZodISOTime:()=>Tv,ZodISODuration:()=>Vv,ZodISODateTime:()=>Av,ZodISODate:()=>Mv,ZodIPv6:()=>hv,ZodIPv4:()=>yv,ZodGUID:()=>k$,ZodFunction:()=>Po,ZodFirstPartyTypeKind:()=>Eo,ZodFile:()=>pI,ZodExactOptional:()=>ro,ZodError:()=>pk,ZodEnum:()=>An,ZodEmoji:()=>xv,ZodEmail:()=>Zv,ZodE164:()=>sv,ZodDiscriminatedUnion:()=>tI,ZodDefault:()=>vo,ZodDate:()=>J$,ZodCustomStringFormat:()=>Tn,ZodCustom:()=>z$,ZodCodec:()=>X$,ZodCatch:()=>Uo,ZodCUID2:()=>tv,ZodCUID:()=>cv,ZodCIDRv6:()=>dv,ZodCIDRv4:()=>fv,ZodBoolean:()=>Bn,ZodBigIntFormat:()=>ng,ZodBigInt:()=>Rn,ZodBase64URL:()=>pv,ZodBase64:()=>av,ZodArray:()=>CI,ZodAny:()=>RI,TimePrecision:()=>y6,NEVER:()=>Qg,$output:()=>C6,$input:()=>c6,$brand:()=>Yg});var qr={};Gr(qr,{version:()=>Vi,util:()=>J,treeifyError:()=>bg,toJSONSchema:()=>Fv,toDotPath:()=>IU,safeParseAsync:()=>Cg,safeParse:()=>xg,safeEncodeAsync:()=>rS,safeEncode:()=>pN,safeDecodeAsync:()=>nS,safeDecode:()=>sN,registry:()=>nv,regexes:()=>ir,process:()=>M,prettifyError:()=>Zg,parseAsync:()=>M$,parse:()=>A$,meta:()=>Y4,locales:()=>o$,isValidJWT:()=>KU,isValidBase64URL:()=>qU,isValidBase64:()=>vu,initializeContext:()=>Zr,globalRegistry:()=>C,globalConfig:()=>cr,formatError:()=>an,flattenError:()=>dn,finalize:()=>Cr,extractDefs:()=>xr,encodeAsync:()=>dN,encode:()=>hN,describe:()=>Q4,decodeAsync:()=>aN,decode:()=>fN,createToJSONSchemaMethod:()=>K4,createStandardJSONSchemaMethod:()=>Kn,config:()=>R,clone:()=>h,_xor:()=>qk,_xid:()=>Sv,_void:()=>_4,_uuidv7:()=>uv,_uuidv6:()=>iv,_uuidv4:()=>gv,_uuid:()=>vv,_url:()=>D$,_uppercase:()=>Jn,_unknown:()=>j4,_union:()=>Yk,_undefined:()=>S4,_ulid:()=>Nv,_uint64:()=>D4,_uint32:()=>g4,_tuple:()=>Hk,_trim:()=>zn,_transform:()=>bk,_toUpperCase:()=>Qn,_toLowerCase:()=>Gn,_templateLiteral:()=>yk,_symbol:()=>N4,_superRefine:()=>G4,_success:()=>tk,_stringbool:()=>q4,_stringFormat:()=>qn,_string:()=>l6,_startsWith:()=>Ln,_slugify:()=>Yn,_size:()=>yr,_set:()=>Tk,_safeParseAsync:()=>kn,_safeParse:()=>Sn,_safeEncodeAsync:()=>x$,_safeEncode:()=>b$,_safeDecodeAsync:()=>C$,_safeDecode:()=>Z$,_regex:()=>wn,_refine:()=>z4,_record:()=>Ak,_readonly:()=>mk,_property:()=>Qv,_promise:()=>fk,_positive:()=>Ev,_pipe:()=>ek,_parseAsync:()=>Nn,_parse:()=>Dn,_overwrite:()=>kr,_optional:()=>Zk,_number:()=>p6,_nullable:()=>xk,_null:()=>k4,_normalize:()=>Xn,_nonpositive:()=>zv,_nonoptional:()=>ck,_nonnegative:()=>Gv,_never:()=>w4,_negative:()=>Xv,_nativeEnum:()=>Bk,_nanoid:()=>ov,_nan:()=>L4,_multipleOf:()=>Rr,_minSize:()=>Lr,_minLength:()=>Yr,_min:()=>d,_mime:()=>En,_maxSize:()=>br,_maxLength:()=>hr,_max:()=>ur,_map:()=>Mk,_mac:()=>m6,_lte:()=>ur,_lt:()=>Jr,_lowercase:()=>_n,_literal:()=>Rk,_length:()=>fr,_lazy:()=>hk,_ksuid:()=>kv,_jwt:()=>Wv,_isoTime:()=>d6,_isoDuration:()=>a6,_isoDateTime:()=>h6,_isoDate:()=>f6,_ipv6:()=>jv,_ipv4:()=>Ov,_intersection:()=>Fk,_int64:()=>U4,_int32:()=>v4,_int:()=>r4,_includes:()=>Pn,_guid:()=>U$,_gte:()=>d,_gt:()=>Pr,_float64:()=>$4,_float32:()=>n4,_file:()=>E4,_enum:()=>Vk,_endsWith:()=>Wn,_encodeAsync:()=>B$,_encode:()=>T$,_emoji:()=>Iv,_email:()=>$v,_e164:()=>Lv,_discriminatedUnion:()=>Kk,_default:()=>Ck,_decodeAsync:()=>R$,_decode:()=>V$,_date:()=>J4,_custom:()=>X4,_cuid2:()=>Dv,_cuid:()=>Uv,_coercedString:()=>e6,_coercedNumber:()=>s6,_coercedDate:()=>P4,_coercedBoolean:()=>u4,_coercedBigint:()=>o4,_cidrv6:()=>_v,_cidrv4:()=>wv,_check:()=>bU,_catch:()=>lk,_boolean:()=>i4,_bigint:()=>I4,_base64url:()=>Pv,_base64:()=>Jv,_array:()=>W4,_any:()=>O4,TimePrecision:()=>y6,NEVER:()=>Qg,JSONSchemaGenerator:()=>kI,JSONSchema:()=>ZU,Doc:()=>e$,$output:()=>C6,$input:()=>c6,$constructor:()=>N,$brand:()=>Yg,$ZodXor:()=>Wu,$ZodXID:()=>mi,$ZodVoid:()=>_u,$ZodUnknown:()=>ju,$ZodUnion:()=>$$,$ZodUndefined:()=>Su,$ZodUUID:()=>bi,$ZodURL:()=>xi,$ZodULID:()=>ei,$ZodType:()=>X,$ZodTuple:()=>p$,$ZodTransform:()=>Fu,$ZodTemplateLiteral:()=>Cu,$ZodSymbol:()=>Nu,$ZodSuccess:()=>Bu,$ZodStringFormat:()=>T,$ZodString:()=>mr,$ZodSet:()=>Qu,$ZodRegistry:()=>t6,$ZodRecord:()=>zu,$ZodRealError:()=>nr,$ZodReadonly:()=>xu,$ZodPromise:()=>tu,$ZodPreprocess:()=>Zu,$ZodPrefault:()=>Tu,$ZodPipe:()=>rv,$ZodOptional:()=>s$,$ZodObjectJIT:()=>Lu,$ZodObject:()=>AU,$ZodNumberFormat:()=>Uu,$ZodNumber:()=>d$,$ZodNullable:()=>Au,$ZodNull:()=>ku,$ZodNonOptional:()=>Vu,$ZodNever:()=>wu,$ZodNanoID:()=>ci,$ZodNaN:()=>bu,$ZodMap:()=>Gu,$ZodMAC:()=>ru,$ZodLiteral:()=>qu,$ZodLazy:()=>lu,$ZodKSUID:()=>yi,$ZodJWT:()=>Iu,$ZodIntersection:()=>Xu,$ZodISOTime:()=>di,$ZodISODuration:()=>ai,$ZodISODateTime:()=>hi,$ZodISODate:()=>fi,$ZodIPv6:()=>si,$ZodIPv4:()=>pi,$ZodGUID:()=>Ri,$ZodFunction:()=>cu,$ZodFile:()=>Ku,$ZodExactOptional:()=>Hu,$ZodError:()=>fn,$ZodEnum:()=>Yu,$ZodEncodeError:()=>tr,$ZodEmoji:()=>Ci,$ZodEmail:()=>Zi,$ZodE164:()=>uu,$ZodDiscriminatedUnion:()=>Eu,$ZodDefault:()=>Mu,$ZodDate:()=>Ju,$ZodCustomStringFormat:()=>ou,$ZodCustom:()=>eu,$ZodCodec:()=>v$,$ZodCheckUpperCase:()=>qi,$ZodCheckStringFormat:()=>On,$ZodCheckStartsWith:()=>Fi,$ZodCheckSizeEquals:()=>Ei,$ZodCheckRegex:()=>Qi,$ZodCheckProperty:()=>Ai,$ZodCheckOverwrite:()=>Ti,$ZodCheckNumberFormat:()=>Ji,$ZodCheckMultipleOf:()=>_i,$ZodCheckMinSize:()=>Wi,$ZodCheckMinLength:()=>zi,$ZodCheckMimeType:()=>Mi,$ZodCheckMaxSize:()=>Li,$ZodCheckMaxLength:()=>Xi,$ZodCheckLowerCase:()=>Yi,$ZodCheckLessThan:()=>t$,$ZodCheckLengthEquals:()=>Gi,$ZodCheckIncludes:()=>Ki,$ZodCheckGreaterThan:()=>l$,$ZodCheckEndsWith:()=>Hi,$ZodCheckBigIntFormat:()=>Pi,$ZodCheck:()=>B,$ZodCatch:()=>Ru,$ZodCUID2:()=>li,$ZodCUID:()=>ti,$ZodCIDRv6:()=>$u,$ZodCIDRv4:()=>nu,$ZodBoolean:()=>n$,$ZodBigIntFormat:()=>Du,$ZodBigInt:()=>a$,$ZodBase64URL:()=>iu,$ZodBase64:()=>gu,$ZodAsyncError:()=>_r,$ZodArray:()=>Pu,$ZodAny:()=>Ou});var nU,Qg=Object.freeze({status:"aborted"});function N(r,$,v){function i(I,U){if(!I._zod)Object.defineProperty(I,"_zod",{value:{def:U,constr:u,traits:new Set},enumerable:!1});if(I._zod.traits.has(r))return;I._zod.traits.add(r),$(I,U);let o=u.prototype,D=Object.keys(o);for(let S=0;S<D.length;S++){let O=D[S];if(!(O in I))I[O]=o[O].bind(I)}}let n=v?.Parent??Object;class g extends n{}Object.defineProperty(g,"name",{value:r});function u(I){var U;let o=v?.Parent?new g:this;i(o,I),(U=o._zod).deferred??(U.deferred=[]);for(let D of o._zod.deferred)D();return o}return Object.defineProperty(u,"init",{value:i}),Object.defineProperty(u,Symbol.hasInstance,{value:(I)=>{if(v?.Parent&&I instanceof v.Parent)return!0;return I?._zod?.traits?.has(r)}}),Object.defineProperty(u,"name",{value:r}),u}var Yg=Symbol("zod_brand");class _r extends Error{constructor(){super("Encountered Promise during synchronous parse. Use .parseAsync() instead.")}}class tr extends Error{constructor(r){super(`Encountered unidirectional transform during encode: ${r}`);this.name="ZodEncodeError"}}(nU=globalThis).__zod_globalConfig??(nU.__zod_globalConfig={});var cr=globalThis.__zod_globalConfig;function R(r){if(r)Object.assign(cr,r);return cr}var J={};Gr(J,{unwrapMessage:()=>tn,uint8ArrayToHex:()=>mN,uint8ArrayToBase64url:()=>lN,uint8ArrayToBase64:()=>gU,stringifyPrimitive:()=>w,slugify:()=>Fg,shallowClone:()=>Ag,safeExtend:()=>bN,required:()=>CN,randomString:()=>HN,propertyKeyTypes:()=>mn,promiseAllObject:()=>FN,primitiveTypes:()=>Mg,prefixIssues:()=>rr,pick:()=>VN,partial:()=>xN,parsedType:()=>_,optionalKeys:()=>Tg,omit:()=>BN,objectClone:()=>YN,numKeys:()=>AN,nullish:()=>Mr,normalizeParams:()=>P,mergeDefs:()=>Qr,merge:()=>ZN,jsonStringifyReplacer:()=>In,joinValues:()=>k,issue:()=>Un,isPlainObject:()=>Vr,isObject:()=>lr,hexToUint8Array:()=>eN,getSizableOrigin:()=>yn,getParsedType:()=>MN,getLengthableOrigin:()=>hn,getEnumValues:()=>ln,getElementAtPath:()=>KN,floatSafeRemainder:()=>Kg,finalizeIssue:()=>f,extend:()=>RN,explicitlyAborted:()=>Rg,escapeRegex:()=>or,esc:()=>F$,defineLazy:()=>Y,createTransparentProxy:()=>TN,cloneDef:()=>qN,clone:()=>h,cleanRegex:()=>en,cleanEnum:()=>cN,captureStackTrace:()=>H$,cached:()=>on,base64urlToUint8Array:()=>tN,base64ToUint8Array:()=>vU,assignProp:()=>Tr,assertNotEqual:()=>XN,assertNever:()=>GN,assertIs:()=>zN,assertEqual:()=>EN,assert:()=>QN,allowsEval:()=>Hg,aborted:()=>Br,NUMBER_FORMAT_RANGES:()=>Vg,Class:()=>iU,BIGINT_FORMAT_RANGES:()=>Bg});function EN(r){return r}function XN(r){return r}function zN(r){}function GN(r){throw Error("Unexpected value in exhaustive check")}function QN(r){}function ln(r){let $=Object.values(r).filter((i)=>typeof i==="number");return Object.entries(r).filter(([i,n])=>$.indexOf(+i)===-1).map(([i,n])=>n)}function k(r,$="|"){return r.map((v)=>w(v)).join($)}function In(r,$){if(typeof $==="bigint")return $.toString();return $}function on(r){return{get value(){{let v=r();return Object.defineProperty(this,"value",{value:v}),v}throw Error("cached value already set")}}}function Mr(r){return r===null||r===void 0}function en(r){let $=r.startsWith("^")?1:0,v=r.endsWith("$")?r.length-1:r.length;return r.slice($,v)}function Kg(r,$){let v=r/$,i=Math.round(v),n=Number.EPSILON*Math.max(Math.abs(v),1);if(Math.abs(v-i)<n)return 0;return v-i}var $U=Symbol("evaluating");function Y(r,$,v){let i=void 0;Object.defineProperty(r,$,{get(){if(i===$U)return;if(i===void 0)i=$U,i=v();return i},set(n){Object.defineProperty(r,$,{value:n})},configurable:!0})}function YN(r){return Object.create(Object.getPrototypeOf(r),Object.getOwnPropertyDescriptors(r))}function Tr(r,$,v){Object.defineProperty(r,$,{value:v,writable:!0,enumerable:!0,configurable:!0})}function Qr(...r){let $={};for(let v of r){let i=Object.getOwnPropertyDescriptors(v);Object.assign($,i)}return Object.defineProperties({},$)}function qN(r){return Qr(r._zod.def)}function KN(r,$){if(!$)return r;return $.reduce((v,i)=>v?.[i],r)}function FN(r){let $=Object.keys(r),v=$.map((i)=>r[i]);return Promise.all(v).then((i)=>{let n={};for(let g=0;g<$.length;g++)n[$[g]]=i[g];return n})}function HN(r=10){let v="";for(let i=0;i<r;i++)v+="abcdefghijklmnopqrstuvwxyz"[Math.floor(Math.random()*26)];return v}function F$(r){return JSON.stringify(r)}function Fg(r){return r.toLowerCase().trim().replace(/[^\w\s-]/g,"").replace(/[\s_-]+/g,"-").replace(/^-+|-+$/g,"")}var H$="captureStackTrace"in Error?Error.captureStackTrace:(...r)=>{};function lr(r){return typeof r==="object"&&r!==null&&!Array.isArray(r)}var Hg=on(()=>{if(cr.jitless)return!1;if(typeof navigator<"u"&&navigator?.userAgent?.includes("Cloudflare"))return!1;try{return new Function(""),!0}catch(r){return!1}});function Vr(r){if(lr(r)===!1)return!1;let $=r.constructor;if($===void 0)return!0;if(typeof $!=="function")return!0;let v=$.prototype;if(lr(v)===!1)return!1;if(Object.prototype.hasOwnProperty.call(v,"isPrototypeOf")===!1)return!1;return!0}function Ag(r){if(Vr(r))return{...r};if(Array.isArray(r))return[...r];if(r instanceof Map)return new Map(r);if(r instanceof Set)return new Set(r);return r}function AN(r){let $=0;for(let v in r)if(Object.prototype.hasOwnProperty.call(r,v))$++;return $}var MN=(r)=>{let $=typeof r;switch($){case"undefined":return"undefined";case"string":return"string";case"number":return Number.isNaN(r)?"nan":"number";case"boolean":return"boolean";case"function":return"function";case"bigint":return"bigint";case"symbol":return"symbol";case"object":if(Array.isArray(r))return"array";if(r===null)return"null";if(r.then&&typeof r.then==="function"&&r.catch&&typeof r.catch==="function")return"promise";if(typeof Map<"u"&&r instanceof Map)return"map";if(typeof Set<"u"&&r instanceof Set)return"set";if(typeof Date<"u"&&r instanceof Date)return"date";if(typeof File<"u"&&r instanceof File)return"file";return"object";default:throw Error(`Unknown data type: ${$}`)}},mn=new Set(["string","number","symbol"]),Mg=new Set(["string","number","bigint","boolean","symbol","undefined"]);function or(r){return r.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function h(r,$,v){let i=new r._zod.constr($??r._zod.def);if(!$||v?.parent)i._zod.parent=r;return i}function P(r){let $=r;if(!$)return{};if(typeof $==="string")return{error:()=>$};if($?.message!==void 0){if($?.error!==void 0)throw Error("Cannot specify both `message` and `error` params");$.error=$.message}if(delete $.message,typeof $.error==="string")return{...$,error:()=>$.error};return $}function TN(r){let $;return new Proxy({},{get(v,i,n){return $??($=r()),Reflect.get($,i,n)},set(v,i,n,g){return $??($=r()),Reflect.set($,i,n,g)},has(v,i){return $??($=r()),Reflect.has($,i)},deleteProperty(v,i){return $??($=r()),Reflect.deleteProperty($,i)},ownKeys(v){return $??($=r()),Reflect.ownKeys($)},getOwnPropertyDescriptor(v,i){return $??($=r()),Reflect.getOwnPropertyDescriptor($,i)},defineProperty(v,i,n){return $??($=r()),Reflect.defineProperty($,i,n)}})}function w(r){if(typeof r==="bigint")return r.toString()+"n";if(typeof r==="string")return`"${r}"`;return`${r}`}function Tg(r){return Object.keys(r).filter(($)=>{return r[$]._zod.optin==="optional"&&r[$]._zod.optout==="optional"})}var Vg={safeint:[Number.MIN_SAFE_INTEGER,Number.MAX_SAFE_INTEGER],int32:[-2147483648,2147483647],uint32:[0,4294967295],float32:[-340282346638528860000000000000000000000,340282346638528860000000000000000000000],float64:[-Number.MAX_VALUE,Number.MAX_VALUE]},Bg={int64:[BigInt("-9223372036854775808"),BigInt("9223372036854775807")],uint64:[BigInt(0),BigInt("18446744073709551615")]};function VN(r,$){let v=r._zod.def,i=v.checks;if(i&&i.length>0)throw Error(".pick() cannot be used on object schemas containing refinements");let g=Qr(r._zod.def,{get shape(){let u={};for(let I in $){if(!(I in v.shape))throw Error(`Unrecognized key: "${I}"`);if(!$[I])continue;u[I]=v.shape[I]}return Tr(this,"shape",u),u},checks:[]});return h(r,g)}function BN(r,$){let v=r._zod.def,i=v.checks;if(i&&i.length>0)throw Error(".omit() cannot be used on object schemas containing refinements");let g=Qr(r._zod.def,{get shape(){let u={...r._zod.def.shape};for(let I in $){if(!(I in v.shape))throw Error(`Unrecognized key: "${I}"`);if(!$[I])continue;delete u[I]}return Tr(this,"shape",u),u},checks:[]});return h(r,g)}function RN(r,$){if(!Vr($))throw Error("Invalid input to extend: expected a plain object");let v=r._zod.def.checks;if(v&&v.length>0){let g=r._zod.def.shape;for(let u in $)if(Object.getOwnPropertyDescriptor(g,u)!==void 0)throw Error("Cannot overwrite keys on object schemas containing refinements. Use `.safeExtend()` instead.")}let n=Qr(r._zod.def,{get shape(){let g={...r._zod.def.shape,...$};return Tr(this,"shape",g),g}});return h(r,n)}function bN(r,$){if(!Vr($))throw Error("Invalid input to safeExtend: expected a plain object");let v=Qr(r._zod.def,{get shape(){let i={...r._zod.def.shape,...$};return Tr(this,"shape",i),i}});return h(r,v)}function ZN(r,$){if(r._zod.def.checks?.length)throw Error(".merge() cannot be used on object schemas containing refinements. Use .safeExtend() instead.");let v=Qr(r._zod.def,{get shape(){let i={...r._zod.def.shape,...$._zod.def.shape};return Tr(this,"shape",i),i},get catchall(){return $._zod.def.catchall},checks:$._zod.def.checks??[]});return h(r,v)}function xN(r,$,v){let n=$._zod.def.checks;if(n&&n.length>0)throw Error(".partial() cannot be used on object schemas containing refinements");let u=Qr($._zod.def,{get shape(){let I=$._zod.def.shape,U={...I};if(v)for(let o in v){if(!(o in I))throw Error(`Unrecognized key: "${o}"`);if(!v[o])continue;U[o]=r?new r({type:"optional",innerType:I[o]}):I[o]}else for(let o in I)U[o]=r?new r({type:"optional",innerType:I[o]}):I[o];return Tr(this,"shape",U),U},checks:[]});return h($,u)}function CN(r,$,v){let i=Qr($._zod.def,{get shape(){let n=$._zod.def.shape,g={...n};if(v)for(let u in v){if(!(u in g))throw Error(`Unrecognized key: "${u}"`);if(!v[u])continue;g[u]=new r({type:"nonoptional",innerType:n[u]})}else for(let u in n)g[u]=new r({type:"nonoptional",innerType:n[u]});return Tr(this,"shape",g),g}});return h($,i)}function Br(r,$=0){if(r.aborted===!0)return!0;for(let v=$;v<r.issues.length;v++)if(r.issues[v]?.continue!==!0)return!0;return!1}function Rg(r,$=0){if(r.aborted===!0)return!0;for(let v=$;v<r.issues.length;v++)if(r.issues[v]?.continue===!1)return!0;return!1}function rr(r,$){return $.map((v)=>{var i;return(i=v).path??(i.path=[]),v.path.unshift(r),v})}function tn(r){return typeof r==="string"?r:r?.message}function f(r,$,v){let i=r.message?r.message:tn(r.inst?._zod.def?.error?.(r))??tn($?.error?.(r))??tn(v.customError?.(r))??tn(v.localeError?.(r))??"Invalid input",{inst:n,continue:g,input:u,...I}=r;if(I.path??(I.path=[]),I.message=i,$?.reportInput)I.input=u;return I}function yn(r){if(r instanceof Set)return"set";if(r instanceof Map)return"map";if(r instanceof File)return"file";return"unknown"}function hn(r){if(Array.isArray(r))return"array";if(typeof r==="string")return"string";return"unknown"}function _(r){let $=typeof r;switch($){case"number":return Number.isNaN(r)?"nan":"number";case"object":{if(r===null)return"null";if(Array.isArray(r))return"array";let v=r;if(v&&Object.getPrototypeOf(v)!==Object.prototype&&"constructor"in v&&v.constructor)return v.constructor.name}}return $}function Un(...r){let[$,v,i]=r;if(typeof $==="string")return{message:$,code:"custom",input:v,inst:i};return{...$}}function cN(r){return Object.entries(r).filter(([$,v])=>{return Number.isNaN(Number.parseInt($,10))}).map(($)=>$[1])}function vU(r){let $=atob(r),v=new Uint8Array($.length);for(let i=0;i<$.length;i++)v[i]=$.charCodeAt(i);return v}function gU(r){let $="";for(let v=0;v<r.length;v++)$+=String.fromCharCode(r[v]);return btoa($)}function tN(r){let $=r.replace(/-/g,"+").replace(/_/g,"/"),v="=".repeat((4-$.length%4)%4);return vU($+v)}function lN(r){return gU(r).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")}function eN(r){let $=r.replace(/^0x/,"");if($.length%2!==0)throw Error("Invalid hex string length");let v=new Uint8Array($.length/2);for(let i=0;i<$.length;i+=2)v[i/2]=Number.parseInt($.slice(i,i+2),16);return v}function mN(r){return Array.from(r).map(($)=>$.toString(16).padStart(2,"0")).join("")}class iU{constructor(...r){}}var uU=(r,$)=>{r.name="$ZodError",Object.defineProperty(r,"_zod",{value:r._zod,enumerable:!1}),Object.defineProperty(r,"issues",{value:$,enumerable:!1}),r.message=JSON.stringify($,In,2),Object.defineProperty(r,"toString",{value:()=>r.message,enumerable:!1})},fn=N("$ZodError",uU),nr=N("$ZodError",uU,{Parent:Error});function dn(r,$=(v)=>v.message){let v={},i=[];for(let n of r.issues)if(n.path.length>0)v[n.path[0]]=v[n.path[0]]||[],v[n.path[0]].push($(n));else i.push($(n));return{formErrors:i,fieldErrors:v}}function an(r,$=(v)=>v.message){let v={_errors:[]},i=(n,g=[])=>{for(let u of n.issues)if(u.code==="invalid_union"&&u.errors.length)u.errors.map((I)=>i({issues:I},[...g,...u.path]));else if(u.code==="invalid_key")i({issues:u.issues},[...g,...u.path]);else if(u.code==="invalid_element")i({issues:u.issues},[...g,...u.path]);else{let I=[...g,...u.path];if(I.length===0)v._errors.push($(u));else{let U=v,o=0;while(o<I.length){let D=I[o];if(o!==I.length-1)U[D]=U[D]||{_errors:[]};else U[D]=U[D]||{_errors:[]},U[D]._errors.push($(u));U=U[D],o++}}}};return i(r),v}function bg(r,$=(v)=>v.message){let v={errors:[]},i=(n,g=[])=>{var u,I;for(let U of n.issues)if(U.code==="invalid_union"&&U.errors.length)U.errors.map((o)=>i({issues:o},[...g,...U.path]));else if(U.code==="invalid_key")i({issues:U.issues},[...g,...U.path]);else if(U.code==="invalid_element")i({issues:U.issues},[...g,...U.path]);else{let o=[...g,...U.path];if(o.length===0){v.errors.push($(U));continue}let D=v,S=0;while(S<o.length){let O=o[S],j=S===o.length-1;if(typeof O==="string")D.properties??(D.properties={}),(u=D.properties)[O]??(u[O]={errors:[]}),D=D.properties[O];else D.items??(D.items=[]),(I=D.items)[O]??(I[O]={errors:[]}),D=D.items[O];if(j)D.errors.push($(U));S++}}};return i(r),v}function IU(r){let $=[],v=r.map((i)=>typeof i==="object"?i.key:i);for(let i of v)if(typeof i==="number")$.push(`[${i}]`);else if(typeof i==="symbol")$.push(`[${JSON.stringify(String(i))}]`);else if(/[^\w$]/.test(i))$.push(`[${JSON.stringify(i)}]`);else{if($.length)$.push(".");$.push(i)}return $.join("")}function Zg(r){let $=[],v=[...r.issues].sort((i,n)=>(i.path??[]).length-(n.path??[]).length);for(let i of v)if($.push(`\u2716 ${i.message}`),i.path?.length)$.push(` \u2192 at ${IU(i.path)}`);return $.join(`
@@ -76,6 +76,6 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
76
76
  `),example:v?.apiKey?void 0:"otalan_ci_xxxxxxxxx"});return{apiUrl:i,apiKey:u.trim()||v?.apiKey||""}}function qO(r,$){return r.find((v)=>v.appId===$)}function KO(r){return r.name===r.appId?r.appId:`${r.name} (${r.appId})`}async function FO(r){let $=z(r.options,"app-id");if($){let v=qO(r.apps,$);if(!v)throw Error(`App "${$}" was not found in the logged-in project, or it is archived.`);return v.appId}if(r.apps.length===0)throw Error("No active apps found in the logged-in project. Create or restore an app before running `otalan init`.");return Fr({question:"App",fallback:r.apps[0]?.appId,hint:"Select the active app to link with this repo.",options:r.apps.map((v)=>({label:KO(v),value:v.appId}))})}async function K1(r){let{apiKey:$,apiUrl:v}=await YO(r);await D1({apiKey:$,apiUrl:v});let i=await bn({apiUrl:v,apiKey:$}).catch(()=>null);if(i)console.log(""),console.log(`Resolved CI key context: ${i.organizationSlug} / ${i.projectSlug}`);console.log(""),console.log("Saved CLI auth.")}async function F1(r){let $=await pr(r),v=await bn({apiUrl:$.apiUrl,apiKey:$.apiKey});console.log("Otalan API connection OK."),console.log(`API URL: ${$.apiUrl}`),console.log(`Organization: ${v.organizationSlug}`),console.log(`Project: ${v.projectSlug}`)}async function H1(r,$){let v=await pr($),[i,n]=await Promise.all([bn({apiUrl:v.apiUrl,apiKey:v.apiKey}),w1({apiUrl:v.apiUrl,apiKey:v.apiKey})]),g=await FO({apps:n,options:$});await S1(r.cwd,{organizationSlug:i.organizationSlug,projectSlug:i.projectSlug,appId:g}),console.log(""),console.log(`Resolved CI key context: ${i.organizationSlug} / ${i.projectSlug}`),console.log(`Linked app: ${g}`),console.log("Created otalan.config.json.")}import kj from"path";import{stdin as Oj,stdout as jj}from"process";import{createHash as yO}from"crypto";import{mkdtemp as hO,mkdir as f1,readdir as d1,rm as fO}from"fs/promises";import l from"path";import{createRequire as HO}from"module";var AO=HO("/"),MO;try{MO=AO("worker_threads").Worker}catch(r){}var t=Uint8Array,Ir=Uint16Array,To=Int32Array,Vo=new t([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),Bo=new t([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),A1=new t([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),Z1=function(r,$){var v=new Ir(31);for(var i=0;i<31;++i)v[i]=$+=1<<r[i-1];var n=new To(v[30]);for(var i=1;i<30;++i)for(var g=v[i];g<v[i+1];++g)n[g]=g-v[i]<<5|i;return{b:v,r:n}},x1=Z1(Vo,2),TO=x1.b,Fo=x1.r;TO[28]=258,Fo[258]=28;var C1=Z1(Bo,0),DP=C1.b,M1=C1.r,Ho=new Ir(32768);for(K=0;K<32768;++K)zr=(K&43690)>>1|(K&21845)<<1,zr=(zr&52428)>>2|(zr&13107)<<2,zr=(zr&61680)>>4|(zr&3855)<<4,Ho[K]=((zr&65280)>>8|(zr&255)<<8)>>1;var zr,K,q$=function(r,$,v){var i=r.length,n=0,g=new Ir($);for(;n<i;++n)if(r[n])++g[r[n]-1];var u=new Ir($);for(n=1;n<$;++n)u[n]=u[n-1]+g[n-1]<<1;var I;if(v){I=new Ir(1<<$);var U=15-$;for(n=0;n<i;++n)if(r[n]){var o=n<<4|r[n],D=$-r[n],S=u[r[n]-1]++<<D;for(var O=S|(1<<D)-1;S<=O;++S)I[Ho[S]>>U]=o}}else{I=new Ir(i);for(n=0;n<i;++n)if(r[n])I[n]=Ho[u[r[n]-1]++]>>15-r[n]}return I},sr=new t(288);for(K=0;K<144;++K)sr[K]=8;var K;for(K=144;K<256;++K)sr[K]=9;var K;for(K=256;K<280;++K)sr[K]=7;var K;for(K=280;K<288;++K)sr[K]=8;var K,Og=new t(32);for(K=0;K<32;++K)Og[K]=5;var K,VO=q$(sr,9,0);var BO=q$(Og,5,0);var c1=function(r){return(r+7)/8|0},t1=function(r,$,v){if($==null||$<0)$=0;if(v==null||v>r.length)v=r.length;return new t(r.subarray($,v))};var RO=["unexpected EOF","invalid block type","invalid length/literal","invalid distance","stream finished","no stream handler",,"no callback","invalid UTF-8 data","extra field too long","date not in range 1980-2099","filename too long","stream finishing","invalid zip data"],jg=function(r,$,v){var i=Error($||RO[r]);if(i.code=r,Error.captureStackTrace)Error.captureStackTrace(i,jg);if(!v)throw i;return i};var Hr=function(r,$,v){v<<=$&7;var i=$/8|0;r[i]|=v,r[i+1]|=v>>8},Q$=function(r,$,v){v<<=$&7;var i=$/8|0;r[i]|=v,r[i+1]|=v>>8,r[i+2]|=v>>16},Ko=function(r,$){var v=[];for(var i=0;i<r.length;++i)if(r[i])v.push({s:i,f:r[i]});var n=v.length,g=v.slice();if(!n)return{t:e1,l:0};if(n==1){var u=new t(v[0].s+1);return u[v[0].s]=1,{t:u,l:1}}v.sort(function(H,e){return H.f-e.f}),v.push({s:-1,f:25001});var I=v[0],U=v[1],o=0,D=1,S=2;v[0]={s:-1,f:I.f+U.f,l:I,r:U};while(D!=n-1)I=v[v[o].f<v[S].f?o++:S++],U=v[o!=D&&v[o].f<v[S].f?o++:S++],v[D++]={s:-1,f:I.f+U.f,l:I,r:U};var O=g[0].s;for(var i=1;i<n;++i)if(g[i].s>O)O=g[i].s;var j=new Ir(O+1),L=Ao(v[D-1],j,0);if(L>$){var i=0,E=0,q=L-$,p=1<<q;g.sort(function(e,Z){return j[Z.s]-j[e.s]||e.f-Z.f});for(;i<n;++i){var s=g[i].s;if(j[s]>$)E+=p-(1<<L-j[s]),j[s]=$;else break}E>>=q;while(E>0){var b=g[i].s;if(j[b]<$)E-=1<<$-j[b]++-1;else++i}for(;i>=0&&E;--i){var Q=g[i].s;if(j[Q]==$)--j[Q],++E}L=$}return{t:new t(j),l:L}},Ao=function(r,$,v){return r.s==-1?Math.max(Ao(r.l,$,v+1),Ao(r.r,$,v+1)):$[r.s]=v},T1=function(r){var $=r.length;while($&&!r[--$]);var v=new Ir(++$),i=0,n=r[0],g=1,u=function(U){v[i++]=U};for(var I=1;I<=$;++I)if(r[I]==n&&I!=$)++g;else{if(!n&&g>2){for(;g>138;g-=138)u(32754);if(g>2)u(g>10?g-11<<5|28690:g-3<<5|12305),g=0}else if(g>3){u(n),--g;for(;g>6;g-=6)u(8304);if(g>2)u(g-3<<5|8208),g=0}while(g--)u(n);g=1,n=r[I]}return{c:v.subarray(0,i),n:$}},Y$=function(r,$){var v=0;for(var i=0;i<$.length;++i)v+=r[i]*$[i];return v},l1=function(r,$,v){var i=v.length,n=c1($+2);r[n]=i&255,r[n+1]=i>>8,r[n+2]=r[n]^255,r[n+3]=r[n+1]^255;for(var g=0;g<i;++g)r[n+g+4]=v[g];return(n+4+i)*8},V1=function(r,$,v,i,n,g,u,I,U,o,D){Hr($,D++,v),++n[256];var S=Ko(n,15),O=S.t,j=S.l,L=Ko(g,15),E=L.t,q=L.l,p=T1(O),s=p.c,b=p.n,Q=T1(E),H=Q.c,e=Q.n,Z=new Ir(19);for(var A=0;A<s.length;++A)++Z[s[A]&31];for(var A=0;A<H.length;++A)++Z[H[A]&31];var F=Ko(Z,7),vr=F.t,rn=F.l,gr=19;for(;gr>4&&!vr[A1[gr-1]];--gr);var nn=o+5<<3,Dr=Y$(n,sr)+Y$(g,Og)+u,Nr=Y$(n,O)+Y$(g,E)+u+14+3*gr+Y$(Z,vr)+2*Z[16]+3*Z[17]+7*Z[18];if(U>=0&&nn<=Dr&&nn<=Nr)return l1($,D,r.subarray(U,U+o));var Or,x,Sr,Ar;if(Hr($,D,1+(Nr<Dr)),D+=2,Nr<Dr){Or=q$(O,j,0),x=O,Sr=q$(E,q,0),Ar=E;var Pg=q$(vr,rn,0);Hr($,D,b-257),Hr($,D+5,e-1),Hr($,D+10,gr-4),D+=14;for(var A=0;A<gr;++A)Hr($,D+3*A,vr[A1[A]]);D+=3*gr;var jr=[s,H];for(var cn=0;cn<2;++cn){var $n=jr[cn];for(var A=0;A<$n.length;++A){var wr=$n[A]&31;if(Hr($,D,Pg[wr]),D+=vr[wr],wr>15)Hr($,D,$n[A]>>5&127),D+=$n[A]>>12}}}else Or=VO,x=sr,Sr=BO,Ar=Og;for(var A=0;A<I;++A){var m=i[A];if(m>255){var wr=m>>18&31;if(Q$($,D,Or[wr+257]),D+=x[wr+257],wr>7)Hr($,D,m>>23&31),D+=Vo[wr];var vn=m&31;if(Q$($,D,Sr[vn]),D+=Ar[vn],vn>3)Q$($,D,m>>5&8191),D+=Bo[vn]}else Q$($,D,Or[m]),D+=x[m]}return Q$($,D,Or[256]),D+x[256]},bO=new To([65540,131080,131088,131104,262176,1048704,1048832,2114560,2117632]),e1=new t(0),ZO=function(r,$,v,i,n,g){var u=g.z||r.length,I=new t(i+u+5*(1+Math.ceil(u/7000))+n),U=I.subarray(i,I.length-n),o=g.l,D=(g.r||0)&7;if($){if(D)U[0]=g.r>>3;var S=bO[$-1],O=S>>13,j=S&8191,L=(1<<v)-1,E=g.p||new Ir(32768),q=g.h||new Ir(L+1),p=Math.ceil(v/3),s=2*p,b=function(Eg){return(r[Eg]^r[Eg+1]<<p^r[Eg+2]<<s)&L},Q=new To(25000),H=new Ir(288),e=new Ir(32),Z=0,A=0,F=g.i||0,vr=0,rn=g.w||0,gr=0;for(;F+2<u;++F){var nn=b(F),Dr=F&32767,Nr=q[nn];if(E[Dr]=Nr,q[nn]=Dr,rn<=F){var Or=u-F;if((Z>7000||vr>24576)&&(Or>423||!o)){D=V1(r,U,0,Q,H,e,A,vr,gr,F-gr,D),vr=Z=A=0,gr=F;for(var x=0;x<286;++x)H[x]=0;for(var x=0;x<30;++x)e[x]=0}var Sr=2,Ar=0,Pg=j,jr=Dr-Nr&32767;if(Or>2&&nn==b(F-jr)){var cn=Math.min(O,Or)-1,$n=Math.min(32767,F),wr=Math.min(258,Or);while(jr<=$n&&--Pg&&Dr!=Nr){if(r[F+Sr]==r[F+Sr-jr]){var m=0;for(;m<wr&&r[F+m]==r[F+m-jr];++m);if(m>Sr){if(Sr=m,Ar=jr,m>cn)break;var vn=Math.min(jr,m-2),to=0;for(var x=0;x<vn;++x){var Lg=F-jr+x&32767,JN=E[Lg],lo=Lg-JN&32767;if(lo>to)to=lo,Nr=Lg}}}Dr=Nr,Nr=E[Dr],jr+=Dr-Nr&32767}}if(Ar){Q[vr++]=268435456|Fo[Sr]<<18|M1[Ar];var eo=Fo[Sr]&31,mo=M1[Ar]&31;A+=Vo[eo]+Bo[mo],++H[257+eo],++e[mo],rn=F+Sr,++Z}else Q[vr++]=r[F],++H[r[F]]}}for(F=Math.max(F,rn);F<u;++F)Q[vr++]=r[F],++H[r[F]];if(D=V1(r,U,o,Q,H,e,A,vr,gr,F-gr,D),!o)g.r=D&7|U[D/8|0]<<3,D-=7,g.h=q,g.p=E,g.i=F,g.w=rn}else{for(var F=g.w||0;F<u+o;F+=65535){var Wg=F+65535;if(Wg>=u)U[D/8|0]=o,Wg=u;D=l1(U,D+1,r.subarray(F,Wg))}g.i=u}return t1(I,0,i+c1(D)+n)},xO=function(){var r=new Int32Array(256);for(var $=0;$<256;++$){var v=$,i=9;while(--i)v=(v&1&&-306674912)^v>>>1;r[$]=v}return r}(),CO=function(){var r=-1;return{p:function($){var v=r;for(var i=0;i<$.length;++i)v=xO[v&255^$[i]]^v>>>8;r=v},d:function(){return~r}}};var cO=function(r,$,v,i,n){if(!n){if(n={l:1},$.dictionary){var g=$.dictionary.subarray(-32768),u=new t(g.length+r.length);u.set(g),u.set(r,g.length),r=u,n.w=g.length}}return ZO(r,$.level==null?6:$.level,$.mem==null?n.l?Math.ceil(Math.max(8,Math.min(13,Math.log(r.length)))*1.5):20:12+$.mem,v,i,n)},m1=function(r,$){var v={};for(var i in r)v[i]=r[i];for(var i in $)v[i]=$[i];return v};var c=function(r,$,v){for(;v;++$)r[$]=v,v>>>=8};function tO(r,$){return cO(r,$||{},0,0)}var y1=function(r,$,v,i){for(var n in r){var g=r[n],u=$+n,I=i;if(Array.isArray(g))I=m1(i,g[1]),g=g[0];if(g instanceof t)v[u]=[g,I];else v[u+="/"]=[new t(0),I],y1(g,u,v,i)}},B1=typeof TextEncoder<"u"&&new TextEncoder,lO=typeof TextDecoder<"u"&&new TextDecoder,eO=0;try{lO.decode(e1,{stream:!0}),eO=1}catch(r){}function R1(r,$){if($){var v=new t(r.length);for(var i=0;i<r.length;++i)v[i]=r.charCodeAt(i);return v}if(B1)return B1.encode(r);var n=r.length,g=new t(r.length+(r.length>>1)),u=0,I=function(D){g[u++]=D};for(var i=0;i<n;++i){if(u+5>g.length){var U=new t(u+8+(n-i<<1));U.set(g),g=U}var o=r.charCodeAt(i);if(o<128||$)I(o);else if(o<2048)I(192|o>>6),I(128|o&63);else if(o>55295&&o<57344)o=65536+(o&1047552)|r.charCodeAt(++i)&1023,I(240|o>>18),I(128|o>>12&63),I(128|o>>6&63),I(128|o&63);else I(224|o>>12),I(128|o>>6&63),I(128|o&63)}return t1(g,0,u)}var Mo=function(r){var $=0;if(r)for(var v in r){var i=r[v].length;if(i>65535)jg(9);$+=i+4}return $},b1=function(r,$,v,i,n,g,u,I){var U=i.length,o=v.extra,D=I&&I.length,S=Mo(o);if(c(r,$,u!=null?33639248:67324752),$+=4,u!=null)r[$++]=20,r[$++]=v.os;r[$]=20,$+=2,r[$++]=v.flag<<1|(g<0&&8),r[$++]=n&&8,r[$++]=v.compression&255,r[$++]=v.compression>>8;var O=new Date(v.mtime==null?Date.now():v.mtime),j=O.getFullYear()-1980;if(j<0||j>119)jg(10);if(c(r,$,j<<25|O.getMonth()+1<<21|O.getDate()<<16|O.getHours()<<11|O.getMinutes()<<5|O.getSeconds()>>1),$+=4,g!=-1)c(r,$,v.crc),c(r,$+4,g<0?-g-2:g),c(r,$+8,v.size);if(c(r,$+12,U),c(r,$+14,S),$+=16,u!=null)c(r,$,D),c(r,$+6,v.attrs),c(r,$+10,u),$+=14;if(r.set(i,$),$+=U,S)for(var L in o){var E=o[L],q=E.length;c(r,$,+L),c(r,$+2,q),r.set(E,$+4),$+=4+q}if(D)r.set(I,$),$+=D;return $},mO=function(r,$,v,i,n){c(r,$,101010256),c(r,$+8,v),c(r,$+10,v),c(r,$+12,i),c(r,$+16,n)};function h1(r,$){if(!$)$={};var v={},i=[];y1(r,"",v,$);var n=0,g=0;for(var u in v){var I=v[u],U=I[0],o=I[1],D=o.level==0?0:8,S=R1(u),O=S.length,j=o.comment,L=j&&R1(j),E=L&&L.length,q=Mo(o.extra);if(O>65535)jg(11);var p=D?tO(U,o):U,s=p.length,b=CO();b.p(U),i.push(m1(o,{size:U.length,crc:b.d(),c:p,f:S,m:L,u:O!=u.length||L&&j.length!=E,o:n,compression:D})),n+=30+O+q+s,g+=76+2*(O+q)+(E||0)+s}var Q=new t(g+22),H=n,e=g-n;for(var Z=0;Z<i.length;++Z){var S=i[Z];b1(Q,S.o,S,S.f,S.u,S.c.length);var A=30+S.f.length+Mo(S.extra);Q.set(S.c,S.o+A),b1(Q,n,S,S.f,S.u,S.c.length,S.o,S.m),n+=16+A+(S.m?S.m.length:0)}return mO(Q,n,i.length,e,H),Q}async function a1(r){return Bun.file(r).exists()}async function wg(r){if(!await a1(r))return null;return Bun.file(r).text()}async function dO(r){try{return await d1(r),!0}catch{return!1}}async function Zo(r,$=r){let v={},i=(await d1($,{withFileTypes:!0})).sort((n,g)=>{if(n.name<g.name)return-1;if(n.name>g.name)return 1;return 0});for(let n of i){let g=l.join($,n.name);if(n.isDirectory()){let I=await Zo(r,g);Object.assign(v,I);continue}if(!n.isFile())continue;let u=l.relative(r,g).split(l.sep).join(l.posix.sep);v[u]=new Uint8Array(await Bun.file(g).arrayBuffer())}return v}async function p1(r){let $=await Zo(r);if(Object.keys($).length===0)throw Error(`No files found in ${r}`);return h1($,{level:9})}async function s1(r,$,v){await f1(r,{recursive:!0}),await Bun.write(l.join(r,"bundle.zip"),$),await Bun.write(l.join(r,"manifest.json"),`${JSON.stringify(v,null,2)}
77
77
  `)}function rN(r){return yO("sha256").update(r).digest("hex")}function Ro(r){return r.trim().replace(/[^a-zA-Z0-9._-]+/g,"-").replace(/^-+|-+$/g,"")||"bundle"}function aO(r,$){return`${Ro(r)}-${$.slice(0,12)}`}async function nN(r){let $=l.join(r,"package.json");if(!await a1($))return;return JSON.parse(await Bun.file($).text()).version}function pO(r,$){return($?[$]:["dist","www"]).map((i)=>l.resolve(r,i))}async function sO(r){for(let $ of r)if(await dO($))return $;return null}async function rj(r,$,v){let n=await Bun.spawn([r,...$],{cwd:v,stdin:"inherit",stdout:"inherit",stderr:"inherit"}).exited;if(n!==0)throw Error(`${r} ${$.join(" ")} exited with code ${n}`)}async function $N(r){let $=Bun.spawn(["bunx","expo","config","--json"],{cwd:r,stdout:"pipe",stderr:"inherit"}),v=await $.exited;if(v!==0)throw Error(`bunx expo config --json exited with code ${v}`);let i=await new Response($.stdout).text(),n=JSON.parse(i);return n.exp??n.expo??n}function K$(r){if(typeof r!=="string")return;let $=r.trim();return $.length>0?$:void 0}function vN(r,$){return K$($==="ios"?r.ios?.version??r.version:r.android?.version??r.version)}function nj(r,$){let v=$==="ios"?r.ios?.buildNumber:r.android?.versionCode;if(typeof v==="number")return`${v}`;return K$(v)}function $j(r,$,v){let i=vN(r,$);switch(v){case"appVersion":{if(!i)throw Error('Unable to resolve Expo runtimeVersion policy "appVersion". Set version in Expo config or pass --runtime-version.');return i}case"nativeVersion":{let n=nj(r,$);if(!i||!n)throw Error(`Unable to resolve Expo runtimeVersion policy "nativeVersion" for ${$}. Set version and ${$==="ios"?"ios.buildNumber":"android.versionCode"} in Expo config or pass --runtime-version.`);return`${i}(${n})`}case"sdkVersion":{let n=K$(r.sdkVersion);if(!n)throw Error('Unable to resolve Expo runtimeVersion policy "sdkVersion". Set sdkVersion in Expo config or pass --runtime-version.');return`exposdk:${n}`}default:throw Error(`Unable to resolve Expo runtimeVersion policy "${v}". Pass --runtime-version or use a resolved Expo runtimeVersion.`)}}function gN(r,$,v){if(v)return v;let i=vN(r,$);if(!i)throw Error("Unable to resolve Expo native version. Pass --native-version or set a version in Expo config.");return i}function bo(r){if(!r||typeof r!=="object")return;if(Array.isArray(r)){for(let i of r){let n=bo(i);if(n)return n}return}let $=r,v=K$($.runtimeVersion);if(v)return v;for(let i of Object.values($)){let n=bo(i);if(n)return n}return}async function vj(r){let $=l.join(r,"metadata.json"),v=await wg($);if(!v)return;try{return bo(JSON.parse(v))}catch{return}}function gj(r,$,v,i,n){if(v?.trim())return v.trim();if(i?.trim())return i.trim();let g=$==="ios"?r.ios?.runtimeVersion??r.runtimeVersion:r.android?.runtimeVersion??r.runtimeVersion;if(typeof g==="string"&&g.trim())return g.trim();if(g&&typeof g==="object"){let u=K$(g.policy);if(u==="fingerprint")throw Error('Unable to resolve Expo runtimeVersion policy "fingerprint" from export metadata. Pass --runtime-version if your Expo export omits metadata.json.');if(u)return $j(r,$,u)}if(n?.trim())return n.trim();throw Error("Expo runtimeVersion is required. Pass --runtime-version or set runtimeVersion in Expo config.")}function ij(r,$){return r.match(new RegExp(`<key>\\s*${$}\\s*<\\/key>\\s*<string>\\s*([^<]+?)\\s*<\\/string>`,"s"))?.[1]?.trim()}function iN(r){let $=r.trim().match(/^\$\(([^):]+)(?::[^)]+)?\)$|^\$\{([^}:]+)(?::[^}]+)?\}$/);return $?.[1]??$?.[2]}function uj(r,$){let v=$.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),n=[...r.matchAll(new RegExp(`\\b${v}\\s*=\\s*([^;\\n]+)\\s*;`,"g")),...r.matchAll(new RegExp(`^\\s*${v}\\s*=\\s*(.+?)\\s*$`,"gm"))].at(-1)?.[1]?.trim();if(!n)return;return n.replace(/;\s*$/,"").replace(/^["']|["']$/g,"").trim()}async function uN(r,$,v=new Set){if(v.has($))return;let i=new Set(v);i.add($);let n=[l.join(r,"ios","App","App.xcodeproj","project.pbxproj"),l.join(r,"ios","App.xcodeproj","project.pbxproj")];for(let g of n){let u=await wg(g);if(!u)continue;let I=uj(u,$);if(!I)continue;let U=iN(I);if(!U)return I;let o=await uN(r,U,i);if(o)return o}return}async function Ij(r,$){let v=iN($);if(!v)return $;let i=await uN(r,v);if(i)return i;throw Error(`Unable to resolve iOS native version placeholder "${$}". Pass --native-version or ensure ${v} is defined in the Xcode project.`)}async function IN(r,$){if($)return $;let v=[l.join(r,"ios","App","App","Info.plist"),l.join(r,"ios","App","Info.plist")];for(let i of v){let n=await wg(i);if(!n)continue;let g=ij(n,"CFBundleShortVersionString");if(g)return Ij(r,g)}throw Error("Unable to resolve iOS native version. Pass --native-version or ensure Info.plist defines CFBundleShortVersionString.")}async function oN(r,$){if($)return $;let v=[l.join(r,"android","app","build.gradle"),l.join(r,"android","app","build.gradle.kts")];for(let i of v){let n=await wg(i);if(!n)continue;let g=n.match(/versionName\s*(?:=)?\s*["']([^"']+)["']/);if(g?.[1])return g[1].trim()}throw Error("Unable to resolve Android native version. Pass --native-version or ensure build.gradle defines versionName as a string literal.")}async function oj(r,$,v){if($==="ios")return IN(r,v);return oN(r,v)}async function _g(r,$,v){if(v)return v;let n=await($==="ios"?IN:oN)(r).catch(()=>null);if(n)return n;let g=await $N(r).catch(()=>null);if(g)return gN(g,$);throw Error(`Unable to resolve ${$} native version. Pass --native-version to override.`)}function UN(r){if(r.bundleId)return{bundleId:Ro(r.bundleId),bundleIdSource:r.explicitBundleIdSource??"flag"};if(r.bundleFromPackage){if(!r.packageVersion)throw Error("`--bundle-from-package` requires a package.json version.");return{bundleId:Ro(r.packageVersion),bundleIdSource:"package-json"}}return{bundleId:aO(r.nativeVersion,r.hash),bundleIdSource:"native-version"}}async function Uj(r){let $=await Zo(r),v=Object.keys($).filter((n)=>!n.endsWith(".map")).filter((n)=>!n.endsWith("metadata.json")).filter((n)=>!n.endsWith("assetmap.json")).sort(),i=v.find((n)=>n.endsWith(".js")||n.endsWith(".hbc"));if(!i)throw Error("Unable to find Expo launch asset in export output.");return{launchAsset:i,assets:v.filter((n)=>n!==i)}}async function Dj(r){let $=l.join(r,".otalan");return await f1($,{recursive:!0}),hO(l.join($,"expo-export-"))}async function DN(r){if(r.target==="capacitor")return Nj(r);return Sj(r)}async function Nj(r){let $=await sO(pO(r.cwd,r.inputDir));if(!$)throw Error("Unable to find a Capacitor web directory. Build your app first, then run `otalan bundle`. Checked dist/ and www/.");let v=await p1($),i=rN(v),n=await oj(r.cwd,r.platform,r.nativeVersion),g=await nN(r.cwd),{bundleId:u,bundleIdSource:I}=UN({bundleId:r.bundleId,bundleFromPackage:r.bundleFromPackage,explicitBundleIdSource:r.explicitBundleIdSource,packageVersion:g,nativeVersion:n,hash:i}),U={target:"capacitor",hash:i,nativeVersion:n,bundleId:u,createdAt:new Date().toISOString(),platform:r.platform};return await s1(r.outputDir,v,U),{outputDir:r.outputDir,manifest:U,bundleIdSource:I}}async function Sj(r){let $=await Dj(r.cwd);try{await rj("bunx",["expo","export","--platform",r.platform,"--output-dir",$],r.cwd);let v=await vj($),i=await $N(r.cwd),n=gN(i,r.platform,r.nativeVersion),g=gj(i,r.platform,r.runtimeVersion,v,n),u=await p1($),I=rN(u),U=await Uj($),o=await nN(r.cwd),{bundleId:D,bundleIdSource:S}=UN({bundleId:r.bundleId,bundleFromPackage:r.bundleFromPackage,explicitBundleIdSource:r.explicitBundleIdSource,packageVersion:o,nativeVersion:n,hash:I}),O={target:"expo",hash:I,nativeVersion:n,runtimeVersion:g,bundleId:D,launchAsset:U.launchAsset,assets:U.assets,expoConfig:i,createdAt:new Date().toISOString(),platform:r.platform};return await s1(r.outputDir,u,O),{outputDir:r.outputDir,manifest:O,bundleIdSource:S}}finally{await fO($,{recursive:!0,force:!0})}}var wj=[{label:"capacitor",value:"capacitor"},{label:"expo",value:"expo"}],_j=[{label:"ios",value:"ios"},{label:"android",value:"android"}];function Jj(){return Boolean(Oj.isTTY&&jj.isTTY)}function Pj(r,$){if(!r||r.platform!==$)return;return r.nativeVersion}function Lj(r,$){if(!r||r.platform!==$)return;return r.bundleId}async function Wj(r){let $=z(r.options,"native-version");if($)return $;if(!r.isInteractive)return;let v=r.prompt??Ur,n=await(r.detectNativeVersion??_g)(r.context.cwd,r.platform).catch(()=>{return}),g=Pj(r.manifest,r.platform),u=[n?`Active native version: ${n}`:"Active native version could not be detected automatically.",g&&g!==n?`Current bundle native version: ${g}`:void 0,"Press Enter to use the active native version, or type another exact native app version."].filter(Boolean);return(await v({question:"Native version",fallback:n,hint:u.join(`
78
78
  `)})).trim()||void 0}async function Ej(r){let $=z(r.options,"bundle-id")??z(r.options,"version");if($)return{bundleId:$,bundleIdSource:"flag"};if(gn(r.options,"bundle-from-package",!1)||!r.isInteractive)return{bundleId:void 0,bundleIdSource:void 0};let v=r.prompt??Ur,i=Lj(r.manifest,r.platform),n=[i?`Local bundle ID: ${i}`:"No local bundle ID found for this platform.",Xj(r.publishedBundle),"Type the bundle ID to release, or press Enter to generate one from nativeVersion and the bundle hash."].filter(Boolean),g=r.publishedBundle?.bundleId,I=(await v({question:"Bundle ID",hint:n.join(`
79
- `),example:i||g?void 0:`${r.nativeVersion??"1.0.0"}-web.1`})).trim();return{bundleId:I||void 0,bundleIdSource:I?"prompt":void 0}}function Xj(r){if(!r)return;if(!r.checked)return`Published bundle ID (${r.channel}): unavailable.`;if(!r.bundleId)return`Published bundle ID (${r.channel}): none found.`;return`Published bundle ID (${r.channel}): ${r.bundleId}`}function zj(r){let $=r.find((v)=>v.isActive);if($)return $.bundleId;return[...r].sort((v,i)=>Date.parse(i.createdAt)-Date.parse(v.createdAt)).at(0)?.bundleId}async function Gj(r){if(!r.nativeVersion)return;let $=z(r.options,"channel")??"production";try{if(r.loadPublishedBundleId)return{channel:$,bundleId:await r.loadPublishedBundleId({channel:$,platform:r.platform,nativeVersion:r.nativeVersion}),checked:!0};let v=await pr(r.options),i=await Sg(r.context);await Ng({apiUrl:v.apiUrl,apiKey:v.apiKey,organizationSlug:i.organizationSlug,projectSlug:i.projectSlug});let n=await Zn({apiUrl:v.apiUrl,apiKey:v.apiKey,appId:i.appId,platform:r.platform,channel:$,nativeVersion:r.nativeVersion});return{channel:$,bundleId:zj(n),checked:!0}}catch{return{channel:$,checked:!1}}}async function NN(r,$){let v=z($,"target")?void 0:await Fr({question:"Target",fallback:"capacitor",hint:"OTA client type: capacitor or expo. Use expo for Expo or React Native projects.",options:wj}),i=L1($,v),n=z($,"platform")?void 0:await Fr({question:"Platform",hint:"Target mobile platform: ios or android.",options:_j}),g=xn($,n),u=Jj(),I=kj.resolve(r.cwd,z($,"output-dir")??".otalan/bundle"),U=await kg(I),o=await Wj({context:r,options:$,platform:g,manifest:U,isInteractive:u}),S=u&&!z($,"bundle-id")&&!z($,"version")&&!gn($,"bundle-from-package",!1)?await Gj({context:r,options:$,platform:g,nativeVersion:o}):void 0,O=await Ej({options:$,platform:g,nativeVersion:o,manifest:U,publishedBundle:S,isInteractive:u});if(i==="capacitor")console.log(""),console.log("Build web assets before running `otalan bundle`."),console.log("");let j=await DN({cwd:r.cwd,outputDir:I,inputDir:z($,"input-dir"),bundleId:O.bundleId,bundleFromPackage:gn($,"bundle-from-package",!1),explicitBundleIdSource:O.bundleIdSource,nativeVersion:o,runtimeVersion:z($,"runtime-version"),platform:g,target:i});console.log(po(j.bundleIdSource)),console.log(""),ao(j)}import{randomBytes as Qj}from"crypto";var xo=24,Yj=[{label:"CI key (private)",value:"ci"},{label:"OTA key (public)",value:"ota"}];function qj(r){return r==="ci"?"otalan_ci":"otalan_ota"}function Kj(r){if(r==="ci"||r==="ota")return r;throw Error("Key kind is required. Use --kind ci or --kind ota.")}function Fj(r,$=Qj(xo)){if($.length!==xo)throw Error(`Otalan keys must use exactly ${xo} random bytes.`);let v=qj(r),i=$.toString("base64url");return{kind:r,prefix:v,suffix:i,fullKey:`${v}_${i}`}}function Hj(r){return r==="ci"?"CI":"OTA"}function Aj(r){return[`Generated ${Hj(r.kind)} key.`,"","Full key:",r.fullKey,"","Key without prefix:",r.suffix].join(`
79
+ `),example:i||g?void 0:`${r.nativeVersion??"1.0.0"}-web.1`})).trim();return{bundleId:I||void 0,bundleIdSource:I?"prompt":void 0}}function Xj(r){if(!r)return;if(!r.checked)return`Published bundle ID (${r.channel}): unavailable.`;if(!r.bundleId)return`Published bundle ID (${r.channel}): none found.`;return`Published bundle ID (${r.channel}): ${r.bundleId}`}function zj(r){let $=r.find((v)=>v.isActive);if($)return $.bundleId;return[...r].sort((v,i)=>Date.parse(i.createdAt)-Date.parse(v.createdAt)).at(0)?.bundleId}async function Gj(r){if(!r.nativeVersion)return;let $=z(r.options,"channel")??"production";try{if(r.loadPublishedBundleId)return{channel:$,bundleId:await r.loadPublishedBundleId({channel:$,platform:r.platform,nativeVersion:r.nativeVersion}),checked:!0};let v=await pr(r.options),i=await Sg(r.context);await Ng({apiUrl:v.apiUrl,apiKey:v.apiKey,organizationSlug:i.organizationSlug,projectSlug:i.projectSlug});let n=await Zn({apiUrl:v.apiUrl,apiKey:v.apiKey,appId:i.appId,platform:r.platform,channel:$,nativeVersion:r.nativeVersion});return{channel:$,bundleId:zj(n),checked:!0}}catch{return{channel:$,checked:!1}}}async function NN(r,$){let v=z($,"target")?void 0:await Fr({question:"Target",fallback:"capacitor",hint:"OTA client type: capacitor or expo. Use expo for Expo projects.",options:wj}),i=L1($,v),n=z($,"platform")?void 0:await Fr({question:"Platform",hint:"Target mobile platform: ios or android.",options:_j}),g=xn($,n),u=Jj(),I=kj.resolve(r.cwd,z($,"output-dir")??".otalan/bundle"),U=await kg(I),o=await Wj({context:r,options:$,platform:g,manifest:U,isInteractive:u}),S=u&&!z($,"bundle-id")&&!z($,"version")&&!gn($,"bundle-from-package",!1)?await Gj({context:r,options:$,platform:g,nativeVersion:o}):void 0,O=await Ej({options:$,platform:g,nativeVersion:o,manifest:U,publishedBundle:S,isInteractive:u});if(i==="capacitor")console.log(""),console.log("Build web assets before running `otalan bundle`."),console.log("");let j=await DN({cwd:r.cwd,outputDir:I,inputDir:z($,"input-dir"),bundleId:O.bundleId,bundleFromPackage:gn($,"bundle-from-package",!1),explicitBundleIdSource:O.bundleIdSource,nativeVersion:o,runtimeVersion:z($,"runtime-version"),platform:g,target:i});console.log(po(j.bundleIdSource)),console.log(""),ao(j)}import{randomBytes as Qj}from"crypto";var xo=24,Yj=[{label:"CI key (private)",value:"ci"},{label:"OTA key (public)",value:"ota"}];function qj(r){return r==="ci"?"otalan_ci":"otalan_ota"}function Kj(r){if(r==="ci"||r==="ota")return r;throw Error("Key kind is required. Use --kind ci or --kind ota.")}function Fj(r,$=Qj(xo)){if($.length!==xo)throw Error(`Otalan keys must use exactly ${xo} random bytes.`);let v=qj(r),i=$.toString("base64url");return{kind:r,prefix:v,suffix:i,fullKey:`${v}_${i}`}}function Hj(r){return r==="ci"?"CI":"OTA"}function Aj(r){return[`Generated ${Hj(r.kind)} key.`,"","Full key:",r.fullKey,"","Key without prefix:",r.suffix].join(`
80
80
  `)}async function SN(r){let v=z(r,"kind")??await Fr({question:"Key kind",fallback:"ci",hint:"Generate a local Otalan key. Use CI for private automation secrets or OTA for app update checks.",options:Yj}),i=Fj(Kj(v));console.log(Aj(i))}import Mj from"path";var Tj=[{label:"ios",value:"ios"},{label:"android",value:"android"}],Vj=2000,Bj=600000;async function Jg(r,$){let v=await pr($),i=await Sg(r),n=await Ng({apiUrl:v.apiUrl,apiKey:v.apiKey,organizationSlug:i.organizationSlug,projectSlug:i.projectSlug});for(let g of so(n).split(`
81
81
  `))console.log(g);return console.log(""),{api:v,project:i}}function kN(r,$){return Mj.resolve(r.cwd,z($,"output-dir")??".otalan/bundle")}async function Co(r,$,v){let i=await kg(kN(r,$));return z($,"native-version")??X1(i,v)??await _g(r.cwd,v).catch(async()=>Ur({question:"Native version",hint:"Exact native app version."}))}function Rj(r){let $=Number(z(r,"rollout-percent")??"100");if(Number.isNaN($)||!Number.isInteger($)||$<0||$>100)throw Error("rollout-percent must be an integer between 0 and 100.");return $}async function co(){return Fr({question:"Platform",hint:"Target mobile platform: ios or android.",options:Tj})}async function bj(r,$){let v=kN(r,$),i=await Qo(v),n=W1(i,z($,"platform")),g=E1(i,z($,"native-version")),u=z($,"channel")??await Ur({question:"Channel",fallback:"production",hint:"Release channel."});return{outputDir:v,manifest:i,platform:n,nativeVersion:g,channel:u}}function Zj(r){if(r.target!=="expo")return;return r.expoConfig}function xj(r){return r==="ready"||r==="failed"}async function Cj(r){let $=z(r.options,"bundle-id")??z(r.options,"target-bundle-id");if($)return $;let v=r.releases.find((i)=>i.resolvedDownloadUrl)?.bundleId??"1.0.0-web.1";if(console.log(""),console.log("Available bundles"),console.log(""),Gg(r.releases),r.promptTargetBundleId)return r.promptTargetBundleId(v);return Ur({question:"Target bundle ID",hint:"Published bundle ID to reactivate.",example:v})}async function cj(r){let $=r.pollIntervalMs??Vj,v=r.timeoutMs??Bj,i=r.sleep??Bun.sleep,n=r.now??Date.now,g=n(),u=r.ingest;while(!xj(u.status)){if(n()-g>=v)throw Error(`Timed out waiting for release validation. Ingest ${u.id} is still ${u.status}.`);await i($);let I=await r.loadIngest(u.id);if(I.status!==u.status)r.onStatusChange?.(I);u=I}return u}async function ON(r,$){let{api:v,project:i}=await Jg(r,$),{outputDir:n,manifest:g,platform:u,nativeVersion:I,channel:U}=await bj(r,$),o=!gn($,"optional",!1),D=Rj($),S=z($,"release-notes"),O=await z1(n),j=await j1({apiUrl:v.apiUrl,apiKey:v.apiKey,appId:i.appId,platform:u,channel:U,nativeVersion:I,bundleId:g.bundleId,mandatory:o,rolloutPercent:D,releaseNotes:S,file:O,expoConfig:Zj(g)});console.log(""),console.log(rU({bundleId:g.bundleId,platform:u,channel:U,nativeVersion:I,rolloutPercent:D,mandatory:o,releaseNotes:S})),console.log(""),console.log(zg({ingest:j})),console.log(""),console.log("Waiting for validation...");let L=await cj({ingest:j,loadIngest:(E)=>_1({apiUrl:v.apiUrl,apiKey:v.apiKey,ingestId:E}),onStatusChange:(E)=>{console.log(`Ingest status: ${E.status}`)}});if(L.status==="failed"){if(L.failureReason)throw Error(`Release validation failed for ingest ${L.id}: ${L.failureReason}`);throw Error(`Release validation failed for ingest ${L.id}.`)}console.log(""),console.log("Release published."),console.log(""),console.log(zg({ingest:L}))}async function jN(r,$){let{api:v,project:i}=await Jg(r,$),n=z($,"platform")?void 0:await co(),g=xn($,n),u=z($,"native-version")??await Co(r,$,g),I=z($,"channel")??await Ur({question:"Channel",fallback:"production",hint:"Release channel for this rollback."}),U=await Zn({apiUrl:v.apiUrl,apiKey:v.apiKey,appId:i.appId,platform:g,channel:I,nativeVersion:u}),o=await Cj({options:$,releases:U}),D=U.find((O)=>O.bundleId===o);if(!D)throw Error(`Bundle "${o}" was not found for the selected platform, channel, and nativeVersion.`);if(!D.resolvedDownloadUrl)throw Error(`Bundle "${o}" archive is unavailable and cannot be rolled back.`);let S=await J1({apiUrl:v.apiUrl,apiKey:v.apiKey,appId:i.appId,platform:g,channel:I,nativeVersion:u,targetBundleId:o});console.log(""),console.log("Rollback applied."),console.log(""),console.log(Xg({bundleId:S.bundleId,platform:S.platform,channel:S.channel,nativeVersion:S.nativeVersion,rolloutPercent:S.rolloutPercent,rolloutState:S.rolloutState,releaseNotes:S.releaseNotes,createdAt:S.createdAt,selectable:Boolean(S.resolvedDownloadUrl)}))}async function wN(r,$){let{api:v,project:i}=await Jg(r,$),n=z($,"platform")?void 0:await co(),g=xn($,n),u=z($,"native-version")??await Co(r,$,g),I=z($,"channel")??await Ur({question:"Channel",fallback:"production",hint:"Release channel."}),o=(await Zn({apiUrl:v.apiUrl,apiKey:v.apiKey,appId:i.appId,platform:g,channel:I,nativeVersion:u})).find((D)=>D.isActive)??null;if(!o){console.log("No active bundle found for the selected platform, channel, and nativeVersion.");return}console.log("Active bundle"),console.log(""),console.log(Xg({bundleId:o.bundleId,platform:o.platform,channel:o.channel,nativeVersion:o.nativeVersion,rolloutPercent:o.rolloutPercent,rolloutState:o.rolloutState,releaseNotes:o.releaseNotes,createdAt:o.createdAt,selectable:Boolean(o.resolvedDownloadUrl)}))}async function _N(r,$){let{api:v,project:i}=await Jg(r,$),n=z($,"platform")?void 0:await co(),g=xn($,n),u=z($,"channel")??await Ur({question:"Channel",fallback:"production",hint:"Release channel."}),I=z($,"native-version")??await Co(r,$,g),U=await Zn({apiUrl:v.apiUrl,apiKey:v.apiKey,appId:i.appId,platform:g,channel:u,nativeVersion:I});Gg(U)}async function Cn(){let r=new URL("../package.json",import.meta.url),$=await Bun.file(r).json();if(typeof $.version!=="string")throw Error("Unable to read CLI version from package.json.");return $.version}async function tj(){let r=yo(process.argv.slice(2)),$={cwd:process.cwd()};if(r.options.help===!0){un(await Cn());return}switch(r.command){case"login":await K1(r.options);return;case"init":await H1($,r.options);return;case"doctor":await F1(r.options);return;case"keygen":await SN(r.options);return;case"bundle":await NN($,r.options);return;case"publish":await ON($,r.options);return;case"rollback":await jN($,r.options);return;case"help":un(await Cn());return;case"version":case"--version":case"-v":console.log(await Cn());return;case"status":await wN($,r.options);return;case"bundles":if(!r.subcommand||r.subcommand==="ls"){await _N($,r.options);return}un(await Cn());return;case"--help":case"-h":un(await Cn());return;case void 0:un(await Cn());return;default:throw Error(`Unknown command: ${r.command}`)}}(async()=>{try{await tj()}catch(r){console.error(r instanceof Error?r.message:r),process.exitCode=1}})();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@otalan/cli",
3
- "version": "1.1.0",
3
+ "version": "1.1.1",
4
4
  "description": "Otalan CLI for bundling and publishing OTA updates through otalan.com.",
5
5
  "license": "Apache-2.0",
6
6
  "author": {
@@ -13,7 +13,6 @@
13
13
  "cli",
14
14
  "capacitor",
15
15
  "expo",
16
- "react-native",
17
16
  "codepush"
18
17
  ],
19
18
  "homepage": "https://otalan.com",