@coreframe/scripts 0.2.30 → 0.2.31

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
@@ -11,7 +11,7 @@ import*as e from"@alloc/cmd-ts";import{command as t,extendType as n,flag as r,nu
11
11
  `)?`
12
12
  `:``;Ke(e,`${JSON.stringify(n,null,r)}${i}`)}function Fa(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function Ia(e){let t=F(Ta([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=q(t,`utf8`),r=Ea(n,t),i=Q(e.target),a=Ma(i),o=new Set(a.map(({name:e})=>e)),s=[],c=[],l=[],u=0;for(let e of a){let t=Na(r,e.name);if(!t){c.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(ka(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=wa.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>Oa(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;Pa(t,n,r)}console.log(`Coreframe package sync: ${i}`),console.log(``),Fa(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),Fa(`Missing target Coreframe packages`,c),Fa(`Locally linked Coreframe packages`,l),Fa(`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 La={...u,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return Rr(e)}},Ra=d({name:`upgrade`,cmds:{"ensure-template-remote":t({name:`ensure-template-remote`,args:{remote:o({long:`remote`,type:u,defaultValue:()=>`template`,description:`Remote name to ensure.`}),noFetch:r({long:`no-fetch`,description:`Do not fetch the remote after ensuring it exists.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t})=>Jr({fetch:!e,remote:t})}),"check-skill-current":t({name:`check-skill-current`,args:{target:o({long:`target`,type:u,description:`Target Coreframe template git ref.`}),apply:r({long:`apply`,description:`Replace the local upgrade skill with the target version when it differs.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>{process.exitCode=$i({apply:e,target:t})}}),"fast-forward-template-files":t({name:`fast-forward-template-files`,args:{target:o({long:`target`,type:u,description:`Target Coreframe template git ref.`}),base:o({long:`base`,type:s(u),description:`Previous Coreframe template git ref. Defaults to package.json engines.coreframe.`}),apply:r({long:`apply`,description:`Write clean fast-forwards to the worktree.`,defaultValue:()=>!1})},handler:({apply:e,base:t,target:n})=>Ca({apply:e,base:t,target:n})}),"sync-coreframe-packages":t({name:`sync-coreframe-packages`,args:{target:o({long:`target`,type:u,description:`Target Coreframe template git ref.`}),apply:r({long:`apply`,description:`Update existing published Coreframe dependency specifications.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>Ia({apply:e,target:t})})}}),za=d({name:`recipes`,cmds:{apply:t({name:`apply`,args:{recipe:c({type:La,displayName:`recipe`,description:`Recipe to prepare and apply.`}),target:o({long:`target`,type:s(u),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:o({long:`remote`,type:u,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:r({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>Di(Ei({fetch:!e,name:t,remote:n,target:r}))}),list:t({name:`list`,args:{target:o({long:`target`,type:s(u),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:o({long:`remote`,type:u,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:r({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t,target:n})=>Ki(Gi({fetch:!e,remote:t,target:n}))}),verify:t({name:`verify`,args:{recipe:c({type:La,displayName:`recipe`,description:`Recipe adoption to verify.`}),target:o({long:`target`,type:s(u),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:o({long:`remote`,type:u,defaultValue:()=>`template`,description:`Coreframe Git remote name.`}),noFetch:r({long:`no-fetch`,description:`Use already-fetched recipe refs without fetching the remote.`,defaultValue:()=>!1})},handler:({noFetch:e,recipe:t,remote:n,target:r})=>Ci(Si({fetch:!e,name:t,remote:n,target:r}))})}}),Ba=d({name:`db`,cmds:{ensure:t({name:`ensure`,args:{},handler:v}),generate:t({name:`generate`,args:{args:l({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>T(`generate`,e)}),migrate:t({name:`migrate`,args:{args:l({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>T(`migrate`,e)}),"migrate-held":t({name:`migrate-held`,args:{local:r({long:`local`,description:`Run held migrations against the Coreframe-managed local PostgreSQL database.`,defaultValue:()=>!1})},handler:({local:e})=>S({target:e?`local`:`deployment`})}),"migrate-local":t({name:`migrate-local`,args:{},handler:C}),"migrations-check":t({name:`migrations-check`,args:{},handler:p}),reset:t({name:`reset`,args:{},handler:te}),seed:t({name:`seed`,args:{},handler:()=>E()}),"schema-check":t({name:`schema-check`,args:{seed:r({long:`seed`,description:`Run the configured project seed against the throwaway database.`,defaultValue:()=>!1})},handler:({seed:e})=>m({seed:e})}),setup:t({name:`setup`,args:{},handler:()=>re()}),studio:t({name:`studio`,args:{args:l({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>T(`studio`,e)})}}),Va=`package.json`;async function Ha(e=process.argv.slice(2),t=process.env){let n=Ua(e);Za(n);let{packageJson:r,source:i}=await mt(Va),a=await U(),o=vt(a.deploy,n.environment,t);Qa(n,o.mode),no(t,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let s=await $a(o,n.environment,()=>it({env:t})),c=o.mode===`full`?await Ga(n.environment,t):void 0,l=await Xa();await Xn({env:t,revision:l});let u=l.slice(0,12),d=yt(n.environment,r.version,u),f=_t(r.name,d),p={...oo(t,n.environment,f,r.name,d),COREFRAME_I18N_RELEASE_REVISION:l},m=n.environment===`production`,h=!1;R.intro(`Deploy ${f} to ${n.environment}`);let g=Object.keys(c?.pendingWorkerSecrets.values??{}).sort();g.length>0&&R.note(g.join(`
13
13
  `),`Pending Worker secret updates`),c?.accessTokenSigningSecret.provisioned&&R.log.info(`Provisioning Coreframe-managed access-token signing material.`),await to(n);let _=o.mode===`full`?await Ka(a,n,t):!1;try{m&&await Tt(Va,r,d),R.log.step(`Running pre-deploy build`),await L(`pnpm`,[`build`],{env:so(p),stdio:`inherit`}),R.log.step(`Running release build and uploading PostHog source maps`),h=!0,await L(`pnpm`,[`build`],{env:p,stdio:`inherit`}),_&&(R.log.step(`Running deploy-safe database migrations`),await L(`pnpm`,[`db`,`migrate`],{env:p,stdio:`inherit`})),R.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?{[et]:c.accessTokenSigningSecret.value}:{},...c?.pendingWorkerSecrets.values},t=Object.keys(e).length>0?await io(e):void 0,i=o.mode===`full`?await st({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:f}}}):await ot(process.cwd());try{await L(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,i.path,...o.mode===`full`?[`--env`,n.environment]:[],`--strict`,`--keep-vars`,`--tag`,f,`--message`,`Deploy ${f}`,...t?[`--secrets-file`,t.path]:[]],{env:p,stdio:`inherit`}),c&&(await tt(c.pendingWorkerSecrets),await wt({environment:n.environment}))}finally{await i.dispose(),await t?.dispose()}let l={environment:n.environment,releaseName:f,url:s,version:d};o.mode===`full`&&o.afterWorkerDeploy&&(R.log.step(`Running required after-Worker deploy hook`),await xt(o,l)),n.skipPostDeployChecks||(R.log.step(`Running post-deploy checks`),await St(o,l)),R.outro(`Deployed ${f} to ${n.environment}`)}catch(e){throw!h&&m&&await H(Va,i),e}}function Ua(e){return{environment:Wa(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),yes:e.includes(`--yes`)}}function Wa(e){if(e&&nt.includes(e))return e;throw Error(`Deploy environment must be one of: ${nt.join(`, `)}.`)}async function Ga(e,t){let n=await ht({environment:e}),r=n.values.DASHBOARD_PASSWORD??await ro(t,e);return Ct(await at({environment:e}),e,{availableNames:[...Object.keys(n.values),...r?[`DASHBOARD_PASSWORD`]:[]]}),{accessTokenSigningSecret:await ut({environment:e}),dashboardPassword:r,pendingWorkerSecrets:n}}async function Ka(e,t,n){let r=e.database?.dialect??`postgres`,i;switch(r){case`postgres`:i=await g({env:n});break;case`sqlite`:i=await _({env:n});break;default:throw Error(`Unsupported database dialect "${r}".`)}let a=await qa(i),o=await ne(a);if(o.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${x(o)}`);return Ya(t,a)}async function qa(e){try{return await Ja(e)}finally{await e.close?.()}}async function Ja(e){return ee(await h(),await w(e))}async function Ya(e,t){if(t.length===0)return R.log.info(`No pending deploy migrations.`),!1;if(R.note(b(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 R.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(R.isCancel(n))throw R.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function Xa(){let{stdout:e}=await L(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await L(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function Za(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}function Qa(e,t){if(t===`client`&&(e.runMigrations||e.skipMigrations))throw Error(`Migration flags are not available when deploy.mode is "client".`)}async function $a(e,t,n=it){return e.url?eo(e.url,t):t===`staging`&&e.stagingHostname?eo(await n(),t):eo(void 0,t)}function eo(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 to(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await R.confirm({initialValue:!1,message:`Deploy to production?`});if(R.isCancel(t)||!t)throw R.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function no(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 ro(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Dt(await B(`.env`,`utf8`))}catch(e){throw ao(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 io(e){let t=await Ee(N(Me(),`coreframe-deploy-secrets-`)),n=N(t,`secrets.json`);return await H(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>V(t,{force:!0,recursive:!0})}}function ao(e){return e instanceof Error&&`code`in e}function oo(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 so(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}async function co(){let e=await uo();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function lo(e){let t=await uo(),n=fo();await Z.mkdir(A.dirname(n),{recursive:!0}),await Z.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function uo(){try{let e=await Z.readFile(fo(),`utf8`),t=JSON.parse(e);return po(t)?t:{}}catch{return{}}}function fo(){return A.join(Tr.homedir(),`.coreframe`,`preferences.json`)}function po(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function mo({env:e=G.env,interactive:t=G.stdin.isTTY===!0,platform:n,target:r}){let i=await xo(n,e).catch(()=>[]),a=r?zo(i,r):void 0;if(a)return a;if(!r&&i.length>0)return bo(i,n,t);let o=r?zo(await Co(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return wo(o,n,e,t);let s=await So(n,e),c=r?zo(s,r):void 0;if(c)return c;if(!r&&s.length>0)return bo(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 ho(e){let{device:t,host:n,interactive:r=G.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=Vo();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await vo();if(a&&i.includes(a))return a;if(i.length===1)return await yo(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await R.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(R.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await yo(o),o}async function go({device:e,env:t=G.env,host:n,interactive:r,platform:i,port:a}){if(i===`android`&&e.physical&&n===void 0)try{return await Mo(e.id,a,t)}catch{R.log.warn(`Could not establish Android ADB port forwarding. Using the LAN development address instead.`)}return{close:async()=>void 0,serverUrl:_o(i,await ho({device:e,host:n,interactive:r,platform:i}),a),viteHost:!0}}function _o(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 vo(){return(await co()).mobileDevHost}async function yo(e){try{await lo({mobileDevHost:e})}catch(e){R.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function bo(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 R.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(R.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function xo(e,t){return e===`android`?Eo(t):Oo(t)}async function So(e,t){return e===`android`?Do(t):ko(t)}async function Co(e){let{stdout:t}=await L(`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 wo(e,t,n,r){let i=await To(t,n).catch(()=>[]),{stdout:a}=await L(`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 To(t,n).catch(()=>[]),o=zo(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return bo(s,t,r);if(a.length===1)return a[0];await Bt(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 To(e,t){return e===`ios`?ko(t,`booted`):(await Eo(t)).filter(e=>!e.physical)}async function Eo(e){let t=await jo(e,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await L(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 Po(t,e,n,`ro.product.model`),i=n.startsWith(`emulator-`),a=i?await Io(t,e,n,r):await Lo(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(Ho)}async function Do(e){let{stdout:t}=await L(await jo(e,`emulator`,G.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 Oo(e){let t=await Z.mkdtemp(A.join(Tr.tmpdir(),`coreframe-ios-devices-`)),n=A.join(t,`devices.json`);try{return await Z.writeFile(n,``),await L(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await Z.readFile(n,`utf8`)).result?.devices??[]).filter(Ao).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(Ho)}finally{await Z.rm(t,{force:!0,recursive:!0})}}async function ko(e,t=`available`){let{stdout:n}=await L(`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(Ho)}function Ao(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 jo(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:No(e);for(let e of i){let r=A.join(e,t,n);try{return await Z.access(r),r}catch{}}return n}async function Mo(e,t,n){let r=await jo(n,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:i}=await L(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 L(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 No(e){return G.platform===`darwin`?[A.join(Tr.homedir(),`Library`,`Android`,`sdk`)]:G.platform===`win32`&&e.LOCALAPPDATA?[A.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[A.join(Tr.homedir(),`Android`,`Sdk`)]}async function Po(e,t,n,r){return(await Fo(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function Fo(e,t,n){return(await L(e,n,{env:t,timeout:3e3})).stdout}async function Io(e,t,n,r){return Fo(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function Lo(e,t,n,r){return Fo(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>Ro(e)||r).catch(()=>r)}function Ro(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function zo(e,t){let n=e.map(e=>({device:e,score:Math.max(Bo(t,e.name),Bo(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function Bo(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 Vo(){return[...new Set(Object.values(Tr.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function Ho(e,t){return e.label.localeCompare(t.label)}var Uo=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(!Jo(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:Jo(e.params)?e.params:{}};this.#l(t),await this.#e?.(t),n.push(...Go(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(!Jo(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=Xo(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(Yo(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(Xo(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*Wo(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 Go({event:e,params:t},n){if(e===`daemon.log`||e===`app.log`)return $(qo(t.log),t.error===!0?`error`:`debug`);if(e===`daemon.logMessage`){let e=Ko(t.level);return!n&&e===`debug`?[]:[...$(qo(t.message),e),...n?$(qo(t.stackTrace),e):[]]}return e===`daemon.showMessage`?$(qo(t.message),Ko(t.level)):e===`app.warning`?$(qo(t.warning),`warn`):e===`app.progress`&&t.finished!==!0?$(qo(t.message),`debug`):e===`app.stop`&&t.error!==void 0?$(Yo(t.error),`error`):[]}function $(e,t){return e===void 0?[]:e.split(/\r?\n/u).map(e=>({level:t,message:e}))}function Ko(e){return e===`error`?`error`:e===`warning`||e===`warn`?`warn`:`debug`}function qo(e){return typeof e==`string`&&e.length>0?e:void 0}function Jo(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Yo(e){if(typeof e==`string`)return e;if(Jo(e)&&typeof e.message==`string`)return e.message;try{return JSON.stringify(e)??String(e)}catch{return String(e)}}function Xo(e){return e instanceof Error?e:Error(Yo(e))}async function Zo(e,t){if(!e)return()=>void 0;Be(A.dirname(e),{recursive:!0}),Ke(e,``,{flag:`a`});let n;try{n=q(e,`utf8`)}catch{n=void 0}let r=0,i=!1,a=Ge(e,{persistent:!1},()=>{if(i)return;let a=++r;B(e,`utf8`).then(e=>{i||a!==r||e===n||(n=e,t())},()=>void 0)});return()=>{i=!0,a.close()}}function Qo(e,t){let n={...e};return t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const $o=G.platform===`win32`?`portless.cmd`:`portless`,es=RegExp(`\x1B\\[[0-?]*[ -/]*[@-~]`,`g`),ts=/^Proxy is already running on port (\d+)\.$/,ns=/^To restart: portless proxy stop(?: (?:-p|--port) \d+)? && portless proxy start(?: (?:-p|--port) \d+)?$/;function rs(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(es,``).trim().match(ts);if(a?.[1]!==void 0&&i!==void 0&&ns.test(i.replace(es,``).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 is(e){let t=rs(e);t&&G.stdout.write(t.endsWith(`
14
- `)?t:`${t}\n`)}async function as({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await Vt()).isAgent?!1:Pt(e)}async function os({cwd:e,env:t,lan:n=!1}){let r=A.join(`node_modules`,`.bin`,$o),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await L(A.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});is(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&is(e.stdout),e}}function ss({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 cs=A.join(`.coreframe`,`dev`,`session.json`);async function ls({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=A.resolve(t,cs),d=A.dirname(u),f={version:2,id:a,pid:c,projectRoot:A.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:A.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 z(d,{recursive:!0});let t=A.join(d,`.session-${a}.json`);await H(t,e,{mode:384}),await Ce(t,384),await Oe(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=fs(t.appId),i;if(e===`daemon.connected`){let e=ps(t.pid),r=fs(t.version);i={...us(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...us(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=fs(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=fs(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=fs(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=ds(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:ds(f.flutter)},await m())},async close(){await p;try{JSON.parse(await B(u,`utf8`)).id===a&&await V(u,{force:!0})}catch(e){if(e.code!==`ENOENT`)throw e}}}}function us(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 ds(e){return{...us(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function fs(e){return typeof e==`string`?e:void 0}function ps(e){return typeof e==`number`?e:void 0}const ms=`extension:dev`;function hs(e){if(!K(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(q(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.${ms} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function gs({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`,ms,...n.length>0?[`--`,...n]:[]]}const _s=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],vs=[`managed-dev-overlay`],ys=A.resolve(`node_modules`,`.bin`),bs=G.platform===`win32`?`pnpm.cmd`:`pnpm`,xs=G.platform===`win32`?`portless.cmd`:`portless`,Ss=G.platform===`win32`?`react-router.cmd`:`react-router`,Cs=`Lost connection to device.`;async function ws({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,flutterDebug:i=!1,flutterMcp:a=!1,flutterOutput:o=`filtered`,host:s,https:c=!1,interactive:l=G.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=At({env:r}),ee=r.PATH??r.Path??``,y=Ls(h)?h:void 0,b=qt(i||a),x=Is(_??r.COREFRAME_WEB_PORT),S,C,w,te,T,ne,E,re,ie,oe,se,ce,ue,D=!1,O,k=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.`);hs(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 fe=await v.measure(`routing`,()=>as({cwd:e,env:r,platform:h}));fe&&await v.measure(`portless`,()=>os({cwd:e,env:r,lan:u}));let j=y===void 0?h===`web`?x??await wr.getAvailablePort():h===`webext`?x:void 0:x??await wr.getAvailablePort(),M,N=new Promise(e=>{M=e}),P=()=>{D||(D=!0,M(),C?.kill(`SIGTERM`),ne?.kill(`SIGTERM`),E?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),re?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ie?.close().catch(()=>void 0),S?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),F().catch(()=>void 0))},F=()=>te?(T??=te[Symbol.asyncDispose](),T):Promise.resolve(),I=e=>{O??=e,P()},pe=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>I(e);return G.on(e,t),{handler:t,signal:e}}),me=async e=>{let t=Ye(e);C=t;try{await t.expectSuccess()}catch(e){if(!D)throw e}finally{C===t&&(C=void 0)}};try{se=y?zt({path:A.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await mo({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&Jt({device:_,mode:b,platform:i});let x=y?se?.logger({scope:`dev.flutter`,properties:{platform:y,..._?{deviceId:_.id}:void 0}}):void 0;oe=i&&_&&j!==void 0?await go({device:_,env:r,host:s,interactive:l,platform:i,port:j}):void 0;let C=oe?.viteHost??(y?i?!0:`127.0.0.1`:s),T=j===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${j}`,O=y===void 0?T:oe?.serverUrl??_o(y,void 0,j),M={},F=!1,I;[M,F]=await Promise.all([v.measure(`config`,()=>U({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await Nt(e))]),await v.measure(`i18n`,()=>Jn({cwd:e,projectConfig:M})),I=h!==`webext`&&jr(e)?await wr.getAvailablePort():void 0;let pe=await v.measure(`https`,async()=>c&&!fe?Ft({cwd:e}):void 0),he=Qo(r,h);k={...he,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[It]:W()}:void 0,...y?{COREFRAME_PLATFORM:y,[Rt]:A.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...pe?{[jt]:pe.cert,[Mt]:pe.key}:void 0,...I?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${I}`}:void 0},T!==void 0&&O!==void 0&&(ce=await ls({appOrigin:O,cwd:e,device:_,flutterMcp:a,flutterMode:y===void 0?void 0:b,id:W(),localOrigin:T,platform:h}));let ge=async()=>{if(!I)return;let t=Mr({cwd:e,env:k,port:I});ie=t;try{await t.listen(),await t.wait()}finally{await t.close(),ie===t&&(ie=void 0)}},_e=async()=>{let t=Je({label:`web`}),n=Je({color:`red`,label:`web`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),E=L(fe?xs:Ss,fe?ss({host:C,lan:u,port:j}):Fs({host:C,port:j,strictPort:h===`web`||y!==void 0}),{cwd:e,env:{...k,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[k.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:ys+A.delimiter+ee},stdin:`inherit`});let r=Promise.allSettled([js(E.stdout,t),js(E.stderr,n)]);try{await E;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!D)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([qe(t),qe(n)]),E=void 0}},ve=async()=>{let t=Je({label:`webext`}),n=Je({color:`red`,label:`webext`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),re=L(bs,gs({host:s,port:j}),{cwd:e,env:k,stdin:`inherit`});let r=Promise.allSettled([js(re.stdout,t),js(re.stderr,n)]);try{await re;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!D)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([qe(t),qe(n)]),re=void 0}},ye=async t=>{let n,r,i=!1,s,c=Zo(k[Rt],()=>{if(D||!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`}}),G.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`}}),G.stderr.write(`Flutter restart failed: ${t}\n`)}).finally(()=>{s=void 0})});try{for(;!D;){i=!1;let s=!1,c=h===`android`&&o===`filtered`&&!g?await de():void 0,u=L(`flutter`,Yt({device:_??{id:h},flutterDriver:a,mode:b,serverUrl:O,verbose:g}),{cwd:A.join(e,`src-flutter`),env:Kt(he,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new Uo({onEvent:async e=>{Ds(e.params.message)&&(s=!0),await ce?.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 Ot(t.stdin,`drain`)}}),p=e=>Es(Wo(e,d),()=>s=!0);S=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(As(p(u),x,`output`)):Promise.all([ks(p(u.stdout),G.stdout,x,`stdout`),Ts(u.stderr,G.stderr,x,`stderr`)]);await Promise.all([u,e])}catch{e=!0}if(i&&!D)continue;if(D||!e&&!s)return;let n=l?await R.confirm({initialValue:!0,message:s?`${Cs} Restart Flutter?`:`Flutter failed. Retry?`}):!1;if(R.isCancel(n)||!n){R.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),await(t??N);return}}finally{S===u&&(S=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),ce?.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)()}},be=async()=>{if(h===`web`){await _e();return}let t=_e().then(()=>{if(!D)throw Error(`The Vite development server stopped while Flutter was still running.`)});await le({cwd:e});try{await Promise.race([t,ye(t)])}finally{P(),await Promise.allSettled([t,S]),S=void 0}},xe=async()=>{let t=Ye({name:`panda`,command:bs,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:k});ne=t;try{if(await t.expectSuccess(),!D)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!D)throw e}finally{ne===t&&(ne=void 0)}},Se=async()=>{if(h===`webext`){await ve();return}let e=xe(),t=be(),n=I?ge():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),D&&await t}finally{P(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(F&&(k={...k,[Lt]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(ue=await v.measure(`supervisor`,()=>kt({cwd:e,env:r})))),D)return;if(h===`webext`){v.report(),await Se();return}if(M.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await ae({config:M,cwd:e,env:r,tursoOutput:G.stdout,useSupervisorLease:!0});te=t,k={...k,...t.env}}),await v.measure(`schema`,()=>me({name:`db`,command:bs,args:[`db`,`ensure`],cwd:e,env:k,prefix:!1})),D))return;if(Ps(M)){let t=Je({label:`postgres`});t.pipe(G.stdout,{end:!1});try{let n=await v.measure(`database`,()=>Ns({config:M,cwd:e,env:k,failIfRunning:!0,interactive:l,isStopping:()=>D,postgresOutput:t,useSupervisorLease:!0}));if(!n)return;w=n,k={...k,...n.env};try{D||await v.measure(`schema`,()=>me({name:`db`,command:bs,args:[`db`,`ensure`],cwd:e,env:k,prefix:!1})),D||(v.report(),await Se())}finally{await n[Symbol.asyncDispose](),w===n&&(w=void 0)}}finally{t.end()}return}v.report(),await Se()}finally{P(),await oe?.close(),oe=void 0;let e;try{await w?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await F()}finally{try{await ce?.close()}finally{ue?.close(),se?.close();for(let{handler:e,signal:t}of pe)G.off(t,e)}}O&&(G.exitCode??=O===`SIGINT`?130:143)}Ms(e)}}async function Ts(e,t,n,r){for await(let i of Os(e,n,r))t.write(`${i}\n`)||await Ot(t,`drain`)}async function*Es(e,t){for await(let n of e)Ds(n.message)&&t(),yield n}function Ds(e){return typeof e==`string`&&e.trim()===Cs}async function*Os(e,t,n){for await(let r of e){let e=ce(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function ks(e,t,n,r){for await(let i of As(e,n,r))t.write(`${i}\n`)||await Ot(t,`drain`)}async function*As(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 js(e,t){for await(let n of e)t.write(`${n}\n`)||await Ot(t,`drain`)}function Ms(e){if(e)throw e}async function Ns({interactive:e,isStopping:t,...n}){try{return await ie(n)}catch(r){if(!(r instanceof f)||!e)throw r;let i=await R.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${r.pid}). Stop it and start here?`});if(R.isCancel(i)||!i){R.cancel(`Keeping the existing PostgreSQL process.`);return}return await oe(r),t()?void 0:ie(n)}}function Ps(e){return(e.database?.dialect??`postgres`)===`postgres`}function Fs({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 Is(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 Ls(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function Rs(e={}){let t=e.cwd??G.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await Se(A.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Pe(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 Ht({...e,cwd:t},r)}const zs=`worker-configuration.d.ts`;async function Bs({check:e=!1,cwd:t=process.cwd()}={}){let n=await U({cwd:t}),r=await ct({coreframeConfig:n,cwd:t}),i=F(t,zs),a=F(t,`.coreframe-worker-types-${W()}.d.ts`);try{try{await L(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw Vs(e),e}let o=Hs(await B(a,`utf8`)),s=Ie(r.config),c=Fe(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${Us(c)}\n`;if(e){if(await B(i,`utf8`).catch(()=>``)!==l)throw Error(`${zs} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await B(i,`utf8`).catch(()=>``);return u!==l&&await H(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await V(a,{force:!0})}}function Vs(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
14
+ `)?t:`${t}\n`)}async function as({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await Vt()).isAgent?!1:Pt(e)}async function os({cwd:e,env:t,lan:n=!1}){let r=A.join(`node_modules`,`.bin`,$o),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await L(A.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});is(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&is(e.stdout),e}}function ss({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 cs=A.join(`.coreframe`,`dev`,`session.json`);async function ls({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=A.resolve(t,cs),d=A.dirname(u),f={version:2,id:a,pid:c,projectRoot:A.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:A.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 z(d,{recursive:!0});let t=A.join(d,`.session-${a}.json`);await H(t,e,{mode:384}),await Ce(t,384),await Oe(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=fs(t.appId),i;if(e===`daemon.connected`){let e=ps(t.pid),r=fs(t.version);i={...us(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...us(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=fs(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=fs(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=fs(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=ds(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:ds(f.flutter)},await m())},async close(){await p;try{JSON.parse(await B(u,`utf8`)).id===a&&await V(u,{force:!0})}catch(e){if(e.code!==`ENOENT`)throw e}}}}function us(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 ds(e){return{...us(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function fs(e){return typeof e==`string`?e:void 0}function ps(e){return typeof e==`number`?e:void 0}const ms=`extension:dev`;function hs(e){if(!K(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(q(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.${ms} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function gs({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`,ms,...n.length>0?[`--`,...n]:[]]}const _s=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],vs=[`managed-dev-overlay`],ys=A.resolve(`node_modules`,`.bin`),bs=G.platform===`win32`?`pnpm.cmd`:`pnpm`,xs=G.platform===`win32`?`portless.cmd`:`portless`,Ss=G.platform===`win32`?`react-router.cmd`:`react-router`,Cs=`Lost connection to device.`;async function ws({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,flutterDebug:i=!1,flutterMcp:a=!1,flutterOutput:o=`filtered`,host:s,https:c=!1,interactive:l=G.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=At({env:r}),ee=r.PATH??r.Path??``,y=Ls(h)?h:void 0,b=qt(i||a),x=Is(_??r.COREFRAME_WEB_PORT),S,C,w,te,T,ne,E,re,ie,oe,se,ce,ue,D=!1,O,k=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.`);hs(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 fe=await v.measure(`routing`,()=>as({cwd:e,env:r,platform:h}));fe&&await v.measure(`portless`,()=>os({cwd:e,env:r,lan:u}));let j=y===void 0?h===`web`?x??await wr.getAvailablePort():h===`webext`?x:void 0:x??await wr.getAvailablePort(),M,N=new Promise(e=>{M=e}),P=()=>{D||(D=!0,M(),C?.kill(`SIGTERM`),ne?.kill(`SIGTERM`),E?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),re?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ie?.close().catch(()=>void 0),S?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),F().catch(()=>void 0))},F=()=>te?(T??=te[Symbol.asyncDispose](),T):Promise.resolve(),I=e=>{O??=e,P()},pe=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>I(e);return G.on(e,t),{handler:t,signal:e}}),me=async e=>{let t=Ye(e);C=t;try{await t.expectSuccess()}catch(e){if(!D)throw e}finally{C===t&&(C=void 0)}};try{se=y?zt({path:A.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await mo({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&Jt({device:_,mode:b,platform:i});let x=y?se?.logger({scope:`dev.flutter`,properties:{platform:y,..._?{deviceId:_.id}:void 0}}):void 0;oe=i&&_&&j!==void 0?await go({device:_,env:r,host:s,interactive:l,platform:i,port:j}):void 0;let C=oe?.viteHost??(y?i?!0:`127.0.0.1`:s),T=j===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${j}`,O=y===void 0?T:oe?.serverUrl??_o(y,void 0,j),M={},F=!1,I;[M,F]=await Promise.all([v.measure(`config`,()=>U({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await Nt(e))]),await v.measure(`i18n`,()=>Jn({cwd:e,projectConfig:M})),I=h!==`webext`&&jr(e)?await wr.getAvailablePort():void 0;let pe=await v.measure(`https`,async()=>c&&!fe?Ft({cwd:e}):void 0),he=Qo(r,h);k={...he,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[It]:W()}:void 0,...y?{COREFRAME_PLATFORM:y,[Rt]:A.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...pe?{[jt]:pe.cert,[Mt]:pe.key}:void 0,...I?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${I}`}:void 0},T!==void 0&&O!==void 0&&(ce=await ls({appOrigin:O,cwd:e,device:_,flutterMcp:a,flutterMode:y===void 0?void 0:b,id:W(),localOrigin:T,platform:h}));let ge=async()=>{if(!I)return;let t=Mr({cwd:e,env:k,port:I});ie=t;try{await t.listen(),await t.wait()}finally{await t.close(),ie===t&&(ie=void 0)}},_e=async()=>{let t=Je({label:`web`}),n=Je({color:`red`,label:`web`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),E=L(fe?xs:Ss,fe?ss({host:C,lan:u,port:j}):Fs({host:C,port:j,strictPort:h===`web`||y!==void 0}),{cwd:e,env:{...k,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[k.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:ys+A.delimiter+ee},stdin:`inherit`});let r=Promise.allSettled([js(E.stdout,t),js(E.stderr,n)]);try{await E;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!D)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([qe(t),qe(n)]),E=void 0}},ve=async()=>{let t=Je({label:`webext`}),n=Je({color:`red`,label:`webext`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),re=L(bs,gs({host:s,port:j}),{cwd:e,env:k,stdin:`inherit`});let r=Promise.allSettled([js(re.stdout,t),js(re.stderr,n)]);try{await re;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!D)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([qe(t),qe(n)]),re=void 0}},ye=async t=>{let n,r,i=!1,s,c=Zo(k[Rt],()=>{if(D||!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`}}),G.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`}}),G.stderr.write(`Flutter restart failed: ${t}\n`)}).finally(()=>{s=void 0})});try{for(;!D;){i=!1;let s=!1,c=h===`android`&&o===`filtered`&&!g?await de():void 0,u=L(`flutter`,Yt({device:_??{id:h},flutterDriver:a,mode:b,serverUrl:O,verbose:g}),{cwd:A.join(e,`src-flutter`),env:Kt(he,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new Uo({onEvent:async e=>{Ds(e.params.message)&&(s=!0),await ce?.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 Ot(t.stdin,`drain`)}}),p=e=>Es(Wo(e,d),()=>s=!0);S=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(As(p(u),x,`output`)):Promise.all([ks(p(u.stdout),G.stdout,x,`stdout`),Ts(u.stderr,G.stderr,x,`stderr`)]);await Promise.all([u,e])}catch{e=!0}if(i&&!D)continue;if(D)return;let n=l?await R.confirm({initialValue:!0,message:s?`${Cs} Restart Flutter?`:e?`Flutter failed. Retry?`:`Flutter exited unexpectedly. Restart Flutter?`}):!1;if(R.isCancel(n)||!n){if(!e&&!s){R.log.warn(`Flutter exited unexpectedly.`);return}R.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),await(t??N);return}}finally{S===u&&(S=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),ce?.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)()}},be=async()=>{if(h===`web`){await _e();return}let t=_e().then(()=>{if(!D)throw Error(`The Vite development server stopped while Flutter was still running.`)});await le({cwd:e});try{await Promise.race([t,ye(t)])}finally{P(),await Promise.allSettled([t,S]),S=void 0}},xe=async()=>{let t=Ye({name:`panda`,command:bs,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:k});ne=t;try{if(await t.expectSuccess(),!D)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!D)throw e}finally{ne===t&&(ne=void 0)}},Se=async()=>{if(h===`webext`){await ve();return}let e=xe(),t=be(),n=I?ge():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),D&&await t}finally{P(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(F&&(k={...k,[Lt]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(ue=await v.measure(`supervisor`,()=>kt({cwd:e,env:r})))),D)return;if(h===`webext`){v.report(),await Se();return}if(M.database?.dialect===`sqlite`&&(await v.measure(`database`,async()=>{let t=await ae({config:M,cwd:e,env:r,tursoOutput:G.stdout,useSupervisorLease:!0});te=t,k={...k,...t.env}}),await v.measure(`schema`,()=>me({name:`db`,command:bs,args:[`db`,`ensure`],cwd:e,env:k,prefix:!1})),D))return;if(Ps(M)){let t=Je({label:`postgres`});t.pipe(G.stdout,{end:!1});try{let n=await v.measure(`database`,()=>Ns({config:M,cwd:e,env:k,failIfRunning:!0,interactive:l,isStopping:()=>D,postgresOutput:t,useSupervisorLease:!0}));if(!n)return;w=n,k={...k,...n.env};try{D||await v.measure(`schema`,()=>me({name:`db`,command:bs,args:[`db`,`ensure`],cwd:e,env:k,prefix:!1})),D||(v.report(),await Se())}finally{await n[Symbol.asyncDispose](),w===n&&(w=void 0)}}finally{t.end()}return}v.report(),await Se()}finally{P(),await oe?.close(),oe=void 0;let e;try{await w?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await F()}finally{try{await ce?.close()}finally{ue?.close(),se?.close();for(let{handler:e,signal:t}of pe)G.off(t,e)}}O&&(G.exitCode??=O===`SIGINT`?130:143)}Ms(e)}}async function Ts(e,t,n,r){for await(let i of Os(e,n,r))t.write(`${i}\n`)||await Ot(t,`drain`)}async function*Es(e,t){for await(let n of e)Ds(n.message)&&t(),yield n}function Ds(e){return typeof e==`string`&&e.trim()===Cs}async function*Os(e,t,n){for await(let r of e){let e=ce(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function ks(e,t,n,r){for await(let i of As(e,n,r))t.write(`${i}\n`)||await Ot(t,`drain`)}async function*As(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 js(e,t){for await(let n of e)t.write(`${n}\n`)||await Ot(t,`drain`)}function Ms(e){if(e)throw e}async function Ns({interactive:e,isStopping:t,...n}){try{return await ie(n)}catch(r){if(!(r instanceof f)||!e)throw r;let i=await R.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${r.pid}). Stop it and start here?`});if(R.isCancel(i)||!i){R.cancel(`Keeping the existing PostgreSQL process.`);return}return await oe(r),t()?void 0:ie(n)}}function Ps(e){return(e.database?.dialect??`postgres`)===`postgres`}function Fs({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 Is(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 Ls(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function Rs(e={}){let t=e.cwd??G.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await Se(A.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Pe(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 Ht({...e,cwd:t},r)}const zs=`worker-configuration.d.ts`;async function Bs({check:e=!1,cwd:t=process.cwd()}={}){let n=await U({cwd:t}),r=await ct({coreframeConfig:n,cwd:t}),i=F(t,zs),a=F(t,`.coreframe-worker-types-${W()}.d.ts`);try{try{await L(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw Vs(e),e}let o=Hs(await B(a,`utf8`)),s=Ie(r.config),c=Fe(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${Us(c)}\n`;if(e){if(await B(i,`utf8`).catch(()=>``)!==l)throw Error(`${zs} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await B(i,`utf8`).catch(()=>``);return u!==l&&await H(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await V(a,{force:!0})}}function Vs(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
15
15
  `)?t:`${t}\n`)}function Hs(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
16
16
  `)}function Us(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(`
17
17
  `)}const Ws=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),Gs=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],Ks=[`dashboard`,`node_modules/@coreframe/dashboard/dist/package/app`,`node_modules/@coreframe/dashboard/package.json`,`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`],qs=[`coreframe.config.ts`,`node_modules/@coreframe/config/dist`,`node_modules/@coreframe/config/package.json`,`node_modules/@coreframe/deploy/dist`,`node_modules/@coreframe/deploy/package.json`,`node_modules/wrangler/package.json`,`package.json`,`pnpm-lock.yaml`,`src/api`,`wrangler.jsonc`],Js=`.coreframe/typegen.json`,Ys=[`web`,`dashboard`,`worker`];async function Xs({checkWorker:e=!1,cwd:t=G.cwd(),runners:n={}}={}){let r=await ec(t)??{generators:{},schemaVersion:1},i=[];return i.push(await Qs({cwd:t,inputPaths:Gs,name:`web`,outputPath:`.react-router`,run:()=>(n.web??$s)(t),state:r})),i.push(await Qs({cwd:t,inputPaths:Ks,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??yr)(t),state:r})),i.push(await Qs({cwd:t,inputPaths:qs,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??Bs)({check:e,cwd:t}),state:r})),i}function Zs(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function Qs({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await nc(e,t),s=await rc(e,r),c=a.generators[n];if(s&&c?.inputFingerprint===o&&c.outputFingerprint===s)return{changed:!1,name:n,ran:!1};await i();let l=await rc(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await tc(e,a),{changed:s!==l,name:n,ran:!0}}async function $s(e){let t=G.platform===`win32`?`react-router.cmd`:`react-router`,n=G.env;await L(t,[`typegen`],{cwd:e,env:{...n,PATH:A.resolve(e,`node_modules/.bin`)+A.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function ec(e){try{let t=JSON.parse(await B(A.resolve(e,Js),`utf8`));if(!sc(t)||t.schemaVersion!==1)return;let n={};if(!sc(t.generators))return;for(let e of Ys){let r=t.generators[e];sc(r)&&typeof r.inputFingerprint==`string`&&typeof r.outputFingerprint==`string`&&(n[e]={inputFingerprint:r.inputFingerprint,outputFingerprint:r.outputFingerprint})}return{generators:n,schemaVersion:1}}catch{return}}async function tc(e,t){let n=A.resolve(e,Js);await z(A.dirname(n),{recursive:!0}),await H(n,`${JSON.stringify(t)}\n`,{mode:384})}async function nc(e,t){let n=Le(`sha256`);for(let r of[...t].sort()){let t=A.resolve(e,r),i=await ac(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await ic(t)){let i=A.join(t,r),a=A.relative(e,i).split(A.sep).join(`/`);n.update(`${a}\0`),n.update(await B(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await B(t)))}return n.digest(`hex`)}async function rc(e,t){if(await ac(A.resolve(e,t)))return nc(e,[t])}async function ic(e){let t=[];async function n(e,r){let i=await De(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(Ws.has(a.name))continue;await n(A.join(e,a.name),A.join(r,a.name))}else a.isFile()&&t.push(A.join(r,a.name))}return await n(e,``),t.sort()}async function ac(e){try{return await ke(e)}catch(e){if(oc(e))return;throw e}}function oc(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function sc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const cc=A.resolve(`node_modules`,`.bin`);G.env.PATH=cc+A.delimiter+G.env.PATH;const lc=G.platform===`win32`?`tsc.cmd`:`tsc`,uc=[{name:`scripts`,path:`scripts/tsconfig.json`},{name:`shared`,path:`src/shared/tsconfig.json`},{name:`api`,path:`src/api/tsconfig.json`},{name:`worker`,path:`src/api/worker/tsconfig.json`},{name:`web`,path:`src/web/tsconfig.json`},{name:`dashboard`,path:`dashboard/tsconfig.json`}];async function dc(){await Xs({checkWorker:!0});let e=[];for(let t of uc)try{await Se(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>Ye({name:e.name,command:lc,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(G.exitCode=n[0].exitCode)}const fc=n(a(vs),{displayName:`feature`,from:async e=>e}),pc=n(a(Gt),{displayName:`filtered|full`,from:async e=>e}),mc=[`Cookies and sessions are origin-scoped.`,`Exact-host passkeys may require re-registration unless a stable eligible parent RP ID was configured in advance.`,`External OAuth callbacks such as Google may need updating.`,`Database data and private backend resources are unchanged.`],hc=t({name:`deploy`,args:{environment:c({type:a(nt),displayName:`environment`,description:`Deploy to the staging or production environment.`}),runMigrations:r({long:`run-migrations`,description:`Run pending deploy-safe database migrations before deploying.`,defaultValue:()=>!1}),skipMigrations:r({long:`skip-migrations`,description:`Deploy without running pending deploy-safe database migrations.`,defaultValue:()=>!1}),skipPostDeployChecks:r({long:`skip-post-deploy-checks`,description:`Skip post-deploy checks after Cloudflare deployment.`,defaultValue:()=>!1}),yes:r({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,yes:i})=>Ha([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i?[`--yes`]:[]])}),gc=d({name:`staging`,cmds:{reassign:t({name:`reassign`,args:{json:r({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await gt();if(e){console.log(JSON.stringify({...t,notices:mc}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${mc.join(` `)}`)}}),url:t({name:`url`,args:{json:r({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await it();console.log(e?JSON.stringify({url:t}):t)}})}}),_c=d({name:`secrets`,cmds:{"rotate-access-token":t({name:`rotate-access-token`,args:{environment:c({type:a(nt),displayName:`environment`,description:`Worker environment whose access JWTs should be invalidated.`}),yes:r({long:`yes`,short:`y`,description:`Confirm immediate signing-secret replacement and invalidation of outstanding access JWTs.`,defaultValue:()=>!1})},handler:async({environment:e,yes:t})=>{if(!t)throw Error(`Access-token signing-secret rotation requires --yes because it immediately invalidates outstanding access JWTs.`);await bt({environment:e}),console.log(`Rotated Coreframe access-token signing material for ${e}. Clients must remint outstanding access JWTs.`)}}),status:t({name:`status`,args:{environment:c({type:s(a(nt)),displayName:`environment`,description:`Inspect staging, production, or both when omitted.`}),json:r({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({environment:e,json:t})=>{let n=await at({environment:e});console.log(t?JSON.stringify(n):Cc(n))}}),set:t({name:`set`,args:{environment:c({type:a(nt),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:c({type:s(u),displayName:`name`,description:`Declared Worker secret name; omit to configure known secrets.`}),bulk:r({long:`bulk`,description:`Queue known secrets from pasted or piped dotenv-formatted contents.`,defaultValue:()=>!1})},handler:async({environment:e,name:t,bulk:n})=>{if(n&&t)throw Error(`Use either a secret name or --bulk, not both.`);if(t){await dt({environment:e,name:t,value:await wc(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await pt(),i=n?await Ec(r):await Tc(r,e);await ft({environment:e,values:i});let a=Object.keys(i).sort();console.log(a.length>0?`Queued ${a.join(`, `)} for ${e}. Run coreframe deploy ${e} to apply.`:`No ${e} Worker secret updates were queued.`)}}),discard:t({name:`discard`,args:{environment:c({type:a(nt),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:c({type:u,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await rt({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),vc=t({name:`typecheck`,args:{},handler:dc}),yc=d({name:`worker`,cmds:{typegen:t({name:`typegen`,args:{check:r({long:`check`,description:`Fail when the committed primary Worker declarations are stale.`,defaultValue:()=>!1})},handler:async({check:e})=>{let t=await Bs({check:e});console.log(e?`${Oc(t.path)} is current.`:`${Oc(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),bc=t({name:`dev`,args:{debug:o({long:`debug`,type:s(fc),description:`Launch a development feature in isolated debug mode.`}),flutterDebug:r({long:`flutter-debug`,description:`Run Flutter in debug mode instead of profile mode.`,defaultValue:()=>!1}),flutterMcp:r({long:`flutter-mcp`,description:`Enable the app-side Flutter MCP QA bridge and imply Flutter debug mode.`,defaultValue:()=>!1}),flutterOutput:o({long:`flutter-output`,type:pc,description:`Choose filtered Android diagnostics (default) or full standard Flutter output.`,defaultValue:()=>`filtered`}),https:r({long:`https`,description:`Serve the web app over locally trusted HTTPS.`,defaultValue:()=>!1}),host:o({long:`host`,type:s(u),implicitValue:`0.0.0.0`,description:`Host address for the web development server. Pass without an address to use 0.0.0.0.`}),lan:r({long:`lan`,description:`Expose the Portless development proxy to devices on the local network.`,defaultValue:()=>!1}),managed:r({long:`managed`,description:`Run managed checkout synchronization even without an interactive terminal.`,defaultValue:()=>!1}),noCodesign:r({long:`no-codesign`,description:`Disable Xcode code signing for macOS Flutter development.`,defaultValue:()=>!1}),noManaged:r({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),noDevJobs:r({long:`no-dev-jobs`,description:`Skip automatic local development jobs for this invocation.`,defaultValue:()=>!1}),simulator:r({long:`simulator`,description:`Run iOS in Flutter debug mode on the Apple iOS Simulator.`,defaultValue:()=>!1}),platform:c({type:s(a(_s)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:c({type:s(u),displayName:`device`,description:`Device name or ID for iOS or Android development.`}),port:o({long:`port`,type:s(i),description:`Port for the web development server.`}),verbose:r({long:`verbose`,description:`Show the full native development output.`,defaultValue:()=>!1})},handler:({debug:e,device:t,flutterDebug:n,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f,port:p,simulator:m,verbose:h})=>{let g=xc({device:t,flutterDebug:n,platform:f,simulator:m});return ws({debug:e,device:g.device,flutterDebug:g.flutterDebug,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f??`web`,verbose:h,webPort:p})}});function xc({device:e,flutterDebug:t,platform:n,simulator:r}){if(!r)return{device:e,flutterDebug:t};if(n!==`ios`)throw Error(`The --simulator flag is only supported for the iOS development target.`);if(e!==void 0)throw Error(`The --simulator flag cannot be combined with an explicit device.`);return{device:`apple_ios_simulator`,flutterDebug:!0}}const Sc=t({name:`preview`,args:{host:o({long:`host`,type:s(u),description:`Host address for the preview server.`}),port:o({long:`port`,type:s(i),description:`Port for the preview server.`})},handler:({host:e,port:t})=>Rs({host:e,port:t})});function Cc(e){if(e.entries.length===0)return`No Worker environment values are declared in coreframe.config.ts.`;let t=e.entries.map(e=>[e.name,e.kind,e.local===`override`?`override`:`built-in default`,e.deployed.staging.replaceAll(`_`,` `),e.deployed.production.replaceAll(`_`,` `)]),n=[`Name`,`Kind`,`Local`,`Staging`,`Production`],r=n.map((e,n)=>Math.max(e.length,...t.map(e=>e[n].length))),i=e=>e.map((e,t)=>e.padEnd(r[t])).join(` `).trimEnd();return[i(n),i(r.map(e=>`-`.repeat(e))),...t].join(`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/scripts",
3
- "version": "0.2.30",
3
+ "version": "0.2.31",
4
4
  "description": "Coreframe project workflow CLI and automation scripts",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,15 +29,15 @@
29
29
  "nano-spawn": "^2.1.0",
30
30
  "procband": "^0.3.8",
31
31
  "yaml": "^2.9.0",
32
+ "@coreframe/assets": "^0.1.16",
32
33
  "@coreframe/config": "^0.1.13",
33
34
  "@coreframe/db": "^0.1.17",
34
- "@coreframe/assets": "^0.1.16",
35
+ "@coreframe/deploy": "^0.1.13",
35
36
  "@coreframe/dev": "^0.1.20",
36
37
  "@coreframe/flutter-tools": "^0.1.23",
37
- "@coreframe/object-storage": "^0.1.4",
38
38
  "@coreframe/dev-contracts": "^0.1.8",
39
- "@coreframe/deploy": "^0.1.13",
40
- "@coreframe/preview": "^0.1.16"
39
+ "@coreframe/object-storage": "^0.1.4",
40
+ "@coreframe/preview": "^0.1.17"
41
41
  },
42
42
  "devDependencies": {
43
43
  "@types/node": "^26.1.0",