UNPKG

@prisma/cli-dev

Version:

Dev CLI for Prisma

35 lines (22 loc) • 8.94 kB
import { createRequire } from 'module'; const require = createRequire(import.meta.url); import{a as s,b as y,d as c,e as u,f as w}from"./chunk-ZKMEOIRF.js";import{a as N}from"./chunk-XOIFSEIB.js";import{runMain as Se}from"citty";import{unstable_startServer as ue}from"@prisma/dev";import{defineCommand as fe}from"citty";function _(e){let r,o,t=new Promise((n,p)=>{r=n,o=p}),i=n=>{i=a=null,o(n),e?.onRejected?.(n),e?.onFulfilled?.()},a=n=>{a=i=null,r(n),e?.onResolved?.(n),e?.onFulfilled?.()};return{isFulfilled:()=>a===i,promise:t,reject:n=>i?.(n),resolve:n=>a?.(n)}}import{consola as K,LogLevels as ve}from"consola";import{process as ge}from"std-env";var M="0.8.2";var d={database:"db-port",server:"port",shadow_database:"shadow-db-port"},D={...N,[d.database]:{alias:"P",description:"Port number the database server will listen on.",required:!1,type:"string"},name:{alias:"n",default:"default",description:"Name of the server. Helps keep state isolated between different projects. Defaults to `default`.",required:!1,type:"string"},[d.server]:{alias:"p",description:"Main port number the Prisma Dev server will listen on.",required:!1,type:"string"},[d.shadow_database]:{description:"Port number the shadow database server will listen on.",required:!1,type:"string"}},J=/^[a-zA-Z0-9-_]+$/;function k(e){let{[d.server]:r,[d.database]:o,[d.shadow_database]:t,debug:i,name:a}=e.args,n=o?Number(o):void 0,p=r?Number(r):void 0,l=t?Number(t):void 0;return r&&Number.isNaN(p)?(console.error(`Invalid server port number provided. Please provide a valid port number in \`--${d.server}\`.`),process.exit(1)):o&&Number.isNaN(n)?(console.error(`Invalid database port number provided. Please provide a valid port number in \`--${d.database}\`.`),process.exit(1)):t&&Number.isNaN(l)?(console.error(`Invalid shadow database port number provided. Please provide a valid port number in \`--${d.shadow_database}\`.`),process.exit(1)):p!=null&&p===n?(console.error(`The server port and database port cannot be the same. Please provide different port numbers in \`--${d.server}\` and/or \`--${d.database}\`.`),process.exit(1)):n!=null&&n===l?(console.error(`The database port and shadow database port cannot be the same. Please provide different port numbers in \`--${d.database}\` and/or \`--${d.shadow_database}\`.`),process.exit(1)):p!=null&&p===l?(console.error(`The server port and shadow database port cannot be the same. Please provide different port numbers in \`--${d.server}\` and/or \`--${d.shadow_database}\`.`),process.exit(1)):J.test(a)?{databasePort:n,debug:i,name:a,serverPort:p,shadowDatabasePort:l}:(console.error("Invalid name provided. The name can only contain letters, numbers, dashes, and underscores. Please provide a valid name in `--name`."),process.exit(1))}import{PortNotAvailableError as me,ServerAlreadyRunningError as ce}from"@prisma/dev";import{consola as F}from"consola";import{process as q}from"std-env";import{setTimeout as se}from"timers/promises";import{consola as f}from"consola";import{colorize as C}from"consola/utils";import ie from"yocto-spinner";import{isCancel as Z,SelectKeyPrompt as ee}from"@clack/core";import{box as re,colorize as oe}from"consola/utils";import{process as R}from"std-env";var te=[{value:"h",label:"print http url"},{value:"t",label:"print tcp urls"},{value:"q",label:"quit"}],$=6;function G(e){let r=new ee({debug:e?.debug,options:te,render:ne,signal:e?.abortSignal});return{clearPrompt(){R.stdout.moveCursor(0,-$),R.stdout.cursorTo(0),R.stdout.clearScreenDown()},prompt:r,respond:async o=>{if(Z(o)||o==="q")return await e?.onQuit?.();await e?.onOption?.[o]?.()}}}function ne(){let e=`${this.options.map(r=>`${oe("inverse",` ${r.value} `)} ${r.label}`).join(" ")}`;return re(e,{style:{borderColor:"blackBright",borderStyle:"solid"},title:" \u25B3 press a key \u25B3 "})}function B(e){let r=ie();return{renderContent:ae,renderIntro:()=>de(e,r),renderOutro:()=>Promise.resolve(pe(e)),spinner:r}}async function ae(e){let{abortSignal:r,debug:o,isClosed:t,onQuit:i,server:a,spinner:n}=e;if(n.success(` Great Success! \u{1F609}\u{1F44D} Your ${u} server ${s(a.name)} is ready and listening on ports ${x([new URL(a.http.url).port,new URL(a.database.connectionString).port,new URL(a.shadowDatabase.connectionString).port])}.`),!w){f.log(L(a)),f.log(U(a));return}for(;!t();){let{clearPrompt:p,prompt:l,respond:P}=G({abortSignal:r,debug:o,onOption:{h:()=>f.log(L(a)),t:()=>f.log(U(a))},onQuit:i}),v=await l.prompt();p(),r.aborted||await P(v)}}async function de(e,r){r.start(` Starting ${u} server ${s(e)}...${` `.repeat($+3)}`),w&&await se(250)}function pe(e){f.log(`\u{1F44B} Buh Bye! Your ${u} server ${s(e)} has been closed successfully. `)}function L(e){return`\u{1F50C} To connect to your local Prisma Postgres database via HTTP + Prisma ORM use the following connection string: ${H("\u{1F4C4} .env:")} ${T("DATABASE_URL",le(e.ppg.url))} \u2728 The ${s("api_key")} above does not contain any sensitive information.`}function U(e){return`\u{1F50C} To connect to your local Prisma Postgres database via TCP + Prisma ORM use the following connection strings: ${H("\u{1F4C4} .env:")} ${T("DATABASE_URL",j(e.database.prismaORMConnectionString))} ${T("SHADOW_DATABASE_URL",j(e.shadowDatabase.prismaORMConnectionString))} \u{1F418} You can also use the TCP ${s("DATABASE_URL")} with the ${s("pg")} or ${s("postgres.js")} JavaScript drivers! Set the maximum number of connections to ${s(1)}, connect timeout to ${s(0)} and idle timeout to the smallest positive value supported.`}function x(e){if(e.length===0)return"";let r=[...e].map(Number).sort();return r.length>1&&r.every((o,t)=>t===0||o===r[t-1]+1)?`${s(r[0])}-${s(r.at(-1))}`:e.map(s).join(", ")}function T(e,r){return`${s(e)}="${r}"`}function le(e){return e=new URL(e),`${y(e.protocol)}//${s(e.hostname)}:${s(e.port)}${c(e.pathname)}${c(e.search)}`}function j(e){return e=new URL(e),`${y(e.protocol)}${c(`//${e.username}:${e.password}@`)}${s(e.hostname)}${c(":")}${s(e.port)}${c(e.pathname)}${c(e.search)}`}function H(e){return C("italic",C("dim",C("green",`# ${e}`)))}async function g(e,r,o){if(e instanceof ce)try{let i=await e.server;if(!i)return await g("Something went wrong, try again!",r,o);r.warning(` Skipped! \u{1F60C} Your ${u} server ${s(i.name)} is already running and listening on ports ${x([i.port,i.databasePort,i.shadowDatabasePort])}. To start a different server, use the ${`${s("-n")}/${s("--name")}`} flag with another name. `);return}catch(i){return await g(i,r,o)}let{args:t}=o;throw F.error(e instanceof me?`Prisma Dev Error: port number \`${e.port}\` is already in use. Please pass a different port number in the \`--${t.port===String(e.port)?"port":t.databasePort===String(e.port)?"database":"shadow_database"}\` option.`:e),q.exitCode||=1,e}function V(e){q.on?.("uncaughtException",r=>{if("code"in r&&r.code==="ECONNRESET"){e?.debug&&F.error("uncaught ECONNRESET");return}e?.onError?.(r)})}import{consola as b}from"consola";import{process as h}from"std-env";function X(e){let r={shutdownAlreadyStarted:!1};h.once?.("SIGINT",Q("SIGINT",e,r)),h.once?.("SIGTERM",Q("SIGTERM",e,r))}function Q(e,r,o){let{debug:t,onFailure:i,onSuccess:a,server:n}=r;return()=>{if(o.shutdownAlreadyStarted){t&&b.debug(`Received ${e} signal, ignoring.`);return}o.shutdownAlreadyStarted=!0,t&&b.debug(`${e} signal receieved.`),t&&b.log(` Closing Prisma Dev... `),h.exitCode=e==="SIGINT"?130:143,n.close().then(()=>{t&&b.debug("Prisma Dev server closed."),e==="SIGINT"&&(h.exitCode=0),a()}).catch(i)}}var be={description:"Spin up a local Prisma Postgres database",name:"prisma dev",version:M},S="\v",O=fe({args:D,meta:be,run:async e=>{let{subCommands:r}=e.cmd,o=r?e.rawArgs.find(m=>!m.startsWith("-")):void 0;if(o&&o!==S&&o in r)return;let{debug:t,name:i,serverPort:a,...n}=k(e),{renderContent:p,renderIntro:l,renderOutro:P,spinner:v}=B(i);try{let m=await he({...n,debug:t,name:i,port:a,renderIntro:l}),A=new AbortController,{isFulfilled:W,promise:Y,reject:E,resolve:I}=_({onFulfilled:()=>A.abort()});X({debug:t,onFailure:E,onSuccess:I,server:m}),V({debug:t,onError:E}),await p({abortSignal:A.signal,debug:t,isClosed:W,onQuit:async()=>{await m.close(),I()},server:m,spinner:v}),await Y,await P(),ge.exitCode||=0}catch(m){await g(m,v,e)}},setup(e){e.args.debug&&(K.level=ve.debug),K.options.formatOptions.date=!1},subCommands:{[S]:{},ls:()=>import("./list-K5DAVLAS.js").then(e=>e.ListCommand),rm:()=>import("./remove-6QJTZ5SK.js").then(e=>e.RemoveCommand),stop:()=>import("./stop-CRL2UWAK.js").then(e=>e.StopCommand)}});async function he(e){let{renderIntro:r,...o}=e,[,t]=await Promise.allSettled([e.renderIntro(),ue({...o,persistenceMode:"stateful"})]);if(t.status==="rejected")throw t.reason;return t.value}async function ir(e,r){let[o]=e;o==="-v"&&(e[0]="--version"),o&&!(o in O.subCommands)&&o!=="--help"&&o!=="-h"&&o!=="--version"&&o!=="-v"&&e.unshift(S),await Se(O,{rawArgs:e})}export{ir as run};