@coreframe/scripts 0.2.7 → 0.2.8
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 +5 -4
- package/package.json +9 -9
package/dist/coreframe.js
CHANGED
|
@@ -8,7 +8,8 @@ import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,f
|
|
|
8
8
|
`)])),encoding:`utf8`});if(n.status!==0){let e=n.stderr.trim()||n.stdout.trim();throw Error(`Could not apply recipe patches.${e?`\n${e}`:``}`)}}function yi(e){return bi(e)?.toString(`utf8`)}function bi(e){try{return J(e)}catch(e){if(Ti(e)&&e.code===`ENOENT`)return;throw e}}function xi(e,t){let n=yi(e);if(n===void 0)throw Error(`Required file ${t} does not exist.`);return n}function Si(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ci(e,t){let n=Object.keys(e).sort();return n.length===t.length&&n.every((e,n)=>e===t[n])}function wi(e){return typeof e==`string`&&e.length>0}function Ti(e){return e instanceof Error&&`code`in e}function Ei(e={}){let{ref:t,repositoryRoot:n}=Rr(e),r=Vr(n,t,`recipes`).filter(e=>/^recipes\/[^/]+\/recipe\.yaml$/u.test(e)).map(e=>{let r=e.split(`/`)[1];return Cr(r),{description:Sr(zr(n,t,e),e).description,name:r}});return r.sort((e,t)=>e.name.localeCompare(t.name)),{recipes:r,ref:t}}function Di(e){console.log(`Coreframe recipes at ${e.ref}:`);for(let t of e.recipes)console.log(`${t.name} — ${t.description}`)}const Oi=`.agents/skills/coreframe-upgrade/SKILL.md`;function ki(e,t={}){return K(`git`,e,t)}function Ai(e){return e.stderr.toString(`utf8`).trim()||e.stdout.toString(`utf8`).trim()}function ji(e,t){let n=Lr(e,t),r=ki([`show`,n],{encoding:`utf8`});if(r.status!==0){let e=Ai(r);throw Error(`Could not read ${n}.${e?` ${e}`:``}`)}return r.stdout.toString()}function Mi(){let e=ki([`rev-parse`,`--show-toplevel`],{encoding:`utf8`});if(e.status!==0){let t=Ai(e);throw Error(`Could not find git repository root.${t?` ${t}`:``}`)}return e.stdout.toString().trim()}function Ni(e,t){let n=He(I(Me(),`coreframe-upgrade-skill-`)),r=I(n,`SKILL.md`);try{Ke(r,t);let n=Ai(ki([`--no-pager`,`diff`,`--no-index`,`--color=never`,`--`,e,r]));n&&console.log(n)}finally{We(n,{force:!0,recursive:!0})}}function Pi({apply:e,target:t}){let n=I(Mi(),Oi),r=Fr(t);if(!q(n))throw Error(`Local ${Oi} does not exist.`);let i=J(n,`utf8`),a=ji(t,Oi);return i===a?(console.log(`Coreframe upgrade skill matches ${r}:template/${Oi}.`),0):e?(Ke(n,a),console.error(`Updated ${Oi} from ${r}:template. Reread it before continuing the upgrade.`),20):(console.error(`Coreframe upgrade skill differs from ${r}:template/${Oi}.`),console.error(`Run again with --apply to update it, then reread ${Oi} before continuing.`),Ni(n,a),20)}const Fi=[{matches:e=>e===`drizzle`||e.startsWith(`drizzle/`),reason:`project-owned migration history`},{matches:e=>e===`drizzle-hold`||e.startsWith(`drizzle-hold/`),reason:`project-owned migration history`},{matches:e=>e===`src/web/routes.ts`||e.startsWith(`src/web/app/routes/`),reason:`downstream-owned demonstration routes`},{matches:e=>e===`pnpm-lock.yaml`||e===`src-tauri/Cargo.lock`,reason:`downstream-owned dependency lockfile`}],Ii=new Set([`100644`,`100755`,`120000`]);function Li(e,t={}){return K(`git`,e,t)}function Ri(e){let t=Li(e,{encoding:`utf8`});if(t.status!==0){let n=t.stderr.toString().trim()||t.stdout.toString().trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout.toString()}function zi(e){let t=Li(e);if(t.status!==0){let n=t.stderr.toString(`utf8`).trim()||t.stdout.toString(`utf8`).trim();throw Error(`Git command failed: git ${e.join(` `)}${n?`\n${n}`:``}`)}return t.stdout}function Bi(){return Ri([`rev-parse`,`--show-toplevel`]).trim()}function Vi(e){let t=I(e,`package.json`);if(!q(t))throw Error(`Missing --base <git-ref>, and package.json does not exist.`);let n=JSON.parse(J(t,`utf8`)).engines?.coreframe;if(typeof n!=`string`||n.length===0)throw Error(`Missing --base <git-ref>, and package.json engines.coreframe is not set.`);return n}function Hi(e){let t=[],n=0;for(let r=0;r<e.length;r+=1)e[r]===0&&(t.push(e.subarray(n,r).toString(`utf8`)),n=r+1);return t.filter(e=>e.length>0)}function Ui(e,t){let n=Hi(zi([`diff`,`--name-status`,`-z`,`--no-renames`,Ir(e),Ir(t),`--`])),r=[];for(let e=0;e<n.length;e+=2){let t=n[e],i=n[e+1];if(!t||!i)throw Error(`Could not parse git diff --name-status output.`);r.push({path:i,status:t})}return r}function Wi(e,t){let n=zi([`ls-tree`,`-z`,Ir(e),`--`,t]);if(n.length===0)return null;let r=Hi(n)[0],i=r.indexOf(` `);if(i===-1)throw Error(`Could not parse git ls-tree output for ${e}:${t}.`);let[a,o,s]=r.slice(0,i).split(` `);if(!a||!o||!s)throw Error(`Could not parse git ls-tree metadata for ${e}:${t}.`);return{mode:a,object:s,path:t,type:o}}function Gi(e){return zi([`cat-file`,`blob`,e.object])}function Ki(e,t){let n=L(e,t),r=e.endsWith(ue)?e:`${e}${ue}`;if(n!==e&&!n.startsWith(r))throw Error(`Refusing to access path outside repository: ${t}`);return n}function qi(e){try{return Be(e),!0}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return!1;throw e}}function Ji(e){return(e.mode&73)!=0}function Yi(e){return e===null||e.type===`blob`&&Ii.has(e.mode)}function Xi(e){return Fi.find(t=>t.matches(e))?.reason}function Zi(e,t,n){let r=Ki(e,t);if(n===null)return{matches:!qi(r)};if(!Yi(n))return{matches:!1,reason:`unsupported template entry mode ${n.mode} ${n.type}`};let i;try{i=Be(r)}catch(e){if(e instanceof Error&&`code`in e&&e.code===`ENOENT`)return{matches:!1,reason:`path is missing from worktree`};throw e}let a=Gi(n);return n.mode===`120000`?i.isSymbolicLink()?{matches:Buffer.from(Ue(r),`utf8`).equals(a)}:{matches:!1,reason:`worktree path is not a symlink`}:i.isFile()?(n.mode===`100755`?Ji(i):!Ji(i))?{matches:J(r).equals(a)}:{matches:!1,reason:`worktree executable bit differs from template`}:{matches:!1,reason:`worktree path is not a regular file`}}function Qi(e){qi(e)&&We(e,{force:!0,recursive:!1})}function $i(e,t,n){let r=Ki(e,t);if(n===null){Qi(r);return}if(Ve(F(r),{recursive:!0}),n.mode===`120000`){Qi(r),Ge(Gi(n).toString(`utf8`),r);return}let i=qi(r)?Be(r):null;i&&!i.isFile()&&Qi(r),Ke(r,Gi(n)),ze(r,n.mode===`100755`?493:420)}function ea(e,t){return e===null&&t!==null?`add`:e!==null&&t===null?`delete`:`update`}function ta(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t){let t=e.reason?` (${e.reason})`:``;console.log(` ${e.action}: ${e.path}${t}`)}console.log(``)}}function na(e){let t=Bi(),n=Fr(e.base??Vi(t)),r=Fr(e.target),i=Ui(n,r),a=[],o=[],s=[],c=[];for(let e of i){let i=Xi(e.path);if(i){o.push({action:`ignored`,path:e.path,reason:i});continue}let l=Wi(n,e.path),u=Wi(r,e.path),d=ea(l,u);if(!Yi(l)||!Yi(u)){s.push({action:d,path:e.path,reason:`unsupported template entry type`});continue}if(Zi(t,e.path,u).matches){c.push({action:`unchanged`,path:e.path});continue}let f=Zi(t,e.path,l);if(!f.matches){s.push({action:d,path:e.path,reason:f.reason??`downstream differs from base template`});continue}a.push({action:d,path:e.path,targetEntry:u})}if(e.apply)for(let e of a)$i(t,e.path,e.targetEntry??null);console.log(`Coreframe template fast-forward: ${n} -> ${r}`),console.log(``),ta(e.apply?`Applied clean template updates`:`Would apply clean template updates`,a),ta(`Ignored downstream-owned paths`,o),ta(`Skipped for agent review`,s),c.length>0&&console.log(`${c.length} changed template path(s) already matched the target state.`),i.length===0&&console.log(`No template file changes found in the requested range.`),!e.apply&&a.length>0&&(console.log(``),console.log(`Run with --apply to write the ${a.length} clean update(s).`))}const ra=[`dependencies`,`devDependencies`];function ia(e){let t=K(`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 aa(e,t){try{return JSON.parse(e)}catch(e){throw Error(`Could not parse ${t}: ${e instanceof Error?e.message:e}`)}}function oa(e,t){let n=`${Fr(e)}:${t}`;return aa(ia([`show`,n]),n)}function sa(e){return e.startsWith(`@coreframe/`)}function ca(e){return e.startsWith(`file:`)||e.startsWith(`link:`)||e.startsWith(`workspace:`)}function la(e){return e.startsWith(`file:`)||e.startsWith(`link:`)}function ua(e,t){let n=e.indexOf(`:`),r=e.slice(n+1),i=le.normalize(le.join(`template`,r,`package.json`));if(r.length===0||le.isAbsolute(r)||i===`..`||i.startsWith(`../`))throw Error(`Invalid local template dependency for ${t}: ${e}`);return i}function da(e){let t=oa(e,`template/package.json`),n=[],r=new Set;for(let i of ra)for(let[a,o]of Object.entries(t[i]??{})){if(!sa(a)||!la(o))continue;if(r.has(a))throw Error(`Target template declares ${a} more than once.`);let t=ua(o,a),s=oa(e,t);if(s.name!==a||typeof s.version!=`string`)throw Error(`${Fr(e)}:${t} must declare ${a} with a version.`);n.push({group:i,name:a,spec:`^${s.version}`}),r.add(a)}return n}function fa(e,t){for(let n of ra){let r=e[n]?.[t];if(r)return{group:n,spec:r}}}function pa(e,t,n){let r=t.match(/\n([\t ]+)"/u)?.[1]??` `,i=t.endsWith(`
|
|
9
9
|
`)?`
|
|
10
10
|
`:``;Ke(e,`${JSON.stringify(n,null,r)}${i}`)}function ma(e,t){if(t.length!==0){console.log(`${e}:`);for(let e of t)console.log(` ${e}`);console.log(``)}}function ha(e){let t=L(ia([`rev-parse`,`--show-toplevel`]).trim(),`package.json`),n=J(t,`utf8`),r=aa(n,t),i=Fr(e.target),a=da(i),o=new Set(a.map(({name:e})=>e)),s=[],c=[],l=[],u=0;for(let e of a){let t=fa(r,e.name);if(!t){c.push(`missing: ${e.name} ${e.spec} (${e.group})`);continue}if(ca(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=ra.flatMap(e=>Object.entries(r[e]??{}).filter(([e])=>sa(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(``),ma(e.apply?`Updated Coreframe packages`:`Would update Coreframe packages`,s.map(({currentSpec:e,name:t,spec:n})=>`update: ${t} ${e} -> ${n}`)),ma(`Missing target Coreframe packages`,c),ma(`Locally linked Coreframe packages`,l),ma(`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 ga={...f,displayName:`recipe`,description:`Coreframe recipe name, such as yam-db.`,async from(e){return Cr(e)}},_a=p({name:`upgrade`,cmds:{"ensure-template-remote":n({name:`ensure-template-remote`,args:{remote:c({long:`remote`,type:f,defaultValue:()=>`template`,description:`Remote name to ensure.`}),noFetch:i({long:`no-fetch`,description:`Do not fetch the remote after ensuring it exists.`,defaultValue:()=>!1})},handler:({noFetch:e,remote:t})=>Nr({fetch:!e,remote:t})}),"check-skill-current":n({name:`check-skill-current`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),apply:i({long:`apply`,description:`Replace the local upgrade skill with the target version when it differs.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>{process.exitCode=Pi({apply:e,target:t})}}),"fast-forward-template-files":n({name:`fast-forward-template-files`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),base:c({long:`base`,type:l(f),description:`Previous Coreframe template git ref. Defaults to package.json engines.coreframe.`}),apply:i({long:`apply`,description:`Write clean fast-forwards to the worktree.`,defaultValue:()=>!1})},handler:({apply:e,base:t,target:n})=>na({apply:e,base:t,target:n})}),"sync-coreframe-packages":n({name:`sync-coreframe-packages`,args:{target:c({long:`target`,type:f,description:`Target Coreframe template git ref.`}),apply:i({long:`apply`,description:`Update existing published Coreframe dependency specifications.`,defaultValue:()=>!1})},handler:({apply:e,target:t})=>ha({apply:e,target:t})})}}),va=p({name:`recipes`,cmds:{apply:n({name:`apply`,args:{recipe:u({type:ga,displayName:`recipe`,description:`Recipe to prepare and apply.`}),target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,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})=>ci(si({fetch:!e,name:t,remote:n,target:r}))}),list:n({name:`list`,args:{target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,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})=>Di(Ei({fetch:!e,remote:t,target:n}))}),verify:n({name:`verify`,args:{recipe:u({type:ga,displayName:`recipe`,description:`Recipe adoption to verify.`}),target:c({long:`target`,type:l(f),description:`Coreframe Git ref. Defaults to package.json engines.coreframe.`}),remote:c({long:`remote`,type:f,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})=>ii(ri({fetch:!e,name:t,remote:n,target:r}))})}}),ya=p({name:`db`,cmds:{ensure:n({name:`ensure`,args:{},handler:y}),generate:n({name:`generate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit generate.`})},handler:({args:e})=>te(`generate`,e)}),migrate:n({name:`migrate`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit migrate.`})},handler:({args:e})=>te(`migrate`,e)}),"migrate-held":n({name:`migrate-held`,args:{confirm:c({long:`confirm`,type:l(s([`run-held-migrations`])),description:`Required confirmation value for held migrations.`})},handler:({confirm:e})=>w({argv:e?[`--confirm=${e}`]:[]})}),"migrate-local":n({name:`migrate-local`,args:{},handler:T}),"migrations-check":n({name:`migrations-check`,args:{},handler:h}),reset:n({name:`reset`,args:{},handler:ee}),seed:n({name:`seed`,args:{},handler:()=>O()}),"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})=>g({seed:e})}),setup:n({name:`setup`,args:{},handler:()=>ne()}),studio:n({name:`studio`,args:{args:d({displayName:`drizzle-kit args`,description:`Additional arguments passed to drizzle-kit studio.`})},handler:({args:e})=>te(`studio`,e)})}}),ba=`package.json`;async function xa(e=process.argv.slice(2),t=process.env){let n=Sa(e);Aa(n);let{packageJson:r,source:i}=await ut(ba),a=await Ie(),o=mt(a.deploy??{},n.environment,t);Fa(t,[`POSTHOG_API_KEY`,`POSTHOG_PROJECT_ID`]);let s=await ja(o,n.environment,()=>$e({env:t})),c=gt({args:n,config:n.environment===`production`?o.tauriRelease:{},env:t});Pa(n.environment,c.enabled),await Ct(c);let l=await dt({environment:n.environment}),u=l.values.DASHBOARD_PASSWORD??await Ia(t,n.environment);wt(await et({environment:n.environment}),n.environment,{availableNames:[...Object.keys(l.values),...u?[`DASHBOARD_PASSWORD`]:[]]});let d=await at({environment:n.environment}),f=await ka();await Kn({env:t,revision:f});let p=f.slice(0,12),m=ht(n.environment,r.version,p),h=pt(r.name,m),g={...za(t,n.environment,h,r.name,m),COREFRAME_I18N_RELEASE_REVISION:f},_=n.environment===`production`,y=!1,b={files:[]};z.intro(`Deploy ${h} to ${n.environment}`);let x=Object.keys(l.values).sort();x.length>0&&z.note(x.join(`
|
|
11
|
-
`),`Pending Worker secret updates`),d.provisioned&&z.log.info(`Provisioning Coreframe-managed access-token signing material.`),await Na(n);let S=await Ea(await v({config:a.database,env:t})),w=await D(S);if(w.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${C(w)}`);let T=await Oa(n,S);try{_&&(await Et(ba,r,m),b=await Dt(c,m)),z.log.step(`Running pre-deploy build`),await R(`pnpm`,[`build`],{env:Ba(g),stdio:`inherit`});let e=c.enabled?await ot({env:Ba(g),plan:c,releaseName:h,version:m}):void 0;z.log.step(`Running release build and uploading PostHog source maps`),y=!0,await R(`pnpm`,[`build`],{env:g,stdio:`inherit`}),T&&(z.log.step(`Running deploy-safe database migrations`),await R(`pnpm`,[`db`,`migrate`],{env:g,stdio:`inherit`})),z.log.step(`Deploying Worker and static assets to Cloudflare`);let t={...u?{DASHBOARD_PASSWORD:u}:{},...d.value?{[Ye]:d.value}:{},...l.values},i=Object.keys(t).length>0?await La(t):void 0,f=await tt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:h}}});try{await R(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,f.path,`--env`,n.environment,`--strict`,`--keep-vars`,`--tag`,h,`--message`,`Deploy ${h}`,...i?[`--secrets-file`,i.path]:[]],{env:g,stdio:`inherit`}),await Xe(l),await Tt({environment:n.environment})}finally{await f.dispose(),await i?.dispose()}let p={environment:n.environment,releaseName:h,url:s,version:m};o.afterWorkerDeploy&&(z.log.step(`Running required after-Worker deploy hook`),await yt(o,p)),n.skipPostDeployChecks||(z.log.step(`Running post-deploy checks`),await bt(o,p)),e&&(z.log.step(`Uploading Tauri release artifacts to Backblaze B2`),await St(c,e)),z.outro(`Deployed ${h} to ${n.environment}`)}catch(e){throw!y&&_&&(await U(ba,i),await _t(b)),e}}function Sa(e){return{environment:Ca(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),tauriLocalPlatforms:wa(e,`--tauri-local-platform`).map(e=>it(e)),tauriWorkflowName:Ta(e,`--tauri-workflow-name`),tauriWorkflowPlatforms:wa(e,`--tauri-workflow-platform`).map(e=>it(e)),tauriWorkflowRef:Ta(e,`--tauri-workflow-ref`),yes:e.includes(`--yes`)}}function Ca(e){if(e&&Ze.includes(e))return e;throw Error(`Deploy environment must be one of: ${Ze.join(`, `)}.`)}function wa(e,t){let n=[];for(let r=0;r<e.length;r+=1){let i=e[r];if(i===t){let i=e[r+1];if(!i||i.startsWith(`--`))throw Error(`${t} requires a value.`);n.push(...i.split(`,`).filter(Boolean)),r+=1;continue}i.startsWith(`${t}=`)&&n.push(...i.slice(t.length+1).split(`,`).filter(Boolean))}return n}function Ta(e,t){let n=wa(e,t);if(n.length>1)throw Error(`${t} can only be provided once.`);return n[0]}async function Ea(e){try{return await Da(e)}finally{await e.close?.()}}async function Da(e){return b(await _(),await E(e))}async function Oa(e,t){if(t.length===0)return z.log.info(`No pending deploy migrations.`),!1;if(z.note(S(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 z.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(z.isCancel(n))throw z.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function ka(){let{stdout:e}=await R(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await R(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function Aa(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}async function ja(e,t,n=$e){return e.url?Ma(e.url,t):t===`staging`&&e.stagingHostname?Ma(await n(),t):Ma(void 0,t)}function Ma(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 Na(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await z.confirm({initialValue:!1,message:`Deploy to production?`});if(z.isCancel(t)||!t)throw z.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function Pa(e,t){if(e===`staging`&&t)throw Error(`Tauri releases can only be published from production deploys.`)}function Fa(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 Ia(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Lt(await V(`.env`,`utf8`))}catch(e){throw Ra(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 La(e){let t=await we(I(Me(),`coreframe-deploy-secrets-`)),n=I(t,`secrets.json`);return await U(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>H(t,{force:!0,recursive:!0})}}function Ra(e){return e instanceof Error&&`code`in e}function za(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 Ba(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}const $={access:ye,chmod:be,mkdir:B,mkdtemp:we,readFile:V,readFileSync:J,rm:H,writeFile:U},Va={getAvailablePort:Ua},Ha={homedir:Ae,kill:G.kill,networkInterfaces:je,tmpdir:Me};async function Ua(){let e=Wt();try{await new Promise((t,n)=>{e.once(`error`,n),e.listen(0,`127.0.0.1`,t)});let t=e.address();if(!t||typeof t==`string`)throw Error(`Could not allocate an available TCP port.`);return t.port}finally{e.listening&&await new Promise((t,n)=>{e.close(e=>e?n(e):t())})}}async function Wa(){let e=await Ka();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function Ga(e){let t=await Ka(),n=qa();await $.mkdir(P.dirname(n),{recursive:!0}),await $.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function Ka(){try{let e=await $.readFile(qa(),`utf8`),t=JSON.parse(e);return Ja(t)?t:{}}catch{return{}}}function qa(){return P.join(Ha.homedir(),`.coreframe`,`preferences.json`)}function Ja(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ya({env:e=G.env,interactive:t=G.stdin.isTTY===!0,platform:n,target:r}){let i=await eo(n,e).catch(()=>[]),a=r?vo(i,r):void 0;if(a)return a;if(!r&&i.length>0)return $a(i,n,t);let o=r?vo(await no(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return ro(o,n,e,t);let s=await to(n,e),c=r?vo(s,r):void 0;if(c)return c;if(!r&&s.length>0)return $a(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 Xa(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=bo();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await Za();if(a&&i.includes(a))return a;if(i.length===1)return await Qa(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await z.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(z.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await Qa(o),o}async function Za(){return(await Wa()).mobileDevHost}async function Qa(e){try{await Ga({mobileDevHost:e})}catch(e){z.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function $a(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 z.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(z.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function eo(e,t){return e===`android`?ao(t):so(t)}async function to(e,t){return e===`android`?oo(t):co(t)}async function no(e){let{stdout:t}=await R(`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 ro(e,t,n,r){let i=await io(t,n).catch(()=>[]),{stdout:a}=await R(`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 io(t,n).catch(()=>[]),o=vo(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return $a(s,t,r);if(a.length===1)return a[0];await Gt(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 io(e,t){return e===`ios`?co(t,`booted`):(await ao(t)).filter(e=>!e.physical)}async function ao(e){let t=await uo(e,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await R(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 ho(t,e,n,r):await go(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(xo)}async function oo(e){let{stdout:t}=await R(await uo(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 so(e){let t=await $.mkdtemp(P.join(Ha.tmpdir(),`coreframe-ios-devices-`)),n=P.join(t,`devices.json`);try{return await $.writeFile(n,``),await R(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await $.readFile(n,`utf8`)).result?.devices??[]).filter(lo).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(xo)}finally{await $.rm(t,{force:!0,recursive:!0})}}async function co(e,t=`available`){let{stdout:n}=await R(`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(xo)}function lo(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 uo(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:fo(e);for(let e of i){let r=P.join(e,t,n);try{return await $.access(r),r}catch{}}return n}function fo(e){return G.platform===`darwin`?[P.join(Ha.homedir(),`Library`,`Android`,`sdk`)]:G.platform===`win32`&&e.LOCALAPPDATA?[P.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[P.join(Ha.homedir(),`Android`,`Sdk`)]}async function po(e,t,n,r){return(await mo(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function mo(e,t,n){return(await R(e,n,{env:t,timeout:3e3})).stdout}async function ho(e,t,n,r){return mo(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function go(e,t,n,r){return mo(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>_o(e)||r).catch(()=>r)}function _o(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function vo(e,t){let n=e.map(e=>({device:e,score:Math.max(yo(t,e.name),yo(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function yo(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 bo(){return[...new Set(Object.values(Ha.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function xo(e,t){return e.label.localeCompare(t.label)}function So({host:e=`127.0.0.1`,port:t,start:n}){let r,i=!1,a=!1,o=!1,s,c,l,u,d,f=new Set,p=new Promise((e,t)=>{u=e,d=t}),m=e=>{a||o||(o=!0,d(e))},h=()=>(s||=Promise.resolve().then(n).catch(e=>{throw m(e),e}),s),g=e=>{f.add(e),e.once(`close`,()=>f.delete(e)),e.pause(),_(e).catch(t=>{m(t),e.destroy()})},_=async e=>{let t=await h();if(a||e.destroyed)return;let n=await Co(t,()=>a);if(a||e.destroyed){n.destroy();return}f.add(n),n.once(`close`,()=>f.delete(n)),n.on(`error`,()=>e.destroy()),n.once(`close`,()=>e.destroy()),e.on(`error`,()=>n.destroy()),e.once(`close`,()=>n.destroy()),e.pipe(n),n.pipe(e)};return{close:async()=>l||(l=(async()=>{a=!0,o||(o=!0,u());for(let e of f)e.destroy();f.clear(),c&&!i&&await Promise.allSettled([c]),!(!r||!i)&&(await new Promise(e=>{r.close(()=>e())}),i=!1)})(),l),fail:m,listen:async()=>c||(r=Wt(g),c=new Promise((n,a)=>{let o=e=>{if(i){m(e);return}a(e)};r.once(`error`,o),r.once(`listening`,()=>{i=!0,r.off(`error`,o),r.on(`error`,m),n()}),r.listen(t,e)}),c),wait:()=>p}}async function Co(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await wo(e)}catch(e){if(r=e,Date.now()>=n)break;await new Promise(e=>setTimeout(e,50))}throw r instanceof Error?r:Error(`Could not connect to the dashboard.`)}function wo({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=Ut({host:e,port:t}),a=e=>{i.off(`connect`,o),i.destroy(),r(e)},o=()=>{i.off(`error`,a),n(i)};i.once(`error`,a),i.once(`connect`,o)})}const To={command:Vo,isRunning:Mo,stop(e){try{G.kill(e,`SIGTERM`)}catch(e){if(!Fo(e))throw e}},waitForExit:No};async function Eo({confirmStop:e=ko,cwd:t=G.cwd(),interactive:n=G.stdin.isTTY===!0,pid:r=G.pid,platform:i=`web`,processes:a=To}={}){let o=await Wo(t,i),s=o.file,c={pid:r,platform:i,repository:o.repository,token:W()},l=`${JSON.stringify(c)}\n`,u=`${s}.${c.token}.tmp`,d=await Lo({confirmStop:e,file:P.resolve(t,`.coreframe/dev.lock`),interactive:n,owner:c,processes:a});if(d===void 0)return;let f=d;await B(P.dirname(s),{recursive:!0}),await U(u,l,{flag:`wx`,mode:384});try{for(;;){try{return await Ce(u,s),{owner:c,async release(){await jo(s,l)},takeoverApproved:f}}catch(e){if(!Po(e))throw e}let t=await Oo({confirmStop:e,file:s,interactive:n,owner:c,processes:a});if(t===void 0)return;f||=t}}finally{await ke(u).catch(()=>void 0)}}async function Do({cwd:e=G.cwd(),platform:t=`web`}={}){let{file:n}=await Wo(e,t);return(await Ao(n))?.owner}async function Oo({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Ao(t);if(!a||!Jo(a.owner,r)||!i.isRunning(a.owner.pid))return await jo(t,a?.source),!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await jo(t,a.source),!0}async function ko(e){let t=await z.confirm({initialValue:!1,message:`Coreframe dev is already running for this project (PID ${e}). Stop it and start here?`});return z.isCancel(t)||!t?(z.cancel(`Keeping the existing Coreframe dev process.`),!1):!0}async function Ao(e){try{let t=await V(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.platform!=`string`||n.platform.length===0||typeof n.repository!=`string`||n.repository.length===0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}async function jo(e,t){let n=await V(e,`utf8`).catch(()=>void 0);(t===void 0||n===t)&&await ke(e).catch(()=>void 0)}function Mo(e){try{return G.kill(e,0),!0}catch(e){return!Fo(e)}}async function No(e){let t=Date.now()+1e4;for(;Mo(e);){if(Date.now()>=t)throw Error(`Coreframe dev process ${e} did not stop within 10 seconds.`);await new Promise(e=>setTimeout(e,50))}}function Po(e){return Io(e)&&e.code===`EEXIST`}function Fo(e){return Io(e)&&e.code===`ESRCH`}function Io(e){return e instanceof Error}async function Lo({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Ro(t);if(!a||!i.isRunning(a.owner.pid))return await jo(t,a?.source),!1;let o=i.command?.(a.owner.pid);if(!o||!zo(o,r.platform))return!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await jo(t,a.source),!0}async function Ro(e){try{let t=await V(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}function zo(e,t){let n=e.trim().split(/\s+/u),r=n.findIndex(e=>{let t=e.split(/[\\/]/u).at(-1);return t===`coreframe`||t===`coreframe.js`||t===`coreframe.ts`});if(r<0)return!1;let i=n.indexOf(`dev`,r+1);return i<0?!1:Bo(n.slice(i+1))===t}function Bo(e){let t=new Set([`android`,`desktop`,`ios`,`macos`,`web`]),n=new Set([`--debug`,`--host`,`--port`]),r=!1;for(let i of e){if(r){r=!1;continue}if(n.has(i)){r=!0;continue}if(!i.startsWith(`-`))return t.has(i)?i:`web`}return`web`}function Vo(e){let t=G.platform===`win32`?Uo(e):Ho(e);if(t.status===0)return t.stdout.trim()||void 0}function Ho(e){return K(`ps`,[`-p`,String(e),`-o`,`command=`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}function Uo(e){return K(`powershell.exe`,[`-NoProfile`,`-NonInteractive`,`-Command`,`(Get-CimInstance Win32_Process -Filter 'ProcessId = ${e}').CommandLine`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}async function Wo(e,t){let n=await Go(P.resolve(e)),r=n.gitCommonDir?P.join(n.path,`coreframe-dev`):P.join(n.path,`.coreframe`);return{file:P.join(r,`dev.${t}.lock`),repository:n.path}}async function Go(e){let t=Ko(e);return t?{gitCommonDir:!0,path:await qo(P.resolve(e,t))}:{gitCommonDir:!1,path:await qo(e)}}function Ko(e){let t=K(`git`,[`rev-parse`,`--git-common-dir`],{cwd:e,encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]});if(t.status===0)return t.stdout.trim()||void 0}async function qo(e){return Ee(e).catch(()=>P.resolve(e))}function Jo(e,t){return e.platform===t.platform&&e.repository===t.repository}function Yo(e,t){let n={...e};return t===`desktop`?delete n.COREFRAME_PLATFORM:t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const Xo=G.platform===`win32`?`portless.cmd`:`portless`;async function Zo({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||t.TAURI_ENV_PLATFORM!==void 0||(await Kt()).isAgent?!1:Nt(e)}async function Qo({cwd:e,env:t,lan:n=!1}){let r=P.join(`node_modules`,`.bin`,Xo),i=[`proxy`,`start`,...n?[`--lan`]:[]];await R(G.platform===`win32`?P.resolve(e,r):`sudo`,G.platform===`win32`?i:[r,...i],{cwd:e,env:t,stdio:`inherit`})}function $o({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]]}async function es({cwd:e=G.cwd(),platform:t}){let n=await ts({cwd:e});if(!n||!us(n.platform)||!ds(n.platform,t)||!ps(n.owner.pid))return;let r=await Do({cwd:e,platform:n.platform});if(!(!r||!ms(n.owner,r))&&!(n.postgres?.pid!==void 0&&!ps(n.postgres.pid)))return n}async function ts({cwd:e=G.cwd()}={}){let t;try{t=JSON.parse(await V(is(e),`utf8`))}catch{return}return as(t)&&t.cwd===P.resolve(e)?t:void 0}async function ns({cwd:e=G.cwd(),owner:t,platform:n,postgres:r,vitePort:i}){let a=is(e),o=P.dirname(a),s=`${a}.${W()}.tmp`,c={cwd:P.resolve(e),owner:t,platform:n,...r?{postgres:r}:void 0,version:1,vite:{port:i}};await B(o,{recursive:!0});try{await U(s,`${JSON.stringify(c)}\n`,{flag:`wx`,mode:384}),await De(s,a)}finally{await ke(s).catch(()=>void 0)}}async function rs({cwd:e=G.cwd(),owner:t}){let n=is(e),r=await ts({cwd:e});!r||!ms(r.owner,t)||await ke(n).catch(()=>void 0)}function is(e){return P.resolve(e,`.coreframe/dev.session.json`)}function as(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.version===1&&typeof t.cwd==`string`&&os(t.owner)&&cs(t.platform)&&fs(t.vite?.port)&&(t.postgres===void 0||ss(t.postgres))}function os(e){if(!e||typeof e!=`object`)return!1;let t=e,n=t.pid;return typeof n==`number`&&Number.isSafeInteger(n)&&n>0&&typeof t.token==`string`}function ss(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.dataDir==`string`&&(t.pid===void 0||Number.isSafeInteger(t.pid)&&t.pid>0)}function cs(e){return e===`android`||e===`desktop`||e===`ios`||e===`macos`||e===`web`}function ls(e){return e===`android`||e===`ios`||e===`macos`}function us(e){return e===`web`||ls(e)}function ds(e,t){return t===void 0?ls(e):e===t}function fs(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>0&&e<=65535}function ps(e){try{return G.kill(e,0),!0}catch(e){return e instanceof Error&&e.code===`EPERM`}}function ms(e,t){return e.pid===t.pid&&e.token===t.token}const hs=G.platform===`win32`?`pnpm.cmd`:`pnpm`,gs=G.platform===`win32`?`portless.cmd`:`portless`,_s=G.platform===`win32`?`react-router.cmd`:`react-router`,vs=G.platform===`win32`?`turso.cmd`:`turso`;async function ys({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,host:i,https:a=!1,interactive:o=G.stdin.isTTY===!0,lan:s=!1,managed:c=!1,noManaged:l=!1,platform:u=`web`,portless:d,fresh:f=!1,reuseVite:p=!1,verbose:m=!1,webPort:h,supervisor:g}){let _=kt({env:r}),v=Ts(u)?u:void 0,y=Es(u),b=u===`ios`||u===`android`?u:void 0,x=b?await Ya({env:r,interactive:o,platform:b,target:n}):void 0,S=b&&x?await Xa({device:x,host:i,interactive:o,platform:b}):void 0,C=v?!0:i,w=await _.measure(`config`,()=>Ie({cwd:e})),T=await _.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(c||o&&!l)&&await Mt(e));await _.measure(`i18n`,()=>Wn({cwd:e,projectConfig:w}));let E=await _.measure(`routing`,async()=>d??await Zo({cwd:e,env:r,platform:u})),ee=await _.measure(`https`,async()=>a&&!E?Pt({cwd:e}):void 0),te=Yo(r,u),D={...te,..._.environment,...T?{[Bt]:`1`,[Vt]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...v?{COREFRAME_PLATFORM:v}:void 0,...ee?{[At]:ee.cert,[jt]:ee.key}:void 0},O=!1,ne,re,k,A,j,ae,M,oe=new Map,N=[`postgres`,y];for(let e of N){let t=e===`postgres`?`postgres`:e.startsWith(`vite:flutter`)?`flutter`:`web`,n=Y({label:t}),r=Y({color:`red`,label:t});n.pipe(G.stdout,{end:!1}),r.pipe(G.stderr,{end:!1}),oe.set(e,{stderr:r,stdout:n})}let se=g.onEvent(e=>{e.event===`log`?(oe.get(e.resource)?.[e.stream])?.write(e.data):e.event===`service`&&e.resource===y&&e.state===`failed`&&(M=Error(e.error??`${y} development failed.`),F())}),F=()=>{O||(O=!0,k?.kill(`SIGTERM`),A?.kill(`SIGTERM`),re?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))},ce=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>{ne??=e,F()};return G.on(e,t),{handler:t,signal:e}}),I=async e=>{let t=Ht(e);k=t;try{await t.expectSuccess()}catch(e){if(!O)throw e}finally{k===t&&(k=void 0)}};try{if(await g.subscribe(N),ws(w)){let e=await g.acquirePostgres({config:w,env:D});j=e.leaseId,D={...D,...e.env}}if(w.database?.dialect===`sqlite`){let t=await Va.getAvailablePort(),n=P.resolve(e,`.coreframe`),r=P.join(n,`turso.db`);await $.mkdir(n,{recursive:!0}),D={...D,TURSO_DATABASE_URL:`http://127.0.0.1:${t}`,TURSO_AUTH_TOKEN:`dev`},A=Ht({name:`turso`,command:vs,args:[`dev`,`--port`,String(t),`--db-file`,r],cwd:e,env:D}),await A.waitFor(`listening`)}(ws(w)||w.database?.dialect===`sqlite`)&&await _.measure(`schema`,()=>I({name:`db`,command:hs,args:[`db`,`ensure`],cwd:e,env:D,prefix:!1}));let t=Cs(h??r.COREFRAME_WEB_PORT),n=await g.status(),i=n.resources?.find(e=>e.resource===y),c=i!==void 0&&!f&&t===void 0?void 0:t??5173,l=c??i?.endpoint?.port??5173;if(c!==void 0&&n.resources?.some(e=>e.resource!==y&&e.endpoint?.port===l)){if(t!==void 0)throw Error(`Port ${l} is already used by another Coreframe development shell.`);l=await Va.getAvailablePort()}if(!p){let t={...D,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[D.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:P.join(e,`node_modules`,`.bin`)+P.delimiter+(D.PATH??``)},n=[{args:E?$o({host:C,lan:s,port:l}):[`dev`,...C===void 0?[]:[`--host`,C===!0?`0.0.0.0`:C],`--port`,String(l),...v?[`--strictPort`]:[]],command:E?gs:_s,cwd:e,env:t},{args:[`exec`,`panda`,`dev`,`--no-color`],command:hs,cwd:e,env:D}],r=await g.acquireVite({configFingerprint:Ss({cwd:e,host:C,lan:s,https:a,portless:E,resource:y}),endpoint:{host:C===!0?`0.0.0.0`:C??`127.0.0.1`,port:l},processes:n,resource:y},f);ae=r.leaseId,l=r.endpoint.port}if(_.report(),O)return;if(u===`web`?await xs(g,y,()=>M):(await ie({cwd:e}),await bs({cwd:e,env:te,interactive:o,mobileHost:S,platform:u,port:l,requestStop:F,selectedDevice:x,isStopping:()=>O,setActiveNative:e=>{re=e},verbose:m})),M)throw M}finally{F(),ae&&await g.release(ae).catch(()=>void 0),j&&await g.release(j).catch(()=>void 0),se();for(let{handler:e,signal:t}of ce)G.off(t,e);for(let e of oe.values())e.stdout.end(),e.stderr.end();ne&&(G.exitCode??=ne===`SIGINT`?130:143),g.close()}}async function bs({cwd:e,env:t,interactive:n,mobileHost:r,platform:i,port:a,requestStop:o,selectedDevice:s,isStopping:c,setActiveNative:l,verbose:u}){for(;;){let d=i===`android`&&!u?await oe():void 0,f=R(`flutter`,[`run`,`-d`,s?.id??`macos`,`--dart-define=COREFRAME_DEV_SERVER_URL=${Ds(i,r,a)}`,...u?[`--verbose`]:[]],{cwd:P.join(e,`src-flutter`),env:t,stdio:d?[`inherit`,`pipe`,`pipe`]:`inherit`});l(f);try{await Promise.all([f,d?.capture(f)]);return}catch(e){if(c()||i===`desktop`||!n)throw e;let t=await z.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(z.isCancel(t)||!t){o();return}}finally{l(void 0)}}}async function xs(e,t,n){await e.waitForServiceExit(t);let r=n();if(r)throw r}function Ss({cwd:e,host:t,lan:n,https:r,portless:i,resource:a}){return Re(`sha256`).update(JSON.stringify({cwd:P.resolve(e),host:t??null,lan:n,https:r,portless:i,resource:a})).digest(`hex`)}function Cs(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 ws(e){return(e.database?.dialect??`postgres`)===`postgres`}function Ts(e){return e===`android`||e===`ios`||e===`macos`}function Es(e){if(e===`web`)return`vite:web`;if(Ts(e))return`vite:flutter:${e}`;throw Error(`Unsupported supervised development platform: ${e}.`)}function Ds(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}`}const Os=`extension:dev`;function ks(e){if(!q(I(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=I(e,`package.json`),n;try{n=JSON.parse(J(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.${Os} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function As({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`,Os,...n.length>0?[`--`,...n]:[]]}const js=[`web`,`webext`,`desktop`,`ios`,`android`,`macos`],Ms=[`managed-dev-overlay`],Ns=P.resolve(`node_modules`,`.bin`),Ps=G.platform===`win32`?`pnpm.cmd`:`pnpm`,Fs=G.platform===`win32`?`portless.cmd`:`portless`,Is=G.platform===`win32`?`react-router.cmd`:`react-router`,Ls=G.platform===`win32`?`turso.cmd`:`turso`;async function Rs({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,host:i,https:a=!1,interactive:o=G.stdin.isTTY===!0,lan:s=!1,managed:c=!1,noManaged:l=!1,platform:u=`web`,fresh:d=!1,reuseVite:f=!1,supervisor:p,verbose:m=!1,webPort:h}={}){let g=kt({env:r}),_=r.PATH??r.Path??``,v=u===`ios`||u===`android`||u===`macos`?u:void 0,y=u===`web`||v!==void 0;if(d&&f)throw Error(`Cannot use --fresh and --reuse-vite together.`);let b=!d&&(v||u===`web`)?await g.measure(`dev-session`,()=>es({cwd:e,platform:u})):void 0,x=f||b!==void 0,S=u===`desktop`?void 0:Xs(h??r.COREFRAME_WEB_PORT);if(b&&S!==void 0&&S!==b.vite.port)throw Error(`The active development session uses port ${b.vite.port}. Omit --port or use that port when reusing it.`);let C=u===`ios`||u===`android`||u===`macos`?b?.vite.port??S??5173:u===`web`||u===`webext`?b?.vite.port??S:void 0,w,T,E,ee,te,D,O,ne,re,k=!1,A,j=r,ae,M;if(c&&l)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&c)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(f&&v===void 0)throw Error(`The --reuse-vite option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(u===`webext`){if(c||l||t!==void 0||m)throw Error(`Managed development, debug features, and verbose native output are only supported for the main web or native development platforms.`);ks(e)}if(a&&u!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&u!==`ios`&&u!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(u===`web`&&r.TAURI_ENV_PLATFORM!==void 0&&r.COREFRAME_TAURI_DEV!==`1`)throw Error("Direct Tauri development is not supported. Run `pnpm dev desktop` instead.");let N=await g.measure(`routing`,()=>Zo({cwd:e,env:r,platform:u}));if(N&&await g.measure(`portless`,()=>Qo({cwd:e,env:r,lan:s})),y&&r.COREFRAME_DEV_SUPERVISOR!==`0`){let g=p??await Ot({cwd:e,env:r});if(g)return ys({cwd:e,debug:t,device:n,env:r,fresh:d,host:i,https:a,interactive:o,lan:s,managed:c,noManaged:l,platform:u,portless:N,reuseVite:f,supervisor:g,verbose:m,webPort:h})}let se=x?void 0:await g.measure(`dev-lock`,()=>Eo({cwd:e,interactive:o,platform:u}));if(!x&&!se)return;let F=()=>{k||(k=!0,T?.kill(`SIGTERM`),ee?.kill(`SIGTERM`),D?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),O?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),re?.close().catch(()=>void 0),ne?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),w?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),te?.kill(`SIGTERM`))},ce=e=>{A??=e,F()},I=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>ce(e);return G.on(e,t),{handler:t,signal:e}}),le=async e=>{let t=Ht(e);T=t;try{await t.expectSuccess()}catch(e){if(!k)throw e}finally{T===t&&(T=void 0)}};try{let d=u===`ios`||u===`android`?u:void 0,f=d?await Ya({env:r,interactive:o,platform:d,target:n}):void 0,p=d&&f?await Xa({device:f,host:i,interactive:o,platform:d}):void 0,h=v?!0:i,y={},b=!1,S;x||([y,b]=await Promise.all([g.measure(`config`,()=>Ie({cwd:e})),g.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(c||o&&!l)&&await Mt(e))]),await g.measure(`i18n`,()=>Wn({cwd:e,projectConfig:y})),S=u!==`webext`&&zs(e)?await Va.getAvailablePort():void 0);let T=x?void 0:await g.measure(`https`,async()=>a&&!N?Pt({cwd:e}):void 0),A=Yo(r,u);j={...A,...g.environment,...b?{[Bt]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...u===`desktop`?{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:Js()}:void 0,...v?{COREFRAME_PLATFORM:v}:void 0,...T?{[At]:T.cert,[jt]:T.key}:void 0,...S?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${S}`}:void 0};let ce=async()=>{if(!S)return;let t,n=async(e,n)=>{try{await e,k||t?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){k||t?.fail(e)}finally{await n.outputTasks,n.stdout.end(),n.stderr.end(),await Promise.allSettled([zt(n.stdout),zt(n.stderr)]),ne===e&&(ne=void 0)}};t=So({port:S,start:async()=>{if(k)throw Error(`The dashboard development server was stopped before it started.`);let t=await Va.getAvailablePort();if(k)throw Error(`The dashboard development server was stopped before it started.`);let r=Y({label:`dashboard`}),i=Y({color:`red`,label:`dashboard`});r.pipe(G.stdout,{end:!1}),i.pipe(G.stderr,{end:!1});let a=R(Is,[`dev`,`--host`,`127.0.0.1`,`--port`,String(t)],{cwd:P.resolve(e,`dashboard`),env:{...j,PATH:P.resolve(e,`node_modules/.bin`)+P.delimiter+_},stdin:`inherit`});ne=a;let o=Promise.allSettled([Bs(a.stdout,r),Bs(a.stderr,i)]);return n(a,{outputTasks:o,stderr:i,stdout:r}),{host:`127.0.0.1`,port:t}}}),re=t;try{await t.listen(),await t.wait()}finally{await t.close(),re===t&&(re=void 0)}},I=async()=>{let t=Y({label:`web`}),n=Y({color:`red`,label:`web`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),D=R(N?Fs:Is,N?$o({host:h,lan:s,port:C}):Ys({host:h,port:C,strictPort:v!==void 0}),{cwd:e,env:{...j,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[j.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:Ns+P.delimiter+_},stdin:`inherit`});let r=Promise.allSettled([Bs(D.stdout,t),Bs(D.stderr,n)]);try{await D;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!k)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([zt(t),zt(n)]),D=void 0}},L=async()=>{let t=Y({label:`webext`}),n=Y({color:`red`,label:`webext`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),O=R(Ps,As({host:i,port:C}),{cwd:e,env:j,stdin:`inherit`});let r=Promise.allSettled([Bs(O.stdout,t),Bs(O.stderr,n)]);try{await O;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!k)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([zt(t),zt(n)]),O=void 0}},ue=async t=>{for(;!k;){let n=u===`android`&&!m?await oe():void 0,r=u===`desktop`?R(Ps,Gs(),{cwd:e,env:A,stdio:`inherit`}):R(`flutter`,Ks({device:f??{id:`macos`},serverUrl:qs(u,p,C),verbose:m}),{cwd:P.join(e,`src-flutter`),env:A,stdio:n?[`inherit`,`pipe`,`pipe`]:`inherit`});w=r;try{await Promise.all([r,n?.capture(r)]);return}catch(e){if(u===`desktop`||k||!o)throw e;let n=await z.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(z.isCancel(n)||!n){z.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),t&&await t;return}}finally{w===r&&(w=void 0)}}},de=async()=>{if(x){if(u===`web`)return;await ie({cwd:e}),await ue();return}if(u===`web`){await I();return}let t=I().then(()=>{if(!k)throw Error(`The Vite development server stopped while ${u===`desktop`?`Tauri`:`Flutter`} was still running.`)});u!==`desktop`&&await ie({cwd:e});try{await Promise.race([t,ue(t)])}finally{F(),await Promise.allSettled([t,w]),w=void 0}},fe=async()=>{let t=Ht({name:`panda`,command:Ps,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:j});ee=t;try{if(await t.expectSuccess(),!k)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!k)throw e}finally{ee===t&&(ee=void 0)}},pe=async()=>{if(u===`webext`){await L();return}if(x){await de();return}let e=fe(),t=de(),n=S?ce():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),k&&await t}finally{F(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}},me=async()=>{x||!se?.owner||C===void 0||(await ns({cwd:e,owner:se.owner,platform:u,postgres:M,vitePort:C}),ae=se.owner)};if(b&&(j={...j,[Vt]:`1`}),k)return;if(u===`webext`){g.report(),await pe();return}if(x){g.report(),await pe();return}if(y.database?.dialect===`sqlite`&&(await g.measure(`database`,async()=>{let t=await Va.getAvailablePort(),n=P.resolve(e,`.coreframe`),i=P.join(n,`turso.db`);await $.mkdir(n,{recursive:!0}),j={...j,TURSO_DATABASE_URL:`http://127.0.0.1:${t}`,TURSO_AUTH_TOKEN:`dev`},te=Ht({name:`turso`,command:Ls,args:[`dev`,`--port`,String(t),`--db-file`,i],cwd:e,env:r}),await te.waitFor(`listening`)}),await g.measure(`schema`,()=>le({name:`db`,command:Ps,args:[`db`,`ensure`],cwd:e,env:j,prefix:!1})),k))return;if(Ws(y)){let t=Y({label:`postgres`});t.pipe(G.stdout,{end:!1});try{let n=await g.measure(`database`,()=>Us({config:y,cwd:e,env:j,failIfRunning:!0,interactive:o,isStopping:()=>k,postgresOutput:t,takeoverApproved:se?.takeoverApproved??!1}));if(!n)return;E=n,j=n.env,M=await Hs(n.env);try{k||await g.measure(`schema`,()=>le({name:`db`,command:Ps,args:[`db`,`ensure`],cwd:e,env:j,prefix:!1})),k||(await me(),g.report(),await pe())}finally{await n[Symbol.asyncDispose](),E===n&&(E=void 0)}}finally{t.end()}return}await me(),g.report(),await pe()}finally{F(),ae&&=(await rs({cwd:e,owner:ae}),void 0);let t;try{await E?.[Symbol.asyncDispose]()}catch(e){t=e}finally{for(let{handler:e,signal:t}of I)G.off(t,e);A&&(G.exitCode??=A===`SIGINT`?130:143)}Vs(t),await se?.release()}}function zs(e){return q(P.resolve(e,`dashboard/dashboard.config.ts`))}async function Bs(e,t){for await(let n of e)t.write(`${n}\n`)||await Rt(t,`drain`)}function Vs(e){if(e)throw e}async function Hs(e){let t=e.PGDATA;if(!t)return;let n=Number((await $.readFile(P.join(t,`postmaster.pid`),`utf8`).catch(()=>``)).split(/\r?\n/,1)[0]);return{dataDir:P.resolve(t),...Number.isSafeInteger(n)&&n>0?{pid:n}:void 0}}async function Us({interactive:e,isStopping:t,takeoverApproved:n,...r}){try{return await re(r)}catch(i){if(!(i instanceof m)||!e)throw i;if(!n){let e=await z.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${i.pid}). Stop it and start here?`});if(z.isCancel(e)||!e){z.cancel(`Keeping the existing PostgreSQL process.`);return}}return await k(i),t()?void 0:re(r)}}function Ws(e){return(e.database?.dialect??`postgres`)===`postgres`}function Gs(){return[`exec`,`tauri`,`dev`,`--config`,JSON.stringify({build:{beforeDevCommand:``}})]}function Ks({device:e,serverUrl:t,verbose:n}){return[`run`,`-d`,e.id,`--dart-define=COREFRAME_DEV_SERVER_URL=${t}`,...n?[`--verbose`]:[]]}function qs(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}`}function Js(){return G.platform===`win32`?`windows`:G.platform}function Ys({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 Xs(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}async function Zs(e={}){let t=e.cwd??G.cwd(),n=await Pe(`scripts/preview.ts`,t);if(typeof n.default!=`function`)throw Error(`scripts/preview.ts must export a default preview function.`);return qt({...e,cwd:t},n.default)}const Qs=`worker-configuration.d.ts`;async function $s({check:e=!1,cwd:t=process.cwd()}={}){let n=await Ie({cwd:t}),r=await nt({coreframeConfig:n,cwd:t}),i=L(t,Qs),a=L(t,`.coreframe-worker-types-${W()}.d.ts`);try{await R(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:`inherit`});let o=ec(await V(a,`utf8`)),s=Le(r.config),c=Fe(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${tc(c)}\n`;if(e){if(await V(i,`utf8`).catch(()=>``)!==l)throw Error(`${Qs} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await V(i,`utf8`).catch(()=>``);return u!==l&&await U(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await H(a,{force:!0})}}function ec(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
|
|
12
|
-
`)}function tc(e){return
|
|
13
|
-
`)}const nc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),rc=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],ic=[`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`],ac=[`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`],oc=`.coreframe/typegen.json`,sc=[`web`,`dashboard`,`worker`];async function cc({checkWorker:e=!1,cwd:t=G.cwd(),runners:n={}}={}){let r=await fc(t)??{generators:{},schemaVersion:1},i=[];return i.push(await uc({cwd:t,inputPaths:rc,name:`web`,outputPath:`.react-router`,run:()=>(n.web??dc)(t),state:r})),i.push(await uc({cwd:t,inputPaths:ic,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??hr)(t),state:r})),i.push(await uc({cwd:t,inputPaths:ac,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??$s)({check:e,cwd:t}),state:r})),i}function lc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function uc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await mc(e,t),s=await hc(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 hc(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await pc(e,a),{changed:s!==l,name:n,ran:!0}}async function dc(e){let t=G.platform===`win32`?`react-router.cmd`:`react-router`,n=G.env;await R(t,[`typegen`],{cwd:e,env:{...n,PATH:P.resolve(e,`node_modules/.bin`)+P.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function fc(e){try{let t=JSON.parse(await V(P.resolve(e,oc),`utf8`));if(!yc(t)||t.schemaVersion!==1)return;let n={};if(!yc(t.generators))return;for(let e of sc){let r=t.generators[e];yc(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 pc(e,t){let n=P.resolve(e,oc);await B(P.dirname(n),{recursive:!0}),await U(n,`${JSON.stringify(t)}\n`,{mode:384})}async function mc(e,t){let n=Re(`sha256`);for(let r of[...t].sort()){let t=P.resolve(e,r),i=await _c(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await gc(t)){let i=P.join(t,r),a=P.relative(e,i).split(P.sep).join(`/`);n.update(`${a}\0`),n.update(await V(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await V(t)))}return n.digest(`hex`)}async function hc(e,t){if(await _c(P.resolve(e,t)))return mc(e,[t])}async function gc(e){let t=[];async function n(e,r){let i=await Te(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(nc.has(a.name))continue;await n(P.join(e,a.name),P.join(r,a.name))}else a.isFile()&&t.push(P.join(r,a.name))}return await n(e,``),t.sort()}async function _c(e){try{return await Oe(e)}catch(e){if(vc(e))return;throw e}}function vc(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function yc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const bc=P.resolve(`node_modules`,`.bin`);G.env.PATH=bc+P.delimiter+G.env.PATH;const xc=G.platform===`win32`?`tsc.cmd`:`tsc`,Sc=[{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 Cc(){await cc({checkWorker:!0});let e=[];for(let t of Sc)try{await ye(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>Ht({name:e.name,command:xc,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 wc=r(s(Ms),{displayName:`feature`,from:async e=>e}),Tc=[`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.`],Ec=n({name:`deploy`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Deploy to the staging or production environment.`}),runMigrations:i({long:`run-migrations`,description:`Run pending deploy-safe database migrations before deploying.`,defaultValue:()=>!1}),skipMigrations:i({long:`skip-migrations`,description:`Deploy without running pending deploy-safe database migrations.`,defaultValue:()=>!1}),skipPostDeployChecks:i({long:`skip-post-deploy-checks`,description:`Skip post-deploy checks after Cloudflare deployment.`,defaultValue:()=>!1}),tauriLocalPlatforms:a({long:`tauri-local-platform`,type:t(s(xt)),description:`Build one Tauri release platform locally. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowName:c({long:`tauri-workflow-name`,type:l(f),description:`GitHub Actions workflow file or name for remote Tauri release builds.`}),tauriWorkflowPlatforms:a({long:`tauri-workflow-platform`,type:t(s(xt)),description:`Build one Tauri release platform with GitHub Actions. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowRef:c({long:`tauri-workflow-ref`,type:l(f),description:`Git ref used when dispatching remote Tauri release builds.`}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,tauriLocalPlatforms:i,tauriWorkflowName:a,tauriWorkflowPlatforms:o,tauriWorkflowRef:s,yes:c})=>xa([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i.flatMap(e=>[`--tauri-local-platform`,e]),...a?[`--tauri-workflow-name`,a]:[],...o.flatMap(e=>[`--tauri-workflow-platform`,e]),...s?[`--tauri-workflow-ref`,s]:[],...c?[`--yes`]:[]])}),Dc=p({name:`staging`,cmds:{reassign:n({name:`reassign`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ft();if(e){console.log(JSON.stringify({...t,notices:Tc}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${Tc.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await $e();console.log(e?JSON.stringify({url:t}):t)}})}}),Oc=p({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Worker environment whose access JWTs should be invalidated.`}),yes:i({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 vt({environment:e}),console.log(`Rotated Coreframe access-token signing material for ${e}. Clients must remint outstanding access JWTs.`)}}),status:n({name:`status`,args:{environment:u({type:l(s(Ze)),displayName:`environment`,description:`Inspect staging, production, or both when omitted.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({environment:e,json:t})=>{let n=await et({environment:e});console.log(t?JSON.stringify(n):Nc(n))}}),set:n({name:`set`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(f),displayName:`name`,description:`Declared Worker secret name; omit to configure known secrets.`}),bulk:i({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 st({environment:e,name:t,value:await Pc(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await lt(),i=n?await Ic(r):await Fc(r,e);await ct({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:n({name:`discard`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:f,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await Qe({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),kc=n({name:`typecheck`,args:{},handler:Cc}),Ac=p({name:`worker`,cmds:{typegen:n({name:`typegen`,args:{check:i({long:`check`,description:`Fail when the committed primary Worker declarations are stale.`,defaultValue:()=>!1})},handler:async({check:e})=>{let t=await $s({check:e});console.log(e?`${Rc(t.path)} is current.`:`${Rc(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),jc=n({name:`dev`,args:{debug:c({long:`debug`,type:l(wc),description:`Launch a development feature in isolated debug mode.`}),https:i({long:`https`,description:`Serve the web app over locally trusted HTTPS.`,defaultValue:()=>!1}),fresh:i({long:`fresh`,description:`Start a new directory-scoped development session instead of attaching to one.`,defaultValue:()=>!1}),host:c({long:`host`,type:l(f),implicitValue:`0.0.0.0`,description:`Host address for the web development server. Pass without an address to use 0.0.0.0.`}),lan:i({long:`lan`,description:`Expose the Portless development proxy to devices on the local network.`,defaultValue:()=>!1}),managed:i({long:`managed`,description:`Run managed checkout synchronization even without an interactive terminal.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),reuseVite:i({long:`reuse-vite`,description:`Use an existing Vite development server instead of starting another one for Flutter.`,defaultValue:()=>!1}),stop:i({long:`stop`,description:`Stop the directory development supervisor and its managed services.`,defaultValue:()=>!1}),platform:u({type:l(s(js)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(f),displayName:`device`,description:`Device name or ID for iOS or Android development.`}),port:c({long:`port`,type:l(o),description:`Port for the web development server.`}),verbose:i({long:`verbose`,description:`Show the full native development output.`,defaultValue:()=>!1})},handler:({debug:e,device:t,fresh:n,host:r,https:i,lan:a,managed:o,noManaged:s,platform:c,port:l,reuseVite:u,stop:d,verbose:f})=>d?Ft({cwd:G.cwd()}):Rs({debug:e,device:t,fresh:n,host:r,https:i,lan:a,managed:o,noManaged:s,platform:c??`web`,reuseVite:u,verbose:f,webPort:l})}),Mc=n({name:`preview`,args:{host:c({long:`host`,type:l(f),description:`Host address for the preview server.`}),port:c({long:`port`,type:l(o),description:`Port for the preview server.`})},handler:({host:e,port:t})=>Zs({host:e,port:t})});function Nc(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(`
|
|
14
|
-
`)}async function Pc(e){if(!G.stdin.isTTY){let e=``;for await(let t of G.stdin)e+=t.toString();return e.replace(/\r?\n$/,``)}let t=await z.password({message:`Enter the new value for ${e}`});if(z.isCancel(t))throw z.cancel(`Secret update cancelled.`),Error(`Secret update cancelled.`);return t}async function Fc(e,t){if(!G.stdin.isTTY)throw Error(`Interactive secret setup requires a terminal. Provide a secret name or use --bulk with piped dotenv contents.`);if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let n={};for(let r of e){let e=r.requiredIn.includes(t),i=await z.password({message:`${r.name}: ${r.description}${e?` (required)`:` (optional; leave blank to skip)`}`,validate:n=>e&&!n?.trim()?`${r.name} is required in ${t}.`:void 0});if(z.isCancel(i))throw z.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);i.trim()&&(n[r.name]=i)}return n}async function Ic(e){if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let t=G.stdin.isTTY?await z.multiline({message:`Paste dotenv-formatted Worker secrets. Press Enter twice to submit.`,validate:e=>e?.trim()?void 0:`Paste at least one dotenv entry.`}):await Lc();if(z.isCancel(t))throw z.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=rt(t,e);return n.length>0&&z.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function Lc(){let e=``;for await(let t of G.stdin)e+=t.toString();return e}function Rc(e){return e.split(/[\\/]/).at(-1)??e}const zc=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await cc();for(let t of e)console.log(lc(t))}});function Bc(e,{formatMessage:t,temporaryDirectory:n=Me(),write:r=e=>console.error(e)}={}){let i=Kc(e),a=Yc(Hc(e,t),i);try{let t=I(He(I(n,`coreframe-error-`)),`error.log`);return Ke(t,`${Yc(Uc(e),i)}\n`,{mode:384}),r(`Error: ${a}\nFull diagnostic: ${t}`),t}catch{r(`Error: ${a}\nThe full diagnostic could not be written to the temporary directory.`);return}}function Vc(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,Bc(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function Hc(e,t){try{return t?.(e)||(e instanceof Error?e.message:String(e)).split(/\r?\n/,1)[0]||`Unknown error`}catch{return`Unknown error`}}function Uc(e){try{let t=Wc(e);if(!(e instanceof Error)||!Gc(t))return It(t,{customInspect:!1,depth:10});let n=typeof t.stack==`string`?t.stack:`${e.name}: ${e.message}`;return delete t.name,delete t.message,delete t.stack,`${n}${Reflect.ownKeys(t).length?`\n${It(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function Wc(e,t=new WeakMap){if((typeof e!=`object`||!e)&&typeof e!=`function`)return e;let n=e,r=t.get(n);if(r)return r;if(typeof e==`function`)return`[Function${e.name?`: ${e.name}`:``}]`;let i=Array.isArray(e)?[]:{};t.set(n,i),e instanceof Error&&(i.name=e.name,i.message=e.message,i.stack=e.stack??`${e.name}: ${e.message}`);for(let r of Reflect.ownKeys(n)){if(typeof r!=`string`||r.toLowerCase()===`env`||Array.isArray(e)&&r===`length`||e instanceof Error&&(r===`name`||r===`message`||r===`stack`))continue;let a=Object.getOwnPropertyDescriptor(n,r);!a||!(`value`in a)||Object.defineProperty(i,r,{configurable:!0,enumerable:!0,value:Wc(a.value,t),writable:!0})}return i}function Gc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Kc(e,t=new WeakSet){let n=new Set;function r(e){if((typeof e!=`object`||!e)&&typeof e!=`function`)return;let i=e;if(!t.has(i)){t.add(i);for(let e of Reflect.ownKeys(i)){if(typeof e!=`string`)continue;let t=Object.getOwnPropertyDescriptor(i,e);!t||!(`value`in t)||(e.toLowerCase()===`env`?qc(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function qc(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);typeof n==`string`&&Jc(n)&&r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function Jc(e){return/(?:^|_)(?:AUTH|CERT|COOKIE|CREDENTIALS?|DATABASE_URL|DSN|KEY|PASS(?:WORD)?|PRIVATE|SECRET|SESSION|TOKEN)(?:_|$)/i.test(e)}function Yc(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const Xc=p({name:`coreframe`,cmds:{build:an,dashboard:br,assets:ur,flutter:dr,i18n:fr,deploy:Ec,staging:Dc,secrets:Oc,typegen:zc,typecheck:kc,worker:Ac,dev:jc,preview:Mc,upgrade:_a,recipes:va,db:ya}});import.meta.main&&Vc(Xc,{formatMessage:process.argv[2]===`db`?x:void 0});export{Xc as coreframeCli};
|
|
11
|
+
`),`Pending Worker secret updates`),d.provisioned&&z.log.info(`Provisioning Coreframe-managed access-token signing material.`),await Na(n);let S=await Ea(await v({config:a.database,env:t})),w=await D(S);if(w.length>0)throw Error(`Pending deploy migrations contain unsafe SQL. Move unsafe statements to held migrations.\n${C(w)}`);let T=await Oa(n,S);try{_&&(await Et(ba,r,m),b=await Dt(c,m)),z.log.step(`Running pre-deploy build`),await R(`pnpm`,[`build`],{env:Ba(g),stdio:`inherit`});let e=c.enabled?await ot({env:Ba(g),plan:c,releaseName:h,version:m}):void 0;z.log.step(`Running release build and uploading PostHog source maps`),y=!0,await R(`pnpm`,[`build`],{env:g,stdio:`inherit`}),T&&(z.log.step(`Running deploy-safe database migrations`),await R(`pnpm`,[`db`,`migrate`],{env:g,stdio:`inherit`})),z.log.step(`Deploying Worker and static assets to Cloudflare`);let t={...u?{DASHBOARD_PASSWORD:u}:{},...d.value?{[Ye]:d.value}:{},...l.values},i=Object.keys(t).length>0?await La(t):void 0,f=await tt({coreframeConfig:a,environment:n.environment,contributions:{generatedValues:{DEPLOY_ENV:n.environment,POSTHOG_RELEASE:h}}});try{await R(`pnpm`,[`exec`,`wrangler`,`deploy`,`--config`,f.path,`--env`,n.environment,`--strict`,`--keep-vars`,`--tag`,h,`--message`,`Deploy ${h}`,...i?[`--secrets-file`,i.path]:[]],{env:g,stdio:`inherit`}),await Xe(l),await Tt({environment:n.environment})}finally{await f.dispose(),await i?.dispose()}let p={environment:n.environment,releaseName:h,url:s,version:m};o.afterWorkerDeploy&&(z.log.step(`Running required after-Worker deploy hook`),await yt(o,p)),n.skipPostDeployChecks||(z.log.step(`Running post-deploy checks`),await bt(o,p)),e&&(z.log.step(`Uploading Tauri release artifacts to Backblaze B2`),await St(c,e)),z.outro(`Deployed ${h} to ${n.environment}`)}catch(e){throw!y&&_&&(await U(ba,i),await _t(b)),e}}function Sa(e){return{environment:Ca(e[0]),runMigrations:e.includes(`--run-migrations`),skipMigrations:e.includes(`--skip-migrations`),skipPostDeployChecks:e.includes(`--skip-post-deploy-checks`),tauriLocalPlatforms:wa(e,`--tauri-local-platform`).map(e=>it(e)),tauriWorkflowName:Ta(e,`--tauri-workflow-name`),tauriWorkflowPlatforms:wa(e,`--tauri-workflow-platform`).map(e=>it(e)),tauriWorkflowRef:Ta(e,`--tauri-workflow-ref`),yes:e.includes(`--yes`)}}function Ca(e){if(e&&Ze.includes(e))return e;throw Error(`Deploy environment must be one of: ${Ze.join(`, `)}.`)}function wa(e,t){let n=[];for(let r=0;r<e.length;r+=1){let i=e[r];if(i===t){let i=e[r+1];if(!i||i.startsWith(`--`))throw Error(`${t} requires a value.`);n.push(...i.split(`,`).filter(Boolean)),r+=1;continue}i.startsWith(`${t}=`)&&n.push(...i.slice(t.length+1).split(`,`).filter(Boolean))}return n}function Ta(e,t){let n=wa(e,t);if(n.length>1)throw Error(`${t} can only be provided once.`);return n[0]}async function Ea(e){try{return await Da(e)}finally{await e.close?.()}}async function Da(e){return b(await _(),await E(e))}async function Oa(e,t){if(t.length===0)return z.log.info(`No pending deploy migrations.`),!1;if(z.note(S(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 z.confirm({initialValue:!0,message:`Run these deploy-safe database migrations before Cloudflare deploy?`});if(z.isCancel(n))throw z.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`);return n}async function ka(){let{stdout:e}=await R(`git`,[`status`,`--porcelain`],{stdin:`ignore`});if(e.trim().length>0)throw Error(`Deploy requires a clean git tree.`);let{stdout:t}=await R(`git`,[`rev-parse`,`HEAD`],{stdin:`ignore`});return t.trim()}function Aa(e){if(e.runMigrations&&e.skipMigrations)throw Error(`Use only one of --run-migrations or --skip-migrations.`)}async function ja(e,t,n=$e){return e.url?Ma(e.url,t):t===`staging`&&e.stagingHostname?Ma(await n(),t):Ma(void 0,t)}function Ma(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 Na(e){if(e.environment!==`production`||e.yes)return;if(!process.stdout.isTTY)throw Error(`Production deploys require --yes in noninteractive environments.`);let t=await z.confirm({initialValue:!1,message:`Deploy to production?`});if(z.isCancel(t)||!t)throw z.cancel(`Deploy cancelled.`),Error(`Deploy cancelled.`)}function Pa(e,t){if(e===`staging`&&t)throw Error(`Tauri releases can only be published from production deploys.`)}function Fa(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 Ia(e,t){let n=e.DASHBOARD_PASSWORD?.trim();if(n)return n;let r;try{r=Lt(await V(`.env`,`utf8`))}catch(e){throw Ra(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 La(e){let t=await we(I(Me(),`coreframe-deploy-secrets-`)),n=I(t,`secrets.json`);return await U(n,JSON.stringify(e),{mode:384}),{path:n,dispose:()=>H(t,{force:!0,recursive:!0})}}function Ra(e){return e instanceof Error&&`code`in e}function za(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 Ba(e){let{POSTHOG_API_KEY:t,POSTHOG_PROJECT_ID:n,...r}=e;return r}const $={access:ye,chmod:be,mkdir:B,mkdtemp:we,readFile:V,readFileSync:J,rm:H,writeFile:U},Va={getAvailablePort:Ua},Ha={homedir:Ae,kill:G.kill,networkInterfaces:je,tmpdir:Me};async function Ua(){let e=Wt();try{await new Promise((t,n)=>{e.once(`error`,n),e.listen(0,`127.0.0.1`,t)});let t=e.address();if(!t||typeof t==`string`)throw Error(`Could not allocate an available TCP port.`);return t.port}finally{e.listening&&await new Promise((t,n)=>{e.close(e=>e?n(e):t())})}}async function Wa(){let e=await Ka();return typeof e.mobileDevHost==`string`?{mobileDevHost:e.mobileDevHost}:{}}async function Ga(e){let t=await Ka(),n=qa();await $.mkdir(P.dirname(n),{recursive:!0}),await $.writeFile(n,`${JSON.stringify({...t,...e},void 0,2)}\n`)}async function Ka(){try{let e=await $.readFile(qa(),`utf8`),t=JSON.parse(e);return Ja(t)?t:{}}catch{return{}}}function qa(){return P.join(Ha.homedir(),`.coreframe`,`preferences.json`)}function Ja(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}async function Ya({env:e=G.env,interactive:t=G.stdin.isTTY===!0,platform:n,target:r}){let i=await eo(n,e).catch(()=>[]),a=r?vo(i,r):void 0;if(a)return a;if(!r&&i.length>0)return $a(i,n,t);let o=r?vo(await no(e).catch(()=>[]),r):void 0;if(o&&o.platform===n)return ro(o,n,e,t);let s=await to(n,e),c=r?vo(s,r):void 0;if(c)return c;if(!r&&s.length>0)return $a(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 Xa(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=bo();if(i.length===0)throw Error(`No external IP address was detected. Pass one explicitly with --host.`);let a=await Za();if(a&&i.includes(a))return a;if(i.length===1)return await Qa(i[0]),i[0];if(!r)throw Error(`Multiple external IP addresses were detected (${i.join(`, `)}). Pass one explicitly with --host.`);let o=await z.select({message:`Which IP address should the mobile device use to reach the development server?`,options:i.map(e=>({label:e,value:e}))});if(z.isCancel(o))throw Error(`Mobile development IP selection was cancelled.`);return await Qa(o),o}async function Za(){return(await Wa()).mobileDevHost}async function Qa(e){try{await Ga({mobileDevHost:e})}catch(e){z.log.warn(`Could not remember the mobile development IP address: ${e instanceof Error?e.message:String(e)}`)}}async function $a(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 z.select({message:`Which ${t===`ios`?`iOS`:`Android`} device should Coreframe use?`,options:e.map(e=>({label:e.label,value:e,hint:e.id}))});if(z.isCancel(r))throw Error(`Mobile development device selection was cancelled.`);return r}async function eo(e,t){return e===`android`?ao(t):so(t)}async function to(e,t){return e===`android`?oo(t):co(t)}async function no(e){let{stdout:t}=await R(`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 ro(e,t,n,r){let i=await io(t,n).catch(()=>[]),{stdout:a}=await R(`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 io(t,n).catch(()=>[]),o=vo(a,e.id);if(o)return o;let s=a.filter(e=>!i.some(t=>t.id===e.id));if(s.length>0)return $a(s,t,r);if(a.length===1)return a[0];await Gt(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 io(e,t){return e===`ios`?co(t,`booted`):(await ao(t)).filter(e=>!e.physical)}async function ao(e){let t=await uo(e,`platform-tools`,G.platform===`win32`?`adb.exe`:`adb`),{stdout:n}=await R(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 ho(t,e,n,r):await go(t,e,n,r);return{id:n,label:a===r?a:`${a} (${r})`,name:a,physical:!i}}))).sort(xo)}async function oo(e){let{stdout:t}=await R(await uo(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 so(e){let t=await $.mkdtemp(P.join(Ha.tmpdir(),`coreframe-ios-devices-`)),n=P.join(t,`devices.json`);try{return await $.writeFile(n,``),await R(`xcrun`,[`devicectl`,`list`,`devices`,`--json-output`,n],{env:e}),(JSON.parse(await $.readFile(n,`utf8`)).result?.devices??[]).filter(lo).map(e=>({id:e.hardwareProperties.udid,label:`${e.deviceProperties.name} (${e.hardwareProperties.productType})`,name:e.deviceProperties.name,physical:!0})).sort(xo)}finally{await $.rm(t,{force:!0,recursive:!0})}}async function co(e,t=`available`){let{stdout:n}=await R(`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(xo)}function lo(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 uo(e,t,n){let r=e.ANDROID_HOME??e.ANDROID_SDK_ROOT,i=r?[r]:fo(e);for(let e of i){let r=P.join(e,t,n);try{return await $.access(r),r}catch{}}return n}function fo(e){return G.platform===`darwin`?[P.join(Ha.homedir(),`Library`,`Android`,`sdk`)]:G.platform===`win32`&&e.LOCALAPPDATA?[P.join(e.LOCALAPPDATA,`Android`,`Sdk`)]:[P.join(Ha.homedir(),`Android`,`Sdk`)]}async function po(e,t,n,r){return(await mo(e,t,[`-s`,n,`shell`,`getprop`,r])).trim()}async function mo(e,t,n){return(await R(e,n,{env:t,timeout:3e3})).stdout}async function ho(e,t,n,r){return mo(e,t,[`-s`,n,`emu`,`avd`,`name`]).then(e=>e.split(/\r?\n/)[0]?.trim()||r).catch(()=>r)}async function go(e,t,n,r){return mo(e,t,[`-s`,n,`shell`,`dumpsys`,`bluetooth_manager`]).then(e=>_o(e)||r).catch(()=>r)}function _o(e){return e.match(/\bname: (.+)/)?.[1]?.trim()}function vo(e,t){let n=e.map(e=>({device:e,score:Math.max(yo(t,e.name),yo(t,e.id))})).sort((e,t)=>t.score-e.score)[0];return n&&n.score>0?n.device:void 0}function yo(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 bo(){return[...new Set(Object.values(Ha.networkInterfaces()).flatMap(e=>e??[]).filter(e=>!e.internal&&e.family===`IPv4`).map(e=>e.address))].sort()}function xo(e,t){return e.label.localeCompare(t.label)}function So({host:e=`127.0.0.1`,port:t,start:n}){let r,i=!1,a=!1,o=!1,s,c,l,u,d,f=new Set,p=new Promise((e,t)=>{u=e,d=t}),m=e=>{a||o||(o=!0,d(e))},h=()=>(s||=Promise.resolve().then(n).catch(e=>{throw m(e),e}),s),g=e=>{f.add(e),e.once(`close`,()=>f.delete(e)),e.pause(),_(e).catch(t=>{m(t),e.destroy()})},_=async e=>{let t=await h();if(a||e.destroyed)return;let n=await Co(t,()=>a);if(a||e.destroyed){n.destroy();return}f.add(n),n.once(`close`,()=>f.delete(n)),n.on(`error`,()=>e.destroy()),n.once(`close`,()=>e.destroy()),e.on(`error`,()=>n.destroy()),e.once(`close`,()=>n.destroy()),e.pipe(n),n.pipe(e)};return{close:async()=>l||(l=(async()=>{a=!0,o||(o=!0,u());for(let e of f)e.destroy();f.clear(),c&&!i&&await Promise.allSettled([c]),!(!r||!i)&&(await new Promise(e=>{r.close(()=>e())}),i=!1)})(),l),fail:m,listen:async()=>c||(r=Wt(g),c=new Promise((n,a)=>{let o=e=>{if(i){m(e);return}a(e)};r.once(`error`,o),r.once(`listening`,()=>{i=!0,r.off(`error`,o),r.on(`error`,m),n()}),r.listen(t,e)}),c),wait:()=>p}}async function Co(e,t){let n=Date.now()+1e4,r;for(;!t();)try{return await wo(e)}catch(e){if(r=e,Date.now()>=n)break;await new Promise(e=>setTimeout(e,50))}throw r instanceof Error?r:Error(`Could not connect to the dashboard.`)}function wo({host:e=`127.0.0.1`,port:t}){return new Promise((n,r)=>{let i=Ut({host:e,port:t}),a=e=>{i.off(`connect`,o),i.destroy(),r(e)},o=()=>{i.off(`error`,a),n(i)};i.once(`error`,a),i.once(`connect`,o)})}const To={command:Vo,isRunning:Mo,stop(e){try{G.kill(e,`SIGTERM`)}catch(e){if(!Fo(e))throw e}},waitForExit:No};async function Eo({confirmStop:e=ko,cwd:t=G.cwd(),interactive:n=G.stdin.isTTY===!0,pid:r=G.pid,platform:i=`web`,processes:a=To}={}){let o=await Wo(t,i),s=o.file,c={pid:r,platform:i,repository:o.repository,token:W()},l=`${JSON.stringify(c)}\n`,u=`${s}.${c.token}.tmp`,d=await Lo({confirmStop:e,file:P.resolve(t,`.coreframe/dev.lock`),interactive:n,owner:c,processes:a});if(d===void 0)return;let f=d;await B(P.dirname(s),{recursive:!0}),await U(u,l,{flag:`wx`,mode:384});try{for(;;){try{return await Ce(u,s),{owner:c,async release(){await jo(s,l)},takeoverApproved:f}}catch(e){if(!Po(e))throw e}let t=await Oo({confirmStop:e,file:s,interactive:n,owner:c,processes:a});if(t===void 0)return;f||=t}}finally{await ke(u).catch(()=>void 0)}}async function Do({cwd:e=G.cwd(),platform:t=`web`}={}){let{file:n}=await Wo(e,t);return(await Ao(n))?.owner}async function Oo({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Ao(t);if(!a||!Jo(a.owner,r)||!i.isRunning(a.owner.pid))return await jo(t,a?.source),!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await jo(t,a.source),!0}async function ko(e){let t=await z.confirm({initialValue:!1,message:`Coreframe dev is already running for this project (PID ${e}). Stop it and start here?`});return z.isCancel(t)||!t?(z.cancel(`Keeping the existing Coreframe dev process.`),!1):!0}async function Ao(e){try{let t=await V(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.platform!=`string`||n.platform.length===0||typeof n.repository!=`string`||n.repository.length===0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}async function jo(e,t){let n=await V(e,`utf8`).catch(()=>void 0);(t===void 0||n===t)&&await ke(e).catch(()=>void 0)}function Mo(e){try{return G.kill(e,0),!0}catch(e){return!Fo(e)}}async function No(e){let t=Date.now()+1e4;for(;Mo(e);){if(Date.now()>=t)throw Error(`Coreframe dev process ${e} did not stop within 10 seconds.`);await new Promise(e=>setTimeout(e,50))}}function Po(e){return Io(e)&&e.code===`EEXIST`}function Fo(e){return Io(e)&&e.code===`ESRCH`}function Io(e){return e instanceof Error}async function Lo({confirmStop:e,file:t,interactive:n,owner:r,processes:i}){let a=await Ro(t);if(!a||!i.isRunning(a.owner.pid))return await jo(t,a?.source),!1;let o=i.command?.(a.owner.pid);if(!o||!zo(o,r.platform))return!1;if(!n)throw Error(`Coreframe dev is already running for this project (PID ${a.owner.pid}). Stop it before starting another.`);if(await e(a.owner.pid))return i.stop(a.owner.pid),await i.waitForExit(a.owner.pid),await jo(t,a.source),!0}async function Ro(e){try{let t=await V(e,`utf8`),n=JSON.parse(t);return!Number.isSafeInteger(n.pid)||Number(n.pid)<=0||typeof n.token!=`string`||n.token.length===0?void 0:{owner:n,source:t}}catch{return}}function zo(e,t){let n=e.trim().split(/\s+/u),r=n.findIndex(e=>{let t=e.split(/[\\/]/u).at(-1);return t===`coreframe`||t===`coreframe.js`||t===`coreframe.ts`});if(r<0)return!1;let i=n.indexOf(`dev`,r+1);return i<0?!1:Bo(n.slice(i+1))===t}function Bo(e){let t=new Set([`android`,`desktop`,`ios`,`macos`,`web`]),n=new Set([`--debug`,`--host`,`--port`]),r=!1;for(let i of e){if(r){r=!1;continue}if(n.has(i)){r=!0;continue}if(!i.startsWith(`-`))return t.has(i)?i:`web`}return`web`}function Vo(e){let t=G.platform===`win32`?Uo(e):Ho(e);if(t.status===0)return t.stdout.trim()||void 0}function Ho(e){return K(`ps`,[`-p`,String(e),`-o`,`command=`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}function Uo(e){return K(`powershell.exe`,[`-NoProfile`,`-NonInteractive`,`-Command`,`(Get-CimInstance Win32_Process -Filter 'ProcessId = ${e}').CommandLine`],{encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]})}async function Wo(e,t){let n=await Go(P.resolve(e)),r=n.gitCommonDir?P.join(n.path,`coreframe-dev`):P.join(n.path,`.coreframe`);return{file:P.join(r,`dev.${t}.lock`),repository:n.path}}async function Go(e){let t=Ko(e);return t?{gitCommonDir:!0,path:await qo(P.resolve(e,t))}:{gitCommonDir:!1,path:await qo(e)}}function Ko(e){let t=K(`git`,[`rev-parse`,`--git-common-dir`],{cwd:e,encoding:`utf8`,stdio:[`ignore`,`pipe`,`ignore`]});if(t.status===0)return t.stdout.trim()||void 0}async function qo(e){return Ee(e).catch(()=>P.resolve(e))}function Jo(e,t){return e.platform===t.platform&&e.repository===t.repository}function Yo(e,t){let n={...e};return t===`desktop`?delete n.COREFRAME_PLATFORM:t===`web`||t===`webext`?n.COREFRAME_PLATFORM=`web`:n.COREFRAME_PLATFORM=t,n}const Xo=G.platform===`win32`?`portless.cmd`:`portless`;async function Zo({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||t.TAURI_ENV_PLATFORM!==void 0||(await Kt()).isAgent?!1:Nt(e)}async function Qo({cwd:e,env:t,lan:n=!1}){let r=P.join(`node_modules`,`.bin`,Xo),i=[`proxy`,`start`,...n?[`--lan`]:[]];await R(P.resolve(e,r),i,{cwd:e,env:t,stdio:`inherit`})}function $o({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]]}async function es({cwd:e=G.cwd(),platform:t}){let n=await ts({cwd:e});if(!n||!us(n.platform)||!ds(n.platform,t)||!ps(n.owner.pid))return;let r=await Do({cwd:e,platform:n.platform});if(!(!r||!ms(n.owner,r))&&!(n.postgres?.pid!==void 0&&!ps(n.postgres.pid)))return n}async function ts({cwd:e=G.cwd()}={}){let t;try{t=JSON.parse(await V(is(e),`utf8`))}catch{return}return as(t)&&t.cwd===P.resolve(e)?t:void 0}async function ns({cwd:e=G.cwd(),owner:t,platform:n,postgres:r,vitePort:i}){let a=is(e),o=P.dirname(a),s=`${a}.${W()}.tmp`,c={cwd:P.resolve(e),owner:t,platform:n,...r?{postgres:r}:void 0,version:1,vite:{port:i}};await B(o,{recursive:!0});try{await U(s,`${JSON.stringify(c)}\n`,{flag:`wx`,mode:384}),await De(s,a)}finally{await ke(s).catch(()=>void 0)}}async function rs({cwd:e=G.cwd(),owner:t}){let n=is(e),r=await ts({cwd:e});!r||!ms(r.owner,t)||await ke(n).catch(()=>void 0)}function is(e){return P.resolve(e,`.coreframe/dev.session.json`)}function as(e){if(!e||typeof e!=`object`)return!1;let t=e;return t.version===1&&typeof t.cwd==`string`&&os(t.owner)&&cs(t.platform)&&fs(t.vite?.port)&&(t.postgres===void 0||ss(t.postgres))}function os(e){if(!e||typeof e!=`object`)return!1;let t=e,n=t.pid;return typeof n==`number`&&Number.isSafeInteger(n)&&n>0&&typeof t.token==`string`}function ss(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.dataDir==`string`&&(t.pid===void 0||Number.isSafeInteger(t.pid)&&t.pid>0)}function cs(e){return e===`android`||e===`desktop`||e===`ios`||e===`macos`||e===`web`}function ls(e){return e===`android`||e===`ios`||e===`macos`}function us(e){return e===`web`||ls(e)}function ds(e,t){return t===void 0?ls(e):e===t}function fs(e){return typeof e==`number`&&Number.isSafeInteger(e)&&e>0&&e<=65535}function ps(e){try{return G.kill(e,0),!0}catch(e){return e instanceof Error&&e.code===`EPERM`}}function ms(e,t){return e.pid===t.pid&&e.token===t.token}const hs=G.platform===`win32`?`pnpm.cmd`:`pnpm`,gs=G.platform===`win32`?`portless.cmd`:`portless`,_s=G.platform===`win32`?`react-router.cmd`:`react-router`,vs=G.platform===`win32`?`turso.cmd`:`turso`;async function ys({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,host:i,https:a=!1,interactive:o=G.stdin.isTTY===!0,lan:s=!1,managed:c=!1,noManaged:l=!1,platform:u=`web`,portless:d,fresh:f=!1,reuseVite:p=!1,verbose:m=!1,webPort:h,supervisor:g}){let _=kt({env:r}),v=Ts(u)?u:void 0,y=Es(u),b=u===`ios`||u===`android`?u:void 0,x=b?await Ya({env:r,interactive:o,platform:b,target:n}):void 0,S=b&&x?await Xa({device:x,host:i,interactive:o,platform:b}):void 0,C=v?!0:i,w=await _.measure(`config`,()=>Ie({cwd:e})),T=await _.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(c||o&&!l)&&await Mt(e));await _.measure(`i18n`,()=>Wn({cwd:e,projectConfig:w}));let E=await _.measure(`routing`,async()=>d??await Zo({cwd:e,env:r,platform:u})),ee=await _.measure(`https`,async()=>a&&!E?Pt({cwd:e}):void 0),te=Yo(r,u),D={...te,..._.environment,...T?{[Bt]:`1`,[Vt]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...v?{COREFRAME_PLATFORM:v}:void 0,...ee?{[At]:ee.cert,[jt]:ee.key}:void 0},O=!1,ne,re,k,A,j,ae,M,oe=new Map,N=[`postgres`,y];for(let e of N){let t=e===`postgres`?`postgres`:e.startsWith(`vite:flutter`)?`flutter`:`web`,n=Y({label:t}),r=Y({color:`red`,label:t});n.pipe(G.stdout,{end:!1}),r.pipe(G.stderr,{end:!1}),oe.set(e,{stderr:r,stdout:n})}let se=g.onEvent(e=>{e.event===`log`?(oe.get(e.resource)?.[e.stream])?.write(e.data):e.event===`service`&&e.resource===y&&e.state===`failed`&&(M=Error(e.error??`${y} development failed.`),F())}),F=()=>{O||(O=!0,k?.kill(`SIGTERM`),A?.kill(`SIGTERM`),re?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0))},ce=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>{ne??=e,F()};return G.on(e,t),{handler:t,signal:e}}),I=async e=>{let t=Ht(e);k=t;try{await t.expectSuccess()}catch(e){if(!O)throw e}finally{k===t&&(k=void 0)}};try{if(await g.subscribe(N),ws(w)){let e=await g.acquirePostgres({config:w,env:D});j=e.leaseId,D={...D,...e.env}}if(w.database?.dialect===`sqlite`){let t=await Va.getAvailablePort(),n=P.resolve(e,`.coreframe`),r=P.join(n,`turso.db`);await $.mkdir(n,{recursive:!0}),D={...D,TURSO_DATABASE_URL:`http://127.0.0.1:${t}`,TURSO_AUTH_TOKEN:`dev`},A=Ht({name:`turso`,command:vs,args:[`dev`,`--port`,String(t),`--db-file`,r],cwd:e,env:D}),await A.waitFor(`listening`)}(ws(w)||w.database?.dialect===`sqlite`)&&await _.measure(`schema`,()=>I({name:`db`,command:hs,args:[`db`,`ensure`],cwd:e,env:D,prefix:!1}));let t=Cs(h??r.COREFRAME_WEB_PORT),n=await g.status(),i=n.resources?.find(e=>e.resource===y),c=i!==void 0&&!f&&t===void 0?void 0:t??5173,l=c??i?.endpoint?.port??5173;if(c!==void 0&&n.resources?.some(e=>e.resource!==y&&e.endpoint?.port===l)){if(t!==void 0)throw Error(`Port ${l} is already used by another Coreframe development shell.`);l=await Va.getAvailablePort()}if(!p){let t={...D,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[D.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:P.join(e,`node_modules`,`.bin`)+P.delimiter+(D.PATH??``)},n=[{args:E?$o({host:C,lan:s,port:l}):[`dev`,...C===void 0?[]:[`--host`,C===!0?`0.0.0.0`:C],`--port`,String(l),...v?[`--strictPort`]:[]],command:E?gs:_s,cwd:e,env:t},{args:[`exec`,`panda`,`dev`,`--no-color`],command:hs,cwd:e,env:D}],r=await g.acquireVite({configFingerprint:Ss({cwd:e,host:C,lan:s,https:a,portless:E,resource:y}),endpoint:{host:C===!0?`0.0.0.0`:C??`127.0.0.1`,port:l},processes:n,resource:y},f);ae=r.leaseId,l=r.endpoint.port}if(_.report(),O)return;if(u===`web`?await xs(g,y,()=>M):(await ie({cwd:e}),await bs({cwd:e,env:te,interactive:o,mobileHost:S,platform:u,port:l,requestStop:F,selectedDevice:x,isStopping:()=>O,setActiveNative:e=>{re=e},verbose:m})),M)throw M}finally{F(),ae&&await g.release(ae).catch(()=>void 0),j&&await g.release(j).catch(()=>void 0),se();for(let{handler:e,signal:t}of ce)G.off(t,e);for(let e of oe.values())e.stdout.end(),e.stderr.end();ne&&(G.exitCode??=ne===`SIGINT`?130:143),g.close()}}async function bs({cwd:e,env:t,interactive:n,mobileHost:r,platform:i,port:a,requestStop:o,selectedDevice:s,isStopping:c,setActiveNative:l,verbose:u}){for(;;){let d=i===`android`&&!u?await oe():void 0,f=R(`flutter`,[`run`,`-d`,s?.id??`macos`,`--dart-define=COREFRAME_DEV_SERVER_URL=${Ds(i,r,a)}`,...u?[`--verbose`]:[]],{cwd:P.join(e,`src-flutter`),env:t,stdio:d?[`inherit`,`pipe`,`pipe`]:`inherit`});l(f);try{await Promise.all([f,d?.capture(f)]);return}catch(e){if(c()||i===`desktop`||!n)throw e;let t=await z.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(z.isCancel(t)||!t){o();return}}finally{l(void 0)}}}async function xs(e,t,n){await e.waitForServiceExit(t);let r=n();if(r)throw r}function Ss({cwd:e,host:t,lan:n,https:r,portless:i,resource:a}){return Re(`sha256`).update(JSON.stringify({cwd:P.resolve(e),host:t??null,lan:n,https:r,portless:i,resource:a})).digest(`hex`)}function Cs(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 ws(e){return(e.database?.dialect??`postgres`)===`postgres`}function Ts(e){return e===`android`||e===`ios`||e===`macos`}function Es(e){if(e===`web`)return`vite:web`;if(Ts(e))return`vite:flutter:${e}`;throw Error(`Unsupported supervised development platform: ${e}.`)}function Ds(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}`}const Os=`extension:dev`;function ks(e){if(!q(I(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=I(e,`package.json`),n;try{n=JSON.parse(J(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.${Os} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function As({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`,Os,...n.length>0?[`--`,...n]:[]]}const js=[`web`,`webext`,`desktop`,`ios`,`android`,`macos`],Ms=[`managed-dev-overlay`],Ns=P.resolve(`node_modules`,`.bin`),Ps=G.platform===`win32`?`pnpm.cmd`:`pnpm`,Fs=G.platform===`win32`?`portless.cmd`:`portless`,Is=G.platform===`win32`?`react-router.cmd`:`react-router`,Ls=G.platform===`win32`?`turso.cmd`:`turso`;async function Rs({cwd:e=G.cwd(),debug:t,device:n,env:r=G.env,host:i,https:a=!1,interactive:o=G.stdin.isTTY===!0,lan:s=!1,managed:c=!1,noManaged:l=!1,platform:u=`web`,fresh:d=!1,reuseVite:f=!1,supervisor:p,verbose:m=!1,webPort:h}={}){let g=kt({env:r}),_=r.PATH??r.Path??``,v=u===`ios`||u===`android`||u===`macos`?u:void 0,y=u===`web`||v!==void 0;if(d&&f)throw Error(`Cannot use --fresh and --reuse-vite together.`);let b=!d&&(v||u===`web`)?await g.measure(`dev-session`,()=>es({cwd:e,platform:u})):void 0,x=f||b!==void 0,S=u===`desktop`?void 0:Xs(h??r.COREFRAME_WEB_PORT);if(b&&S!==void 0&&S!==b.vite.port)throw Error(`The active development session uses port ${b.vite.port}. Omit --port or use that port when reusing it.`);let C=u===`ios`||u===`android`||u===`macos`?b?.vite.port??S??5173:u===`web`||u===`webext`?b?.vite.port??S:void 0,w,T,E,ee,te,D,O,ne,re,k=!1,A,j=r,ae,M;if(c&&l)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&c)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(f&&v===void 0)throw Error(`The --reuse-vite option is only supported for Flutter development platforms (iOS, Android, and macOS).`);if(u===`webext`){if(c||l||t!==void 0||m)throw Error(`Managed development, debug features, and verbose native output are only supported for the main web or native development platforms.`);ks(e)}if(a&&u!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&u!==`ios`&&u!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(u===`web`&&r.TAURI_ENV_PLATFORM!==void 0&&r.COREFRAME_TAURI_DEV!==`1`)throw Error("Direct Tauri development is not supported. Run `pnpm dev desktop` instead.");let N=await g.measure(`routing`,()=>Zo({cwd:e,env:r,platform:u}));if(N&&await g.measure(`portless`,()=>Qo({cwd:e,env:r,lan:s})),y&&r.COREFRAME_DEV_SUPERVISOR!==`0`){let g=p??await Ot({cwd:e,env:r});if(g)return ys({cwd:e,debug:t,device:n,env:r,fresh:d,host:i,https:a,interactive:o,lan:s,managed:c,noManaged:l,platform:u,portless:N,reuseVite:f,supervisor:g,verbose:m,webPort:h})}let se=x?void 0:await g.measure(`dev-lock`,()=>Eo({cwd:e,interactive:o,platform:u}));if(!x&&!se)return;let F=()=>{k||(k=!0,T?.kill(`SIGTERM`),ee?.kill(`SIGTERM`),D?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),O?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),re?.close().catch(()=>void 0),ne?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),w?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),te?.kill(`SIGTERM`))},ce=e=>{A??=e,F()},I=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>ce(e);return G.on(e,t),{handler:t,signal:e}}),le=async e=>{let t=Ht(e);T=t;try{await t.expectSuccess()}catch(e){if(!k)throw e}finally{T===t&&(T=void 0)}};try{let d=u===`ios`||u===`android`?u:void 0,f=d?await Ya({env:r,interactive:o,platform:d,target:n}):void 0,p=d&&f?await Xa({device:f,host:i,interactive:o,platform:d}):void 0,h=v?!0:i,y={},b=!1,S;x||([y,b]=await Promise.all([g.measure(`config`,()=>Ie({cwd:e})),g.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(c||o&&!l)&&await Mt(e))]),await g.measure(`i18n`,()=>Wn({cwd:e,projectConfig:y})),S=u!==`webext`&&zs(e)?await Va.getAvailablePort():void 0);let T=x?void 0:await g.measure(`https`,async()=>a&&!N?Pt({cwd:e}):void 0),A=Yo(r,u);j={...A,...g.environment,...b?{[Bt]:`1`}:void 0,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...u===`desktop`?{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:Js()}:void 0,...v?{COREFRAME_PLATFORM:v}:void 0,...T?{[At]:T.cert,[jt]:T.key}:void 0,...S?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${S}`}:void 0};let ce=async()=>{if(!S)return;let t,n=async(e,n)=>{try{await e,k||t?.fail(Error(`The dashboard development server stopped unexpectedly.`))}catch(e){k||t?.fail(e)}finally{await n.outputTasks,n.stdout.end(),n.stderr.end(),await Promise.allSettled([zt(n.stdout),zt(n.stderr)]),ne===e&&(ne=void 0)}};t=So({port:S,start:async()=>{if(k)throw Error(`The dashboard development server was stopped before it started.`);let t=await Va.getAvailablePort();if(k)throw Error(`The dashboard development server was stopped before it started.`);let r=Y({label:`dashboard`}),i=Y({color:`red`,label:`dashboard`});r.pipe(G.stdout,{end:!1}),i.pipe(G.stderr,{end:!1});let a=R(Is,[`dev`,`--host`,`127.0.0.1`,`--port`,String(t)],{cwd:P.resolve(e,`dashboard`),env:{...j,PATH:P.resolve(e,`node_modules/.bin`)+P.delimiter+_},stdin:`inherit`});ne=a;let o=Promise.allSettled([Bs(a.stdout,r),Bs(a.stderr,i)]);return n(a,{outputTasks:o,stderr:i,stdout:r}),{host:`127.0.0.1`,port:t}}}),re=t;try{await t.listen(),await t.wait()}finally{await t.close(),re===t&&(re=void 0)}},I=async()=>{let t=Y({label:`web`}),n=Y({color:`red`,label:`web`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),D=R(N?Fs:Is,N?$o({host:h,lan:s,port:C}):Ys({host:h,port:C,strictPort:v!==void 0}),{cwd:e,env:{...j,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[j.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:Ns+P.delimiter+_},stdin:`inherit`});let r=Promise.allSettled([Bs(D.stdout,t),Bs(D.stderr,n)]);try{await D;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!k)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([zt(t),zt(n)]),D=void 0}},L=async()=>{let t=Y({label:`webext`}),n=Y({color:`red`,label:`webext`});t.pipe(G.stdout,{end:!1}),n.pipe(G.stderr,{end:!1}),O=R(Ps,As({host:i,port:C}),{cwd:e,env:j,stdin:`inherit`});let r=Promise.allSettled([Bs(O.stdout,t),Bs(O.stderr,n)]);try{await O;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!k)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([zt(t),zt(n)]),O=void 0}},ue=async t=>{for(;!k;){let n=u===`android`&&!m?await oe():void 0,r=u===`desktop`?R(Ps,Gs(),{cwd:e,env:A,stdio:`inherit`}):R(`flutter`,Ks({device:f??{id:`macos`},serverUrl:qs(u,p,C),verbose:m}),{cwd:P.join(e,`src-flutter`),env:A,stdio:n?[`inherit`,`pipe`,`pipe`]:`inherit`});w=r;try{await Promise.all([r,n?.capture(r)]);return}catch(e){if(u===`desktop`||k||!o)throw e;let n=await z.confirm({initialValue:!0,message:`Flutter failed. Retry?`});if(z.isCancel(n)||!n){z.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),t&&await t;return}}finally{w===r&&(w=void 0)}}},de=async()=>{if(x){if(u===`web`)return;await ie({cwd:e}),await ue();return}if(u===`web`){await I();return}let t=I().then(()=>{if(!k)throw Error(`The Vite development server stopped while ${u===`desktop`?`Tauri`:`Flutter`} was still running.`)});u!==`desktop`&&await ie({cwd:e});try{await Promise.race([t,ue(t)])}finally{F(),await Promise.allSettled([t,w]),w=void 0}},fe=async()=>{let t=Ht({name:`panda`,command:Ps,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:j});ee=t;try{if(await t.expectSuccess(),!k)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!k)throw e}finally{ee===t&&(ee=void 0)}},pe=async()=>{if(u===`webext`){await L();return}if(x){await de();return}let e=fe(),t=de(),n=S?ce():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),k&&await t}finally{F(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}},me=async()=>{x||!se?.owner||C===void 0||(await ns({cwd:e,owner:se.owner,platform:u,postgres:M,vitePort:C}),ae=se.owner)};if(b&&(j={...j,[Vt]:`1`}),k)return;if(u===`webext`){g.report(),await pe();return}if(x){g.report(),await pe();return}if(y.database?.dialect===`sqlite`&&(await g.measure(`database`,async()=>{let t=await Va.getAvailablePort(),n=P.resolve(e,`.coreframe`),i=P.join(n,`turso.db`);await $.mkdir(n,{recursive:!0}),j={...j,TURSO_DATABASE_URL:`http://127.0.0.1:${t}`,TURSO_AUTH_TOKEN:`dev`},te=Ht({name:`turso`,command:Ls,args:[`dev`,`--port`,String(t),`--db-file`,i],cwd:e,env:r}),await te.waitFor(`listening`)}),await g.measure(`schema`,()=>le({name:`db`,command:Ps,args:[`db`,`ensure`],cwd:e,env:j,prefix:!1})),k))return;if(Ws(y)){let t=Y({label:`postgres`});t.pipe(G.stdout,{end:!1});try{let n=await g.measure(`database`,()=>Us({config:y,cwd:e,env:j,failIfRunning:!0,interactive:o,isStopping:()=>k,postgresOutput:t,takeoverApproved:se?.takeoverApproved??!1}));if(!n)return;E=n,j=n.env,M=await Hs(n.env);try{k||await g.measure(`schema`,()=>le({name:`db`,command:Ps,args:[`db`,`ensure`],cwd:e,env:j,prefix:!1})),k||(await me(),g.report(),await pe())}finally{await n[Symbol.asyncDispose](),E===n&&(E=void 0)}}finally{t.end()}return}await me(),g.report(),await pe()}finally{F(),ae&&=(await rs({cwd:e,owner:ae}),void 0);let t;try{await E?.[Symbol.asyncDispose]()}catch(e){t=e}finally{for(let{handler:e,signal:t}of I)G.off(t,e);A&&(G.exitCode??=A===`SIGINT`?130:143)}Vs(t),await se?.release()}}function zs(e){return q(P.resolve(e,`dashboard/dashboard.config.ts`))}async function Bs(e,t){for await(let n of e)t.write(`${n}\n`)||await Rt(t,`drain`)}function Vs(e){if(e)throw e}async function Hs(e){let t=e.PGDATA;if(!t)return;let n=Number((await $.readFile(P.join(t,`postmaster.pid`),`utf8`).catch(()=>``)).split(/\r?\n/,1)[0]);return{dataDir:P.resolve(t),...Number.isSafeInteger(n)&&n>0?{pid:n}:void 0}}async function Us({interactive:e,isStopping:t,takeoverApproved:n,...r}){try{return await re(r)}catch(i){if(!(i instanceof m)||!e)throw i;if(!n){let e=await z.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${i.pid}). Stop it and start here?`});if(z.isCancel(e)||!e){z.cancel(`Keeping the existing PostgreSQL process.`);return}}return await k(i),t()?void 0:re(r)}}function Ws(e){return(e.database?.dialect??`postgres`)===`postgres`}function Gs(){return[`exec`,`tauri`,`dev`,`--config`,JSON.stringify({build:{beforeDevCommand:``}})]}function Ks({device:e,serverUrl:t,verbose:n}){return[`run`,`-d`,e.id,`--dart-define=COREFRAME_DEV_SERVER_URL=${t}`,...n?[`--verbose`]:[]]}function qs(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}`}function Js(){return G.platform===`win32`?`windows`:G.platform}function Ys({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 Xs(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}async function Zs(e={}){let t=e.cwd??G.cwd(),n=await Pe(`scripts/preview.ts`,t);if(typeof n.default!=`function`)throw Error(`scripts/preview.ts must export a default preview function.`);return qt({...e,cwd:t},n.default)}const Qs=`worker-configuration.d.ts`;async function $s({check:e=!1,cwd:t=process.cwd()}={}){let n=await Ie({cwd:t}),r=await nt({coreframeConfig:n,cwd:t}),i=L(t,Qs),a=L(t,`.coreframe-worker-types-${W()}.d.ts`);try{try{await R(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw ec(e),e}let o=tc(await V(a,`utf8`)),s=Le(r.config),c=Fe(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${nc(c)}\n`;if(e){if(await V(i,`utf8`).catch(()=>``)!==l)throw Error(`${Qs} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await V(i,`utf8`).catch(()=>``);return u!==l&&await U(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await H(a,{force:!0})}}function ec(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
|
|
12
|
+
`)?t:`${t}\n`)}function tc(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
|
|
13
|
+
`)}function nc(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(`
|
|
14
|
+
`)}const rc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),ic=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],ac=[`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`],oc=[`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`],sc=`.coreframe/typegen.json`,cc=[`web`,`dashboard`,`worker`];async function lc({checkWorker:e=!1,cwd:t=G.cwd(),runners:n={}}={}){let r=await pc(t)??{generators:{},schemaVersion:1},i=[];return i.push(await dc({cwd:t,inputPaths:ic,name:`web`,outputPath:`.react-router`,run:()=>(n.web??fc)(t),state:r})),i.push(await dc({cwd:t,inputPaths:ac,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??hr)(t),state:r})),i.push(await dc({cwd:t,inputPaths:oc,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??$s)({check:e,cwd:t}),state:r})),i}function uc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function dc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await hc(e,t),s=await gc(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 gc(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await mc(e,a),{changed:s!==l,name:n,ran:!0}}async function fc(e){let t=G.platform===`win32`?`react-router.cmd`:`react-router`,n=G.env;await R(t,[`typegen`],{cwd:e,env:{...n,PATH:P.resolve(e,`node_modules/.bin`)+P.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function pc(e){try{let t=JSON.parse(await V(P.resolve(e,sc),`utf8`));if(!bc(t)||t.schemaVersion!==1)return;let n={};if(!bc(t.generators))return;for(let e of cc){let r=t.generators[e];bc(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 mc(e,t){let n=P.resolve(e,sc);await B(P.dirname(n),{recursive:!0}),await U(n,`${JSON.stringify(t)}\n`,{mode:384})}async function hc(e,t){let n=Re(`sha256`);for(let r of[...t].sort()){let t=P.resolve(e,r),i=await vc(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await _c(t)){let i=P.join(t,r),a=P.relative(e,i).split(P.sep).join(`/`);n.update(`${a}\0`),n.update(await V(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await V(t)))}return n.digest(`hex`)}async function gc(e,t){if(await vc(P.resolve(e,t)))return hc(e,[t])}async function _c(e){let t=[];async function n(e,r){let i=await Te(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(rc.has(a.name))continue;await n(P.join(e,a.name),P.join(r,a.name))}else a.isFile()&&t.push(P.join(r,a.name))}return await n(e,``),t.sort()}async function vc(e){try{return await Oe(e)}catch(e){if(yc(e))return;throw e}}function yc(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function bc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const xc=P.resolve(`node_modules`,`.bin`);G.env.PATH=xc+P.delimiter+G.env.PATH;const Sc=G.platform===`win32`?`tsc.cmd`:`tsc`,Cc=[{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 wc(){await lc({checkWorker:!0});let e=[];for(let t of Cc)try{await ye(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>Ht({name:e.name,command:Sc,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 Tc=r(s(Ms),{displayName:`feature`,from:async e=>e}),Ec=[`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.`],Dc=n({name:`deploy`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Deploy to the staging or production environment.`}),runMigrations:i({long:`run-migrations`,description:`Run pending deploy-safe database migrations before deploying.`,defaultValue:()=>!1}),skipMigrations:i({long:`skip-migrations`,description:`Deploy without running pending deploy-safe database migrations.`,defaultValue:()=>!1}),skipPostDeployChecks:i({long:`skip-post-deploy-checks`,description:`Skip post-deploy checks after Cloudflare deployment.`,defaultValue:()=>!1}),tauriLocalPlatforms:a({long:`tauri-local-platform`,type:t(s(xt)),description:`Build one Tauri release platform locally. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowName:c({long:`tauri-workflow-name`,type:l(f),description:`GitHub Actions workflow file or name for remote Tauri release builds.`}),tauriWorkflowPlatforms:a({long:`tauri-workflow-platform`,type:t(s(xt)),description:`Build one Tauri release platform with GitHub Actions. Repeat for multiple platforms.`,defaultValue:()=>[]}),tauriWorkflowRef:c({long:`tauri-workflow-ref`,type:l(f),description:`Git ref used when dispatching remote Tauri release builds.`}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,tauriLocalPlatforms:i,tauriWorkflowName:a,tauriWorkflowPlatforms:o,tauriWorkflowRef:s,yes:c})=>xa([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i.flatMap(e=>[`--tauri-local-platform`,e]),...a?[`--tauri-workflow-name`,a]:[],...o.flatMap(e=>[`--tauri-workflow-platform`,e]),...s?[`--tauri-workflow-ref`,s]:[],...c?[`--yes`]:[]])}),Oc=p({name:`staging`,cmds:{reassign:n({name:`reassign`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ft();if(e){console.log(JSON.stringify({...t,notices:Ec}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${Ec.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await $e();console.log(e?JSON.stringify({url:t}):t)}})}}),kc=p({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Worker environment whose access JWTs should be invalidated.`}),yes:i({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 vt({environment:e}),console.log(`Rotated Coreframe access-token signing material for ${e}. Clients must remint outstanding access JWTs.`)}}),status:n({name:`status`,args:{environment:u({type:l(s(Ze)),displayName:`environment`,description:`Inspect staging, production, or both when omitted.`}),json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({environment:e,json:t})=>{let n=await et({environment:e});console.log(t?JSON.stringify(n):Pc(n))}}),set:n({name:`set`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(f),displayName:`name`,description:`Declared Worker secret name; omit to configure known secrets.`}),bulk:i({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 st({environment:e,name:t,value:await Fc(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await lt(),i=n?await Lc(r):await Ic(r,e);await ct({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:n({name:`discard`,args:{environment:u({type:s(Ze),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:f,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await Qe({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),Ac=n({name:`typecheck`,args:{},handler:wc}),jc=p({name:`worker`,cmds:{typegen:n({name:`typegen`,args:{check:i({long:`check`,description:`Fail when the committed primary Worker declarations are stale.`,defaultValue:()=>!1})},handler:async({check:e})=>{let t=await $s({check:e});console.log(e?`${zc(t.path)} is current.`:`${zc(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),Mc=n({name:`dev`,args:{debug:c({long:`debug`,type:l(Tc),description:`Launch a development feature in isolated debug mode.`}),https:i({long:`https`,description:`Serve the web app over locally trusted HTTPS.`,defaultValue:()=>!1}),fresh:i({long:`fresh`,description:`Start a new directory-scoped development session instead of attaching to one.`,defaultValue:()=>!1}),host:c({long:`host`,type:l(f),implicitValue:`0.0.0.0`,description:`Host address for the web development server. Pass without an address to use 0.0.0.0.`}),lan:i({long:`lan`,description:`Expose the Portless development proxy to devices on the local network.`,defaultValue:()=>!1}),managed:i({long:`managed`,description:`Run managed checkout synchronization even without an interactive terminal.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),reuseVite:i({long:`reuse-vite`,description:`Use an existing Vite development server instead of starting another one for Flutter.`,defaultValue:()=>!1}),stop:i({long:`stop`,description:`Stop the directory development supervisor and its managed services.`,defaultValue:()=>!1}),platform:u({type:l(s(js)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(f),displayName:`device`,description:`Device name or ID for iOS or Android development.`}),port:c({long:`port`,type:l(o),description:`Port for the web development server.`}),verbose:i({long:`verbose`,description:`Show the full native development output.`,defaultValue:()=>!1})},handler:({debug:e,device:t,fresh:n,host:r,https:i,lan:a,managed:o,noManaged:s,platform:c,port:l,reuseVite:u,stop:d,verbose:f})=>d?Ft({cwd:G.cwd()}):Rs({debug:e,device:t,fresh:n,host:r,https:i,lan:a,managed:o,noManaged:s,platform:c??`web`,reuseVite:u,verbose:f,webPort:l})}),Nc=n({name:`preview`,args:{host:c({long:`host`,type:l(f),description:`Host address for the preview server.`}),port:c({long:`port`,type:l(o),description:`Port for the preview server.`})},handler:({host:e,port:t})=>Zs({host:e,port:t})});function Pc(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(`
|
|
15
|
+
`)}async function Fc(e){if(!G.stdin.isTTY){let e=``;for await(let t of G.stdin)e+=t.toString();return e.replace(/\r?\n$/,``)}let t=await z.password({message:`Enter the new value for ${e}`});if(z.isCancel(t))throw z.cancel(`Secret update cancelled.`),Error(`Secret update cancelled.`);return t}async function Ic(e,t){if(!G.stdin.isTTY)throw Error(`Interactive secret setup requires a terminal. Provide a secret name or use --bulk with piped dotenv contents.`);if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let n={};for(let r of e){let e=r.requiredIn.includes(t),i=await z.password({message:`${r.name}: ${r.description}${e?` (required)`:` (optional; leave blank to skip)`}`,validate:n=>e&&!n?.trim()?`${r.name} is required in ${t}.`:void 0});if(z.isCancel(i))throw z.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);i.trim()&&(n[r.name]=i)}return n}async function Lc(e){if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let t=G.stdin.isTTY?await z.multiline({message:`Paste dotenv-formatted Worker secrets. Press Enter twice to submit.`,validate:e=>e?.trim()?void 0:`Paste at least one dotenv entry.`}):await Rc();if(z.isCancel(t))throw z.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=rt(t,e);return n.length>0&&z.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function Rc(){let e=``;for await(let t of G.stdin)e+=t.toString();return e}function zc(e){return e.split(/[\\/]/).at(-1)??e}const Bc=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await lc();for(let t of e)console.log(uc(t))}});function Vc(e,{formatMessage:t,temporaryDirectory:n=Me(),write:r=e=>console.error(e)}={}){let i=qc(e),a=Xc(Uc(e,t),i);try{let t=I(He(I(n,`coreframe-error-`)),`error.log`);return Ke(t,`${Xc(Wc(e),i)}\n`,{mode:384}),r(`Error: ${a}\nFull diagnostic: ${t}`),t}catch{r(`Error: ${a}\nThe full diagnostic could not be written to the temporary directory.`);return}}function Hc(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,Vc(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function Uc(e,t){try{return t?.(e)||(e instanceof Error?e.message:String(e)).split(/\r?\n/,1)[0]||`Unknown error`}catch{return`Unknown error`}}function Wc(e){try{let t=Gc(e);if(!(e instanceof Error)||!Kc(t))return It(t,{customInspect:!1,depth:10});let n=typeof t.stack==`string`?t.stack:`${e.name}: ${e.message}`;return delete t.name,delete t.message,delete t.stack,`${n}${Reflect.ownKeys(t).length?`\n${It(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function Gc(e,t=new WeakMap){if((typeof e!=`object`||!e)&&typeof e!=`function`)return e;let n=e,r=t.get(n);if(r)return r;if(typeof e==`function`)return`[Function${e.name?`: ${e.name}`:``}]`;let i=Array.isArray(e)?[]:{};t.set(n,i),e instanceof Error&&(i.name=e.name,i.message=e.message,i.stack=e.stack??`${e.name}: ${e.message}`);for(let r of Reflect.ownKeys(n)){if(typeof r!=`string`||r.toLowerCase()===`env`||Array.isArray(e)&&r===`length`||e instanceof Error&&(r===`name`||r===`message`||r===`stack`))continue;let a=Object.getOwnPropertyDescriptor(n,r);!a||!(`value`in a)||Object.defineProperty(i,r,{configurable:!0,enumerable:!0,value:Gc(a.value,t),writable:!0})}return i}function Kc(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function qc(e,t=new WeakSet){let n=new Set;function r(e){if((typeof e!=`object`||!e)&&typeof e!=`function`)return;let i=e;if(!t.has(i)){t.add(i);for(let e of Reflect.ownKeys(i)){if(typeof e!=`string`)continue;let t=Object.getOwnPropertyDescriptor(i,e);!t||!(`value`in t)||(e.toLowerCase()===`env`?Jc(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function Jc(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);typeof n==`string`&&Yc(n)&&r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function Yc(e){return/(?:^|_)(?:AUTH|CERT|COOKIE|CREDENTIALS?|DATABASE_URL|DSN|KEY|PASS(?:WORD)?|PRIVATE|SECRET|SESSION|TOKEN)(?:_|$)/i.test(e)}function Xc(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const Zc=p({name:`coreframe`,cmds:{build:an,dashboard:br,assets:ur,flutter:dr,i18n:fr,deploy:Dc,staging:Oc,secrets:kc,typegen:Bc,typecheck:Ac,worker:jc,dev:Mc,preview:Nc,upgrade:_a,recipes:va,db:ya}});import.meta.main&&Hc(Zc,{formatMessage:process.argv[2]===`db`?x:void 0});export{Zc as coreframeCli};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@coreframe/scripts",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.8",
|
|
4
4
|
"description": "Coreframe project workflow CLI and automation scripts",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -28,15 +28,15 @@
|
|
|
28
28
|
"nano-spawn": "^2.1.0",
|
|
29
29
|
"procband": "^0.3.8",
|
|
30
30
|
"yaml": "^2.9.0",
|
|
31
|
-
"@coreframe/
|
|
32
|
-
"@coreframe/
|
|
33
|
-
"@coreframe/
|
|
34
|
-
"@coreframe/
|
|
35
|
-
"@coreframe/dev": "^0.1.4",
|
|
31
|
+
"@coreframe/deploy": "^0.1.3",
|
|
32
|
+
"@coreframe/assets": "^0.1.6",
|
|
33
|
+
"@coreframe/dev": "^0.1.5",
|
|
34
|
+
"@coreframe/config": "^0.1.3",
|
|
36
35
|
"@coreframe/dev-contracts": "^0.1.2",
|
|
37
|
-
"@coreframe/flutter-tools": "^0.1.
|
|
38
|
-
"@coreframe/object-storage": "^0.1.
|
|
39
|
-
"@coreframe/preview": "^0.1.
|
|
36
|
+
"@coreframe/flutter-tools": "^0.1.7",
|
|
37
|
+
"@coreframe/object-storage": "^0.1.1",
|
|
38
|
+
"@coreframe/preview": "^0.1.1",
|
|
39
|
+
"@coreframe/db": "^0.1.3"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@types/node": "^26.1.0",
|