@coreframe/scripts 0.1.48 → 0.1.49

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/dev.js CHANGED
@@ -1,2 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import{readProjectConfig as e}from"./config.js";import{fs as t,net as n}from"./environment.js";import{ProjectPostgresAlreadyRunningError as r,startProjectPostgres as i,stopProjectPostgres as a}from"./db/local-postgres.js";import{ensureDevI18nCatalogs as o}from"./i18n/workflows.js";import{resolveMobileDevHost as s,selectMobileDevDevice as ee}from"./dev-device.js";import{devHttpsCertEnv as te,devHttpsKeyEnv as c,prepareDevHttps as ne}from"./dev-https.js";import{acquireDevLock as l}from"./dev-lock.js";import{createDevStartupTiming as u}from"./dev-timing.js";import{managedDevEnv as re}from"./managed-dev-protocol.js";import{isManagedDevCheckout as ie,isPrimaryCheckout as ae}from"./managed-dev.js";import{createTauriDevOutput as oe}from"./tauri-dev-output.js";import d from"node:path";import f from"nano-spawn";import{finished as p}from"node:stream/promises";import*as m from"@clack/prompts";import h from"node:process";import{once as g}from"node:events";import{determineAgent as _}from"@vercel/detect-agent";import{createPrefixStream as v,supervise as y}from"procband";const b=[`web`,`desktop`,`ios`,`android`],x=[`managed-dev-overlay`],S=`VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG`;function C(e){let t=e.dev?.platforms??[`web`];for(let e of t)if(!b.includes(e))throw Error(`Invalid development platform "${String(e)}". Expected one of: ${b.join(`, `)}.`);return[...new Set(t)]}const se=d.resolve(`node_modules`,`.bin`),w=h.platform===`win32`?`pnpm.cmd`:`pnpm`,ce=h.platform===`win32`?`portless.cmd`:`portless`,le=h.platform===`win32`?`react-router.cmd`:`react-router`,ue=h.platform===`win32`?`turso.cmd`:`turso`;async function T({cwd:r=h.cwd(),debug:i,device:a,env:g=h.env,host:b,https:x=!1,interactive:C=h.stdin.isTTY===!0,managed:T=!1,noManaged:P=!1,platform:F=`web`,verbose:fe=!1,webPort:I}={}){let L=u({env:g}),pe=g.PATH??g.Path??``,R=F===`web`?N(I??g.COREFRAME_WEB_PORT):void 0,z,B,V,H,U,W,G=!1,K,q=g;if(T&&P)throw Error(`Cannot use --managed and --no-managed together.`);if(i===`managed-dev-overlay`&&T)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(x&&F!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(a!==void 0&&F!==`ios`&&F!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(F===`web`&&g.TAURI_ENV_PLATFORM!==void 0&&g.COREFRAME_TAURI_DEV!==`1`){let e=g.TAURI_ENV_PLATFORM===`ios`||g.TAURI_ENV_PLATFORM===`android`?g.TAURI_ENV_PLATFORM:`desktop`;throw Error(`Direct Tauri development is not supported. Run \`pnpm dev ${e}\` instead.`)}let J=await L.measure(`dev-lock`,()=>l({cwd:r,interactive:C}));if(!J)return;let Y=()=>{G||(G=!0,B?.kill(`SIGTERM`),H?.kill(`SIGTERM`),W?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),z?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),U?.kill(`SIGTERM`))},X=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>{K??=e,Y()};return h.on(e,t),{handler:t,signal:e}}),Z=async e=>{let t=y(e);B=t;try{await t.expectSuccess()}catch(e){if(!G)throw e}finally{B===t&&(B=void 0)}};try{let l=F===`ios`||F===`android`?F:void 0,u=l?await ee({env:g,interactive:C,platform:l,target:a}):void 0,D=l&&u?await s({device:u,host:b,interactive:C,platform:l}):void 0,N=D?!0:b,[I,B,K]=await Promise.all([L.measure(`config`,()=>e({cwd:r})),L.measure(`routing`,async()=>F===`web`&&g.PORTLESS!==`0`&&g.TAURI_ENV_PLATFORM===void 0&&!(await _()).isAgent&&await ae(r)),L.measure(`managed`,async()=>i!==`managed-dev-overlay`&&(T||C&&!P)&&await ie(r))]);await L.measure(`i18n`,()=>o({cwd:r,projectConfig:I}));let X=await L.measure(`https`,async()=>x&&!B?ne({cwd:r}):void 0);q={...g,...L.environment,...i===`managed-dev-overlay`?{[S]:`1`}:void 0,...F===`web`?void 0:{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:A(F),...D?{TAURI_DEV_HOST:D}:void 0},...X?{[te]:X.cert,[c]:X.key}:void 0};let Q=async()=>{let e=v({label:`web`}),t=v({color:`red`,label:`web`});e.pipe(h.stdout,{end:!1}),t.pipe(h.stderr,{end:!1}),W=f(B?ce:le,B?M({host:N,port:R}):j({host:N,port:R}),{cwd:r,env:{...q,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[q.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:se+d.delimiter+pe},stdin:`inherit`});let n=Promise.allSettled([E(W.stdout,e),E(W.stderr,t)]);try{await W;let e=(await n).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!G)throw e}finally{await n,e.end(),t.end(),await Promise.allSettled([p(e),p(t)]),W=void 0}},me=async()=>{if(F===`web`){await Q();return}let e=Q().then(()=>{if(!G)throw Error(`The Vite development server stopped while Tauri was still running.`)}),t,n;if(F===`ios`&&!fe){n=v({label:`ios`}),n.pipe(h.stdout,{end:!1});try{t=await oe({output:n}),m.log.info(`Full iOS log: ${t.logFile}`)}catch{n.end(),n=void 0,m.log.warn(`Could not create the temporary iOS log; showing full Tauri output.`)}}z=f(w,k(F,u?.name,D),{cwd:r,env:g,stdio:t?[`inherit`,`pipe`,`pipe`]:`inherit`});let i=t?.consume(z),a=z.catch(async e=>{throw G||(await i,await t?.reportFailure()),e});try{await Promise.race([e,a])}finally{Y(),await Promise.allSettled([e,z,i]),await t?.close(),n?.end(),z=void 0}},he=async()=>{let e=y({name:`panda`,command:w,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:r,env:q});H=e;try{if(await e.expectSuccess(),!G)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!G)throw e}finally{H===e&&(H=void 0)}},$=async()=>{let e=he(),t=me();try{await Promise.race([e,t])}finally{Y(),await Promise.allSettled([e,t])}};if(K&&(q={...q,[re]:`1`}),G||I.database?.dialect===`sqlite`&&(await L.measure(`database`,async()=>{let e=await n.getAvailablePort(),i=d.resolve(r,`.coreframe`),a=d.join(i,`turso.db`);await t.mkdir(i,{recursive:!0}),q={...q,TURSO_DATABASE_URL:`http://127.0.0.1:${e}`,TURSO_AUTH_TOKEN:`dev`},U=y({name:`turso`,command:ue,args:[`dev`,`--port`,String(e),`--db-file`,a],cwd:r,env:g}),await U.waitFor(`listening`)}),await L.measure(`schema`,()=>Z({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:q,prefix:!1})),G))return;if(O(I)){let e=v({label:`postgres`});e.pipe(h.stdout,{end:!1});try{let t=await L.measure(`database`,()=>de({config:I,cwd:r,env:q,failIfRunning:!0,interactive:C,isStopping:()=>G,postgresOutput:e,takeoverApproved:J.takeoverApproved}));if(!t)return;V=t,q=t.env;try{G||await L.measure(`schema`,()=>Z({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:q,prefix:!1})),G||(L.report(),await $())}finally{await t[Symbol.asyncDispose](),V===t&&(V=void 0)}}finally{e.end()}return}L.report(),await $()}finally{Y();let e;try{await V?.[Symbol.asyncDispose]()}catch(t){e=t}finally{for(let{handler:e,signal:t}of X)h.off(t,e);K&&(h.exitCode??=K===`SIGINT`?130:143)}D(e),await J.release()}}async function E(e,t){for await(let n of e)t.write(`${n}\n`)||await g(t,`drain`)}function D(e){if(e)throw e}async function de({interactive:e,isStopping:t,takeoverApproved:n,...o}){try{return await i(o)}catch(s){if(!(s instanceof r)||!e)throw s;if(!n){let e=await m.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${s.pid}). Stop it and start here?`});if(m.isCancel(e)||!e){m.cancel(`Keeping the existing PostgreSQL process.`);return}}return await a(s),t()?void 0:i(o)}}function O(e){return(e.database?.dialect??`postgres`)===`postgres`}function k(e,t,n){return[`exec`,`tauri`,...e===`desktop`?[]:[e],`dev`,`--config`,JSON.stringify({build:{beforeDevCommand:``}}),...n===void 0?[]:[`--host=${n}`],...t===void 0?[]:[t]]}function A(e){return e===`desktop`?h.platform===`win32`?`windows`:h.platform:e}function j({host:e,port:t}){return[`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)]]}function M({host:e,port:t}){return[`run`,...t===void 0?[]:[`--app-port`,String(t)],`react-router`,...j({host:e,port:void 0})]}function N(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}export{x as devDebugFeatures,b as devPlatforms,S as managedDevOverlayDebugEnv,C as resolveDevPlatforms,T as runDevServer};
2
+ import{readProjectConfig as e}from"./config.js";import{fs as t,net as n}from"./environment.js";import{ProjectPostgresAlreadyRunningError as r,startProjectPostgres as i,stopProjectPostgres as a}from"./db/local-postgres.js";import{ensureDevI18nCatalogs as o}from"./i18n/workflows.js";import{resolveMobileDevHost as s,selectMobileDevDevice as ee}from"./dev-device.js";import{devHttpsCertEnv as te,devHttpsKeyEnv as c,prepareDevHttps as ne}from"./dev-https.js";import{acquireDevLock as l}from"./dev-lock.js";import{createDevStartupTiming as u}from"./dev-timing.js";import{managedDevEnv as re}from"./managed-dev-protocol.js";import{isManagedDevCheckout as ie,isPrimaryCheckout as ae}from"./managed-dev.js";import{createTauriDevOutput as oe}from"./tauri-dev-output.js";import d from"node:path";import f from"nano-spawn";import{finished as p}from"node:stream/promises";import*as m from"@clack/prompts";import h from"node:process";import{once as g}from"node:events";import{createInterface as _}from"node:readline/promises";import{determineAgent as se}from"@vercel/detect-agent";import{createPrefixStream as v,supervise as y}from"procband";const b=[`web`,`desktop`,`ios`,`android`],x=[`managed-dev-overlay`],S=`VITE_COREFRAME_MANAGED_DEV_OVERLAY_DEBUG`;function C(e){let t=e.dev?.platforms??[`web`];for(let e of t)if(!b.includes(e))throw Error(`Invalid development platform "${String(e)}". Expected one of: ${b.join(`, `)}.`);return[...new Set(t)]}const ce=d.resolve(`node_modules`,`.bin`),w=h.platform===`win32`?`pnpm.cmd`:`pnpm`,le=h.platform===`win32`?`portless.cmd`:`portless`,ue=h.platform===`win32`?`react-router.cmd`:`react-router`,de=h.platform===`win32`?`turso.cmd`:`turso`;async function T({cwd:r=h.cwd(),debug:i,device:a,env:g=h.env,host:_,https:b=!1,interactive:x=h.stdin.isTTY===!0,managed:C=!1,noManaged:T=!1,platform:M=`web`,verbose:ge=!1,webPort:N}={}){let P=u({env:g}),F=g.PATH??g.Path??``,I=M===`web`?j(N??g.COREFRAME_WEB_PORT):void 0,L,R,z,B,V,H,U=!1,W,G=g,K=new AbortController;if(C&&T)throw Error(`Cannot use --managed and --no-managed together.`);if(i===`managed-dev-overlay`&&C)throw Error(`Cannot use --managed with --debug managed-dev-overlay.`);if(b&&M!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(a!==void 0&&M!==`ios`&&M!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(M===`web`&&g.TAURI_ENV_PLATFORM!==void 0&&g.COREFRAME_TAURI_DEV!==`1`){let e=g.TAURI_ENV_PLATFORM===`ios`||g.TAURI_ENV_PLATFORM===`android`?g.TAURI_ENV_PLATFORM:`desktop`;throw Error(`Direct Tauri development is not supported. Run \`pnpm dev ${e}\` instead.`)}let q=await P.measure(`dev-lock`,()=>l({cwd:r,interactive:x}));if(!q)return;let J=()=>{U||(U=!0,K.abort(),R?.kill(`SIGTERM`),B?.kill(`SIGTERM`),H?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),L?.nodeChildProcess.then(e=>e.kill(`SIGTERM`)).catch(()=>void 0),V?.kill(`SIGTERM`))},Y=e=>{W??=e,J()},X=[`SIGINT`,`SIGTERM`].map(e=>{let t=()=>Y(e);return h.on(e,t),{handler:t,signal:e}}),Z=async e=>{let t=y(e);R=t;try{await t.expectSuccess()}catch(e){if(!U)throw e}finally{R===t&&(R=void 0)}};try{let l=M===`ios`||M===`android`?M:void 0,u=l?await ee({env:g,interactive:x,platform:l,target:a}):void 0,D=l&&u?await s({device:u,host:_,interactive:x,platform:l}):void 0,j=D?!0:_,[N,R,W]=await Promise.all([P.measure(`config`,()=>e({cwd:r})),P.measure(`routing`,async()=>M===`web`&&g.PORTLESS!==`0`&&g.TAURI_ENV_PLATFORM===void 0&&!(await se()).isAgent&&await ae(r)),P.measure(`managed`,async()=>i!==`managed-dev-overlay`&&(C||x&&!T)&&await ie(r))]);await P.measure(`i18n`,()=>o({cwd:r,projectConfig:N}));let X=await P.measure(`https`,async()=>b&&!R?ne({cwd:r}):void 0);G={...g,...P.environment,...i===`managed-dev-overlay`?{[S]:`1`}:void 0,...M===`web`?void 0:{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:me(M),...D?{TAURI_DEV_HOST:D}:void 0},...X?{[te]:X.cert,[c]:X.key}:void 0};let Q=async()=>{let e=v({label:`web`}),t=v({color:`red`,label:`web`});e.pipe(h.stdout,{end:!1}),t.pipe(h.stderr,{end:!1}),H=f(R?le:ue,R?he({host:j,port:I}):A({host:j,port:I}),{cwd:r,env:{...G,CLOUDFLARE_ENV:`development`,NODE_OPTIONS:[G.NODE_OPTIONS,`--conditions=development`].filter(Boolean).join(` `),PATH:ce+d.delimiter+F},stdin:`inherit`});let n=Promise.allSettled([E(H.stdout,e),E(H.stderr,t)]);try{await H;let e=(await n).find(e=>e.status===`rejected`);if(e)throw e.reason}catch(e){if(!U)throw e}finally{await n,e.end(),t.end(),await Promise.allSettled([p(e),p(t)]),H=void 0}},_e=async()=>{if(M===`web`){await Q();return}let e=Q().then(()=>{if(!U)throw Error(`The Vite development server stopped while Tauri was still running.`)}),t=async()=>{for(;!U;){let e,t;if(M===`ios`&&!ge){t=v({label:`ios`}),t.pipe(h.stdout,{end:!1});try{e=await oe({output:t}),m.log.info(`Full iOS log: ${e.logFile}`)}catch{t.end(),t=void 0,m.log.warn(`Could not create the temporary iOS log; showing full Tauri output.`)}}let n=f(w,k(M,u?.name,D),{cwd:r,env:g,stdio:e?[`inherit`,`pipe`,`pipe`]:`inherit`});L=n;let i=e?.consume(n);try{await n;return}catch(t){if(U)throw t;if(await i,M===`ios`&&x&&e?.failureReason()===`locked-device`){if(await fe({onInterrupt:()=>Y(`SIGINT`),signal:K.signal}))continue;return}throw await e?.reportFailure(),t}finally{await Promise.allSettled([n,i]),await e?.close(),t?.end(),L===n&&(L=void 0)}}};try{await Promise.race([e,t()])}finally{J(),await Promise.allSettled([e,L]),L=void 0}},ve=async()=>{let e=y({name:`panda`,command:w,args:[`exec`,`panda`,`dev`,`--no-color`],cwd:r,env:G});B=e;try{if(await e.expectSuccess(),!U)throw Error(`The Panda CSS watcher stopped while development was still running.`)}catch(e){if(!U)throw e}finally{B===e&&(B=void 0)}},$=async()=>{let e=ve(),t=_e();try{await Promise.race([e,t]),U&&await t}finally{J(),await Promise.allSettled([e,t])}};if(W&&(G={...G,[re]:`1`}),U||N.database?.dialect===`sqlite`&&(await P.measure(`database`,async()=>{let e=await n.getAvailablePort(),i=d.resolve(r,`.coreframe`),a=d.join(i,`turso.db`);await t.mkdir(i,{recursive:!0}),G={...G,TURSO_DATABASE_URL:`http://127.0.0.1:${e}`,TURSO_AUTH_TOKEN:`dev`},V=y({name:`turso`,command:de,args:[`dev`,`--port`,String(e),`--db-file`,a],cwd:r,env:g}),await V.waitFor(`listening`)}),await P.measure(`schema`,()=>Z({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:G,prefix:!1})),U))return;if(pe(N)){let e=v({label:`postgres`});e.pipe(h.stdout,{end:!1});try{let t=await P.measure(`database`,()=>O({config:N,cwd:r,env:G,failIfRunning:!0,interactive:x,isStopping:()=>U,postgresOutput:e,takeoverApproved:q.takeoverApproved}));if(!t)return;z=t,G=t.env;try{U||await P.measure(`schema`,()=>Z({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:G,prefix:!1})),U||(P.report(),await $())}finally{await t[Symbol.asyncDispose](),z===t&&(z=void 0)}}finally{e.end()}return}P.report(),await $()}finally{J();let e;try{await z?.[Symbol.asyncDispose]()}catch(t){e=t}finally{for(let{handler:e,signal:t}of X)h.off(t,e);W&&(h.exitCode??=W===`SIGINT`?130:143)}D(e),await q.release()}}async function fe({onInterrupt:e,signal:t}){m.log.warn(`Unable to launch the iOS app because the device is locked.`);let n=_({input:h.stdin,output:h.stdout});n.once(`SIGINT`,e);try{return await n.question(`Unlock the device, then press Enter to retry. Press Ctrl-C to stop.
3
+ `,{signal:t}),!0}catch(e){if(t.aborted&&e instanceof Error&&e.name===`AbortError`)return!1;throw e}finally{n.close()}}async function E(e,t){for await(let n of e)t.write(`${n}\n`)||await g(t,`drain`)}function D(e){if(e)throw e}async function O({interactive:e,isStopping:t,takeoverApproved:n,...o}){try{return await i(o)}catch(s){if(!(s instanceof r)||!e)throw s;if(!n){let e=await m.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${s.pid}). Stop it and start here?`});if(m.isCancel(e)||!e){m.cancel(`Keeping the existing PostgreSQL process.`);return}}return await a(s),t()?void 0:i(o)}}function pe(e){return(e.database?.dialect??`postgres`)===`postgres`}function k(e,t,n){return[`exec`,`tauri`,...e===`desktop`?[]:[e],`dev`,`--config`,JSON.stringify({build:{beforeDevCommand:``}}),...n===void 0?[]:[`--host=${n}`],...t===void 0?[]:[t]]}function me(e){return e===`desktop`?h.platform===`win32`?`windows`:h.platform:e}function A({host:e,port:t}){return[`dev`,...e===void 0?[]:[`--host`,e===!0?`0.0.0.0`:e],...t===void 0?[]:[`--port`,String(t)]]}function he({host:e,port:t}){return[`run`,...t===void 0?[]:[`--app-port`,String(t)],`react-router`,...A({host:e,port:void 0})]}function j(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}export{x as devDebugFeatures,b as devPlatforms,S as managedDevOverlayDebugEnv,C as resolveDevPlatforms,T as runDevServer};
@@ -4,9 +4,11 @@ import { Writable } from "node:stream";
4
4
  type TauriDevOutput = {
5
5
  close(): Promise<void>;
6
6
  consume(lines: AsyncIterable<string>): Promise<void>;
7
+ failureReason(): TauriDevFailureReason | undefined;
7
8
  logFile: string;
8
9
  reportFailure(): Promise<void>;
9
10
  };
11
+ type TauriDevFailureReason = "locked-device";
10
12
  type CreateTauriDevOutputOptions = {
11
13
  output: Writable;
12
14
  temporaryDirectory?: string;
@@ -16,4 +18,4 @@ declare function createTauriDevOutput({
16
18
  temporaryDirectory
17
19
  }: CreateTauriDevOutputOptions): Promise<TauriDevOutput>;
18
20
  //#endregion
19
- export { TauriDevOutput, createTauriDevOutput };
21
+ export { TauriDevFailureReason, TauriDevOutput, createTauriDevOutput };
@@ -1,2 +1,2 @@
1
- import{mkdtemp as e}from"node:fs/promises";import t from"node:path";import{createWriteStream as n}from"node:fs";import{tmpdir as r}from"node:os";import{finished as i}from"node:stream/promises";import{stripVTControlCharacters as a}from"node:util";import{once as o}from"node:events";async function s({output:i,temporaryDirectory:a=r()}){let s=await e(t.join(a,`coreframe-ios-dev-`)),l=t.join(s,`tauri.log`),u=n(l,{flags:`wx`,mode:384});return await o(u,`open`),new c(l,u,i)}var c=class{logFile;closed=!1;failureLines=[];log;output;runtime=!1;showInstalledBundleId=!1;constructor(e,t,n){this.logFile=e,this.log=t,this.output=n}async consume(e){try{for await(let t of e)await d(this.log,`${t}\n`),this.rememberFailureLine(t),this.shouldShow(t)&&await d(this.output,`${t}\n`)}catch{}}async reportFailure(){await d(this.output,`iOS development failed. Recent diagnostic output:
2
- `);for(let e of this.failureLines)await d(this.output,`${e}\n`);await d(this.output,`Full iOS log: ${this.logFile}\n`)}async close(){this.closed||(this.closed=!0,this.log.end(),await i(this.log))}shouldShow(e){let t=a(e).trim();if(t===`Building app...`)return this.runtime=!1,!0;if(l(t))return!1;if(t.startsWith(`Launched application with `))return this.runtime=!0,!0;if(this.runtime)return!0;if(t===`App installed:`)return this.showInstalledBundleId=!0,!0;if(this.showInstalledBundleId){if(t.length===0)return!1;if(this.showInstalledBundleId=!1,t.startsWith(`• bundleID:`))return!0}return/^(Archiving app|Exporting app|Extracting IPA|Deploying app to device|Pairing with device)\.\.\.$/u.test(t)||/^\*\* BUILD (?:SUCCEEDED|FAILED) \*\*$/u.test(t)||/^(?:Compiling|Checking|Finished)\b/u.test(t)||/^(?:Warn|Error)\b/u.test(t)||/(?:^|:\d+:\d+: )(?:warning|error)(?:\[[^\]]+\])?:/iu.test(t)||/^(?:fatal:|thread .+ panicked|Failed to |No device found\.|The following build commands failed:|command \[.+\] exited)/iu.test(t)||/^Info Watching\b/u.test(t)||/^note: run with RUST_BACKTRACE=/u.test(t)}rememberFailureLine(e){u(a(e).trim())||(this.failureLines.push(e),this.failureLines.length>40&&this.failureLines.shift())}};function l(e){return e.startsWith(`--- xcodebuild: WARNING: Using the first of multiple matching destinations:`)||/^Failed to load provisioning param(?:e)?ter list due to error:/u.test(e)||e==="`devicectl manage create` may support a reduced set of arguments."||/(?:^|\/)idevicesyslog$/u.test(e)}function u(e){return e.length===0||e.startsWith(`export `)||e.startsWith(`inflating:`)||e.startsWith(`Archive:`)||e.startsWith(`cd `)||e.startsWith(`/bin/sh -c `)||e.startsWith(`Command line invocation:`)||e.startsWith(`Build settings from command line:`)}async function d(e,t){e.write(t)||await o(e,`drain`)}export{s as createTauriDevOutput};
1
+ import{mkdtemp as e}from"node:fs/promises";import t from"node:path";import{createWriteStream as n}from"node:fs";import{tmpdir as r}from"node:os";import{finished as i}from"node:stream/promises";import{stripVTControlCharacters as a}from"node:util";import{once as o}from"node:events";async function s({output:i,temporaryDirectory:a=r()}){let s=await e(t.join(a,`coreframe-ios-dev-`)),l=t.join(s,`tauri.log`),u=n(l,{flags:`wx`,mode:384});return await o(u,`open`),new c(l,u,i)}var c=class{logFile;closed=!1;failureLines=[];lockedDeviceFailure=!1;log;output;runtime=!1;showInstalledBundleId=!1;constructor(e,t,n){this.logFile=e,this.log=t,this.output=n}async consume(e){try{for await(let t of e)await f(this.log,`${t}\n`),this.rememberFailureLine(t),this.shouldShow(t)&&await f(this.output,`${t}\n`)}catch{}}async reportFailure(){await f(this.output,`iOS development failed. Recent diagnostic output:
2
+ `);for(let e of this.failureLines)await f(this.output,`${e}\n`);await f(this.output,`Full iOS log: ${this.logFile}\n`)}failureReason(){return this.lockedDeviceFailure?`locked-device`:void 0}async close(){this.closed||(this.closed=!0,this.log.end(),await i(this.log))}shouldShow(e){let t=a(e).trim();if(t===`Building app...`)return this.runtime=!1,!0;if(u(t))return!1;if(t.startsWith(`Launched application with `))return this.runtime=!0,!0;if(this.runtime)return!0;if(t===`App installed:`)return this.showInstalledBundleId=!0,!0;if(this.showInstalledBundleId){if(t.length===0)return!1;if(this.showInstalledBundleId=!1,t.startsWith(`• bundleID:`))return!0}return/^(Archiving app|Exporting app|Extracting IPA|Deploying app to device|Pairing with device)\.\.\.$/u.test(t)||/^\*\* BUILD (?:SUCCEEDED|FAILED) \*\*$/u.test(t)||/^(?:Compiling|Checking|Finished)\b/u.test(t)||/^(?:Warn|Error)\b/u.test(t)||/(?:^|:\d+:\d+: )(?:warning|error)(?:\[[^\]]+\])?:/iu.test(t)||/^(?:fatal:|thread .+ panicked|Failed to |No device found\.|The following build commands failed:|command \[.+\] exited)/iu.test(t)||/^Info Watching\b/u.test(t)||/^note: run with RUST_BACKTRACE=/u.test(t)}rememberFailureLine(e){let t=a(e).trim();l(t)&&(this.lockedDeviceFailure=!0),!d(t)&&(this.failureLines.push(e),this.failureLines.length>40&&this.failureLines.shift())}};function l(e){return/\bBSErrorCodeDescription\s*=\s*Locked\b/iu.test(e)||/\bNSLocalizedFailureReason\s*=.*\breason:\s*Locked\b/iu.test(e)||/Unable to launch (?:the )?(?:iOS )?app(?:lication)? because the device (?:was not|could not be), or could not be, unlocked/iu.test(e)}function u(e){return e.startsWith(`--- xcodebuild: WARNING: Using the first of multiple matching destinations:`)||/^Failed to load provisioning param(?:e)?ter list due to error:/u.test(e)||e==="`devicectl manage create` may support a reduced set of arguments."||/(?:^|\/)idevicesyslog$/u.test(e)}function d(e){return e.length===0||e.startsWith(`export `)||e.startsWith(`inflating:`)||e.startsWith(`Archive:`)||e.startsWith(`cd `)||e.startsWith(`/bin/sh -c `)||e.startsWith(`Command line invocation:`)||e.startsWith(`Build settings from command line:`)}async function f(e,t){e.write(t)||await o(e,`drain`)}export{s as createTauriDevOutput};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@coreframe/scripts",
3
- "version": "0.1.48",
3
+ "version": "0.1.49",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/airlock-labs/coreframe.git",