@coreframe/scripts 0.2.35 → 0.2.36
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 +1 -1
- package/package.json +5 -5
package/dist/coreframe.js
CHANGED
|
@@ -15,5 +15,5 @@ import*as e from"@alloc/cmd-ts";import{array as t,command as n,extendType as r,f
|
|
|
15
15
|
`)?t:`${t}\n`)}async function tc({cwd:e,env:t,platform:n}){return n!==`web`||t.PORTLESS===`0`||(await Yt()).isAgent?!1:Ht(e)}async function nc({cwd:e,env:t,lan:n=!1}){let r=j.join(`node_modules`,`.bin`,Ys),i=[`proxy`,`start`,...n?[`--lan`]:[]];try{let{stdout:n}=await F(j.resolve(e,r),i,{cwd:e,env:t,stdin:`inherit`,stdout:`pipe`,stderr:`inherit`});ec(n)}catch(e){throw typeof e==`object`&&e&&`stdout`in e&&typeof e.stdout==`string`&&ec(e.stdout),e}}function rc({host:e,lan:t=!1,port:n}){return[...t?[`--lan`]:[],`run`,...n===void 0?[]:[`--app-port`,String(n)],`react-router`,`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e]]}const ic=j.join(`.coreframe`,`dev`,`session.json`);async function ac({appOrigin:e,cwd:t,device:n,flutterMcp:r,flutterMode:i,id:a,localOrigin:o,now:s=new Date,pid:c=process.pid,platform:l}){let u=j.resolve(t,ic),d=j.dirname(u),f={version:2,id:a,pid:c,projectRoot:j.resolve(t),startedAt:s.toISOString(),platform:l,vite:{localOrigin:o,appOrigin:e},logs:{path:j.resolve(t,`.leylines`,`logs.sqlite`),scopes:{browser:`browser`,...i===void 0?void 0:{flutter:`dev.flutter`},vite:`dev.vite`}},...i===void 0?void 0:{flutter:{mode:i,mcp:r,state:`starting`,...n===void 0?void 0:{device:n}}}},p=Promise.resolve(),m=()=>{let e=`${JSON.stringify(f,void 0,2)}\n`;return p=p.then(async()=>{await V(d,{recursive:!0});let t=j.join(d,`.session-${a}.json`);await W(t,e,{mode:384}),await He(t,384),await qe(t,u)}),p};return await m(),{path:u,async recordFlutterEvent({event:e,params:t}){let n=f.flutter;if(!n)return;let r=cc(t.appId),i;if(e===`daemon.connected`){let e=lc(t.pid),r=cc(t.version);i={...oc(n),state:`starting`,...e===void 0?void 0:{daemonPid:e},...r===void 0?void 0:{protocolVersion:r}}}else if(e===`app.start`&&r)i={...oc(n),appId:r,state:`starting`,supportsRestart:t.supportsRestart===!0};else if(e===`app.started`&&r===n.appId)i={...n,state:`running`};else if(e===`app.debugPort`&&r===n.appId){let e=cc(t.wsUri);e&&(i={...n,vmServiceWsUri:e})}else if(e===`app.devTools`&&r===n.appId){let e=cc(t.uri);e&&(i={...n,devToolsUri:e})}else if(e===`app.dtd`&&r===n.appId){let e=cc(t.uri);e&&(i={...n,dtdUri:e})}else e===`app.stop`&&r===n.appId&&(i=sc(n));i&&(f={...f,flutter:i},await m())},async recordFlutterExit(){!f.flutter||f.flutter.state===`stopped`||(f={...f,flutter:sc(f.flutter)},await m())},async close(){await p;try{JSON.parse(await H(u,`utf8`)).id===a&&await U(u,{force:!0})}catch(e){if(e.code!==`ENOENT`)throw e}}}}function oc(e){return{mode:e.mode,mcp:e.mcp,...e.device===void 0?void 0:{device:e.device},...e.daemonPid===void 0?void 0:{daemonPid:e.daemonPid},...e.protocolVersion===void 0?void 0:{protocolVersion:e.protocolVersion}}}function sc(e){return{...oc(e),state:`stopped`,...e.appId===void 0?void 0:{appId:e.appId},...e.supportsRestart===void 0?void 0:{supportsRestart:e.supportsRestart}}}function cc(e){return typeof e==`string`?e:void 0}function lc(e){return typeof e==`number`?e:void 0}const uc=`extension:dev`;function dc(e){if(!L(N(e,`src-webext/wxt.config.ts`)))throw Error("No WXT configuration found at src-webext/wxt.config.ts. Apply the wxt recipe or add that convention before running `coreframe dev webext`.");let t=N(e,`package.json`),n;try{n=JSON.parse(R(t,`utf8`))}catch(e){throw Error(`Could not parse ${t}.`,{cause:e})}if(!n||typeof n!=`object`||!(`scripts`in n)||!n.scripts||typeof n.scripts!=`object`||!(`extension:dev`in n.scripts)||typeof n.scripts[`extension:dev`]!=`string`)throw Error(`package.json must define scripts.${uc} for \`coreframe dev webext\`. Apply the wxt recipe and add its named extension lifecycle scripts.`)}function fc({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`,uc,...n.length>0?[`--`,...n]:[]]}const pc=[`web`,`webext`,`ios`,`android`,`macos`,`windows`,`linux`],mc=[`managed-dev-overlay`],hc=j.resolve(`node_modules`,`.bin`),gc=q.platform===`win32`?`pnpm.cmd`:`pnpm`,_c=q.platform===`win32`?`portless.cmd`:`portless`,vc=q.platform===`win32`?`react-router.cmd`:`react-router`,yc=`Lost connection to device.`;async function bc({cwd:e=q.cwd(),debug:t,device:n,env:r=q.env,flutterDebug:i=!1,flutterMcp:a=!1,flutterOutput:o=`filtered`,host:s,https:c=!1,interactive:l=q.stdin.isTTY===!0,lan:u=!1,managed:d=!1,noCodesign:f=!1,noManaged:p=!1,noDevJobs:m=!1,platform:h=`web`,verbose:g=!1,webPort:_}={}){let v=Rt({env:r}),ee=r.PATH??r.Path??``,y=Nc(h)?h:void 0,b=tn(i||a),x=Mc(_??r.COREFRAME_WEB_PORT),S,C,w,te,ne,re,ie,ae,se,T,ce,le,ue,E=!1,fe,D=r;if(d&&p)throw Error(`Cannot use --managed and --no-managed together.`);if(t===`managed-dev-overlay`&&d)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(i&&y===void 0)throw Error(`The --flutter-debug option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(a&&y===void 0)throw Error(`The --flutter-mcp option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(f&&h!==`macos`)throw Error(`The --no-codesign option is only supported for macOS Flutter development.`);if(o===`full`&&y===void 0)throw Error(`The --flutter-output option is only supported for Flutter development platforms (iOS, Android, macOS, Windows, and Linux).`);if(h===`webext`){if(d||p||t!==void 0||g)throw Error(`Managed development, debug features, and verbose native output are only supported for the main web or native development platforms.`);dc(e)}if(c&&h!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(n!==void 0&&h!==`ios`&&h!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);let pe=await v.measure(`routing`,()=>tc({cwd:e,env:r,platform:h}));pe&&await v.measure(`portless`,()=>nc({cwd:e,env:r,lan:u}));let O=y===void 0?h===`web`?x??await ni.getAvailablePort():h===`webext`?x:void 0:x??await ni.getAvailablePort(),k,he=new Promise(e=>{k=e}),A=()=>{E||(E=!0,k(),C?.kill(`SIGTERM`),re?.kill(`SIGTERM`),ie?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),ae?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),se?.close().catch(()=>void 0),S?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),_e().catch(()=>void 0))},_e=()=>te?(ne??=te[Symbol.asyncDispose](),ne):Promise.resolve(),M=e=>{fe??=e,A()},ve=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>M(e);return q.on(e,t),{handler:t,signal:e}}),N=async e=>{let t=nt(e);C=t;try{await t.expectSuccess()}catch(e){if(!E)throw e}finally{C===t&&(C=void 0)}};try{ce=y?qt({path:j.resolve(e,`.leylines`,`logs.sqlite`)}):void 0;let i=h===`ios`||h===`android`?h:void 0,_=i?await us({env:r,interactive:l,platform:i,target:n}):void 0;i&&_&&nn({device:_,mode:b,platform:i});let x=y?ce?.logger({scope:`dev.flutter`,properties:{platform:y,..._?{deviceId:_.id}:void 0}}):void 0;T=i&&_&&O!==void 0?await fs({device:_,env:r,host:s,interactive:l,platform:i,port:O}):void 0;let C=T?.viteHost??(y?i?!0:`127.0.0.1`:s),ne=O===void 0?void 0:`${c?`https`:`http`}://127.0.0.1:${O}`,fe=y===void 0?ne:T?.serverUrl??ps(y,void 0,O),k={},_e=!1,M;[k,_e]=await Promise.all([v.measure(`config`,()=>G({cwd:e})),v.measure(`managed`,async()=>t!==`managed-dev-overlay`&&(d||l&&!p)&&await Vt(e))]),await v.measure(`i18n`,()=>Tr({cwd:e,projectConfig:k})),M=h!==`webext`&&li(e)?await ni.getAvailablePort():void 0;let ve=await v.measure(`https`,async()=>c&&!pe?Ut({cwd:e}):void 0),ye=Js(r,h);D={...ye,...v.environment,...t===`managed-dev-overlay`?{VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG:`1`}:void 0,...!m&&h!==`webext`?{[Wt]:K()}:void 0,...y?{COREFRAME_PLATFORM:y,[Kt]:j.resolve(e,`.coreframe`,`managed-dev-flutter-restart`)}:void 0,...ve?{[zt]:ve.cert,[Bt]:ve.key}:void 0,...M?{COREFRAME_DASHBOARD_ORIGIN:`http://127.0.0.1:${M}`}:void 0},ne!==void 0&&fe!==void 0&&(le=await ac({appOrigin:fe,cwd:e,device:_,flutterMcp:a,flutterMode:y===void 0?void 0:b,id:K(),localOrigin:ne,platform:h}));let P=async()=>{if(!M)return;let t=ui({cwd:e,env:D,port:M});se=t;try{await t.listen(),await t.wait()}finally{await t.close(),se===t&&(se=void 0)}},be=async()=>{let t=tt({label:`web`}),n=tt({color:`red`,label:`web`});t.pipe(q.stdout,{end:!1}),n.pipe(q.stderr,{end:!1}),ie=F(pe?_c:vc,pe?rc({host:C,lan:u,port:O}):jc({host:C,port:O,strictPort:h===`web`||y!==void 0}),{cwd:e,env:{...D,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[D.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:hc+j.delimiter+ee},stdin:`inherit`});let r=Promise.allSettled([Dc(ie.stdout,t),Dc(ie.stderr,n)]);try{await ie;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!E)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([et(t),et(n)]),ie=void 0}},I=async()=>{let t=tt({label:`webext`}),n=tt({color:`red`,label:`webext`});t.pipe(q.stdout,{end:!1}),n.pipe(q.stderr,{end:!1}),ae=F(gc,fc({host:s,port:O}),{cwd:e,env:D,stdin:`inherit`});let r=Promise.allSettled([Dc(ae.stdout,t),Dc(ae.stderr,n)]);try{await ae;let e=(await r).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!E)throw e}finally{await r,t.end(),n.end(),await Promise.allSettled([et(t),et(n)]),ae=void 0}},xe=async t=>{let n,r,i=!1,s,c=qs(D[Kt],()=>{if(E||!n||!r||s||b!==`debug`&&i)return;let e=n,t=r;s=(async()=>{if(b===`debug`){await t.restart({debounce:!0,fullRestart:!0,reason:`manual`});return}i=!0;try{await t.stop()}catch(t){let n=t instanceof Error?t.message:String(t);x?.write(`warn`,`Flutter stop failed; terminating it: ${n}`,{properties:{stream:`control`}}),q.stderr.write(`Flutter stop failed; terminating it: ${n}\n`),await e.nodeChildProcess.then(e=>e.kill(`SIGTERM`))}})().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Flutter restart failed: ${t}`,{properties:{stream:`control`}}),q.stderr.write(`Flutter restart failed: ${t}\n`)}).finally(()=>{s=void 0})});try{for(;!E;){i=!1;let s=!1,c=h===`android`&&o===`filtered`&&!g?await ge():void 0,u=F(`flutter`,rn({device:_??{id:h},flutterDriver:a,mode:b,serverUrl:fe,verbose:g}),{cwd:j.join(e,`src-flutter`),env:en(ye,{noCodesign:f}),stdio:[`pipe`,`pipe`,`pipe`]}),d=new zs({onEvent:async e=>{Cc(e.params.message)&&(s=!0),await le?.recordFlutterEvent(e)},verbose:g,write:async e=>{let t=await u.nodeChildProcess;if(!t.stdin)throw Error(`Flutter machine input is unavailable.`);t.stdin.write(e)===!1&&await It(t.stdin,`drain`)}}),p=e=>Sc(Bs(e,d),()=>s=!0);S=u,n=u,r=d;try{let e=!1;try{let e=c?c.capture(Ec(p(u),x,`output`)):Promise.all([Tc(p(u.stdout),q.stdout,x,`stdout`),xc(u.stderr,q.stderr,x,`stderr`)]);await Promise.all([u,e])}catch{e=!0}if(i&&!E)continue;if(E)return;let n=l?await B.confirm({initialValue:!0,message:s?`${yc} Restart Flutter?`:e?`Flutter failed. Retry?`:`Flutter exited unexpectedly. Restart Flutter?`}):!1;if(B.isCancel(n)||!n){if(!e&&!s){B.log.warn(`Flutter exited unexpectedly.`);return}B.log.warn(t?`Flutter stopped. Web development is still running.`:`Flutter stopped.`),await(t??he);return}}finally{S===u&&(S=void 0),n===u&&(n=void 0),r===d&&(r=void 0),d.close(),le?.recordFlutterExit().catch(e=>{let t=e instanceof Error?e.message:String(e);x?.write(`error`,`Failed to record Flutter exit: ${t}`,{properties:{stream:`control`}})})}}}finally{(await c)()}},L=async()=>{if(h===`web`){await be();return}let t=be().then(()=>{if(!E)throw Error(`The Vite development server stopped while Flutter was still running.`)});await me({cwd:e});try{await Promise.race([t,xe(t)])}finally{A(),await Promise.allSettled([t,S]),S=void 0}},Se=async()=>{let t=nt({name:`panda`,command:gc,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:e,env:D});re=t;try{if(await t.expectSuccess(),!E)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!E)throw e}finally{re===t&&(re=void 0)}},Ce=async()=>{if(h===`webext`){await I();return}let e=Se(),t=L(),n=M?P():void 0;try{await Promise.race([e,t,n].filter(e=>e!==void 0)),E&&await t}finally{A(),await Promise.allSettled([e,t,n].filter(e=>e!==void 0))}};if(_e&&(D={...D,[Gt]:`1`},r.COREFRAME_DEV_SUPERVISOR!==`0`&&(ue=await v.measure(`supervisor`,()=>Lt({cwd:e,env:r})))),E)return;if(h===`webext`){v.report(),await Ce();return}if(k.database?.dialect===`sqlite`){if(await v.measure(`database`,async()=>{let t=await de({config:k,cwd:e,env:r,tursoOutput:q.stdout,useSupervisorLease:!0});te=t,D={...D,...t.env}}),await v.measure(`schema`,()=>N({name:`db`,command:gc,args:[`db`,`ensure`],cwd:e,env:D,prefix:!1})),E)return;oe({cwd:e,env:D,dialect:`sqlite`})}if(Ac(k)){let t=tt({label:`postgres`});t.pipe(q.stdout,{end:!1});try{let n=await v.measure(`database`,()=>kc({config:k,cwd:e,env:D,failIfRunning:!0,interactive:l,isStopping:()=>E,postgresOutput:t,useSupervisorLease:!0}));if(!n)return;w=n,D={...D,...n.env};try{E||await v.measure(`schema`,()=>N({name:`db`,command:gc,args:[`db`,`ensure`],cwd:e,env:D,prefix:!1})),E||(oe({cwd:e,env:D,dialect:`postgres`}),v.report(),await Ce())}finally{await n[Symbol.asyncDispose](),w===n&&(w=void 0)}}finally{t.end()}return}v.report(),await Ce()}finally{A(),await T?.close(),T=void 0;let e;try{await w?.[Symbol.asyncDispose]()}catch(t){e=t}finally{try{await _e()}finally{try{await le?.close()}finally{ue?.close(),ce?.close();for(let{handler:e,signal:t}of ve)q.off(t,e)}}fe&&(q.exitCode??=fe===`SIGINT`?130:143)}Oc(e)}}async function xc(e,t,n,r){for await(let i of wc(e,n,r))t.write(`${i}\n`)||await It(t,`drain`)}async function*Sc(e,t){for await(let n of e)Cc(n.message)&&t(),yield n}function Cc(e){return typeof e==`string`&&e.trim()===yc}async function*wc(e,t,n){for await(let r of e){let e=pe(r);e.message&&t?.write(e.level,e.message,{properties:{stream:n}}),yield r}}async function Tc(e,t,n,r){for await(let i of Ec(e,n,r))t.write(`${i}\n`)||await It(t,`drain`)}async function*Ec(e,t,n){for await(let r of e)r.message&&t?.write(r.level,r.message,{properties:{stream:n}}),yield r.message}async function Dc(e,t){for await(let n of e)t.write(`${n}\n`)||await It(t,`drain`)}function Oc(e){if(e)throw e}async function kc({interactive:e,isStopping:t,...n}){try{return await E(n)}catch(r){if(!(r instanceof h)||!e)throw r;let i=await B.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${r.pid}). Stop it and start here?`});if(B.isCancel(i)||!i){B.cancel(`Keeping the existing PostgreSQL process.`);return}return await fe(r),t()?void 0:E(n)}}function Ac(e){return(e.database?.dialect??`postgres`)===`postgres`}function jc({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 Mc(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 Nc(e){return e===`android`||e===`ios`||e===`linux`||e===`macos`||e===`windows`}async function Pc(e={}){let t=e.cwd??q.cwd(),n=`scripts/preview.ts`,r={},i=!0;try{await Ve(j.resolve(t,n))}catch(e){if(e.code===`ENOENT`)i=!1;else throw e}if(i){let e=await Xe(n,t);if(!e.default||typeof e.default!=`object`)throw Error(`scripts/preview.ts must default-export preview hooks.`);for(let t of[`beforeBuild`,`afterBuild`])if(e.default[t]!==void 0&&typeof e.default[t]!=`function`)throw Error(`scripts/preview.ts ${t} must be a function.`);r=e.default}return Xt({...e,cwd:t},r)}const Fc=`worker-configuration.d.ts`;async function Ic({check:e=!1,cwd:t=process.cwd()}={}){let n=await G({cwd:t}),r=await gt({coreframeConfig:n,cwd:t}),i=P(t,Fc),a=P(t,`.coreframe-worker-types-${K()}.d.ts`);try{try{await F(`pnpm`,[`exec`,`wrangler`,`types`,a,`--config`,r.path,`--strict-vars=false`,`--include-runtime=false`],{cwd:t,stdio:[`ignore`,`pipe`,`pipe`]})}catch(e){throw Lc(e),e}let o=Rc(await H(a,`utf8`)),s=Qe(r.config),c=Ze(n.worker?.environment).filter(e=>!s.has(e.name)),l=`${o.trimEnd()}\n\n${zc(c)}\n`;if(e){if(await H(i,`utf8`).catch(()=>``)!==l)throw Error(`${Fc} is stale. Run "coreframe worker typegen" and commit the result.`);return{changed:!1,path:i}}let u=await H(i,`utf8`).catch(()=>``);return u!==l&&await W(i,l),{changed:u!==l,path:i}}finally{await r.dispose(),await U(a,{force:!0})}}function Lc(e){if(typeof e!=`object`||!e||!(`output`in e))return;let{output:t}=e;typeof t!=`string`||t===``||process.stderr.write(t.endsWith(`
|
|
16
16
|
`)?t:`${t}\n`)}function Rc(e){return e.split(/\r?\n/).filter(e=>!e.startsWith(`// Generated by Wrangler by running `)).join(`
|
|
17
17
|
`)}function zc(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(`
|
|
18
|
-
`)}const Bc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),Vc=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],Hc=[`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`],Uc=[`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`],Wc=`.coreframe/typegen.json`,Gc=[`web`,`dashboard`,`worker`];async function Kc({checkWorker:e=!1,cwd:t=q.cwd(),runners:n={}}={}){let r=await Xc(t)??{generators:{},schemaVersion:1},i=[];return i.push(await Jc({cwd:t,inputPaths:Vc,name:`web`,outputPath:`.react-router`,run:()=>(n.web??Yc)(t),state:r})),i.push(await Jc({cwd:t,inputPaths:Hc,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??Zr)(t),state:r})),i.push(await Jc({cwd:t,inputPaths:Uc,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??Ic)({check:e,cwd:t}),state:r})),i}function qc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function Jc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await Qc(e,t),s=await $c(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 $c(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await Zc(e,a),{changed:s!==l,name:n,ran:!0}}async function Yc(e){let t=q.platform===`win32`?`react-router.cmd`:`react-router`,n=q.env;await F(t,[`typegen`],{cwd:e,env:{...n,PATH:j.resolve(e,`node_modules/.bin`)+j.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function Xc(e){try{let t=JSON.parse(await H(j.resolve(e,Wc),`utf8`));if(!rl(t)||t.schemaVersion!==1)return;let n={};if(!rl(t.generators))return;for(let e of Gc){let r=t.generators[e];rl(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 Zc(e,t){let n=j.resolve(e,Wc);await V(j.dirname(n),{recursive:!0}),await W(n,`${JSON.stringify(t)}\n`,{mode:384})}async function Qc(e,t){let n=$e(`sha256`);for(let r of[...t].sort()){let t=j.resolve(e,r),i=await tl(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await el(t)){let i=j.join(t,r),a=j.relative(e,i).split(j.sep).join(`/`);n.update(`${a}\0`),n.update(await H(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await H(t)))}return n.digest(`hex`)}async function $c(e,t){if(await tl(j.resolve(e,t)))return Qc(e,[t])}async function el(e){let t=[];async function n(e,r){let i=await Ke(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(Bc.has(a.name))continue;await n(j.join(e,a.name),j.join(r,a.name))}else a.isFile()&&t.push(j.join(r,a.name))}return await n(e,``),t.sort()}async function tl(e){try{return await Je(e)}catch(e){if(nl(e))return;throw e}}function nl(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function rl(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const il=j.resolve(`node_modules`,`.bin`);q.env.PATH=il+j.delimiter+q.env.PATH;const al=q.platform===`win32`?`tsc.cmd`:`tsc`,ol=[{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 sl(){await Kc({checkWorker:!0});let e=[];for(let t of ol)try{await Ve(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>nt({name:e.name,command:al,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(q.exitCode=n[0].exitCode)}const cl=r(s(mc),{displayName:`feature`,from:async e=>e}),ll=r(s($t),{displayName:`filtered|full`,from:async e=>e}),ul=[`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.`],dl=n({name:`deploy`,args:{environment:u({type:s(ut),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}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,yes:i})=>zo([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i?[`--yes`]:[]])}),fl=m({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 wt();if(e){console.log(JSON.stringify({...t,notices:ul}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${ul.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ft();console.log(e?JSON.stringify({url:t}):t)}})}}),pl=m({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(ut),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 Ot({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(ut)),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 pt({environment:e});console.log(t?JSON.stringify(n):yl(n))}}),set:n({name:`set`,args:{environment:u({type:s(ut),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(p),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 yt({environment:e,name:t,value:await bl(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await xt(),i=n?await Sl(r):await xl(r,e);await bt({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(ut),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:p,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await dt({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),ml=n({name:`typecheck`,args:{},handler:sl}),hl=m({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 Ic({check:e});console.log(e?`${wl(t.path)} is current.`:`${wl(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),gl=n({name:`dev`,args:{debug:c({long:`debug`,type:l(cl),description:`Launch a development feature in isolated debug mode.`}),flutterDebug:i({long:`flutter-debug`,description:`Run Flutter in debug mode instead of profile mode.`,defaultValue:()=>!1}),flutterMcp:i({long:`flutter-mcp`,description:`Enable the app-side Flutter MCP QA bridge and imply Flutter debug mode.`,defaultValue:()=>!1}),flutterOutput:c({long:`flutter-output`,type:ll,description:`Choose filtered Android diagnostics (default) or full standard Flutter output.`,defaultValue:()=>`filtered`}),https:i({long:`https`,description:`Serve the web app over locally trusted HTTPS.`,defaultValue:()=>!1}),host:c({long:`host`,type:l(p),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}),noCodesign:i({long:`no-codesign`,description:`Disable Xcode code signing for macOS Flutter development.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),noDevJobs:i({long:`no-dev-jobs`,description:`Skip automatic local development jobs for this invocation.`,defaultValue:()=>!1}),simulator:i({long:`simulator`,description:`Run iOS in Flutter debug mode on the Apple iOS Simulator.`,defaultValue:()=>!1}),platform:u({type:l(s(pc)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(p),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,flutterDebug:n,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f,port:p,simulator:m,verbose:h})=>{let g=_l({device:t,flutterDebug:n,platform:f,simulator:m});return bc({debug:e,device:g.device,flutterDebug:g.flutterDebug,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f??`web`,verbose:h,webPort:p})}});function _l({device:e,flutterDebug:t,platform:n,simulator:r}){if(!r)return{device:e,flutterDebug:t};if(n!==`ios`)throw Error(`The --simulator flag is only supported for the iOS development target.`);if(e!==void 0)throw Error(`The --simulator flag cannot be combined with an explicit device.`);return{device:`apple_ios_simulator`,flutterDebug:!0}}const vl=n({name:`preview`,args:{host:c({long:`host`,type:l(p),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})=>Pc({host:e,port:t})});function yl(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(`
|
|
18
|
+
`)}const Bc=new Set([`.coreframe`,`.git`,`.react-router`,`.wrangler`,`.wxt`,`build`,`dist`,`node_modules`,`styled-system`,`target`]),Vc=[`node_modules/@react-router/dev/package.json`,`node_modules/react-router/package.json`,`package.json`,`pnpm-lock.yaml`,`react-router.config.ts`,`src/web`],Hc=[`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`],Uc=[`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`],Wc=`.coreframe/typegen.json`,Gc=[`web`,`dashboard`,`worker`];async function Kc({checkWorker:e=!1,cwd:t=q.cwd(),runners:n={}}={}){let r=await Xc(t)??{generators:{},schemaVersion:1},i=[];return i.push(await Jc({cwd:t,inputPaths:Vc,name:`web`,outputPath:`.react-router`,run:()=>(n.web??Yc)(t),state:r})),i.push(await Jc({cwd:t,inputPaths:Hc,name:`dashboard`,outputPath:`dashboard/.react-router`,run:()=>(n.dashboard??Zr)(t),state:r})),i.push(await Jc({cwd:t,inputPaths:Uc,name:`worker`,outputPath:`worker-configuration.d.ts`,run:()=>(n.worker??Ic)({check:e,cwd:t}),state:r})),i}function qc(e){return`${{dashboard:`Dashboard route types`,web:`Web route types`,worker:`Worker types`}[e.name]} ${e.changed?`generated`:`unchanged`}.`}async function Jc({cwd:e,inputPaths:t,name:n,outputPath:r,run:i,state:a}){let o=await Qc(e,t),s=await $c(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 $c(e,r);if(!l)throw Error(`Coreframe ${n} typegen did not produce ${r}.`);return a.generators[n]={inputFingerprint:o,outputFingerprint:l},await Zc(e,a),{changed:s!==l,name:n,ran:!0}}async function Yc(e){let t=q.platform===`win32`?`react-router.cmd`:`react-router`,n=q.env;await F(t,[`typegen`],{cwd:e,env:{...n,PATH:j.resolve(e,`node_modules/.bin`)+j.delimiter+(n.PATH??n.Path??``)},stdio:`inherit`})}async function Xc(e){try{let t=JSON.parse(await H(j.resolve(e,Wc),`utf8`));if(!rl(t)||t.schemaVersion!==1)return;let n={};if(!rl(t.generators))return;for(let e of Gc){let r=t.generators[e];rl(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 Zc(e,t){let n=j.resolve(e,Wc);await V(j.dirname(n),{recursive:!0}),await W(n,`${JSON.stringify(t)}\n`,{mode:384})}async function Qc(e,t){let n=$e(`sha256`);for(let r of[...t].sort()){let t=j.resolve(e,r),i=await tl(t);if(!i){n.update(`missing:${r}\0`);continue}if(i.isDirectory()){n.update(`directory:${r}\0`);for(let r of await el(t)){let i=j.join(t,r),a=j.relative(e,i).split(j.sep).join(`/`);n.update(`${a}\0`),n.update(await H(i))}continue}i.isFile()&&(n.update(`file:${r}\0`),n.update(await H(t)))}return n.digest(`hex`)}async function $c(e,t){if(await tl(j.resolve(e,t)))return Qc(e,[t])}async function el(e){let t=[];async function n(e,r){let i=await Ke(e,{withFileTypes:!0});i.sort((e,t)=>e.name.localeCompare(t.name));for(let a of i)if(a.isDirectory()){if(Bc.has(a.name))continue;await n(j.join(e,a.name),j.join(r,a.name))}else a.isFile()&&t.push(j.join(r,a.name))}return await n(e,``),t.sort()}async function tl(e){try{return await Je(e)}catch(e){if(nl(e))return;throw e}}function nl(e){return e instanceof Error&&`code`in e&&e.code===`ENOENT`}function rl(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}const il=j.resolve(`node_modules`,`.bin`);q.env.PATH=il+j.delimiter+q.env.PATH;const al=q.platform===`win32`?`tsc.cmd`:`tsc`,ol=[{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 sl(){await Kc({checkWorker:!0});let e=[];for(let t of ol)try{await Ve(t.path),e.push(t)}catch(e){if(!(e instanceof Error&&`code`in e&&e.code===`ENOENT`))throw e}let t=e.map(e=>nt({name:e.name,command:al,args:[`-p`,e.path]})),n=(await Promise.all(t.map(e=>e.wait()))).filter(e=>e.exitCode!==0);n.length>0&&(q.exitCode=n[0].exitCode)}const cl=r(s(mc),{displayName:`feature`,from:async e=>e}),ll=r(s($t),{displayName:`filtered|full`,from:async e=>e}),ul=[`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.`],dl=n({name:`deploy`,args:{environment:u({type:s(ut),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}),yes:i({long:`yes`,short:`y`,description:`Approve the production deployment confirmation.`,defaultValue:()=>!1})},handler:({environment:e,runMigrations:t,skipMigrations:n,skipPostDeployChecks:r,yes:i})=>zo([e,...t?[`--run-migrations`]:[],...n?[`--skip-migrations`]:[],...r?[`--skip-post-deploy-checks`]:[],...i?[`--yes`]:[]])}),fl=m({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 wt();if(e){console.log(JSON.stringify({...t,notices:ul}));return}console.log(t.url),console.error(`Staging hostname reassigned. ${ul.join(` `)}`)}}),url:n({name:`url`,args:{json:i({long:`json`,description:`Print machine-readable JSON.`,defaultValue:()=>!1})},handler:async({json:e})=>{let t=await ft();console.log(e?JSON.stringify({url:t}):t)}})}}),pl=m({name:`secrets`,cmds:{"rotate-access-token":n({name:`rotate-access-token`,args:{environment:u({type:s(ut),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 Ot({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(ut)),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 pt({environment:e});console.log(t?JSON.stringify(n):yl(n))}}),set:n({name:`set`,args:{environment:u({type:s(ut),displayName:`environment`,description:`Worker environment to update on its next deploy.`}),name:u({type:l(p),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 yt({environment:e,name:t,value:await bl(t)}),console.log(`Queued ${t} for ${e}. Run coreframe deploy ${e} to apply.`);return}let r=await xt(),i=n?await Sl(r):await xl(r,e);await bt({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(ut),displayName:`environment`,description:`Worker environment with a queued secret update.`}),name:u({type:p,displayName:`name`,description:`Declared Worker secret name.`})},handler:async({environment:e,name:t})=>{let n=await dt({environment:e,name:t});console.log(n?`Discarded the queued ${t} update for ${e}.`:`No ${t} update is queued for ${e}.`)}})}}),ml=n({name:`typecheck`,args:{},handler:sl}),hl=m({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 Ic({check:e});console.log(e?`${wl(t.path)} is current.`:`${wl(t.path)} ${t.changed?`generated`:`is unchanged`}.`)}})}}),gl=n({name:`dev`,args:{debug:c({long:`debug`,type:l(cl),description:`Launch a development feature in isolated debug mode.`}),flutterDebug:i({long:`flutter-debug`,description:`Run Flutter in debug mode instead of profile mode.`,defaultValue:()=>!1}),flutterMcp:i({long:`flutter-mcp`,description:`Enable the app-side Flutter MCP QA bridge and imply Flutter debug mode.`,defaultValue:()=>!1}),flutterOutput:c({long:`flutter-output`,type:ll,description:`Choose filtered Android diagnostics (default) or full standard Flutter output.`,defaultValue:()=>`filtered`}),https:i({long:`https`,description:`Serve the web app over locally trusted HTTPS.`,defaultValue:()=>!1}),host:c({long:`host`,type:l(p),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}),noCodesign:i({long:`no-codesign`,description:`Disable Xcode code signing for macOS Flutter development.`,defaultValue:()=>!1}),noManaged:i({long:`no-managed`,description:`Run without managed checkout synchronization for this invocation.`,defaultValue:()=>!1}),noDevJobs:i({long:`no-dev-jobs`,description:`Skip automatic local development jobs for this invocation.`,defaultValue:()=>!1}),simulator:i({long:`simulator`,description:`Run iOS in Flutter debug mode on the Apple iOS Simulator.`,defaultValue:()=>!1}),platform:u({type:l(s(pc)),displayName:`platform`,description:`Development target platform. Defaults to web.`}),device:u({type:l(p),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,flutterDebug:n,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f,port:p,simulator:m,verbose:h})=>{let g=_l({device:t,flutterDebug:n,platform:f,simulator:m});return bc({debug:e,device:g.device,flutterDebug:g.flutterDebug,flutterMcp:r,flutterOutput:i,host:a,https:o,lan:s,managed:c,noCodesign:l,noManaged:u,noDevJobs:d,platform:f??`web`,verbose:h,webPort:p})}});function _l({device:e,flutterDebug:t,platform:n,simulator:r}){if(!r)return{device:e,flutterDebug:t};if(n!==`ios`)throw Error(`The --simulator flag is only supported for the iOS development target.`);if(e!==void 0)throw Error(`The --simulator flag cannot be combined with an explicit device.`);return{device:`apple_ios_simulator`,flutterDebug:!0}}const vl=n({name:`preview`,args:{host:c({long:`host`,type:l(p),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})=>Pc({host:e,port:t})});function yl(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,t=` `)=>e.map((e,n)=>e.padEnd(r[n],t)).join(` | `).trimEnd();return[i(n),i(r.map(e=>``.padEnd(e,`-`)),`-`),...t.map(e=>i(e))].join(`
|
|
19
19
|
`)}async function bl(e){if(!q.stdin.isTTY){let e=``;for await(let t of q.stdin)e+=t.toString();return e.replace(/\r?\n$/,``)}let t=await B.password({message:`Enter the new value for ${e}`});if(B.isCancel(t))throw B.cancel(`Secret update cancelled.`),Error(`Secret update cancelled.`);return t}async function xl(e,t){if(!q.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 B.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(B.isCancel(i))throw B.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);i.trim()&&(n[r.name]=i)}return n}async function Sl(e){if(e.length===0)throw Error(`No Worker secrets are declared in coreframe.config.ts.`);let t=q.stdin.isTTY?await B.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 Cl();if(B.isCancel(t))throw B.cancel(`Secret setup cancelled.`),Error(`Secret setup cancelled.`);let{ignoredNames:n,values:r}=_t(t,e);return n.length>0&&B.log.info(`Ignored non-secret or undeclared names: ${n.join(`, `)}.`),r}async function Cl(){let e=``;for await(let t of q.stdin)e+=t.toString();return e}function wl(e){return e.split(/[\\/]/).at(-1)??e}const Tl=n({name:`typegen`,description:`Generate Coreframe route and Worker type declarations.`,args:{},handler:async()=>{let e=await Kc();for(let t of e)console.log(qc(t))}});function El(e,{formatMessage:t,temporaryDirectory:n=je(),write:r=e=>console.error(e)}={}){let i=Ml(e),a=Fl(Ol(e,t),i);try{let t=N(we(N(n,`coreframe-error-`)),`error.log`);return z(t,`${Fl(kl(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 Dl(t,n={}){let r=typeof t==`function`?t:()=>e.run(e.binary(t),process.argv),i=!1,a=e=>{i||(i=!0,El(e,n),process.exit(1))};process.once(`uncaughtException`,a),process.once(`unhandledRejection`,a),Promise.resolve().then(r).catch(a)}function Ol(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 kl(e){try{let t=Al(e);if(!(e instanceof Error)||!jl(t))return Pt(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${Pt(t,{customInspect:!1,depth:10})}`:``}`}catch{return`The thrown value could not be inspected.`}}function Al(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:Al(a.value,t),writable:!0})}return i}function jl(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function Ml(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`?Nl(t.value,n):r(t.value))}}}try{r(e)}catch{}return n}function Nl(e,t){if(!(typeof e!=`object`||!e))for(let n of Reflect.ownKeys(e)){let r=Object.getOwnPropertyDescriptor(e,n);typeof n==`string`&&Pl(n)&&r&&`value`in r&&typeof r.value==`string`&&r.value&&t.add(r.value)}}function Pl(e){return/(?:^|_)(?:AUTH|CERT|COOKIE|CREDENTIALS?|DATABASE_URL|DSN|KEY|PASS(?:WORD)?|PRIVATE|SECRET|SESSION|TOKEN)(?:_|$)/i.test(e)}function Fl(e,t){return[...t].sort((e,t)=>t.length-e.length).reduce((e,t)=>e.replaceAll(t,`[redacted environment value]`),e)}const Il=m({name:`coreframe`,cmds:{build:_n,conflicts:Bn,dashboard:pi,assets:Kr,flutter:qr,i18n:Jr,jobs:ji,deploy:dl,staging:fl,secrets:pl,typegen:Tl,typecheck:ml,worker:hl,dev:gl,preview:vl,upgrade:Fo,recipes:Io,db:Lo}});import.meta.main&&Dl(Il,{formatMessage:process.argv[2]===`db`?w:void 0});export{Il 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.36",
|
|
4
4
|
"description": "Coreframe project workflow CLI and automation scripts",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -29,16 +29,16 @@
|
|
|
29
29
|
"nano-spawn": "^2.1.0",
|
|
30
30
|
"procband": "^0.3.9",
|
|
31
31
|
"yaml": "^2.9.0",
|
|
32
|
+
"@coreframe/db": "^0.1.21",
|
|
32
33
|
"@coreframe/deploy": "^0.1.14",
|
|
33
|
-
"@coreframe/dev": "^0.1.
|
|
34
|
+
"@coreframe/dev": "^0.1.25",
|
|
34
35
|
"@coreframe/dev-contracts": "^0.1.9",
|
|
35
36
|
"@coreframe/flutter-tools": "^0.1.24",
|
|
36
37
|
"@coreframe/jobs": "^0.1.1",
|
|
38
|
+
"@coreframe/config": "^0.1.14",
|
|
37
39
|
"@coreframe/object-storage": "^0.1.4",
|
|
38
|
-
"@coreframe/preview": "^0.1.20",
|
|
39
|
-
"@coreframe/db": "^0.1.20",
|
|
40
40
|
"@coreframe/assets": "^0.1.17",
|
|
41
|
-
"@coreframe/
|
|
41
|
+
"@coreframe/preview": "^0.1.21"
|
|
42
42
|
},
|
|
43
43
|
"devDependencies": {
|
|
44
44
|
"@types/node": "^26.1.0",
|