@coreframe/scripts 0.2.37 → 0.2.38

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/dist/coreframe.js CHANGED
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env node
2
- import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,flag as i,multioption as a,number as o,oneOf as s,option as c,optional as l,positional as u,rest as d,restPositionals as f,string as p,subcommands as m}from"@alloc/cmd-ts";import{ProjectPostgresAlreadyRunningError as h,checkDeployMigrations as g,checkSchemaPush as _,collectDeployMigrationFiles as v,createLocalPostgresDb as ee,createProjectPostgresDatabaseAdapter as y,createProjectSqliteDatabaseAdapter as b,createProjectSqliteDrizzleDatabase as x,ensureLocalDb as S,filterPendingMigrations as C,formatDbErrorMessage as w,formatMigrationList as te,formatMigrationScanFailures as ne,migrateHeldMigrations as re,migrateLocalDb as ie,readAppliedMigrationNames as ae,reportLocalDatabaseInventory as oe,resetLocalDb as se,runDrizzleKitCommand as T,scanDeployMigrationFiles as ce,seedLocalDb as le,setupLocalDb as ue,startProjectPostgres as E,startProjectTurso as de,stopProjectPostgres as fe}from"@coreframe/db";import{checkFlutterClient as D,classifyFlutterDevOutputLine as pe,ensureFlutterDevAssetDirectories as me,flutterPlatforms as O,generateFlutterNativeBridge as k,prepareFlutterClient as he,prepareFlutterDevOutput as ge,productionApiOrigin as A,runFlutterAcceptance as _e}from"@coreframe/flutter-tools";import j,{dirname as M,isAbsolute as ve,join as N,posix as ye,resolve as P,sep as be}from"node:path";import F from"nano-spawn";import{spawnSync as I}from"node:child_process";import{chmodSync as xe,existsSync as L,lstatSync as Se,mkdirSync as Ce,mkdtempSync as we,readFileSync as R,readlinkSync as Te,rmSync as Ee,symlinkSync as De,watch as Oe,writeFileSync as z}from"node:fs";import{homedir as ke,networkInterfaces as Ae,tmpdir as je}from"node:os";import*as B from"@clack/prompts";import{addAsset as Me,backupAssets as Ne,buildAssets as Pe,checkAssets as Fe,printAssetResult as Ie,publishAssets as Le}from"@coreframe/assets";import{assertAssetCredentialProfile as Re,configureAssetCredentials as ze,createB2PrivateObjectStore as Be}from"@coreframe/object-storage";import{access as Ve,chmod as He,copyFile as Ue,cp as We,mkdir as V,mkdtemp as Ge,readFile as H,readdir as Ke,rename as qe,rm as U,stat as Je,writeFile as W}from"node:fs/promises";import{importProjectDependency as Ye,importProjectModule as Xe,normalizeWorkerEnvironment as Ze,readProjectConfig as G,wranglerEnvironmentNames as Qe}from"@coreframe/config";import{createHash as $e,randomUUID as K}from"node:crypto";import q from"node:process";import{finished as et}from"node:stream/promises";import{createPrefixStream as tt,supervise as nt}from"procband";import{createConnection as rt,createServer as it}from"node:net";import{inspectDevelopmentJobStates as at}from"@coreframe/jobs";import{parse as ot,stringify as st}from"yaml";import{accessTokenSigningSecretName as ct,clearAppliedPendingWorkerSecrets as lt,deployEnvironments as ut,discardPendingWorkerSecret as dt,discoverStagingUrl as ft,inspectWorkerEnvironment as pt,materializeBuiltClientDeployConfig as mt,materializePrimaryWorkerConfig as ht,materializePrimaryWorkerTypeConfig as gt,parseDeclaredWorkerSecretEnv as _t,prepareAccessTokenSigningSecret as vt,queueWorkerSecret as yt,queueWorkerSecrets as bt,readDeclaredWorkerSecrets as xt,readPackageJson as St,readPendingWorkerSecretSnapshot as Ct,reassignStagingHostname as wt,releaseName as Tt,resolveDeployConfig as Et,resolveReleaseVersion as Dt,rotateAccessTokenSigningSecret as Ot,runAfterWorkerDeploy as kt,runPostDeployChecks as At,validateWorkerEnvironmentForDeploy as jt,verifyAccessTokenSigningSecret as Mt,writePackageVersion as Nt}from"@coreframe/deploy";import{inspect as Pt,parseEnv as Ft}from"node:util";import{once as It}from"node:events";import{connectDevSupervisor as Lt,createDevStartupTiming as Rt,devHttpsCertEnv as zt,devHttpsKeyEnv as Bt,isManagedDevCheckout as Vt,isPrimaryCheckout as Ht,prepareDevHttps as Ut}from"@coreframe/dev";import{devJobsEnv as Wt}from"@coreframe/dev-contracts/dev-jobs";import{managedDevEnv as Gt,managedDevFlutterRestartFileEnv as Kt}from"@coreframe/dev-contracts/managed-dev";import{openScopedLogs as qt}from"leylines";import{setTimeout as Jt}from"node:timers/promises";import{determineAgent as Yt}from"@vercel/detect-agent";import{runPreview as Xt}from"@coreframe/preview";const Zt=`FLUTTER_XCODE_COREFRAME_BUNDLE_IDENTIFIER_SUFFIX`,Qt=`COREFRAME_FLUTTER_DEVELOPMENT`,$t=[`filtered`,`full`];function en(e,{noCodesign:t=!1}={}){return{...e,[Zt]:`.dev`,[Qt]:`1`,...t?{FLUTTER_XCODE_CODE_SIGNING_ALLOWED:`NO`,FLUTTER_XCODE_CODE_SIGNING_REQUIRED:`NO`,FLUTTER_XCODE_CODE_SIGN_IDENTITY:``}:void 0}}function tn(e=!1){return e?`debug`:`profile`}function nn({device:e,mode:t,platform:n}){if(t===`profile`&&!e.physical)throw Error(`Flutter profile mode is unavailable on ${n===`ios`?`iOS simulator`:`Android emulator`}s. Re-run with --flutter-debug or select a physical device.`)}function rn({device:e,flutterDriver:t,mode:n,serverUrl:r,verbose:i}){return[`run`,`--machine`,`--${n}`,`-d`,e.id,`--dart-define=COREFRAME_DEV_SERVER_URL=${r}`,...t?[`--dart-define=ENABLE_FLUTTER_DRIVER=true`]:[],...i?[`--verbose`]:[]]}const an=[`web`,...O];function on(e=`web`,{apiOrigin:t,cwd:n=process.cwd(),profile:r=!1,simulator:i=!1}={}){if(pn(e,{profile:r,simulator:i}),e===`web`)return[hn(`pnpm`,[`build`],n,{COREFRAME_PLATFORM:`web`})];let a=A(t);return[{kind:`prepare`,platform:e},hn(`flutter`,sn(e,a,{profile:r,simulator:i}),P(n,`src-flutter`),{COREFRAME_API_ORIGIN:a})]}function sn(e,t,{noCodesign:n=e===`macos`,profile:r=!1,simulator:i=!1}={}){pn(e,{profile:r,simulator:i});let a=A(t);return[`build`,e===`android`?`apk`:e,r?`--profile`:`--release`,...i?[`--simulator`]:[],...n?[`--no-codesign`]:[],`--dart-define=COREFRAME_API_ORIGIN=${a}`]}function cn(e,{profile:t=!1}={}){let n=t?`profile`:`release`,r=P(e,`src-flutter/build/app/outputs/flutter-apk/app-${n}.apk`),i=JSON.stringify(r);return[`Android ${n} build succeeded.`,``,`Install it on a connected Android device:`,` 1. Enable Developer options and USB debugging, connect the device, and accept the authorization prompt.`,` 2. Verify the device is visible:`,` adb devices`,` 3. Install or update the APK:`,` adb install -r ${i}`,``,`If multiple devices are connected, use:`,` adb -s <device-id> install -r ${i}`].join(`
2
+ import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,flag as i,multioption as a,number as o,oneOf as s,option as c,optional as l,positional as u,rest as d,restPositionals as f,string as p,subcommands as m}from"@alloc/cmd-ts";import{ProjectPostgresAlreadyRunningError as h,checkDeployMigrations as g,checkSchemaPush as _,collectDeployMigrationFiles as v,createLocalPostgresDb as ee,createProjectPostgresDatabaseAdapter as y,createProjectSqliteDatabaseAdapter as b,createProjectSqliteDrizzleDatabase as x,ensureLocalDb as S,filterPendingMigrations as C,formatDbErrorMessage as w,formatMigrationList as te,formatMigrationScanFailures as ne,migrateHeldMigrations as re,migrateLocalDb as ie,readAppliedMigrationNames as ae,reportLocalDatabaseInventory as oe,resetLocalDb as se,runDrizzleKitCommand as T,scanDeployMigrationFiles as ce,seedLocalDb as le,setupLocalDb as ue,startProjectPostgres as E,startProjectTurso as de,stopProjectPostgres as fe}from"@coreframe/db";import{checkFlutterClient as D,classifyFlutterDevOutputLine as pe,ensureFlutterDevAssetDirectories as me,flutterPlatforms as O,generateFlutterNativeBridge as k,prepareFlutterClient as he,prepareFlutterDevOutput as ge,productionApiOrigin as A,runFlutterAcceptance as _e}from"@coreframe/flutter-tools";import j,{dirname as M,isAbsolute as ve,join as N,posix as ye,resolve as P,sep as be}from"node:path";import F from"nano-spawn";import{spawnSync as I}from"node:child_process";import{chmodSync as xe,existsSync as L,lstatSync as Se,mkdirSync as Ce,mkdtempSync as we,readFileSync as R,readlinkSync as Te,rmSync as Ee,symlinkSync as De,watch as Oe,writeFileSync as z}from"node:fs";import{homedir as ke,networkInterfaces as Ae,tmpdir as je}from"node:os";import*as B from"@clack/prompts";import{addAsset as Me,backupAssets as Ne,buildAssets as Pe,checkAssets as Fe,printAssetResult as Ie,publishAssets as Le}from"@coreframe/assets";import{assertAssetCredentialProfile as Re,configureAssetCredentials as ze,createB2PrivateObjectStore as Be}from"@coreframe/object-storage";import{access as Ve,chmod as He,copyFile as Ue,cp as We,mkdir as V,mkdtemp as Ge,readFile as H,readdir as Ke,rename as qe,rm as U,stat as Je,writeFile as W}from"node:fs/promises";import{importProjectDependency as Ye,importProjectModule as Xe,normalizeWorkerEnvironment as Ze,readProjectConfig as G,wranglerEnvironmentNames as Qe}from"@coreframe/config";import{createHash as $e,randomUUID as K}from"node:crypto";import q from"node:process";import{finished as et}from"node:stream/promises";import{createPrefixStream as tt,supervise as nt}from"procband";import{createConnection as rt,createServer as it}from"node:net";import{inspectDevelopmentJobStates as at}from"@coreframe/jobs";import{parse as ot,stringify as st}from"yaml";import{accessTokenSigningSecretName as ct,clearAppliedPendingWorkerSecrets as lt,deployEnvironments as ut,discardPendingWorkerSecret as dt,discoverStagingUrl as ft,inspectWorkerEnvironment as pt,materializeBuiltClientDeployConfig as mt,materializeBuiltWorkerDeployConfig as ht,materializePrimaryWorkerTypeConfig as gt,parseDeclaredWorkerSecretEnv as _t,prepareAccessTokenSigningSecret as vt,queueWorkerSecret as yt,queueWorkerSecrets as bt,readDeclaredWorkerSecrets as xt,readPackageJson as St,readPendingWorkerSecretSnapshot as Ct,reassignStagingHostname as wt,releaseName as Tt,resolveDeployConfig as Et,resolveReleaseVersion as Dt,rotateAccessTokenSigningSecret as Ot,runAfterWorkerDeploy as kt,runPostDeployChecks as At,validateWorkerEnvironmentForDeploy as jt,verifyAccessTokenSigningSecret as Mt,writePackageVersion as Nt}from"@coreframe/deploy";import{inspect as Pt,parseEnv as Ft}from"node:util";import{once as It}from"node:events";import{connectDevSupervisor as Lt,createDevStartupTiming as Rt,devHttpsCertEnv as zt,devHttpsKeyEnv as Bt,isManagedDevCheckout as Vt,isPrimaryCheckout as Ht,prepareDevHttps as Ut}from"@coreframe/dev";import{devJobsEnv as Wt}from"@coreframe/dev-contracts/dev-jobs";import{managedDevEnv as Gt,managedDevFlutterRestartFileEnv as Kt}from"@coreframe/dev-contracts/managed-dev";import{openScopedLogs as qt}from"leylines";import{setTimeout as Jt}from"node:timers/promises";import{determineAgent as Yt}from"@vercel/detect-agent";import{runPreview as Xt}from"@coreframe/preview";const Zt=`FLUTTER_XCODE_COREFRAME_BUNDLE_IDENTIFIER_SUFFIX`,Qt=`COREFRAME_FLUTTER_DEVELOPMENT`,$t=[`filtered`,`full`];function en(e,{noCodesign:t=!1}={}){return{...e,[Zt]:`.dev`,[Qt]:`1`,...t?{FLUTTER_XCODE_CODE_SIGNING_ALLOWED:`NO`,FLUTTER_XCODE_CODE_SIGNING_REQUIRED:`NO`,FLUTTER_XCODE_CODE_SIGN_IDENTITY:``}:void 0}}function tn(e=!1){return e?`debug`:`profile`}function nn({device:e,mode:t,platform:n}){if(t===`profile`&&!e.physical)throw Error(`Flutter profile mode is unavailable on ${n===`ios`?`iOS simulator`:`Android emulator`}s. Re-run with --flutter-debug or select a physical device.`)}function rn({device:e,flutterDriver:t,mode:n,serverUrl:r,verbose:i}){return[`run`,`--machine`,`--${n}`,`-d`,e.id,`--dart-define=COREFRAME_DEV_SERVER_URL=${r}`,...t?[`--dart-define=ENABLE_FLUTTER_DRIVER=true`]:[],...i?[`--verbose`]:[]]}const an=[`web`,...O];function on(e=`web`,{apiOrigin:t,cwd:n=process.cwd(),profile:r=!1,simulator:i=!1}={}){if(pn(e,{profile:r,simulator:i}),e===`web`)return[hn(`pnpm`,[`build`],n,{COREFRAME_PLATFORM:`web`})];let a=A(t);return[{kind:`prepare`,platform:e},hn(`flutter`,sn(e,a,{profile:r,simulator:i}),P(n,`src-flutter`),{COREFRAME_API_ORIGIN:a})]}function sn(e,t,{noCodesign:n=e===`macos`,profile:r=!1,simulator:i=!1}={}){pn(e,{profile:r,simulator:i});let a=A(t);return[`build`,e===`android`?`apk`:e,r?`--profile`:`--release`,...i?[`--simulator`]:[],...n?[`--no-codesign`]:[],`--dart-define=COREFRAME_API_ORIGIN=${a}`]}function cn(e,{profile:t=!1}={}){let n=t?`profile`:`release`,r=P(e,`src-flutter/build/app/outputs/flutter-apk/app-${n}.apk`),i=JSON.stringify(r);return[`Android ${n} build succeeded.`,``,`Install it on a connected Android device:`,` 1. Enable Developer options and USB debugging, connect the device, and accept the authorization prompt.`,` 2. Verify the device is visible:`,` adb devices`,` 3. Install or update the APK:`,` adb install -r ${i}`,``,`If multiple devices are connected, use:`,` adb -s <device-id> install -r ${i}`].join(`
3
3
  `)}function ln(e,{profile:t=!1,simulator:n=!1}={}){let r=t?`profile`:`release`,i=P(e,`src-flutter/build/ios/${n?`iphonesimulator`:`iphoneos`}/Runner.app`),a=JSON.stringify(i);return n?[`iOS Simulator ${r} build succeeded.`,``,`Install it on a booted iOS Simulator:`,` 1. Verify available simulators:`,` xcrun simctl list devices`,` 2. Install the app:`,` xcrun simctl install booted ${a}`,``,"If multiple simulators are available, replace `booted` with the simulator UDID."].join(`
4
4
  `):[`iOS ${r} build succeeded.`,``,`Install it on a connected iOS device:`,` 1. Enable Developer Mode, connect the device, and trust this Mac if prompted.`,` 2. Verify the device is visible:`,` xcrun devicectl list devices`,` 3. Install the signed app:`,` xcrun devicectl device install app --device <device-id> ${a}`,``,`If multiple devices are connected, use the device UDID shown by devicectl.`].join(`
5
5
  `)}function un(e){return[`Windows release build succeeded.`,``,`The unpackaged application bundle is at ${JSON.stringify(P(e,`src-flutter/build/windows/x64/runner/Release`))}.`,`Create and sign an installer with the Windows packaging workflow for distribution.`].join(`
@@ -14,7 +14,7 @@ import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,f
14
14
  `).map(e=>e.trim()).filter(Boolean)}const Oo=[`dependencies`,`devDependencies`];function ko(e){let t=I(`git`,e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.trim()||t.stdout.trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function Ao(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function jo(e,t,n){let r=`${Q(e,n)}:${t}`;return Ao(ko([`show`,r]),r)}function Mo(e){return e.startsWith(`@coreframe/`)}function No(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function Po(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function Fo(e,t){let n=e.indexOf(`:`),r=e.slice(n+1),i=ye.normalize(ye.join(`template`,r,`package.json`));if(r.length===0||ye.isAbsolute(r)||i===`..`||i.startsWith(`../`))throw Error(`Invalid local template dependency for ${t}: ${e}`);return i}function Io(e,t){let n=jo(e,`template/package.json`,t),r=[],i=new Set;for(let a of Oo)for(let[o,s]of Object.entries(n[a]??{})){if(!Mo(o)||!Po(s))continue;if(i.has(o))throw Error(`Target template declares ${o} more than once.`);let n=Fo(s,o),c=jo(e,n,t);if(c.name!==o||typeof c.version!=`string`)throw Error(`${Q(e,t)}:${n} must declare ${o} with a version.`);r.push({group:a,name:o,spec:`^${c.version}`}),i.add(o)}return r}function Lo(e,t){for(let n of Oo){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function Ro(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,i=t.endsWith(`
15
15
  `)?`
16
16
  `:``;z(e,`${JSON.stringify(n,null,r)}${i}`)}function zo(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function Bo(e){let t=P(ko([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=R(t,`utf8`),r=Ao(n,t),i=Q(e.target,e.remote),a=Io(e.target,e.remote),o=new Set(a.map(({name:e})=>e)),s=[],c=[],l=[],u=0;for(let e of a){let t=Lo(r,e.name);if(!t){c.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(No(t.spec)){l.push(`linked: ${e.name} ${t.spec}`);continue}if(t.spec===e.spec){u+=1;continue}s.push({...e,currentGroup:t.group,currentSpec:t.spec})}let d=Oo.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>Mo(e)&&!o.has(e)).map(([t,n])=>`review: ${t} ${n} (${e})`));if(e.apply&&s.length>0){for(let e of s)r[e.currentGroup][e.name]=e.spec;Ro(t,n,r)}console.log(`Coreframe package sync: ${Ui(i)}`),console.log(``),zo(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),zo(`Missing target Coreframe packages`,c),zo(`Locally linked Coreframe packages`,l),zo(`Downstream-only Coreframe packages`,d),u>0&&console.log(`${u} Coreframe package(s) already match the target versions.`),s.length===0?console.log(`No Coreframe package version updates found.`):e.apply||(console.log(``),console.log(`Run with --apply to write the ${s.length} package update(s).`))}const Vo={...p,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return Pi(e)}},Ho=m({name:`upgrade`,cmds:{"ensure-template-remote":n({name:`ensure-template-remote`,args:{remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Remote name to ensure.`}),url:c({long:`url`,type:l(p),description:`Template repository URL. Defaults to the upstream Coreframe repository.`}),noFetch:i({long:`no-fetch`,description:`Do not fetch the remote after ensuring it exists.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t,url:n})=>$i({fetch:!e,remote:t,url:n})}),"check-skill-current":n({name:`check-skill-current`,args:{target:c({long:`target`,type:p,description:`Target Coreframe template git ref.`}),remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),apply:i({long:`apply`,description:`Replace the local upgrade skill with the target version when it differs.`,defaultValue:()=>!1})},handler:({apply:e,remote:t,target:n})=>{process.exitCode=to({apply:e,remote:t,target:n})}}),"fast-forward-template-files":n({name:`fast-forward-template-files`,args:{target:c({long:`target`,type:p,description:`Target Coreframe template git ref.`}),base:c({long:`base`,type:l(p),description:`Previous Coreframe template git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),apply:i({long:`apply`,description:`Write clean fast-forwards to the worktree.`,defaultValue:()=>!1})},handler:({apply:e,base:t,remote:n,target:r})=>Eo({apply:e,base:t,remote:n,target:r})}),"list-template-versions":n({name:`list-template-versions`,args:{target:c({long:`target`,type:p,description:`Target Coreframe template git ref.`}),base:c({long:`base`,type:l(p),description:`Previous Coreframe template git ref. Omit to list every released version.`}),remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Coreframe Git remote name.`})},handler:({base:e,remote:t,target:n})=>{for(let r of Do({base:e,remote:t,target:n}))console.log(r)}}),"sync-coreframe-packages":n({name:`sync-coreframe-packages`,args:{target:c({long:`target`,type:p,description:`Target Coreframe template git ref.`}),remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),apply:i({long:`apply`,description:`Update existing published Coreframe dependency specifications.`,defaultValue:()=>!1})},handler:({apply:e,remote:t,target:n})=>Bo({apply:e,remote:t,target:n})})}}),Uo=m({name:`recipes`,cmds:{apply:n({name:`apply`,args:{recipe:u({type:Vo,displayName:`recipe`,description:`Recipe to prepare and apply.`}),target:c({long:`target`,type:l(p),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>ka(Oa({fetch:!e,name:t,remote:n,target:r}))}),list:n({name:`list`,args:{target:c({long:`target`,type:l(p),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t,target:n})=>Ja(qa({fetch:!e,remote:t,target:n}))}),verify:n({name:`verify`,args:{recipe:u({type:Vo,displayName:`recipe`,description:`Recipe adoption to verify.`}),target:c({long:`target`,type:l(p),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:p,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:i({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>Ta(wa({fetch:!e,name:t,remote:n,target:r}))})}}),Wo=m({name:`db`,cmds:{ensure:n({name:`ensure`,args:{},handler:S}),generate:n({name:`generate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>T(`generate`,e)}),migrate:n({name:`migrate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>T(`migrate`,e)}),"migrate-held":n({name:`migrate-held`,args:{local:i({long:`local`,description:`Run held migrations against the Coreframe-managed local PostgreSQL database.`,defaultValue:()=>!1})},handler:({local:e})=>re({target:e?`local`:`deployment`})}),"migrate-local":n({name:`migrate-local`,args:{},handler:ie}),"migrations-check":n({name:`migrations-check`,args:{},handler:g}),reset:n({name:`reset`,args:{},handler:se}),seed:n({name:`seed`,args:{},handler:()=>le()}),"schema-check":n({name:`schema-check`,args:{seed:i({long:`seed`,description:`Run the configured project seed against the throwaway database.`,defaultValue:()=>!1})},handler:({seed:e})=>_({seed:e})}),setup:n({name:`setup`,args:{},handler:()=>ue()}),studio:n({name:`studio`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>T(`studio`,e)})}}),Go=`package.json`;async function Ko(e=process.argv.slice(2),t=process.env){let n=qo(e);ts(n);let{packageJson:r,source:i}=await St(Go),a=await G(),o=Et(a.deploy,n.environment,t);ns(n,o.mode),os(t,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let s=await rs(o,n.environment,()=>ft({env:t})),c=o.mode===`full`?await Yo(n.environment,t):void 0,l=await es(),u=a.i18n?kr(a.i18n):void 0;u&&Or(u)===`source-only`?B.log.info(`I18n source-only mode (${u.sourceLocale}): no prepared translation snapshot is required; source catalogs build directly.`):await Dr({env:t,revision:l});let d=l.slice(0,12),f=Dt(n.environment,r.version,d),p=Tt(r.name,f),m={...us(t,n.environment,p,r.name,f),...u?{COREFRAME_I18N_RELEASE_REVISION:l}:{}},h=n.environment===`production`,g=!1;B.intro(`Deploy ${p} to ${n.environment}`);let _=Object.keys(c?.pendingWorkerSecrets.values??{}).sort();_.length>0&&B.note(_.join(`
17
- `),`Pending Worker secret updates`),c?.accessTokenSigningSecret.provisioned&&B.log.info(`Provisioning Coreframe-managed access-token signing material.`),await as(n);let v=o.mode===`full`?await Xo(a,n,t):!1;try{h&&await Nt(Go,r,f),B.log.step(`Running pre-deploy build`),await F(`pnpm`,[`build`],{env:ds(m),stdio:`inherit`}),B.log.step(`Running release build and uploading PostHog source maps`),g=!0,await F(`pnpm`,[`build`],{env:m,stdio:`inherit`}),v&&(B.log.step(`Running deploy-safe database migrations`),await F(`pnpm`,[`exec`,`drizzle-kit`,`migrate`],{env:m,stdio:`inherit`})),B.log.step(o.mode===`full`?`Deploying Worker and static assets to Cloudflare`:`Deploying static assets to Cloudflare`);let e={...c?.dashboardPassword?{DASHBOARD_PASSWORD:c.dashboardPassword}:{},...c?.accessTokenSigningSecret.value?{[ct]:c.accessTokenSigningSecret.value}:{},...c?.pendingWorkerSecrets.values},t=Object.keys(e).length>0?await cs(e):void 0,i=o.mode===`full`?await ht({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:p}}}):await mt(process.cwd());try{await F(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,i.path,...o.mode===`full`?[`--env`,n.environment]:[],`--strict`,`--keep-vars`,`--tag`,p,`--message`,`Deploy ${p}`,...t?[`--secrets-file`,t.path]:[]],{env:m,stdio:`inherit`}),c&&(await lt(c.pendingWorkerSecrets),await Mt({environment:n.environment}))}finally{await i.dispose(),await t?.dispose()}let l={environment:n.environment,releaseName:p,url:s,version:f};o.mode===`full`&&o.afterWorkerDeploy&&(B.log.step(`Running required after-Worker deploy hook`),await kt(o,l)),n.skipPostDeployChecks||(B.log.step(`Running post-deploy checks`),await At(o,l)),B.outro(`Deployed ${p} to ${n.environment}`)}catch(e){throw!g&&h&&await W(Go,i),e}}function qo(e){return{environment:Jo(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),yes:e.includes(`--yes`)}}function Jo(e){if(e&&ut.includes(e))return e;throw Error(`Deploy environment must be one of: ${ut.join(`, `)}.`)}async function Yo(e,t){let n=await Ct({environment:e}),r=n.values.DASHBOARD_PASSWORD??await ss(t,e);return jt(await pt({environment:e}),e,{availableNames:[...Object.keys(n.values),...r?[`DASHBOARD_PASSWORD`]:[]]}),{accessTokenSigningSecret:await vt({environment:e}),dashboardPassword:r,pendingWorkerSecrets:n}}async function Xo(e,t,n){let r=e.database?.dialect??`postgres`,i;switch(r){case`postgres`:i=await y({env:n});break;case`sqlite`:i=await b({env:n});break;default:throw Error(`Unsupported database dialect "${r}".`)}let{appliedMigrations:a,pendingMigrations:o}=await Zo(i),s=await ce(o);if(s.length>0){if(a.size>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations and apply them with \`pnpm db migrate-held\`.\n${ne(s)}`);B.log.warn(`Pending deploy migrations contain SQL that is unsafe for an existing deployment, but the target database has no applied migrations, so no deployed app version can depend on the current schema. Proceeding with deploy migrations.\n${ne(s)}`)}return $o(t,o)}async function Zo(e){try{return await Qo(e)}finally{await e.close?.()}}async function Qo(e){let t=await v(),n=await ae(e);return{appliedMigrations:n,pendingMigrations:C(t,n)}}async function $o(e,t){if(t.length===0)return B.log.info(`No pending deploy migrations.`),!1;if(B.note(te(t),`Pending deploy migrations`),e.runMigrations)return!0;if(e.skipMigrations)return!1;if(!process.stdout.isTTY)throw Error(`Pending migrations require --run-migrations or --skip-migrations in noninteractive deploys.`);let n=await B.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(B.isCancel(n))throw B.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function es(){let{stdout:e}=await F(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await F(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function ts(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}function ns(e,t){if(t===`client`&&(e.runMigrations||e.skipMigrations))throw Error(`Migration flags are not available when deploy.mode is "client".`)}async function rs(e,t,n=ft){return e.url?is(e.url,t):t===`staging`&&e.stagingHostname?is(await n(),t):is(void 0,t)}function is(e,t){if(!e)throw Error(`Missing ${t} deploy URL. Set DEPLOY_URL or deploy.environments.${t}.url in coreframe.config.ts.`);let n;try{n=new URL(e)}catch{throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`);return n.toString()}async function as(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await B.confirm({initialValue:!1,message:`Deploy to production?`});if(B.isCancel(t)||!t)throw B.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function os(e,t){let n=t.filter(t=>!e[t]);if(n.length>0)throw Error(`Missing required deploy environment variables: ${n.join(`, `)}`);return Object.fromEntries(t.map(t=>[t,e[t]]))}async function ss(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Ft(await H(`.env`,`utf8`))}catch(e){throw ls(e)&&e.code===`ENOENT`?Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`):e}let i=r.DASHBOARD_PASSWORD?.trim();if(!i)throw Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`);return i}async function cs(e){let t=await Ge(N(je(),`coreframe-deploy-secrets-`)),n=N(t,`secrets.json`);return await W(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>U(t,{force:!0,recursive:!0})}}function ls(e){return e instanceof Error&&`code`in e}function us(e,t,n,r,i){return{...e,CLOUDFLARE_ENV:t,DEPLOY_ENV:t,POSTHOG_RELEASE:n,POSTHOG_RELEASE_NAME:e.POSTHOG_RELEASE_NAME??r,POSTHOG_RELEASE_VERSION:e.POSTHOG_RELEASE_VERSION??i}}function ds(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}async function fs(){let e=await ms();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function ps(e){let t=await ms(),n=hs();await Z.mkdir(j.dirname(n),{recursive:!0}),await Z.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function ms(){try{let e=await Z.readFile(hs(),`utf8`),t=JSON.parse(e);return gs(t)?t:{}}catch{return{}}}function hs(){return j.join(ri.homedir(),`.coreframe`,`preferences.json`)}function gs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function _s({env:e=q.env,interactive:t=q.stdin.isTTY===!0,platform:n,target:r}){let i=await ws(n,e).catch(()=>[]),a=r?Hs(i,r):void 0;if(a)return a;if(!r&&i.length>0)return Cs(i,n,t);let o=r?Hs(await Es(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return Ds(o,n,e,t);let s=await Ts(n,e),c=r?Hs(s,r):void 0;if(c)return c;if(!r&&s.length>0)return Cs(s,n,t);let l=n===`ios`?`iOS`:`Android`;throw Error(r?`Could not find a ${l} device matching "${r}".`:`No connected ${l} devices or available ${l} ${n===`ios`?`simulators`:`emulators`} were detected.`)}async function vs(e){let{device:t,host:n,interactive:r=q.stdin.isTTY===!0}=e;if(!t.physical&&n===void 0)return;if(typeof n==`string`&&n!==`0.0.0.0`&&n!==`::`)return n;let i=Ws();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await xs();if(a&&i.includes(a))return a;if(i.length===1)return await Ss(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await B.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(B.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await Ss(o),o}async function ys({device:e,env:t=q.env,host:n,interactive:r,platform:i,port:a}){if(i===`android`&&e.physical&&n===void 0)try{return await Fs(e.id,a,t)}catch{B.log.warn(`Could not establish Android ADB port forwarding. Using the LAN development address instead.`)}return{close:async()=>void 0,serverUrl:bs(i,await vs({device:e,host:n,interactive:r,platform:i}),a),viteHost:!0}}function bs(e,t,n){let r=t??(e===`android`?`10.0.2.2`:`127.0.0.1`);return`http://${r.includes(`:`)&&!r.startsWith(`[`)?`[${r}]`:r}:${n}`}async function xs(){return(await fs()).mobileDevHost}async function Ss(e){try{await ps({mobileDevHost:e})}catch(e){B.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function Cs(e,t,n){if(e.length===1)return e[0];if(!n)throw Error(`Multiple ${t===`ios`?`iOS`:`Android`} devices were detected. Pass a device name explicitly.`);let r=await B.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(B.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function ws(e,t){return e===`android`?ks(t):js(t)}async function Ts(e,t){return e===`android`?As(t):Ms(t)}async function Es(e){let{stdout:t}=await F(`flutter`,[`emulators`],{env:e});return t.split(/\r?\n/).flatMap(e=>{let[t,n,,r]=e.split(/\s*•\s*/).map(e=>e.trim());return t&&n&&(r===`android`||r===`ios`)?[{id:t,label:n,name:n,physical:!1,platform:r}]:[]})}async function Ds(e,t,n,r){let i=await Os(t,n).catch(()=>[]),{stdout:a}=await F(`flutter`,[`emulators`,`--launch`,e.id],{env:n});if(/No emulator found|More than one emulator matches/i.test(a))throw Error(a.trim());let o=Date.now()+3e4;do{let a=await Os(t,n).catch(()=>[]),o=Hs(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return Cs(s,t,r);if(a.length===1)return a[0];await Jt(250)}while(Date.now()<o);let s=t===`ios`?`iOS simulator`:`Android emulator`;throw Error(`Flutter launched "${e.id}", but no ${s} became available.`)}async function Os(e,t){return e===`ios`?Ms(t,`booted`):(await ks(t)).filter(e=>!e.physical)}async function ks(e){let t=await Ps(e,`platform-tools`,q.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await F(t,[`devices`],{env:e}),r=n.split(/\r?\n/).map(e=>e.match(/^(\S+)\s+device(?:\s|$)/)?.[1]).filter(e=>e!==void 0);return(await Promise.all(r.map(async n=>{let r=await Ls(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await zs(t,e,n,r):await Bs(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(Gs)}async function As(e){let{stdout:t}=await F(await Ps(e,`emulator`,q.platform===`win32`?`emulator.exe`:`emulator`),[`-list-avds`],{env:e});return t.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0&&!/^(INFO|WARNING|ERROR)\s+\|/.test(e)).map(e=>({id:e,label:e,name:e,physical:!1}))}async function js(e){let t=await Z.mkdtemp(j.join(ri.tmpdir(),`coreframe-ios-devices-`)),n=j.join(t,`devices.json`);try{return await Z.writeFile(n,``),await F(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await Z.readFile(n,`utf8`)).result?.devices??[]).filter(Ns).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(Gs)}finally{await Z.rm(t,{force:!0,recursive:!0})}}async function Ms(e,t=`available`){let{stdout:n}=await F(`xcrun`,[`simctl`,`list`,`--json`,`devices`,t],{env:e}),r=JSON.parse(n);return Object.entries(r.devices??{}).filter(([e])=>e.includes(`iOS-`)).flatMap(([,e])=>e).flatMap(e=>e.name&&e.udid?[{id:e.udid,label:e.name,name:e.name,physical:!1}]:[]).sort(Gs)}function Ns(e){return e.connectionProperties?.tunnelState!==`unavailable`&&typeof e.hardwareProperties?.platform==`string`&&(e.hardwareProperties.platform.includes(`iOS`)||e.hardwareProperties.platform.includes(`xrOS`))&&typeof e.deviceProperties?.name==`string`&&typeof e.hardwareProperties.productType==`string`&&typeof e.hardwareProperties.udid==`string`}async function Ps(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:Is(e);for(let e of i){let r=j.join(e,t,n);try{return await Z.access(r),r}catch{}}return n}async function Fs(e,t,n){let r=await Ps(n,`platform-tools`,q.platform===`win32`?`adb.exe`:`adb`),{stdout:i}=await F(r,[`-s`,e,`reverse`,`tcp:0`,`tcp:${t}`],{env:n,timeout:3e3}),a=Number(i.trim());if(!Number.isInteger(a)||a<1||a>65535)throw Error(`ADB did not return a valid reverse TCP port.`);let o=`tcp:${a}`,s=!1;return{async close(){s||(s=!0,await F(r,[`-s`,e,`reverse`,`--remove`,o],{env:n,timeout:3e3}).catch(()=>void 0))},serverUrl:`http://127.0.0.1:${a}`,viteHost:`127.0.0.1`}}function Is(e){return q.platform===`darwin`?[j.join(ri.homedir(),`Library`,`Android`,`sdk`)]:q.platform===`win32`&&e.LOCALAPPDATA?[j.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[j.join(ri.homedir(),`Android`,`Sdk`)]}async function Ls(e,t,n,r){return(await Rs(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function Rs(e,t,n){return(await F(e,n,{env:t,timeout:3e3})).stdout}async function zs(e,t,n,r){return Rs(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function Bs(e,t,n,r){return Rs(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>Vs(e)||r).catch(()=>r)}function Vs(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function Hs(e,t){let n=e.map(e=>({device:e,score:Math.max(Us(t,e.name),Us(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function Us(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(r===n)return 1e4;let i=r.indexOf(n);if(i>=0)return 5e3-i;let a=0,o=0;for(let e of n){let t=r.indexOf(e,o);if(t<0)return 0;a+=t===o?2:1,o=t+1}return a}function Ws(){return[...new Set(Object.values(ri.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function Gs(e,t){return e.label.localeCompare(t.label)}var Ks=class{#e;#t=new Map;#n=new Set;#r;#i;#a;#o;#s=0;constructor({onEvent:e,verbose:t=!1,write:n}){this.#e=e,this.#r=t,this.#i=n}async handleLine(e){let t;try{t=JSON.parse(e)}catch{return $(e,`debug`)}if(!Array.isArray(t))return $(e,`debug`);let n=[];for(let e of t){if(!Zs(e)){n.push(...$(JSON.stringify(e),`debug`));continue}if(e.id!==void 0&&(`result`in e||`error`in e)){this.#c(e);continue}if(typeof e.event!=`string`)continue;let t={event:e.event,params:Zs(e.params)?e.params:{}};this.#l(t),await this.#e?.(t),n.push(...Js(t,this.#r))}return n}async restart({debounce:e=!1,fullRestart:t,reason:n}){let r=await this.#d();if(!r.supportsRestart)throw Error(`The running Flutter application does not support hot restart or reload.`);let i=await this.#u(`app.restart`,{appId:r.id,debounce:e,fullRestart:t,reason:n});if(!Zs(i)||typeof i.code!=`number`)throw Error(`Flutter returned an invalid restart response.`);let a={code:i.code,message:typeof i.message==`string`?i.message:``};if(a.code!==0)throw Error(a.message||`Flutter restart failed with code ${a.code}.`);return a}async stop(){let e=await this.#d();if(await this.#u(`app.stop`,{appId:e.id})!==!0)throw Error(`Flutter did not stop the running application.`)}close(e=Error(`The Flutter machine connection closed.`)){if(this.#o)return;let t=$s(e);this.#o=t;for(let e of this.#t.values())e.reject(t);this.#t.clear(),this.#f(t)}#c(e){let t=String(e.id),n=this.#t.get(t);n&&(this.#t.delete(t),`error`in e?n.reject(Error(Qs(e.error))):n.resolve(e.result))}#l({event:e,params:t}){let n=typeof t.appId==`string`?t.appId:void 0;if(e===`app.start`&&n){this.#a={id:n,started:!1,supportsRestart:t.supportsRestart===!0};return}if(e===`app.started`&&n&&this.#a?.id===n){let e={...this.#a,started:!0};this.#a=e;for(let t of this.#n)t.resolve(e);this.#n.clear();return}e===`app.stop`&&n&&this.#a?.id===n&&(this.#a=void 0,this.#f(Error(`The Flutter application stopped before it was ready.`)))}async#u(e,t){if(this.#o)throw this.#o;let n=String(++this.#s),r,i,a=new Promise((e,t)=>{r=t,i=e});this.#t.set(n,{reject:r,resolve:i});try{await this.#i(`${JSON.stringify([{id:n,method:e,params:t}])}\n`)}catch(e){this.#t.delete(n),r($s(e))}return a}#d(){return this.#o?Promise.reject(this.#o):this.#a?.started?Promise.resolve(this.#a):new Promise((e,t)=>{this.#n.add({reject:t,resolve:e})})}#f(e){for(let t of this.#n)t.reject(e);this.#n.clear()}};async function*qs(e,t){try{for await(let n of e)yield*await t.handleLine(n)}catch(e){throw t.close(e),e}finally{t.close()}}function Js({event:e,params:t},n){if(e===`daemon.log`||e===`app.log`)return $(Xs(t.log),t.error===!0?`error`:`debug`);if(e===`daemon.logMessage`){let e=Ys(t.level);return!n&&e===`debug`?[]:[...$(Xs(t.message),e),...n?$(Xs(t.stackTrace),e):[]]}return e===`daemon.showMessage`?$(Xs(t.message),Ys(t.level)):e===`app.warning`?$(Xs(t.warning),`warn`):e===`app.progress`&&t.finished!==!0?$(Xs(t.message),`debug`):e===`app.stop`&&t.error!==void 0?$(Qs(t.error),`error`):[]}function $(e,t){return e===void 0?[]:e.split(/\r?\n/u).map(e=>({level:t,message:e}))}function Ys(e){return e===`error`?`error`:e===`warning`||e===`warn`?`warn`:`debug`}function Xs(e){return typeof e==`string`&&e.length>0?e:void 0}function Zs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Qs(e){if(typeof e==`string`)return e;if(Zs(e)&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function $s(e){return e instanceof Error?e:Error(Qs(e))}async function ec(e,t){if(!e)return()=>void 0;Ce(j.dirname(e),{recursive:!0}),z(e,``,{flag:`a`});let n;try{n=R(e,`utf8`)}catch{n=void 0}let r=0,i=!1,a=Oe(e,{persistent:!1},()=>{if(i)return;let a=++r;H(e,`utf8`).then(e=>{i||a!==r||e===n||(n=e,t())},()=>void 0)});return()=>{i=!0,a.close()}}function tc(e,t){let n={...e};return t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const nc=q.platform===`win32`?`portless.cmd`:`portless`,rc=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),ic=/^Proxy is already running on port (\d+)\.$/,ac=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function oc(e){let t=e.split(/(\r\n|\n)/),n=[];for(let e=0;e<t.length;){let r=t[e],i=t[e+2],a=r?.replace(rc,``).trim().match(ic);if(a?.[1]!==void 0&&i!==void 0&&ac.test(i.replace(rc,``).trim())){n.push(`Portless proxy is running on port ${a[1]}.`),t[e+1]!==void 0&&n.push(t[e+1]),e+=t[e+3]===void 0?3:4;continue}n.push(t[e]??``),e+=1}return n.join(``)}function sc(e){let t=oc(e);t&&q.stdout.write(t.endsWith(`
17
+ `),`Pending Worker secret updates`),c?.accessTokenSigningSecret.provisioned&&B.log.info(`Provisioning Coreframe-managed access-token signing material.`),await as(n);let v=o.mode===`full`?await Xo(a,n,t):!1;try{h&&await Nt(Go,r,f),B.log.step(`Running pre-deploy build`),await F(`pnpm`,[`build`],{env:ds(m),stdio:`inherit`}),B.log.step(`Running release build and uploading PostHog source maps`),g=!0,await F(`pnpm`,[`build`],{env:m,stdio:`inherit`}),v&&(B.log.step(`Running deploy-safe database migrations`),await F(`pnpm`,[`exec`,`drizzle-kit`,`migrate`],{env:m,stdio:`inherit`})),B.log.step(o.mode===`full`?`Deploying Worker and static assets to Cloudflare`:`Deploying static assets to Cloudflare`);let e={...c?.dashboardPassword?{DASHBOARD_PASSWORD:c.dashboardPassword}:{},...c?.accessTokenSigningSecret.value?{[ct]:c.accessTokenSigningSecret.value}:{},...c?.pendingWorkerSecrets.values},t=Object.keys(e).length>0?await cs(e):void 0,i={...m};delete i.CLOUDFLARE_ENV;let l=o.mode===`full`?await ht({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:p}}}):await mt(process.cwd());try{await F(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,l.path,`--strict`,`--keep-vars`,`--tag`,p,`--message`,`Deploy ${p}`,...t?[`--secrets-file`,t.path]:[]],{env:i,stdio:`inherit`}),c&&(await lt(c.pendingWorkerSecrets),await Mt({environment:n.environment}))}finally{await l.dispose(),await t?.dispose()}let u={environment:n.environment,releaseName:p,url:s,version:f};o.mode===`full`&&o.afterWorkerDeploy&&(B.log.step(`Running required after-Worker deploy hook`),await kt(o,u)),n.skipPostDeployChecks||(B.log.step(`Running post-deploy checks`),await At(o,u)),B.outro(`Deployed ${p} to ${n.environment}`)}catch(e){throw!g&&h&&await W(Go,i),e}}function qo(e){return{environment:Jo(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),yes:e.includes(`--yes`)}}function Jo(e){if(e&&ut.includes(e))return e;throw Error(`Deploy environment must be one of: ${ut.join(`, `)}.`)}async function Yo(e,t){let n=await Ct({environment:e}),r=n.values.DASHBOARD_PASSWORD??await ss(t,e);return jt(await pt({environment:e}),e,{availableNames:[...Object.keys(n.values),...r?[`DASHBOARD_PASSWORD`]:[]]}),{accessTokenSigningSecret:await vt({environment:e}),dashboardPassword:r,pendingWorkerSecrets:n}}async function Xo(e,t,n){let r=e.database?.dialect??`postgres`,i;switch(r){case`postgres`:i=await y({env:n});break;case`sqlite`:i=await b({env:n});break;default:throw Error(`Unsupported database dialect "${r}".`)}let{appliedMigrations:a,pendingMigrations:o}=await Zo(i),s=await ce(o);if(s.length>0){if(a.size>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations and apply them with \`pnpm db migrate-held\`.\n${ne(s)}`);B.log.warn(`Pending deploy migrations contain SQL that is unsafe for an existing deployment, but the target database has no applied migrations, so no deployed app version can depend on the current schema. Proceeding with deploy migrations.\n${ne(s)}`)}return $o(t,o)}async function Zo(e){try{return await Qo(e)}finally{await e.close?.()}}async function Qo(e){let t=await v(),n=await ae(e);return{appliedMigrations:n,pendingMigrations:C(t,n)}}async function $o(e,t){if(t.length===0)return B.log.info(`No pending deploy migrations.`),!1;if(B.note(te(t),`Pending deploy migrations`),e.runMigrations)return!0;if(e.skipMigrations)return!1;if(!process.stdout.isTTY)throw Error(`Pending migrations require --run-migrations or --skip-migrations in noninteractive deploys.`);let n=await B.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(B.isCancel(n))throw B.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function es(){let{stdout:e}=await F(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await F(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function ts(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}function ns(e,t){if(t===`client`&&(e.runMigrations||e.skipMigrations))throw Error(`Migration flags are not available when deploy.mode is "client".`)}async function rs(e,t,n=ft){return e.url?is(e.url,t):t===`staging`&&e.stagingHostname?is(await n(),t):is(void 0,t)}function is(e,t){if(!e)throw Error(`Missing ${t} deploy URL. Set DEPLOY_URL or deploy.environments.${t}.url in coreframe.config.ts.`);let n;try{n=new URL(e)}catch{throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`)}if(n.protocol!==`http:`&&n.protocol!==`https:`)throw Error(`Invalid ${t} deploy URL "${e}". Expected an HTTP(S) URL.`);return n.toString()}async function as(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await B.confirm({initialValue:!1,message:`Deploy to production?`});if(B.isCancel(t)||!t)throw B.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function os(e,t){let n=t.filter(t=>!e[t]);if(n.length>0)throw Error(`Missing required deploy environment variables: ${n.join(`, `)}`);return Object.fromEntries(t.map(t=>[t,e[t]]))}async function ss(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Ft(await H(`.env`,`utf8`))}catch(e){throw ls(e)&&e.code===`ENOENT`?Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`):e}let i=r.DASHBOARD_PASSWORD?.trim();if(!i)throw Error(`Missing ${t} dashboard password. Set DASHBOARD_PASSWORD in ".env".`);return i}async function cs(e){let t=await Ge(N(je(),`coreframe-deploy-secrets-`)),n=N(t,`secrets.json`);return await W(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>U(t,{force:!0,recursive:!0})}}function ls(e){return e instanceof Error&&`code`in e}function us(e,t,n,r,i){return{...e,CLOUDFLARE_ENV:t,DEPLOY_ENV:t,POSTHOG_RELEASE:n,POSTHOG_RELEASE_NAME:e.POSTHOG_RELEASE_NAME??r,POSTHOG_RELEASE_VERSION:e.POSTHOG_RELEASE_VERSION??i}}function ds(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}async function fs(){let e=await ms();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function ps(e){let t=await ms(),n=hs();await Z.mkdir(j.dirname(n),{recursive:!0}),await Z.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function ms(){try{let e=await Z.readFile(hs(),`utf8`),t=JSON.parse(e);return gs(t)?t:{}}catch{return{}}}function hs(){return j.join(ri.homedir(),`.coreframe`,`preferences.json`)}function gs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function _s({env:e=q.env,interactive:t=q.stdin.isTTY===!0,platform:n,target:r}){let i=await ws(n,e).catch(()=>[]),a=r?Hs(i,r):void 0;if(a)return a;if(!r&&i.length>0)return Cs(i,n,t);let o=r?Hs(await Es(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return Ds(o,n,e,t);let s=await Ts(n,e),c=r?Hs(s,r):void 0;if(c)return c;if(!r&&s.length>0)return Cs(s,n,t);let l=n===`ios`?`iOS`:`Android`;throw Error(r?`Could not find a ${l} device matching "${r}".`:`No connected ${l} devices or available ${l} ${n===`ios`?`simulators`:`emulators`} were detected.`)}async function vs(e){let{device:t,host:n,interactive:r=q.stdin.isTTY===!0}=e;if(!t.physical&&n===void 0)return;if(typeof n==`string`&&n!==`0.0.0.0`&&n!==`::`)return n;let i=Ws();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await xs();if(a&&i.includes(a))return a;if(i.length===1)return await Ss(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await B.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(B.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await Ss(o),o}async function ys({device:e,env:t=q.env,host:n,interactive:r,platform:i,port:a}){if(i===`android`&&e.physical&&n===void 0)try{return await Fs(e.id,a,t)}catch{B.log.warn(`Could not establish Android ADB port forwarding. Using the LAN development address instead.`)}return{close:async()=>void 0,serverUrl:bs(i,await vs({device:e,host:n,interactive:r,platform:i}),a),viteHost:!0}}function bs(e,t,n){let r=t??(e===`android`?`10.0.2.2`:`127.0.0.1`);return`http://${r.includes(`:`)&&!r.startsWith(`[`)?`[${r}]`:r}:${n}`}async function xs(){return(await fs()).mobileDevHost}async function Ss(e){try{await ps({mobileDevHost:e})}catch(e){B.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function Cs(e,t,n){if(e.length===1)return e[0];if(!n)throw Error(`Multiple ${t===`ios`?`iOS`:`Android`} devices were detected. Pass a device name explicitly.`);let r=await B.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(B.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function ws(e,t){return e===`android`?ks(t):js(t)}async function Ts(e,t){return e===`android`?As(t):Ms(t)}async function Es(e){let{stdout:t}=await F(`flutter`,[`emulators`],{env:e});return t.split(/\r?\n/).flatMap(e=>{let[t,n,,r]=e.split(/\s*•\s*/).map(e=>e.trim());return t&&n&&(r===`android`||r===`ios`)?[{id:t,label:n,name:n,physical:!1,platform:r}]:[]})}async function Ds(e,t,n,r){let i=await Os(t,n).catch(()=>[]),{stdout:a}=await F(`flutter`,[`emulators`,`--launch`,e.id],{env:n});if(/No emulator found|More than one emulator matches/i.test(a))throw Error(a.trim());let o=Date.now()+3e4;do{let a=await Os(t,n).catch(()=>[]),o=Hs(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return Cs(s,t,r);if(a.length===1)return a[0];await Jt(250)}while(Date.now()<o);let s=t===`ios`?`iOS simulator`:`Android emulator`;throw Error(`Flutter launched "${e.id}", but no ${s} became available.`)}async function Os(e,t){return e===`ios`?Ms(t,`booted`):(await ks(t)).filter(e=>!e.physical)}async function ks(e){let t=await Ps(e,`platform-tools`,q.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await F(t,[`devices`],{env:e}),r=n.split(/\r?\n/).map(e=>e.match(/^(\S+)\s+device(?:\s|$)/)?.[1]).filter(e=>e!==void 0);return(await Promise.all(r.map(async n=>{let r=await Ls(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await zs(t,e,n,r):await Bs(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(Gs)}async function As(e){let{stdout:t}=await F(await Ps(e,`emulator`,q.platform===`win32`?`emulator.exe`:`emulator`),[`-list-avds`],{env:e});return t.split(/\r?\n/).map(e=>e.trim()).filter(e=>e.length>0&&!/^(INFO|WARNING|ERROR)\s+\|/.test(e)).map(e=>({id:e,label:e,name:e,physical:!1}))}async function js(e){let t=await Z.mkdtemp(j.join(ri.tmpdir(),`coreframe-ios-devices-`)),n=j.join(t,`devices.json`);try{return await Z.writeFile(n,``),await F(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await Z.readFile(n,`utf8`)).result?.devices??[]).filter(Ns).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(Gs)}finally{await Z.rm(t,{force:!0,recursive:!0})}}async function Ms(e,t=`available`){let{stdout:n}=await F(`xcrun`,[`simctl`,`list`,`--json`,`devices`,t],{env:e}),r=JSON.parse(n);return Object.entries(r.devices??{}).filter(([e])=>e.includes(`iOS-`)).flatMap(([,e])=>e).flatMap(e=>e.name&&e.udid?[{id:e.udid,label:e.name,name:e.name,physical:!1}]:[]).sort(Gs)}function Ns(e){return e.connectionProperties?.tunnelState!==`unavailable`&&typeof e.hardwareProperties?.platform==`string`&&(e.hardwareProperties.platform.includes(`iOS`)||e.hardwareProperties.platform.includes(`xrOS`))&&typeof e.deviceProperties?.name==`string`&&typeof e.hardwareProperties.productType==`string`&&typeof e.hardwareProperties.udid==`string`}async function Ps(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:Is(e);for(let e of i){let r=j.join(e,t,n);try{return await Z.access(r),r}catch{}}return n}async function Fs(e,t,n){let r=await Ps(n,`platform-tools`,q.platform===`win32`?`adb.exe`:`adb`),{stdout:i}=await F(r,[`-s`,e,`reverse`,`tcp:0`,`tcp:${t}`],{env:n,timeout:3e3}),a=Number(i.trim());if(!Number.isInteger(a)||a<1||a>65535)throw Error(`ADB did not return a valid reverse TCP port.`);let o=`tcp:${a}`,s=!1;return{async close(){s||(s=!0,await F(r,[`-s`,e,`reverse`,`--remove`,o],{env:n,timeout:3e3}).catch(()=>void 0))},serverUrl:`http://127.0.0.1:${a}`,viteHost:`127.0.0.1`}}function Is(e){return q.platform===`darwin`?[j.join(ri.homedir(),`Library`,`Android`,`sdk`)]:q.platform===`win32`&&e.LOCALAPPDATA?[j.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[j.join(ri.homedir(),`Android`,`Sdk`)]}async function Ls(e,t,n,r){return(await Rs(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function Rs(e,t,n){return(await F(e,n,{env:t,timeout:3e3})).stdout}async function zs(e,t,n,r){return Rs(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function Bs(e,t,n,r){return Rs(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>Vs(e)||r).catch(()=>r)}function Vs(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function Hs(e,t){let n=e.map(e=>({device:e,score:Math.max(Us(t,e.name),Us(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function Us(e,t){let n=e.toLowerCase(),r=t.toLowerCase();if(r===n)return 1e4;let i=r.indexOf(n);if(i>=0)return 5e3-i;let a=0,o=0;for(let e of n){let t=r.indexOf(e,o);if(t<0)return 0;a+=t===o?2:1,o=t+1}return a}function Ws(){return[...new Set(Object.values(ri.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function Gs(e,t){return e.label.localeCompare(t.label)}var Ks=class{#e;#t=new Map;#n=new Set;#r;#i;#a;#o;#s=0;constructor({onEvent:e,verbose:t=!1,write:n}){this.#e=e,this.#r=t,this.#i=n}async handleLine(e){let t;try{t=JSON.parse(e)}catch{return $(e,`debug`)}if(!Array.isArray(t))return $(e,`debug`);let n=[];for(let e of t){if(!Zs(e)){n.push(...$(JSON.stringify(e),`debug`));continue}if(e.id!==void 0&&(`result`in e||`error`in e)){this.#c(e);continue}if(typeof e.event!=`string`)continue;let t={event:e.event,params:Zs(e.params)?e.params:{}};this.#l(t),await this.#e?.(t),n.push(...Js(t,this.#r))}return n}async restart({debounce:e=!1,fullRestart:t,reason:n}){let r=await this.#d();if(!r.supportsRestart)throw Error(`The running Flutter application does not support hot restart or reload.`);let i=await this.#u(`app.restart`,{appId:r.id,debounce:e,fullRestart:t,reason:n});if(!Zs(i)||typeof i.code!=`number`)throw Error(`Flutter returned an invalid restart response.`);let a={code:i.code,message:typeof i.message==`string`?i.message:``};if(a.code!==0)throw Error(a.message||`Flutter restart failed with code ${a.code}.`);return a}async stop(){let e=await this.#d();if(await this.#u(`app.stop`,{appId:e.id})!==!0)throw Error(`Flutter did not stop the running application.`)}close(e=Error(`The Flutter machine connection closed.`)){if(this.#o)return;let t=$s(e);this.#o=t;for(let e of this.#t.values())e.reject(t);this.#t.clear(),this.#f(t)}#c(e){let t=String(e.id),n=this.#t.get(t);n&&(this.#t.delete(t),`error`in e?n.reject(Error(Qs(e.error))):n.resolve(e.result))}#l({event:e,params:t}){let n=typeof t.appId==`string`?t.appId:void 0;if(e===`app.start`&&n){this.#a={id:n,started:!1,supportsRestart:t.supportsRestart===!0};return}if(e===`app.started`&&n&&this.#a?.id===n){let e={...this.#a,started:!0};this.#a=e;for(let t of this.#n)t.resolve(e);this.#n.clear();return}e===`app.stop`&&n&&this.#a?.id===n&&(this.#a=void 0,this.#f(Error(`The Flutter application stopped before it was ready.`)))}async#u(e,t){if(this.#o)throw this.#o;let n=String(++this.#s),r,i,a=new Promise((e,t)=>{r=t,i=e});this.#t.set(n,{reject:r,resolve:i});try{await this.#i(`${JSON.stringify([{id:n,method:e,params:t}])}\n`)}catch(e){this.#t.delete(n),r($s(e))}return a}#d(){return this.#o?Promise.reject(this.#o):this.#a?.started?Promise.resolve(this.#a):new Promise((e,t)=>{this.#n.add({reject:t,resolve:e})})}#f(e){for(let t of this.#n)t.reject(e);this.#n.clear()}};async function*qs(e,t){try{for await(let n of e)yield*await t.handleLine(n)}catch(e){throw t.close(e),e}finally{t.close()}}function Js({event:e,params:t},n){if(e===`daemon.log`||e===`app.log`)return $(Xs(t.log),t.error===!0?`error`:`debug`);if(e===`daemon.logMessage`){let e=Ys(t.level);return!n&&e===`debug`?[]:[...$(Xs(t.message),e),...n?$(Xs(t.stackTrace),e):[]]}return e===`daemon.showMessage`?$(Xs(t.message),Ys(t.level)):e===`app.warning`?$(Xs(t.warning),`warn`):e===`app.progress`&&t.finished!==!0?$(Xs(t.message),`debug`):e===`app.stop`&&t.error!==void 0?$(Qs(t.error),`error`):[]}function $(e,t){return e===void 0?[]:e.split(/\r?\n/u).map(e=>({level:t,message:e}))}function Ys(e){return e===`error`?`error`:e===`warning`||e===`warn`?`warn`:`debug`}function Xs(e){return typeof e==`string`&&e.length>0?e:void 0}function Zs(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Qs(e){if(typeof e==`string`)return e;if(Zs(e)&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function $s(e){return e instanceof Error?e:Error(Qs(e))}async function ec(e,t){if(!e)return()=>void 0;Ce(j.dirname(e),{recursive:!0}),z(e,``,{flag:`a`});let n;try{n=R(e,`utf8`)}catch{n=void 0}let r=0,i=!1,a=Oe(e,{persistent:!1},()=>{if(i)return;let a=++r;H(e,`utf8`).then(e=>{i||a!==r||e===n||(n=e,t())},()=>void 0)});return()=>{i=!0,a.close()}}function tc(e,t){let n={...e};return t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const nc=q.platform===`win32`?`portless.cmd`:`portless`,rc=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),ic=/^Proxy is already running on port (\d+)\.$/,ac=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function oc(e){let t=e.split(/(\r\n|\n)/),n=[];for(let e=0;e<t.length;){let r=t[e],i=t[e+2],a=r?.replace(rc,``).trim().match(ic);if(a?.[1]!==void 0&&i!==void 0&&ac.test(i.replace(rc,``).trim())){n.push(`Portless proxy is running on port ${a[1]}.`),t[e+1]!==void 0&&n.push(t[e+1]),e+=t[e+3]===void 0?3:4;continue}n.push(t[e]??``),e+=1}return n.join(``)}function sc(e){let t=oc(e);t&&q.stdout.write(t.endsWith(`
18
18
  `)?t:`${t}\n`)}async function cc({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await Yt()).isAgent?!1:Ht(e)}async function lc({cwd:e,env:t,lan:n=!1}){let r=j.join(`node_modules`,`.bin`,nc),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await F(j.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});sc(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&sc(e.stdout),e}}function uc({host:e,lan:t=!1,port:n}){return[...t?[`--lan`]:[],`run`,...n===void 0?[]:[`--app-port`,String(n)],`react-router`,`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e]]}const dc=j.join(`.coreframe`,`dev`,`session.json`);async function fc({appOrigin:e,cwd:t,device:n,flutterMcp:r,flutterMode:i,id:a,localOrigin:o,now:s=new Date,pid:c=process.pid,platform:l}){let u=j.resolve(t,dc),d=j.dirname(u),f={version:2,id:a,pid:c,projectRoot:j.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:j.resolve(t,`.leylines`,`logs.sqlite`),scopes:{browser:`browser`,...i===void 0?void 0:{flutter:`dev.flutter`},vite:`dev.vite`}},...i===void 0?void 0:{flutter:{mode:i,mcp:r,state:`starting`,...n===void 0?void 0:{device:n}}}},p=Promise.resolve(),m=()=>{let e=`${JSON.stringify(f,void 0,2)}\n`;return p=p.then(async()=>{await V(d,{recursive:!0});let t=j.join(d,`.session-${a}.json`);await W(t,e,{mode:384}),await He(t,384),await qe(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=hc(t.appId),i;if(e===`daemon.connected`){let e=gc(t.pid),r=hc(t.version);i={...pc(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...pc(n),appId:r,state:`starting`,supportsRestart:t.supportsRestart===!0};else if(e===`app.started`&&r===n.appId)i={...n,state:`running`};else if(e===`app.debugPort`&&r===n.appId){let e=hc(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=hc(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=hc(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=mc(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:mc(f.flutter)},await m())},async close(){await p;try{JSON.parse(await H(u,`utf8`)).id===a&&await U(u,{force:!0})}catch(e){if(e.code!==`ENOENT`)throw e}}}}function pc(e){return{mode:e.mode,mcp:e.mcp,...e.device===void 0?void 0:{device:e.device},...e.daemonPid===void 0?void 0:{daemonPid:e.daemonPid},...e.protocolVersion===void 0?void 0:{protocolVersion:e.protocolVersion}}}function mc(e){return{...pc(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function hc(e){return typeof e==`string`?e:void 0}function gc(e){return typeof e==`number`?e:void 0}const _c=`extension:dev`;function vc(e){if(!L(N(e,`src-webext/wxt.config.ts`)))throw Error("No WXT configuration found at src-webext/wxt.config.ts. Apply the wxt recipe or add that convention before running `coreframe dev webext`.");let t=N(e,`package.json`),n;try{n=JSON.parse(R(t,`utf8`))}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}if(!n||typeof n!=`object`||!(`scripts`in n)||!n.scripts||typeof n.scripts!=`object`||!(`extension:dev`in n.scripts)||typeof n.scripts[`extension:dev`]!=`string`)throw Error(`package.json must define scripts.${_c} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function yc({host:e,port:t}){let n=[...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)]];return[`run`,_c,...n.length>0?[`--`,...n]:[]]}const bc=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],xc=[`managed-dev-overlay`],Sc=j.resolve(`node_modules`,`.bin`),Cc=q.platform===`win32`?`pnpm.cmd`:`pnpm`,wc=q.platform===`win32`?`portless.cmd`:`portless`,Tc=q.platform===`win32`?`react-router.cmd`:`react-router`,Ec=`Lost connection to device.`;async function Dc({cwd:e=q.cwd(),debug:t,device:n,env:r=q.env,flutterDebug:i=!1,flutterMcp:a=!1,flutterOutput:o=`filtered`,host:s,https:c=!1,interactive:l=q.stdin.isTTY===!0,lan:u=!1,managed:d=!1,noCodesign:f=!1,noManaged:p=!1,noDevJobs:m=!1,platform:h=`web`,verbose:g=!1,webPort:_}={}){let v=Rt({env:r}),ee=r.PATH??r.Path??``,y=Bc(h)?h:void 0,b=tn(i||a),x=zc(_??r.COREFRAME_WEB_PORT),S,C,w,te,ne,re,ie,ae,se,T,ce,le,ue,E=!1,fe,D=r;if(d&&p)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&d)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(i&&y===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(a&&y===void 0)throw Error(`The --flutter-mcp option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(f&&h!==`macos`)throw Error(`The --no-codesign option is only supported for macOS Flutter development.`);if(o===`full`&&y===void 0)throw Error(`The --flutter-output option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(h===`webext`){if(d||p||t!==void 0||g)throw Error(`Managed development, debug features, and verbose native output are only supported for the main web or native development platforms.`);vc(e)}if(c&&h!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&h!==`ios`&&h!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);let pe=await v.measure(`routing`,()=>cc({cwd:e,env:r,platform:h}));pe&&await v.measure(`portless`,()=>lc({cwd:e,env:r,lan:u}));let O=y===void 0?h===`web`?x??await ni.getAvailablePort():h===`webext`?x:void 0:x??await ni.getAvailablePort(),k,he=new Promise(e=>{k=e}),A=()=>{E||(E=!0,k(),C?.kill(`SIGTERM`),re?.kill(`SIGTERM`),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ae?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),se?.close().catch(()=>void 0),S?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),_e().catch(()=>void 0))},_e=()=>te?(ne??=te[Symbol.asyncDispose](),ne):Promise.resolve(),M=e=>{fe??=e,A()},ve=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>M(e);return q.on(e,t),{handler:t,signal:e}}),N=async e=>{let t=nt(e);C=t;try{await t.expectSuccess()}catch(e){if(!E)throw e}finally{C===t&&(C=void 0)}};try{ce=y?qt({path:j.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await _s({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&nn({device:_,mode:b,platform:i});let x=y?ce?.logger({scope:`dev.flutter`,properties:{platform:y,..._?{deviceId:_.id}:void 0}}):void 0;T=i&&_&&O!==void 0?await ys({device:_,env:r,host:s,interactive:l,platform:i,port:O}):void 0;let C=T?.viteHost??(y?i?!0:`127.0.0.1`:s),ne=O===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${O}`,fe=y===void 0?ne:T?.serverUrl??bs(y,void 0,O),k={},_e=!1,M;[k,_e]=await Promise.all([v.measure(`config`,()=>G({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await Vt(e))]),await v.measure(`i18n`,()=>Tr({cwd:e,projectConfig:k})),M=h!==`webext`&&li(e)?await ni.getAvailablePort():void 0;let ve=await v.measure(`https`,async()=>c&&!pe?Ut({cwd:e}):void 0),ye=tc(r,h);D={...ye,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[Wt]:K()}:void 0,...y?{COREFRAME_PLATFORM:y,[Kt]:j.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...ve?{[zt]:ve.cert,[Bt]:ve.key}:void 0,...M?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${M}`}:void 0},ne!==void 0&&fe!==void 0&&(le=await fc({appOrigin:fe,cwd:e,device:_,flutterMcp:a,flutterMode:y===void 0?void 0:b,id:K(),localOrigin:ne,platform:h}));let P=async()=>{if(!M)return;let t=ui({cwd:e,env:D,port:M});se=t;try{await t.listen(),await t.wait()}finally{await t.close(),se===t&&(se=void 0)}},be=async()=>{let t=tt({label:`web`}),n=tt({color:`red`,label:`web`});t.pipe(q.stdout,{end:!1}),n.pipe(q.stderr,{end:!1}),ie=F(pe?wc:Tc,pe?uc({host:C,lan:u,port:O}):Rc({host:C,port:O,strictPort:h===`web`||y!==void 0}),{cwd:e,env:{...D,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[D.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:Sc+j.delimiter+ee},stdin:`inherit`});let r=Promise.allSettled([Pc(ie.stdout,t),Pc(ie.stderr,n)]);try{await ie;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!E)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([et(t),et(n)]),ie=void 0}},I=async()=>{let t=tt({label:`webext`}),n=tt({color:`red`,label:`webext`});t.pipe(q.stdout,{end:!1}),n.pipe(q.stderr,{end:!1}),ae=F(Cc,yc({host:s,port:O}),{cwd:e,env:D,stdin:`inherit`});let r=Promise.allSettled([Pc(ae.stdout,t),Pc(ae.stderr,n)]);try{await ae;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!E)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([et(t),et(n)]),ae=void 0}},xe=async t=>{let n,r,i=!1,s,c=ec(D[Kt],()=>{if(E||!n||!r||s||b!==`debug`&&i)return;let e=n,t=r;s=(async()=>{if(b===`debug`){await t.restart({debounce:!0,fullRestart:!0,reason:`manual`});return}i=!0;try{await t.stop()}catch(t){let n=t instanceof Error?t.message:String(t);x?.write(`warn`,`Flutter stop failed; terminating it: ${n}`,{properties:{stream:`control`}}),q.stderr.write(`Flutter stop failed; terminating it: ${n}\n`),await e.nodeChildProcess.then(e=>e.kill(`SIGTERM`))}})().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Flutter restart failed: ${t}`,{properties:{stream:`control`}}),q.stderr.write(`Flutter restart failed: ${t}\n`)}).finally(()=>{s=void 0})});try{for(;!E;){i=!1;let s=!1,c=h===`android`&&o===`filtered`&&!g?await ge():void 0,u=F(`flutter`,rn({device:_??{id:h},flutterDriver:a,mode:b,serverUrl:fe,verbose:g}),{cwd:j.join(e,`src-flutter`),env:en(ye,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new Ks({onEvent:async e=>{Ac(e.params.message)&&(s=!0),await le?.recordFlutterEvent(e)},verbose:g,write:async e=>{let t=await u.nodeChildProcess;if(!t.stdin)throw Error(`Flutter machine input is unavailable.`);t.stdin.write(e)===!1&&await It(t.stdin,`drain`)}}),p=e=>kc(qs(e,d),()=>s=!0);S=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(Nc(p(u),x,`output`)):Promise.all([Mc(p(u.stdout),q.stdout,x,`stdout`),Oc(u.stderr,q.stderr,x,`stderr`)]);await Promise.all([u,e])}catch{e=!0}if(i&&!E)continue;if(E)return;let n=l?await B.confirm({initialValue:!0,message:s?`${Ec} Restart Flutter?`:e?`Flutter failed. Retry?`:`Flutter exited unexpectedly. Restart Flutter?`}):!1;if(B.isCancel(n)||!n){if(!e&&!s){B.log.warn(`Flutter exited unexpectedly.`);return}B.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),await(t??he);return}}finally{S===u&&(S=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),le?.recordFlutterExit().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Failed to record Flutter exit: ${t}`,{properties:{stream:`control`}})})}}}finally{(await c)()}},L=async()=>{if(h===`web`){await be();return}let t=be().then(()=>{if(!E)throw Error(`The Vite development server stopped while Flutter was still running.`)});await me({cwd:e});try{await Promise.race([t,xe(t)])}finally{A(),await Promise.allSettled([t,S]),S=void 0}},Se=async()=>{let t=nt({name:`panda`,command:Cc,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:D});re=t;try{if(await t.expectSuccess(),!E)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!E)throw e}finally{re===t&&(re=void 0)}},Ce=async()=>{if(h===`webext`){await I();return}let e=Se(),t=L(),n=M?P():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),E&&await t}finally{A(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(_e&&(D={...D,[Gt]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(ue=await v.measure(`supervisor`,()=>Lt({cwd:e,env:r})))),E)return;if(h===`webext`){v.report(),await Ce();return}if(k.database?.dialect===`sqlite`){if(await v.measure(`database`,async()=>{let t=await de({config:k,cwd:e,env:r,tursoOutput:q.stdout,useSupervisorLease:!0});te=t,D={...D,...t.env}}),await v.measure(`schema`,()=>N({name:`db`,command:Cc,args:[`db`,`ensure`],cwd:e,env:D,prefix:!1})),E)return;oe({cwd:e,env:D,dialect:`sqlite`})}if(Lc(k)){let t=tt({label:`postgres`});t.pipe(q.stdout,{end:!1});try{let n=await v.measure(`database`,()=>Ic({config:k,cwd:e,env:D,failIfRunning:!0,interactive:l,isStopping:()=>E,postgresOutput:t,useSupervisorLease:!0}));if(!n)return;w=n,D={...D,...n.env};try{E||await v.measure(`schema`,()=>N({name:`db`,command:Cc,args:[`db`,`ensure`],cwd:e,env:D,prefix:!1})),E||(oe({cwd:e,env:D,dialect:`postgres`}),v.report(),await Ce())}finally{await n[Symbol.asyncDispose](),w===n&&(w=void 0)}}finally{t.end()}return}v.report(),await Ce()}finally{A(),await T?.close(),T=void 0;let e;try{await w?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await _e()}finally{try{await le?.close()}finally{ue?.close(),ce?.close();for(let{handler:e,signal:t}of ve)q.off(t,e)}}fe&&(q.exitCode??=fe===`SIGINT`?130:143)}Fc(e)}}async function Oc(e,t,n,r){for await(let i of jc(e,n,r))t.write(`${i}\n`)||await It(t,`drain`)}async function*kc(e,t){for await(let n of e)Ac(n.message)&&t(),yield n}function Ac(e){return typeof e==`string`&&e.trim()===Ec}async function*jc(e,t,n){for await(let r of e){let e=pe(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function Mc(e,t,n,r){for await(let i of Nc(e,n,r))t.write(`${i}\n`)||await It(t,`drain`)}async function*Nc(e,t,n){for await(let r of e)r.message&&t?.write(r.level,r.message,{properties:{stream:n}}),yield r.message}async function Pc(e,t){for await(let n of e)t.write(`${n}\n`)||await It(t,`drain`)}function Fc(e){if(e)throw e}async function Ic({interactive:e,isStopping:t,...n}){try{return await E(n)}catch(r){if(!(r instanceof h)||!e)throw r;let i=await B.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${r.pid}). Stop it and start here?`});if(B.isCancel(i)||!i){B.cancel(`Keeping the existing PostgreSQL process.`);return}return await fe(r),t()?void 0:E(n)}}function Lc(e){return(e.database?.dialect??`postgres`)===`postgres`}function Rc({host:e,port:t,strictPort:n=!1}){return[`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)],...n?[`--strictPort`]:[]]}function zc(e){if(e===void 0)return;let t=Number(e);if(!Number.isInteger(t)||t<=0||t>65535)throw Error(`COREFRAME_WEB_PORT must be a valid TCP port.`);return t}function Bc(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function Vc(e={}){let t=e.cwd??q.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await Ve(j.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Xe(n,t);if(!e.default||typeof e.default!=`object`)throw Error(`scripts/preview.ts must default-export preview hooks.`);for(let t of[`beforeBuild`,`afterBuild`])if(e.default[t]!==void 0&&typeof e.default[t]!=`function`)throw Error(`scripts/preview.ts ${t} must be a function.`);r=e.default}return Xt({...e,cwd:t},r)}const Hc=`worker-configuration.d.ts`;async function Uc({check:e=!1,cwd:t=process.cwd()}={}){let n=await G({cwd:t}),r=await gt({coreframeConfig:n,cwd:t}),i=P(t,Hc),a=P(t,`.coreframe-worker-types-${K()}.d.ts`);try{try{await F(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw Wc(e),e}let o=Gc(await H(a,`utf8`)),s=Qe(r.config),c=Ze(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${Kc(c)}\n`;if(e){if(await H(i,`utf8`).catch(()=>``)!==l)throw Error(`${Hc} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await H(i,`utf8`).catch(()=>``);return u!==l&&await W(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await U(a,{force:!0})}}function Wc(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
19
19
  `)?t:`${t}\n`)}function Gc(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
20
20
  `)}function Kc(e){return[`// Coreframe application string inventory declaration-merges with Wrangler's generated Env.`,`interface Env {`,...e.map(e=>` /** ${e.description.replaceAll(`*/`,`*\\/`)} */\n ${JSON.stringify(e.name)}?: string`),`}`].join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/scripts",
3
- "version": "0.2.37",
3
+ "version": "0.2.38",
4
4
  "description": "Coreframe project workflow CLI and automation scripts",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,16 +29,16 @@
29
29
  "nano-spawn": "^2.1.0",
30
30
  "procband": "^0.3.9",
31
31
  "yaml": "^2.9.0",
32
- "@coreframe/assets": "^0.1.17",
33
32
  "@coreframe/config": "^0.1.14",
34
33
  "@coreframe/db": "^0.1.21",
35
- "@coreframe/deploy": "^0.1.14",
36
34
  "@coreframe/dev": "^0.1.25",
35
+ "@coreframe/deploy": "^0.1.15",
37
36
  "@coreframe/dev-contracts": "^0.1.9",
38
37
  "@coreframe/flutter-tools": "^0.1.24",
39
38
  "@coreframe/jobs": "^0.1.1",
40
39
  "@coreframe/object-storage": "^0.1.4",
41
- "@coreframe/preview": "^0.1.21"
40
+ "@coreframe/preview": "^0.1.21",
41
+ "@coreframe/assets": "^0.1.17"
42
42
  },
43
43
  "devDependencies": {
44
44
  "@types/node": "^26.1.0",