UNPKG

@prisma/cli-dev

Version:

Dev CLI for Prisma

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