@coreframe/scripts 0.1.37 → 0.1.38
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/db/local-postgres.d.ts +2 -0
- package/dist/db/local-postgres.js +1 -2
- package/dist/dev.js +1 -1
- package/package.json +1 -1
|
@@ -31,6 +31,7 @@ type StartProjectPostgresOptions = {
|
|
|
31
31
|
config?: CoreframeConfig;
|
|
32
32
|
cwd?: string;
|
|
33
33
|
env?: NodeJS.ProcessEnv;
|
|
34
|
+
failIfRunning?: boolean;
|
|
34
35
|
postgresOutput?: PostgresOutputTarget;
|
|
35
36
|
};
|
|
36
37
|
type StartTemporaryProjectPostgresOptions = StartProjectPostgresOptions;
|
|
@@ -43,6 +44,7 @@ declare function startProjectPostgres({
|
|
|
43
44
|
config,
|
|
44
45
|
cwd,
|
|
45
46
|
env,
|
|
47
|
+
failIfRunning,
|
|
46
48
|
postgresOutput
|
|
47
49
|
}?: StartProjectPostgresOptions): Promise<ProjectPostgresSidecar>;
|
|
48
50
|
declare function stopProjectPostgres({
|
|
@@ -1,2 +1 @@
|
|
|
1
|
-
import{readProjectConfig as e}from"../config.js";import{fs as t,os as n}from"../environment.js";import{createProjectPostgresDrizzleDatabase as r}from"./project.js";import i from"node:path";import{startPostgres as a}from"local-postgres";import{PostgresDataDirInUseError as o,stopPostgresDataDir as s}from"local-postgres/core";const c=`COREFRAME_LOCAL_POSTGRES`,l=`coreframe`,u={name:`coreframe`,password:`coreframe`};var d=class extends Error{dataDir;pid;constructor(e,t,n){super(`PostgreSQL is already running for this project (PID ${t}). Stop the other top-level \`coreframe dev\` process before starting another.`,n),this.name=`ProjectPostgresAlreadyRunningError`,this.dataDir=e,this.pid=t}};async function f({config:n,cwd:r=process.cwd(),env:o=process.env,postgresOutput:
|
|
2
|
-
`,1)[0]);if(!(!Number.isSafeInteger(a)||a<=0))try{return n.kill(a,0),a}catch(e){return x(e)&&e.code===`EPERM`?a:void 0}}async function b(e,n){if(e instanceof o)return new d(e.dataDir,e.pid,{cause:e});let r=e instanceof Error?e.message:String(e),i;if(n)try{i=(await t.readFile(n,`utf8`)).trim()||void 0}catch{}let a=i?`\n\nPostgreSQL output:\n${i}`:``,s=n?`\n\nPostgreSQL log: ${n}`:``;return Error(`Local PostgreSQL failed to start: ${r}${a}${s}`,{cause:e})}function x(e){return e instanceof Error}function S(e=process.env){let t=e.DATABASE_URL||C(e);if(!t)throw Error(`DATABASE_URL or PGDATABASE, PGHOST, PGPORT, and PGUSER are required.`);return t}function C(e){let{PGDATABASE:t,PGHOST:n,PGPASSWORD:r,PGPORT:i,PGUSER:a}=e;if(!t||!n||!i||!a)return;let o=new URL(`postgresql://${n}:${i}/${t}`);return o.username=a,r&&(o.password=r),o.href}export{c as LOCAL_POSTGRES_ENV_FLAG,d as ProjectPostgresAlreadyRunningError,g as createLocalPostgresDb,h as createLocalPostgresEnv,S as getLocalPostgresConnectionString,f as startProjectPostgres,m as startTemporaryProjectPostgres,p as stopProjectPostgres};
|
|
1
|
+
import{readProjectConfig as e}from"../config.js";import{fs as t,os as n}from"../environment.js";import{createProjectPostgresDrizzleDatabase as r}from"./project.js";import i from"node:path";import{startPostgres as a}from"local-postgres";import{PostgresDataDirInUseError as o,stopPostgresDataDir as s}from"local-postgres/core";const c=`COREFRAME_LOCAL_POSTGRES`,l=`coreframe`,u={name:`coreframe`,password:`coreframe`};var d=class extends Error{dataDir;pid;constructor(e,t,n){super(`PostgreSQL is already running for this project (PID ${t}). Stop the other top-level \`coreframe dev\` process before starting another.`,n),this.name=`ProjectPostgresAlreadyRunningError`,this.dataDir=e,this.pid=t}};async function f({config:n,cwd:r=process.cwd(),env:o=process.env,failIfRunning:s=!1,postgresOutput:c}={}){if(o.COREFRAME_LOCAL_POSTGRES===`1`||((n??await e({cwd:r})).database?.dialect??`postgres`)!==`postgres`)return v(o);let f=i.resolve(r,`.coreframe/postgres`),p=await y(f);if(p){if(s)throw new d(f,p.pid);return v(b(o,f,p))}let m=i.join(f,`postgres.log`);await t.rm(m,{force:!0});let h;try{h=await a({dataDir:f,database:l,postgresOutput:c??{filePath:m},postgres:{strategy:`prefer-local`},superuser:u})}catch(e){throw await x(e,c?void 0:m)}return _(o,h)}async function p({dataDir:e,pid:t}){await s({dataDir:e,expectedPid:t})}async function m({config:r,cwd:o=process.cwd(),env:s=process.env}={}){let c=(r??await e({cwd:o})).database?.dialect??`postgres`;if(c!==`postgres`)throw Error(`Temporary schema push checks require PostgreSQL, but this project uses ${c}.`);let d=await t.mkdtemp(i.join(n.tmpdir(),`coreframe-schema-check-`));try{let e=_(s,await a({dataDir:d,database:l,postgresOutput:`ignore`,postgres:{strategy:`prefer-local`},superuser:u}));return{env:e.env,async[Symbol.asyncDispose](){try{await e[Symbol.asyncDispose]()}finally{await t.rm(d,{force:!0,recursive:!0})}}}}catch(e){throw await t.rm(d,{force:!0,recursive:!0}),e}}function h(e,t){return{...e,...t,[c]:`1`}}async function g({env:e=process.env}={}){let t=C(e);return r({env:{...e,DATABASE_URL:t}})}function _(e,t){return{env:h(e,t.env),async[Symbol.asyncDispose](){await t[Symbol.asyncDispose]()}}}function v(e){return{env:e,async[Symbol.asyncDispose](){}}}async function y(e){let r;try{r=await t.readFile(i.join(e,`postmaster.pid`),`utf8`)}catch{return}let[a,,,o,,s]=r.split(/\r?\n/),c=Number(a);if(!Number.isSafeInteger(c)||c<=0)return;try{n.kill(c,0)}catch(e){if(!S(e)||e.code!==`EPERM`)return}let l=Number(o);if(!Number.isSafeInteger(l)||l<=0||l>65535||!s)throw Error(`Cannot read connection details for PostgreSQL process ${c} from ${e}.`);return{host:s,pid:c,port:l}}function b(e,t,{host:n,port:r}){let i=new URL(`postgresql://${n}:${r}/${l}`);return i.username=u.name,i.password=u.password,h(e,{DATABASE_URL:i.href,PGDATA:t,PGDATABASE:l,PGHOST:n,PGPASSWORD:u.password,PGPORT:String(r),PGUSER:u.name})}async function x(e,n){if(e instanceof o)return new d(e.dataDir,e.pid,{cause:e});let r=e instanceof Error?e.message:String(e),i;if(n)try{i=(await t.readFile(n,`utf8`)).trim()||void 0}catch{}let a=i?`\n\nPostgreSQL output:\n${i}`:``,s=n?`\n\nPostgreSQL log: ${n}`:``;return Error(`Local PostgreSQL failed to start: ${r}${a}${s}`,{cause:e})}function S(e){return e instanceof Error}function C(e=process.env){let t=e.DATABASE_URL||w(e);if(!t)throw Error(`DATABASE_URL or PGDATABASE, PGHOST, PGPORT, and PGUSER are required.`);return t}function w(e){let{PGDATABASE:t,PGHOST:n,PGPASSWORD:r,PGPORT:i,PGUSER:a}=e;if(!t||!n||!i||!a)return;let o=new URL(`postgresql://${n}:${i}/${t}`);return o.username=a,r&&(o.password=r),o.href}export{c as LOCAL_POSTGRES_ENV_FLAG,d as ProjectPostgresAlreadyRunningError,g as createLocalPostgresDb,h as createLocalPostgresEnv,C as getLocalPostgresConnectionString,f as startProjectPostgres,m as startTemporaryProjectPostgres,p as stopProjectPostgres};
|
package/dist/dev.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
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 o from"./_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{resolveMobileDevHost as s,selectMobileDevDevice as c}from"./dev-device.js";import{devHttpsCertEnv as l,devHttpsKeyEnv as u,prepareDevHttps as d}from"./dev-https.js";import{acquireDevLock as f}from"./dev-lock.js";import{managedDevEnv as p}from"./managed-dev-protocol.js";import{isManagedDevCheckout as m,isPrimaryCheckout as ee}from"./managed-dev.js";import{createTauriDevOutput as te}from"./tauri-dev-output.js";import h from"node:path";import g from"nano-spawn";import*as _ from"@clack/prompts";import v from"node:process";import*as ne from"node:readline";import{createPrefixStream as y,supervise as b}from"procband";const x=[`web`,`desktop`,`ios`,`android`];function S(e){let t=e.dev?.platforms??[`web`];for(let e of t)if(!x.includes(e))throw Error(`Invalid development platform "${String(e)}". Expected one of: ${x.join(`, `)}.`);return[...new Set(t)]}const C=h.resolve(`node_modules`,`.bin`),w=v.platform===`win32`?`pnpm.cmd`:`pnpm`,T=v.platform===`win32`?`portless.cmd`:`portless`,E=v.platform===`win32`?`react-router.cmd`:`react-router`,D=v.platform===`win32`?`turso.cmd`:`turso`;async function O({cwd:r=v.cwd(),device:i,env:a=v.env,host:x,https:S=!1,input:O=v.stdin,interactive:N=v.stdin.isTTY===!0,managed:P=!1,noManaged:F=!1,platform:I=`web`,verbose:L=!1,webPort:R}={}){let z=a.PATH??a.Path??``,B=I===`web`?M(R??a.COREFRAME_WEB_PORT):void 0,V,H,U,W=!1,G=a;if(P&&F)throw Error(`Cannot use --managed and --no-managed together.`);if(S&&I!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(i!==void 0&&I!==`ios`&&I!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(I===`web`&&a.TAURI_ENV_PLATFORM!==void 0&&a.COREFRAME_TAURI_DEV!==`1`){let e=a.TAURI_ENV_PLATFORM===`ios`||a.TAURI_ENV_PLATFORM===`android`?a.TAURI_ENV_PLATFORM:`desktop`;throw Error(`Direct Tauri development is not supported. Run \`pnpm dev ${e}\` instead.`)}let K=await f({cwd:r,interactive:N});if(K)try{let f=I===`ios`||I===`android`?I:void 0,M=f?await c({env:a,interactive:N,platform:f,target:i}):void 0,R=f&&M?await s({device:M,host:x,interactive:N,platform:f}):void 0,J=R?!0:x,Y=await e({cwd:r}),X=I===`web`&&a.PORTLESS!==`0`&&a.TAURI_ENV_PLATFORM===void 0&&await ee(r),Z=S&&!X?await d({cwd:r}):void 0;G={...a,...I===`web`?void 0:{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:ie(I),...R?{TAURI_DEV_HOST:R}:void 0},...Z?{[l]:Z.cert,[u]:Z.key}:void 0};let Q=async()=>{let e=!1,t=N?ne.createInterface({input:O}):void 0;t?.on(`line`,t=>{t.trim().toLowerCase()!==`r`||!U||e||(e=!0,U.kill(`SIGTERM`)?_.log.info(`Restarting the Vite development server.`):e=!1)}),t&&_.log.info(`Press r + Enter to restart the Vite development server.`);try{for(;;){e=!1,U=b({name:`web`,command:X?T:E,args:X?ae({host:J,port:B}):j({host:J,port:B}),cwd:r,env:{...G,CLOUDFLARE_ENV:`development`,PATH:C+h.delimiter+z}}),await U.wait();let t=U;if(U=void 0,!e){W||await t.expectSuccess();return}}}finally{t?.close()}},$=async()=>{if(I===`web`){await Q();return}let e=Q().then(()=>{if(!W)throw Error(`The Vite development server stopped while Tauri was still running.`)}),t,n;if(I===`ios`&&!L){n=y({label:`ios`}),n.pipe(v.stdout,{end:!1});try{t=await te({output:n}),_.log.info(`Full iOS log: ${t.logFile}`)}catch{n.end(),n=void 0,_.log.warn(`Could not create the temporary iOS log; showing full Tauri output.`)}}V=g(w,re(I,M?.name,R),{cwd:r,env:a,stdio:t?[`inherit`,`pipe`,`pipe`]:`inherit`});let i=t?.consume(V),o=V.catch(async e=>{throw W||(await i,await t?.reportFailure()),e});try{await Promise.race([e,o])}finally{W=!0,U?.kill(`SIGTERM`),(await V.nodeChildProcess.catch(()=>void 0))?.kill(`SIGTERM`),await Promise.allSettled([e,V,i]),await t?.close(),n?.end(),V=void 0}};if((P||N&&!F)&&await m(r)&&(G={...G,[p]:`1`}),Y.database?.dialect===`sqlite`){let e=await n.getAvailablePort(),i=h.resolve(r,`.coreframe`),o=h.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`},H=b({name:`turso`,command:D,args:[`dev`,`--port`,String(e),`--db-file`,o],cwd:r,env:a}),await H.waitFor(`listening`),await b({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:G,prefix:!1}).expectSuccess()}if(A(Y)){let e=y({label:`postgres`});e.pipe(v.stdout,{end:!1});try{try{var q=o();let t=await k({config:Y,cwd:r,env:G,interactive:N,postgresOutput:e,takeoverApproved:K.takeoverApproved});if(!t)return;q.a(t),G=t.env,await b({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:G,prefix:!1}).expectSuccess(),await $()}catch(e){q.e=e}finally{await q.d()}}finally{e.end()}return}await $()}finally{W=!0,U?.kill(`SIGTERM`),(await V?.nodeChildProcess.catch(()=>void 0))?.kill(`SIGTERM`),H&&H.kill(`SIGTERM`),await K.release()}}async function k({interactive:e,takeoverApproved:t,...n}){try{return await i(n)}catch(o){if(!(o instanceof r)||!e)throw o;if(!t){let e=await _.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${o.pid}). Stop it and start here?`});if(_.isCancel(e)||!e){_.cancel(`Keeping the existing PostgreSQL process.`);return}}return await a(o),i(n)}}function A(e){return(e.database?.dialect??`postgres`)===`postgres`}function re(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 ie(e){return e===`desktop`?v.platform===`win32`?`windows`:v.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 ae({host:e,port:t}){return[`run`,...t===void 0?[]:[`--app-port`,String(t)],`react-router`,...j({host:e,port:void 0})]}function M(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 devPlatforms,S as resolveDevPlatforms,O 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 o from"./_virtual/_@oxc-project_runtime@0.138.0/helpers/esm/usingCtx.js";import{resolveMobileDevHost as s,selectMobileDevDevice as c}from"./dev-device.js";import{devHttpsCertEnv as l,devHttpsKeyEnv as u,prepareDevHttps as d}from"./dev-https.js";import{acquireDevLock as f}from"./dev-lock.js";import{managedDevEnv as p}from"./managed-dev-protocol.js";import{isManagedDevCheckout as m,isPrimaryCheckout as ee}from"./managed-dev.js";import{createTauriDevOutput as te}from"./tauri-dev-output.js";import h from"node:path";import g from"nano-spawn";import*as _ from"@clack/prompts";import v from"node:process";import*as ne from"node:readline";import{createPrefixStream as y,supervise as b}from"procband";const x=[`web`,`desktop`,`ios`,`android`];function S(e){let t=e.dev?.platforms??[`web`];for(let e of t)if(!x.includes(e))throw Error(`Invalid development platform "${String(e)}". Expected one of: ${x.join(`, `)}.`);return[...new Set(t)]}const C=h.resolve(`node_modules`,`.bin`),w=v.platform===`win32`?`pnpm.cmd`:`pnpm`,T=v.platform===`win32`?`portless.cmd`:`portless`,E=v.platform===`win32`?`react-router.cmd`:`react-router`,D=v.platform===`win32`?`turso.cmd`:`turso`;async function O({cwd:r=v.cwd(),device:i,env:a=v.env,host:x,https:S=!1,input:O=v.stdin,interactive:N=v.stdin.isTTY===!0,managed:P=!1,noManaged:F=!1,platform:I=`web`,verbose:L=!1,webPort:R}={}){let z=a.PATH??a.Path??``,B=I===`web`?M(R??a.COREFRAME_WEB_PORT):void 0,V,H,U,W=!1,G=a;if(P&&F)throw Error(`Cannot use --managed and --no-managed together.`);if(S&&I!==`web`)throw Error(`Local HTTPS is only supported for the web development platform.`);if(i!==void 0&&I!==`ios`&&I!==`android`)throw Error(`A device name or ID is only supported for iOS or Android development.`);if(I===`web`&&a.TAURI_ENV_PLATFORM!==void 0&&a.COREFRAME_TAURI_DEV!==`1`){let e=a.TAURI_ENV_PLATFORM===`ios`||a.TAURI_ENV_PLATFORM===`android`?a.TAURI_ENV_PLATFORM:`desktop`;throw Error(`Direct Tauri development is not supported. Run \`pnpm dev ${e}\` instead.`)}let K=await f({cwd:r,interactive:N});if(K)try{let f=I===`ios`||I===`android`?I:void 0,M=f?await c({env:a,interactive:N,platform:f,target:i}):void 0,R=f&&M?await s({device:M,host:x,interactive:N,platform:f}):void 0,J=R?!0:x,Y=await e({cwd:r}),X=I===`web`&&a.PORTLESS!==`0`&&a.TAURI_ENV_PLATFORM===void 0&&await ee(r),Z=S&&!X?await d({cwd:r}):void 0;G={...a,...I===`web`?void 0:{COREFRAME_TAURI_DEV:`1`,TAURI_ENV_PLATFORM:ie(I),...R?{TAURI_DEV_HOST:R}:void 0},...Z?{[l]:Z.cert,[u]:Z.key}:void 0};let Q=async()=>{let e=!1,t=N?ne.createInterface({input:O}):void 0;t?.on(`line`,t=>{t.trim().toLowerCase()!==`r`||!U||e||(e=!0,U.kill(`SIGTERM`)?_.log.info(`Restarting the Vite development server.`):e=!1)}),t&&_.log.info(`Press r + Enter to restart the Vite development server.`);try{for(;;){e=!1,U=b({name:`web`,command:X?T:E,args:X?ae({host:J,port:B}):j({host:J,port:B}),cwd:r,env:{...G,CLOUDFLARE_ENV:`development`,PATH:C+h.delimiter+z}}),await U.wait();let t=U;if(U=void 0,!e){W||await t.expectSuccess();return}}}finally{t?.close()}},$=async()=>{if(I===`web`){await Q();return}let e=Q().then(()=>{if(!W)throw Error(`The Vite development server stopped while Tauri was still running.`)}),t,n;if(I===`ios`&&!L){n=y({label:`ios`}),n.pipe(v.stdout,{end:!1});try{t=await te({output:n}),_.log.info(`Full iOS log: ${t.logFile}`)}catch{n.end(),n=void 0,_.log.warn(`Could not create the temporary iOS log; showing full Tauri output.`)}}V=g(w,re(I,M?.name,R),{cwd:r,env:a,stdio:t?[`inherit`,`pipe`,`pipe`]:`inherit`});let i=t?.consume(V),o=V.catch(async e=>{throw W||(await i,await t?.reportFailure()),e});try{await Promise.race([e,o])}finally{W=!0,U?.kill(`SIGTERM`),(await V.nodeChildProcess.catch(()=>void 0))?.kill(`SIGTERM`),await Promise.allSettled([e,V,i]),await t?.close(),n?.end(),V=void 0}};if((P||N&&!F)&&await m(r)&&(G={...G,[p]:`1`}),Y.database?.dialect===`sqlite`){let e=await n.getAvailablePort(),i=h.resolve(r,`.coreframe`),o=h.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`},H=b({name:`turso`,command:D,args:[`dev`,`--port`,String(e),`--db-file`,o],cwd:r,env:a}),await H.waitFor(`listening`),await b({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:G,prefix:!1}).expectSuccess()}if(A(Y)){let e=y({label:`postgres`});e.pipe(v.stdout,{end:!1});try{try{var q=o();let t=await k({config:Y,cwd:r,env:G,failIfRunning:!0,interactive:N,postgresOutput:e,takeoverApproved:K.takeoverApproved});if(!t)return;q.a(t),G=t.env,await b({name:`db`,command:w,args:[`db`,`ensure`],cwd:r,env:G,prefix:!1}).expectSuccess(),await $()}catch(e){q.e=e}finally{await q.d()}}finally{e.end()}return}await $()}finally{W=!0,U?.kill(`SIGTERM`),(await V?.nodeChildProcess.catch(()=>void 0))?.kill(`SIGTERM`),H&&H.kill(`SIGTERM`),await K.release()}}async function k({interactive:e,takeoverApproved:t,...n}){try{return await i(n)}catch(o){if(!(o instanceof r)||!e)throw o;if(!t){let e=await _.confirm({initialValue:!1,message:`PostgreSQL is already running for this project (PID ${o.pid}). Stop it and start here?`});if(_.isCancel(e)||!e){_.cancel(`Keeping the existing PostgreSQL process.`);return}}return await a(o),i(n)}}function A(e){return(e.database?.dialect??`postgres`)===`postgres`}function re(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 ie(e){return e===`desktop`?v.platform===`win32`?`windows`:v.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 ae({host:e,port:t}){return[`run`,...t===void 0?[]:[`--app-port`,String(t)],`react-router`,...j({host:e,port:void 0})]}function M(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 devPlatforms,S as resolveDevPlatforms,O as runDevServer};
|