@stacksjs/launchpad
Version:
Like Homebrew, but faster.
4 lines (3 loc) • 5.55 kB
JavaScript
// @bun
import{Ta as Q}from"./chunk-wkk6vc0r.js";import"./chunk-f8dcmgkp.js";import"./chunk-fhet42vs.js";import"./chunk-b9hx8gsj.js";import{bb as q,cb as E}from"./chunk-8pxdwzvm.js";import{spawn as R}from"child_process";import M from"fs";import S from"net";import w from"path";import B from"process";async function N(F,H={}){let G=F.toLowerCase().replace(/\W/g,"_"),J=H.type||await C();switch(console.warn(`\uD83D\uDDC4\uFE0F Creating ${J.toUpperCase()} database: ${G}`),J){case"postgres":return await D(G,H);case"mysql":return await T(G,H);case"sqlite":return await x(G,H);default:throw new Error(`Unsupported database type: ${J}`)}}async function D(F,H){let{host:G="127.0.0.1",port:J=5432,user:O="postgres"}=H;try{let K=B.env.LAUNCHPAD_PG_READY==="1",V=Q("pg_isready")||"pg_isready";for(let Y=0;Y<20&&!K;Y++){let _=!1;try{await X([V,"-h",G,"-p",String(J)]),_=!0}catch{}let Z=!1;if(!_)Z=await new Promise((W)=>{let A=S.connect({host:G,port:J,timeout:1000},()=>{A.end(),W(!0)});A.on("error",()=>W(!1)),A.on("timeout",()=>{A.destroy(),W(!1)})});if(K=_||Z,!K){if(B.env.LAUNCHPAD_DEBUG==="1")console.warn(`\u23F3 PostgreSQL readiness attempt ${Y+1}/${20} not ready; methods: pg_isready=${_?"ok":"fail"} tcp=${Z?"ok":"fail"}`);await new Promise((W)=>setTimeout(W,250+Y*150))}}if(!K)throw new Error("PostgreSQL not accepting connections yet");await new Promise((Y)=>setTimeout(Y,250));let L=["psql","-h",G,"-p",String(J),"-U",O,"-lqt"];if(!(await X(L)).includes(F)){let Y=["createdb","-h",G,"-p",String(J),"-U",O,F],_=!1,Z;for(let W=0;W<5;W++)try{await X(Y),_=!0;break}catch(A){Z=A,await new Promise((j)=>setTimeout(j,500+W*500))}if(!_)throw Z instanceof Error?Z:new Error(String(Z));console.log(`\u2705 PostgreSQL database ${F} created successfully`)}else console.log(`\u2705 PostgreSQL database ${F} already exists`);return{type:"postgres",host:G,port:J,database:F,username:O,password:H.password||""}}catch(U){throw new Error(`Failed to create PostgreSQL database: ${U instanceof Error?U.message:String(U)}`)}}async function T(F,H){let{host:G="localhost",port:J=3306,user:O="root",password:U=""}=H;try{let K=`CREATE DATABASE IF NOT EXISTS \`${F}\` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;`,V=["-h",G,"-P",String(J),"-u",O];if(U)V.push(`-p${U}`);return V.push("-e",K),await X(["mysql",...V]),console.log(`\u2705 MySQL database ${F} created successfully`),{type:"mysql",host:G,port:J,database:F,username:O,password:U||""}}catch(K){throw new Error(`Failed to create MySQL database: ${K instanceof Error?K.message:String(K)}`)}}async function x(F,H){let G=B.cwd(),J=w.join(G,"database",`${F}.sqlite`);try{if(M.mkdirSync(w.dirname(J),{recursive:!0}),!M.existsSync(J))M.writeFileSync(J,""),console.log(`\u2705 SQLite database created: ${J}`);else console.log(`\u2705 SQLite database already exists: ${J}`);return{type:"sqlite",database:F,path:J}}catch(O){throw new Error(`Failed to create SQLite database: ${O instanceof Error?O.message:String(O)}`)}}async function C(){try{let F=await z("postgres",5432),H=await z("mysql",3306);if(F)return"postgres";if(H)return"mysql";return"sqlite"}catch{return"sqlite"}}async function z(F,H){try{if(F==="postgres")return await X(["pg_isready","-h","127.0.0.1","-p",String(H)]),!0;else if(F==="mysql")return await X(["mysqladmin","ping","-h","127.0.0.1","-P",String(H)]),!0;return!1}catch{return!1}}function I(F,H=!0){let G=[];switch(F.type){case"postgres":G.push("DB_CONNECTION=pgsql"),G.push(`DB_HOST=${F.host}`),G.push(`DB_PORT=${F.port}`),G.push(`DB_DATABASE=${F.database}`),G.push(`DB_USERNAME=${F.username}`),G.push(`DB_PASSWORD=${F.password||""}`);break;case"mysql":G.push("DB_CONNECTION=mysql"),G.push(`DB_HOST=${F.host}`),G.push(`DB_PORT=${F.port}`),G.push(`DB_DATABASE=${F.database}`),G.push(`DB_USERNAME=${F.username}`),G.push(`DB_PASSWORD=${F.password||""}`);break;case"sqlite":G.push("DB_CONNECTION=sqlite"),G.push(`DB_DATABASE=${F.path}`);break}if(H)G.push(""),G.push("# Meilisearch Configuration"),G.push("SCOUT_DRIVER=meilisearch"),G.push("MEILISEARCH_HOST=http://127.0.0.1:7700"),G.push("MEILISEARCH_KEY=masterKey");return G.join(`
`)}async function u(){try{return await X(["curl","-f","-s","http://127.0.0.1:7700/health"]),!0}catch{return!1}}async function b(){let{startService:F}=await import("./chunk-2q79gpta.js");console.warn("\uD83D\uDE80 Starting Laravel services...");try{await F("meilisearch"),console.warn("\u2705 Meilisearch started")}catch(H){console.warn(`\u26A0\uFE0F Failed to start Meilisearch: ${H instanceof Error?H.message:String(H)}`)}}async function g(F=!1){if(B.env.NODE_ENV==="test"||B.env.LAUNCHPAD_TEST_MODE==="true"){console.warn("\uD83E\uDDEA Test mode: Skipping Laravel migrations");return}try{if(console.warn("\uD83D\uDD04 Running Laravel migrations..."),await X(["php","artisan","migrate","--force"]),console.warn("\u2705 Migrations completed"),F)console.warn("\uD83C\uDF31 Seeding database..."),await X(["php","artisan","db:seed","--force"]),console.warn("\u2705 Database seeded")}catch(H){throw new Error(`Failed to run Laravel migrations: ${H instanceof Error?H.message:String(H)}`)}}async function X(F){let[H,...G]=F,J=Q(H)||H;return new Promise((O,U)=>{let K=R(J,G,{stdio:["pipe","pipe","pipe"],env:B.env}),V="",L="";K.stdout?.on("data",($)=>{V+=$.toString()}),K.stderr?.on("data",($)=>{L+=$.toString()}),K.on("close",($)=>{if($===0)O(V);else U(new Error(`Command failed with exit code ${$}: ${L||V}`))}),K.on("error",U)})}export{b as startLaravelServices,g as runLaravelMigrations,u as isMeilisearchRunning,I as generateLaravelConfig,N as createProjectDatabase};