create-mercur-app 2.3.9-canary.7 → 2.4.1

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.
@@ -0,0 +1,42 @@
1
+ import {spawn,execSync}from'child_process';import E,{join}from'path';import f from'fs-extra';import {detect}from'@antfu/ni';import {execa}from'execa';import y from'kleur';import {randomUUID,createHash}from'crypto';import {existsSync,readFileSync,mkdirSync,writeFileSync}from'fs';import Ft,{homedir}from'os';import {Readable}from'stream';import {pipeline}from'stream/promises';import {Command}from'commander';import Ht from'open';import re from'prompts';import {x as x$1}from'tar';import Jt from'terminal-link';import Vt from'validate-npm-package-name';import Wt from'wait-on';import Q from'pg';import _t from'ora';var $={name:"create-mercur-app",version:"2.4.1",repository:{type:"git",url:"https://github.com/mercurjs/mercur",directory:"packages/create-mercur-app"},type:"module",description:"Create a new Mercur marketplace project",author:"MercurJS (https://github.com/mercurjs)",keywords:["marketplace","multi-vendor","medusajs","ecommerce","open-source-marketplace","headless-commerce","create-mercur-app","marketplace-framework"],publishConfig:{access:"public"},files:["dist"],bin:{"create-mercur-app":"./dist/index.js"},exports:{".":"./dist/lib.js","./package.json":"./package.json"},scripts:{typecheck:"tsc --noEmit",dev:"tsup --watch",build:"tsup"},dependencies:{"@antfu/ni":"^30.3.0",commander:"^15.0.0",execa:"^10.0.0","fs-extra":"^11.3.2",kleur:"^4.1.5",open:"^11.0.0",ora:"^9.0.0",pg:"^8.17.1",prompts:"^2.4.2",tar:"^7.5.2","terminal-link":"^5.0.0","validate-npm-package-name":"^8.0.0","wait-on":"^9.0.3"},devDependencies:{"@types/fs-extra":"^11.0.4","@types/pg":"^8.16.0","@types/prompts":"^2.4.9","@types/tar":"^7.0.87","@types/validate-npm-package-name":"^4.0.2","@types/wait-on":"^5.3.4",tsup:"^8.5.0",typescript:"5.9.3"},engines:{node:">=20"}};var Ye=["bun","yarn","pnpm","deno","npm"];function ie(e){if(e)return Ye.find(t=>e.startsWith(t))}function x(){return ie(process.env.npm_config_user_agent)}async function Y(e){try{return await execa(e,["--version"]),!0}catch{return false}}async function L(e){let t=ie(await detect({programmatic:true,cwd:e}));if(t&&await Y(t))return t;let n=x();return n&&await Y(n)?n:"npm"}async function ce(){let e=x();return e&&await Y(e)?e:"npm"}var p={error:e=>y.red(e),warn:e=>y.yellow(e),info:e=>y.blue(e),success:e=>y.green(e),dim:e=>y.cyan(e)};var D=e=>Function("mm","return import(mm)")(e);function Ge(){let e=(...t)=>t.some(n=>!!process.env[n]);return e("MEDUSA_CLOUD_ENVIRONMENT_HANDLE","MEDUSA_CLOUD_SANDBOX_HANDLE","MEDUSA_CLOUD_API_KEY")?"medusa-cloud":e("RENDER","RENDER_URL","RENDER_INTERNAL_HOSTNAME","RENDER_SERVICE_ID")?"render":e("FLY_APP_NAME","FLY_REGION","FLY_ALLOC_ID")?"fly-io":e("RAILWAY_STATIC_URL","RAILWAY_ENVIRONMENT_NAME")?"railway":e("DYNO","HEROKU_APP_NAME")?"heroku":e("DO_DEPLOYMENT_ID","DO_APP_NAME","DIGITALOCEAN")?"digitalocean":e("KOYEB","KOYEB_DEPLOYMENT_ID","KOYEB_APP_NAME")?"koyeb":null}async function pe(){try{let e=await D("os"),t=e.cpus();return {deploymentVendor:Ge(),systemPlatform:e.platform(),systemRelease:e.release(),systemArchitecture:e.arch(),cpuCount:t.length,cpuModel:t.length?t[0].model:null,cpuSpeed:t.length?t[0].speed:null,memory:e.totalmem(),isWSL:await He(),isDocker:await ue(),isTTY:typeof process<"u"&&process.stdout?process.stdout.isTTY:null}}catch{return {systemPlatform:null,systemRelease:null,systemArchitecture:null,cpuCount:null,cpuModel:null,cpuSpeed:null,memory:null,isWSL:null,isDocker:null,isTTY:null}}}async function He(){try{if(typeof process>"u"||process?.platform!=="linux")return !1;let e=await D("fs");return (await D("os")).release().toLowerCase().includes("microsoft")?!await le():e.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!await le():!1}catch{return false}}var Ke=async()=>{try{return (await D("fs")).statSync("/run/.containerenv"),!0}catch{return false}};async function ue(){return await Je()||await Ve()}async function Je(){try{return (await D("fs")).statSync("/.dockerenv"),!0}catch{return false}}async function Ve(){try{return (await D("fs")).readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return false}}async function le(){return await Ke()||await ue()}var qe="mercur-telemetry-v1",de=e=>createHash("sha256").update(`${qe}:${e}`).digest("base64url");var G={telemetry_enabled:true,notice_shown:false,device_id:null},Ze=(e=process.env,t=process.platform)=>t==="win32"?join(e.APPDATA||join(homedir(),"AppData","Roaming"),"mercur"):join(e.XDG_CONFIG_HOME||join(homedir(),".config"),"mercur"),fe=join(homedir(),".mercur","config.json"),K=class{path;dir;constructor(t=Ze()){this.dir=t,this.path=join(t,"config.json");}get(t){return this.read()[t]}set(t,n){let r=this.read();r[t]=n,this.write(r);}deviceId(){let t=this.get("device_id");if(t)return t;let n=randomUUID();return this.set("device_id",n),n}read(){try{return existsSync(this.path)?{...G,...JSON.parse(readFileSync(this.path,"utf-8"))}:this.migrateLegacy()}catch{return {...G}}}migrateLegacy(){let t={...G};try{if(existsSync(fe)){let n=JSON.parse(readFileSync(fe,"utf-8"));typeof n.telemetry_enabled=="boolean"&&(t.telemetry_enabled=n.telemetry_enabled),typeof n.notice_shown=="boolean"&&(t.notice_shown=n.notice_shown),this.write(t);}}catch{}return t}write(t){try{mkdirSync(this.dir,{recursive:!0,mode:448}),writeFileSync(this.path,JSON.stringify(t,null,2)+`
2
+ `,{mode:384});}catch{}}},v=new K;var nt="https://telemetry.mercurjs.com",rt=2e3,st=1,ot="mercur",at="https://docs.mercurjs.com/telemetry",it=["CI","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","BUILDKITE","JENKINS_URL","TF_BUILD","TEAMCITY_VERSION","DRONE"],ct=["CLAUDECODE","CLAUDE_CODE","CURSOR_AGENT","CODEX_SANDBOX","GEMINI_CLI","COPILOT_AGENT","OPENCODE_CLIENT"],b={NETWORK:"network",FS:"fs",VALIDATION:"validation",REGISTRY:"registry",INSTALL:"install",DATABASE:"database",UNKNOWN:"unknown"},O=e=>e!==void 0&&["1","true","yes"].includes(e.toLowerCase()),we=()=>it.some(e=>!!process.env[e]),be=()=>O(process.env.MERCUR_TELEMETRY_FORCE_ENABLED)?true:O(process.env.MERCUR_DISABLE_TELEMETRY)||O(process.env.DO_NOT_TRACK)||we()?false:v.get("telemetry_enabled"),Ee=()=>{v.get("notice_shown")||(v.set("notice_shown",true),be()&&console.error(["","Mercur collects anonymous usage data to improve the CLI experience.",`You can disable this at any time by running: ${p.info("mercurjs telemetry --disable")}`,`Or by setting ${p.info("MERCUR_DISABLE_TELEMETRY=true")}`,`Learn more: ${p.info(at)}`,""].join(`
3
+ `)));},lt=e=>{try{return execSync("git config --local --get remote.origin.url",{cwd:e,stdio:"pipe",timeout:1e3}).toString().trim()}catch{return null}},pt=e=>de(lt(e)||e),ye=async e=>{try{return await f.readJSON(e)}catch{return null}},ut=async e=>{let[t,n]=await Promise.all([ye(E.join(e,"package.json")),ye(E.join(e,"packages/api/package.json"))]),r=o=>o?.dependencies??{},s=o=>r(t)[o]??r(n)[o];return {mercur_version:s("@mercurjs/core")??s("@mercurjs/cli"),medusa_version:s("@medusajs/framework")}},dt=async e=>{let[t,n]=await Promise.all([ut(e),pe()]),r=pt(e);return {schema_version:st,source:"create-mercur-app",cli_version:$.version,...t,node_version:process.version,runtime:process.versions.bun?"bun":"node",package_manager:x(),os:n.systemPlatform,arch:n.systemArchitecture,is_ci:we(),is_tty:!!process.stdout.isTTY,is_agent:ct.some(s=>!!process.env[s]),is_docker:n.isDocker,is_wsl:n.isWSL,cloud_provider:n.deploymentVendor,project_id:r,$groups:{project:r},$geoip_disable:true}},I=async(e,t)=>{try{if(!be())return;let n={api_key:ot,batch:[{event:e.event,distinct_id:v.deviceId(),timestamp:new Date().toISOString(),properties:{...await dt(t.cwd),...e.properties}}]};if(O(process.env.MERCUR_TELEMETRY_DEBUG)){console.error(`[telemetry] ${JSON.stringify(n.batch,null,2)}`);return}let r=(process.env.MERCUR_TELEMETRY_PROXY_URL||nt).replace(/\/+$/,""),s=new AbortController,o=setTimeout(()=>s.abort(),rt);try{await fetch(`${r}/batch`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n),signal:s.signal});}finally{clearTimeout(o);}}catch{}},ke=e=>{if(e&&typeof e=="object"){let t=e.name??"",n=e.code??"",r=e.message??"";if(Object.values(b).includes(t))return t;if(t==="ZodError")return b.VALIDATION;if(["ENOTFOUND","ECONNREFUSED","ECONNRESET","ETIMEDOUT","EAI_AGAIN"].includes(n)||/fetch failed/i.test(r))return b.NETWORK;if(["ENOENT","EACCES","EPERM","EEXIST","ENOTDIR","EISDIR"].includes(n))return b.FS}return b.UNKNOWN};var mt={template:["basic","plugin","registry"],tag:["latest","rc","canary"]},j=null,gt=e=>{let t={};for(let[n,r]of Object.entries(e.opts()))e.getOptionValueSource(n)==="cli"&&(typeof r=="boolean"||typeof r=="string"&&mt[n]?.includes(r)?t[n]=r:t[n]="<redacted>");return t},ft=e=>{let t=e.opts();j={name:e.name(),flags:gt(e),cwd:typeof t.cwd=="string"?t.cwd:process.cwd(),startedAt:Date.now()};},P=async(e,t)=>{if(!j)return;let n=j;j=null,await I({event:"cli_command_executed",properties:{command:n.name,flags:n.flags,exit_code:e,duration_ms:Date.now()-n.startedAt,...e!==0?{error_category:ke(t)}:{}}},{cwd:n.cwd});},xn=e=>{e.hook("preAction",(t,n)=>ft(n)),e.hook("postAction",async()=>{await P(0);});};var a={error(...e){console.log(p.error(e.join(" ")));},warn(...e){console.log(p.warn(e.join(" ")));},info(...e){console.log(p.info(e.join(" ")));},success(...e){console.log(p.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};var yt=["ECONNREFUSED","ENOTFOUND","EHOSTUNREACH","ETIMEDOUT","EAI_AGAIN"];function N(e){let t=e?.code??"",n=e instanceof AggregateError?e.errors[0]:void 0,r=e instanceof Error&&e.message||n instanceof Error&&n.message||t||String(e);return yt.includes(t)||/timeout|ECONNREFUSED/i.test(r)?{ok:false,reason:"unreachable",message:r}:t==="28P01"||t==="28000"?{ok:false,reason:"auth",message:r}:t==="3D000"?{ok:false,reason:"missing-database",message:r}:{ok:false,reason:"unknown",message:r}}async function J(e){let t=new Q.Client("connectionString"in e?{connectionString:e.connectionString,connectionTimeoutMillis:5e3}:{host:e.host,port:e.port,user:"postgres",password:"",database:"postgres",connectionTimeoutMillis:5e3});try{return await t.connect(),await t.query("SELECT 1"),{ok:!0}}catch(n){return N(n)}finally{await t.end().catch(()=>{});}}function V(e,t){try{let n=new URL(e);return {host:n.hostname||t.host,port:Number(n.port)||t.port}}catch{return t}}function wt(e){let t=`docker run -d --name mercur-postgres -p ${e}:5432 -e POSTGRES_PASSWORD=postgres postgres:17`;return process.platform==="darwin"?["brew install postgresql@17 && brew services start postgresql@17",`or: ${t}`]:process.platform==="linux"?["sudo systemctl start postgresql",`or: ${t}`]:[t,'or start the "postgresql" service from services.msc']}function C(e,{host:t,port:n}){let r=`${t}:${n}`,s=[];switch(e.reason){case "unreachable":s.push(`PostgreSQL is not reachable at ${r} (${e.message}).`),s.push("Start it, then run this command again:"),s.push(...wt(n).map(o=>` ${p.info(o)}`));break;case "auth":s.push(`PostgreSQL at ${r} rejected the credentials (${e.message}).`),s.push("Pass a working user and password, for example:"),s.push(` ${p.info(`--db-connection-string postgresql://<user>:<password>@${t}:${n}/postgres`)}`);break;case "missing-database":s.push(`The database does not exist on ${r} (${e.message}).`),s.push("Create it first, or point the connection string at an existing database:"),s.push(` ${p.info(`createdb -h ${t} -p ${n} <database>`)}`);break;default:s.push(`Could not connect to PostgreSQL at ${r}: ${e.message}`),s.push(`Check that it is running: ${p.info(`pg_isready -h ${t} -p ${n}`)}`);}s.push(`To scaffold without a database, pass ${p.info("--skip-db")}.`),a.break();for(let o of s)a.log(o);a.break();}var q=({contents:e,databaseUri:t})=>{let n=new Set,r=e;return e.includes("DATABASE_URL")||(r+=`
4
+ DATABASE_URL=your-connection-string-here`),r.split(`
5
+ `).map(o=>{if(o.startsWith("#")||!o.includes("="))return o;let[i]=o.split("=");if(i)return i==="DATABASE_URL"&&(o=`DATABASE_URL=${t||"postgresql://localhost:5432/your-database-name"}`),n.has(i)?null:(n.add(i),o)}).filter(Boolean).join(`
6
+ `)},bt=(e,t,n)=>{let r=`${t}=${n}`,s=new RegExp(`^${t}=.*$`,"m");return s.test(e)?e.replace(s,r):`${e}${e.endsWith(`
7
+ `)||e===""?"":`
8
+ `}${r}`},Et=[{path:"packages/api"},{path:"apps/vendor"},{path:"apps/admin"},{path:"apps/storefront"}];async function R({projectDir:e,databaseUri:t,publishableKey:n}){try{await Promise.all(Et.map(async({path:r})=>{let s=E.join(e,r);if(!f.existsSync(s))return;let o=E.join(s,".env.template"),i=E.join(s,".env"),d=r.includes("api"),c=r.includes("storefront");if(!d){if(f.existsSync(o)&&!f.existsSync(i)&&await f.copy(o,i),c&&n&&f.existsSync(i)){let l=await f.readFile(i,"utf8");await f.writeFile(i,bt(l,"NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY",n));}return}let g="";if(f.existsSync(o)){let l=await f.readFile(o,"utf8");g=q({contents:l,databaseUri:t});}if(f.existsSync(i)){let l=await f.readFile(i,"utf8"),w=q({contents:l,databaseUri:t});await f.writeFile(i,w);}else {let l=q({contents:g,databaseUri:t});await f.writeFile(i,l);}}));}catch(r){a.error("Unable to manage environment files"),r instanceof Error&&a.error(r.message),process.exit(1);}}async function Se({connectionString:e}){let t=new Q.Client({connectionString:e});try{return await t.connect(),await t.query(`INSERT INTO telemetry_installation (id, installation_id, milestones, demo_data_seeded_at)
9
+ VALUES ('singleton', $1, '{}', now())
10
+ ON CONFLICT (id) DO UPDATE
11
+ SET demo_data_seeded_at = COALESCE(telemetry_installation.demo_data_seeded_at, now()),
12
+ updated_at = now();`,[randomUUID()]),!0}catch(n){return a.error(`Error marking demo data${n instanceof Error?`: ${n.message}`:""}.`),false}finally{await t.end().catch(()=>{});}}function m(e,t){return _t({text:e,isSilent:false})}var Ce="localhost",X=5432,Z="packages/api",Pt="admin@mercur-test.com";async function De(e){let t=e.dbHost??Ce,n=e.dbPort??X;if(e.dbConnectionString){let o=await J({connectionString:e.dbConnectionString});return o.ok?{dbName:vt(e.dbConnectionString)??e.projectName,connectionString:e.dbConnectionString}:(e.spinner?.stop(),C(o,V(e.dbConnectionString,{host:t,port:n})),null)}let r=await Dt({host:t,port:n,spinner:e.spinner});if(!r)return null;let{client:s}=r;try{let o=await Tt(s,e.projectName.replace(/[^a-zA-Z0-9]/g,"-"),e.spinner);return o?(e.spinner&&(e.spinner.text=`Creating database "${o}"...`),await s.query(`CREATE DATABASE "${o}"`),{dbName:o,connectionString:Nt({user:r.user,password:r.password,host:t,port:n,db:o})}):null}catch(o){return e.spinner?.stop(),a.error(`Error creating database${o instanceof Error?`: ${o.message}`:""}.`),null}finally{await s.end().catch(()=>{});}}async function Te(e){let{projectDir:t,spinner:n,dbName:r,connectionString:s}=e;if(await R({projectDir:t,databaseUri:s}),!await xt({projectDir:t,spinner:n,connectionString:s}))return {success:false,dbName:r,connectionString:null};if(!await Ot({projectDir:t,spinner:n}))return {success:false,dbName:r,connectionString:null};await Se({connectionString:s});let d=await Lt({projectDir:t}),c=await Ct({connectionString:s});return c&&await R({projectDir:t,databaseUri:s,publishableKey:c}),{success:true,dbName:r,connectionString:s,inviteToken:d,publishableKey:c}}async function Ct({connectionString:e}){let t=new Q.Client({connectionString:e});try{return await t.connect(),(await t.query("SELECT token FROM api_key WHERE type = 'publishable' AND revoked_at IS NULL AND deleted_at IS NULL ORDER BY created_at ASC LIMIT 1;")).rows[0]?.token??null}catch(n){return a.error(`Error reading publishable API key${n instanceof Error?`: ${n.message}`:""}.`),null}finally{await t.end().catch(()=>{});}}async function _e(e){let t=async n=>{let r=new Q.Client({...e,database:n,connectionTimeoutMillis:5e3});try{return await r.connect(),r}catch(s){throw await r.end().catch(()=>{}),s}};try{return await t("postgres")}catch(n){if(N(n).reason!=="missing-database")throw n;return t()}}async function Dt({host:e,port:t,spinner:n}){n&&(n.text=`Connecting to PostgreSQL at ${e}:${t}...`);try{return {client:await _e({user:"postgres",password:"",host:e,port:t}),user:"postgres",password:""}}catch(s){let o=N(s);if(o.reason!=="auth")return n?.stop(),C(o,{host:e,port:t}),null}if(n?.stop(),!process.stdin.isTTY)return C({reason:"auth",message:'user "postgres" without a password was rejected'},{host:e,port:t}),null;a.break(),a.log(`Couldn't connect to PostgreSQL at ${e}:${t} as "postgres" without a password. Enter the credentials Mercur should use to create the project database.`),a.break();let r=3;for(let s=1;s<=r;s++){let o=s>1?` (attempt ${s}/${r})`:"",i=await re([{type:"text",name:"postgresUsername",message:`Enter your Postgres username${o}`,initial:"postgres"},{type:"password",name:"postgresPassword",message:"Enter your Postgres password"}]);if(!i.postgresUsername)return C({reason:"auth",message:"no credentials entered"},{host:e,port:t}),null;let d=i.postgresUsername,c=i.postgresPassword??"";n?.start("Connecting to PostgreSQL...");try{return {client:await _e({user:d,password:c,host:e,port:t}),user:d,password:c}}catch(g){n?.stop();let l=N(g);if(s<r&&l.reason==="auth"){a.warn(`Attempt ${s}/${r} failed: ${l.message}`);continue}return C(l,{host:e,port:t}),null}}return null}async function Tt(e,t,n){let r=t;for(;await At(e,r);){n?.stop();let{newDbName:s}=process.stdin.isTTY?await re({type:"text",name:"newDbName",message:`A database named "${r}" already exists. Enter a name for the new database:`,initial:`${t}-2`,validate:o=>o&&o.trim().length>0||"Name is required"}):{newDbName:void 0};if(!s)return a.error(`Database "${r}" already exists. Drop it (dropdb ${r}), choose another project name, or pass --db-connection-string to use it as is.`),null;r=s.trim(),n?.start(`Checking database "${r}"...`);}return r}async function At(e,t){return ((await e.query("SELECT 1 FROM pg_catalog.pg_database WHERE datname = $1",[t])).rowCount??0)>0}function vt(e){try{return decodeURIComponent(new URL(e).pathname.slice(1))||null}catch{return null}}function Nt({user:e,password:t,host:n,port:r=X,db:s}){let o=encodeURIComponent(t);return `postgresql://${encodeURIComponent(e)}:${o}@${n}:${r}/${s}`}async function Rt(e){let t=new Q.Client({connectionString:e});try{return await t.connect(),!!(await t.query("SELECT to_regclass('public.mikro_orm_migrations') IS NOT NULL AS exists")).rows[0]?.exists}catch{return false}finally{await t.end().catch(()=>{});}}function $t(e,t=20){return e.trim().split(`
13
+ `).slice(-t).join(`
14
+ `)}async function xt({projectDir:e,spinner:t,connectionString:n}){let r=E.join(e,Z),s=await L(r),o=t||m("Running migrations...").start(),i=s==="yarn"?["yarn","run","build"]:s==="pnpm"?["pnpm","run","build"]:s==="bun"?["bun","run","build"]:["npm","run","build"],d=s==="yarn"?["yarn"]:s==="pnpm"?["pnpm","exec"]:s==="bun"?["bunx"]:["npx"],c="";try{o.text="Building project...",await execa(i[0],i.slice(1),{cwd:r}),o.text="Running database migrations...",c=(await execa(d[0],[...d.slice(1),"medusa","db:migrate"],{cwd:r,all:!0})).all??"";}catch(l){c=l.all??(l instanceof Error?l.message:String(l));}if(await Rt(n))return t||o.succeed("Migrations completed successfully."),true;o.fail("Failed to run migrations."),c&&a.log($t(c));let g=await J({connectionString:n});return g.ok||C(g,V(n,{host:Ce,port:X})),false}async function Lt({projectDir:e}){let t=E.join(e,Z),n=await L(t),r=n==="yarn"?["yarn"]:n==="pnpm"?["pnpm","exec"]:n==="bun"?["bunx"]:["npx"];try{return (await execa(r[0],[...r.slice(1),"medusa","user","-e",Pt,"--invite"],{cwd:t})).stdout.match(/Invite token: (?<token>.+)/)?.groups?.token||null}catch(s){return a.error(`Error creating admin invite${s instanceof Error?`: ${s.message}`:""}.`),null}}async function Ot({projectDir:e,spinner:t}){let n=E.join(e,Z),r=await L(n),s=t||m("Seeding database...").start();try{let o=r==="yarn"?["yarn","seed"]:r==="pnpm"?["pnpm","run","seed"]:r==="bun"?["bun","run","seed"]:["npm","run","seed"];return s.text="Seeding database with demo data...",await execa(o[0],o.slice(1),{cwd:n}),t||s.succeed("Database seeded successfully."),!0}catch(o){return s.fail("Failed to seed database."),a.error(`Error seeding database${o instanceof Error?`: ${o.message}`:""}.`),false}}async function Ae(e){await P(1,e),a.break(),a.error("Something went wrong. Please check the error below for more details."),a.error("If the problem persists, please open an issue on GitHub."),a.error(""),typeof e=="string"?a.error(e):e instanceof Error&&a.error(e.message),a.break(),process.exit(1);}var It="https://registry.npmjs.org",jt=["dependencies","devDependencies","peerDependencies","optionalDependencies"];function Ne(e){return e.includes("-canary")?"canary":e.includes("-rc")?"rc":"latest"}async function Re(e,t){try{let n=await fetch(`${It}/-/package/${e}/dist-tags`);return n.ok?(await n.json())[t]??null:null}catch{return null}}async function $e(e){let t=await f.readdir(e,{withFileTypes:true}),n=[];for(let r of t)if(r.isDirectory()){if(r.name==="node_modules"||r.name.startsWith("."))continue;n.push(...await $e(E.join(e,r.name)));}else r.name==="package.json"&&n.push(E.join(e,r.name));return n}function Mt(e){return e.startsWith("@mercurjs/")||e==="mercurjs"}async function xe({projectDir:e,channel:t}){if(t==="latest")return null;let n=await $e(e),r=new Map,s=null;for(let o of n){let i=await f.readJSON(o),d=false;for(let c of jt){let g=i[c];if(g)for(let l of Object.keys(g)){if(!Mt(l))continue;r.has(l)||r.set(l,await Re(l,t));let w=r.get(l);w&&(s??=w,g[l]!==w&&(g[l]=w,d=true));}}d&&await f.writeJSON(o,i,{spaces:2});}return s}async function Le(e){let t=await Re("@mercurjs/core",e);return t?`v${t}`:null}var te="main",ne=20,qt={basic:{path:"basic",description:"Full marketplace starter \u2014 sellers, products, orders, admin & vendor panels"},plugin:{path:"plugin",description:"MedusaJS plugin template \u2014 for building reusable marketplace extensions"}},Fr=new Command().name("create").description("create a new Mercur project").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. basic, registry, or plugin").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--no-deps","skip installing dependencies.").option("--skip-storefront","skip adding the Next.js storefront.",false).option("--skip-db","skip database configuration.",false).option("--skip-email","deprecated: the email prompt was removed, this flag has no effect.",false).option("--tag <tag>","the release channel to pin @mercurjs/* packages to: latest, rc, or canary. defaults to the channel of this CLI.").option("--db-connection-string <string>","PostgreSQL connection string.").option("--db-host <host>","PostgreSQL host.","localhost").option("--db-port <port>","PostgreSQL port.","5432").action(async(e,t)=>{try{let n=Date.now();an();let r=zt(t.tag);Ee();let s=e;if(!s){let{enteredName:u}=await re({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-mercur",format:h=>h.trim(),validate:h=>Vt(E.basename(E.resolve(h))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});u||process.exit(0),s=u;}let o=t.template;o||(o="basic");let i=!1;if(o==="basic"&&!t.skipStorefront){let{wantsStorefront:u}=await re({type:"confirm",name:"wantsStorefront",message:`Add a ${p.info("Next.js storefront")}?`,initial:!0});i=!!u;}let d=null;if(!t.skipDb){let u=m("Preparing database...").start();d=await De({projectName:s,dbConnectionString:t.dbConnectionString,dbHost:t.dbHost,dbPort:parseInt(t.dbPort,10),spinner:u}),d||(u.fail("Failed to prepare database."),a.log(U()),await P(1,{name:b.DATABASE}),process.exit(1)),u.succeed(`Database ${p.info(d.dbName)} is ready.`);}let c=E.resolve(t.cwd,s);await Qt(c);let g=m("Downloading template...").start(),{tarballPath:l,ref:w}=await Xt(await Le(r));try{if(await Zt({tarballPath:l,ref:w,projectDir:c,template:o}),g.succeed("Template downloaded successfully."),i){let u=m("Adding Next.js storefront...").start();try{await en({tarballPath:l,ref:w,projectDir:c}),u.succeed("Next.js storefront added successfully.");}catch(h){u.fail(`Failed to add storefront${h instanceof Error?`: ${h.message}`:""}.`);}}}finally{await f.remove(l).catch(()=>null);}if(r!=="latest"){let u=m(`Pinning Mercur packages to the ${r} release...`).start(),h=await xe({projectDir:c,channel:r});h?u.succeed(`Mercur packages pinned to ${h}.`):u.warn(`No ${r} release found \u2014 keeping the template's pinned versions.`);}let k=await ce();if(await rn(c,s,k),!t.deps)m("Dependency installation skipped.").warn();else {let u=m("Installing dependencies...").start(),h=Date.now(),F=await tn({projectDir:c,packageManager:k}),B=((Date.now()-h)/1e3).toFixed(1);F?u.succeed(`Dependencies installed successfully in ${B}s.`):(u.fail("Failed to install dependencies"),await P(1,{name:b.INSTALL}),process.exit(1));}let ae=t.dbConnectionString,_;if(d){let u=m("Setting up database...").start();_=await Te({projectDir:c,spinner:u,...d}),_.success?(u.succeed(`Database ${p.info(_.dbName)} setup successfully.`),ae=_.connectionString):(u.fail("Failed to setup database."),a.log(U()),await P(1,{name:b.DATABASE}),process.exit(1));}else m("Database setup skipped.").warn();await R({projectDir:c,databaseUri:ae}),await sn(c),await I({event:"project_created",properties:{template:o,package_manager:k,with_storefront:i,skip_db:!!t.skipDb}},{cwd:c});let je=((Date.now()-n)/1e3).toFixed(1);if(m(`Mercur project successfully created! (${je}s)`).succeed(),_?.success){m("Starting development server...").info();let u=_.inviteToken?`http://localhost:9000/dashboard/invite?token=${_.inviteToken}&first_run=true`:"http://localhost:9000/dashboard",B=spawn(k==="npm"?"npm":k,k==="npm"?["run","dev"]:["dev"],{cwd:c,stdio:"inherit",env:process.env}),Me=()=>{a.break(),a.log(y.bgGreen(y.black(" Project stopped. To start again: "))),a.log(Oe(c,k)),a.log(U()),a.break();};process.on("SIGINT",()=>{}),B.on("close",()=>{Me(),process.exit(0);}),Wt({resources:["http://localhost:9000/health"],timeout:6e4}).then(async()=>{a.break(),a.log(nn());try{await Ht(u),m("Admin panel opened in your browser.").succeed();}catch{m("Open this URL in your browser to create your admin account:").info(),a.log(p.info(u));}}).catch(()=>{m("To create your admin account, visit:").info(),a.log(p.info(u));});}else a.log(y.bgGreen(y.black(" Next Steps "))),a.log(Oe(c,k)),a.log(U()),a.break();}catch(n){a.break(),Ae(n);}});function zt(e){if(!e)return Ne($.version??"");if(e!=="latest"&&e!=="rc"&&e!=="canary")throw new Error(`Unknown --tag "${e}". Expected one of: latest, rc, canary.`);return e}async function Qt(e){if(!await f.pathExists(e)){await f.mkdir(e);return}let r=(await f.readdir(e)).filter(s=>!s.startsWith("."));if(r.length>0){let{proceed:s}=await re({type:"confirm",name:"proceed",message:`Directory ${p.info(E.basename(e))} already exists and contains ${r.length} file(s). Continue and overwrite?`,initial:false});s||process.exit(0);}}async function Xt(e){let t=e?[e,te]:[te];for(let n of t){let r=`https://codeload.github.com/mercurjs/mercur/tar.gz/${n}`,s=await fetch(r);if(!s.ok||!s.body){if(n!==te)continue;throw new Error(`Failed to download: ${r}`)}let o=E.join(Ft.tmpdir(),`mercur-${n.replaceAll("/","-")}-${process.pid}.tar.gz`);return await pipeline(Readable.from(s.body),f.createWriteStream(o)),{tarballPath:o,ref:n}}throw new Error("Failed to download the Mercur template.")}async function Ie({tarballPath:e,ref:t,cwd:n,repoPath:r,strip:s}){let i=`${`mercur-${t.replace(/^v/,"").replaceAll("/","-")}`}/${r}/`;await x$1({file:e,cwd:n,filter:d=>d.includes(i),strip:s});}async function Zt({tarballPath:e,ref:t,projectDir:n,template:r}){let o=`templates/${qt[r].path}`;await Ie({tarballPath:e,ref:t,cwd:n,repoPath:o,strip:1+o.split("/").length});}async function en({tarballPath:e,ref:t,projectDir:n}){await f.ensureDir(E.join(n,"apps")),await Ie({tarballPath:e,ref:t,cwd:n,repoPath:"apps/storefront",strip:1});}async function tn({projectDir:e,packageManager:t}){let n="npm",r=["install"];t==="yarn"?(n="yarn",r=[]):t==="pnpm"?(n="pnpm",r=["install"]):t==="bun"&&(n="bun",r=["install"]);try{return await execa(n,r,{cwd:E.resolve(e),stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,npm_config_yes:"true"}}),!0}catch(s){return a.error(`Error installing dependencies${s instanceof Error?`: ${s.message}`:""}.`),false}}function Oe(e,t){let n=E.relative(process.cwd(),e),r=s=>y.bold(s);return `
15
+ ${r("Launch Application:")}
16
+
17
+ - cd ./${n}
18
+ - ${t==="npm"?"npm run":t} dev
19
+
20
+ ${r("Create your first seller:")}
21
+
22
+ Once the server is running, open the Vendor Panel and register at:
23
+ ${p.info("http://localhost:9000/seller/register")}
24
+
25
+ ${r("Documentation:")}
26
+
27
+ - ${se("Getting Started","https://docs.mercurjs.com/welcome")}
28
+ `}function nn(){let e=t=>y.bold(t);return `
29
+ ${e("Your marketplace is running:")}
30
+
31
+ API: ${p.info("http://localhost:9000")}
32
+ Admin Panel: ${p.info("http://localhost:9000/dashboard")}
33
+ Vendor Panel: ${p.info("http://localhost:9000/seller")}
34
+
35
+ ${e("Create your first seller:")}
36
+
37
+ Open the Vendor Panel and register a new account at:
38
+ ${p.info("http://localhost:9000/seller/register")}
39
+ `}function U(){return `${y.bgCyan(y.black(" Have feedback? "))} Visit us on ${se("GitHub","https://github.com/mercurjs/mercur")}.
40
+ ${y.bgMagenta(y.black(" Join the community! "))} Chat with us on ${se("Discord","https://discord.gg/hnZBzc4NJU")}.`}function se(e,t){return Jt(e,t,{fallback:(n,r)=>`${n}: ${y.cyan().underline(r)}`})}async function rn(e,t,n){let r=E.join(e,"package.json"),s=await f.readJSON(r);s.name=t;try{let{stdout:o}=await execa(n,["--version"]);s.packageManager=`${n}@${o.trim()}`;}catch{}await f.writeJSON(r,s,{spaces:2});}async function sn(e){try{await execa("git",["init"],{cwd:e}),a.info("Initialized a git repository.");}catch{throw new Error("Failed to initialize git repository.")}}function on(){let[e]=process.versions.node.split(".").map(Number);return e}function an(){let e=on();if(e<ne)throw new Error(`Mercur requires at least v${ne} of Node.js. You're using v${e}. Please install at least v${ne} and try again: https://nodejs.org/en/download`)}
41
+ export{$ as a,xn as b,Fr as c};//# sourceMappingURL=chunk-HJ32GBX7.js.map
42
+ //# sourceMappingURL=chunk-HJ32GBX7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../package.json","../src/utils/get-package-manager.ts","../src/utils/highlighter.ts","../src/telemetry/detect-system-info.ts","../src/telemetry/hash.ts","../src/telemetry/store.ts","../src/telemetry/index.ts","../src/telemetry/command-tracking.ts","../src/utils/logger.ts","../src/utils/check-postgres.ts","../src/utils/manage-env-files.ts","../src/utils/mark-demo-data.ts","../src/utils/spinner.ts","../src/utils/create-db.ts","../src/utils/handle-error.ts","../src/utils/release-channel.ts","../src/commands/create.ts"],"names":["package_default","SUPPORTED_PACKAGE_MANAGERS","normalizePackageManager","value","pm","getPackageManagerFromUserAgent","isPackageManagerInstalled","packageManager","execa","getPackageManager","targetDir","detected","detect","fromUserAgent","resolveProjectPackageManager","highlighter","text","kleur","importRuntime","m","getVendor","hasAny","keys","k","detectSystemInfo","os","cpus","isWsl","isDocker","fs","isInsideContainer","hasContainerEnv","hasDockerEnv","hasDockerCGroup","PROJECT_ID_SALT","hashProjectKey","input","createHash","DEFAULTS","resolveConfigDir","env","platform","join","homedir","LEGACY_CONFIG_PATH","ConfigStore","dir","key","config","existing","id","randomUUID","existsSync","readFileSync","legacy","mkdirSync","writeFileSync","configStore","DEFAULT_TELEMETRY_HOST","REQUEST_TIMEOUT_MS","SCHEMA_VERSION","PLACEHOLDER_API_KEY","TELEMETRY_DOCS_URL","CI_ENV_KEYS","AGENT_ENV_KEYS","ErrorCategory","isTruthy","isCi","isTelemetryEnabled","showTelemetryNoticeIfNeeded","getGitRemote","cwd","execSync","getProjectId","readJson","file","readVersions","rootPkg","apiPkg","path","deps","pkg","find","name","baseProperties","versions","systemInfo","projectId","sendTelemetryEvent","event","options","body","host","controller","timer","categorizeError","error","code","message","SAFE_FLAG_VALUES","running","redactFlags","command","flags","beginCommand","opts","finishCommand","exitCode","current","registerCommandTracking","program","_this","actionCommand","logger","args","UNREACHABLE_CODES","classifyPostgresError","nested","checkPostgres","target","client","pg","hostAndPort","connectionString","fallback","url","startCommands","port","docker","printPostgresFix","result","lines","cmd","line","sanitizeEnv","contents","databaseUri","seenKeys","withDefaults","setEnvValue","pattern","APP_PATHS","manageEnvFiles","projectDir","publishableKey","appPath","appDir","envTemplatePath","envPath","isApi","isStorefront","templateEnv","envTemplateContents","envContents","updatedEnvContents","envContent","err","markDemoDataSeeded","spinner","ora","DEFAULT_DB_HOST","DEFAULT_DB_PORT","API_DIR","ADMIN_EMAIL","prepareDatabase","check","databaseNameOf","credentials","resolveCredentials","dbName","pickDatabaseName","formatConnectionString","initializeDatabase","runMigrations","seedDatabase","inviteToken","createAdminInvite","getPublishableKey","connectToMaintenanceDb","connection","connect","database","spinnerRef","MAX_ATTEMPTS","attempt","attemptSuffix","answers","prompts","user","password","initial","doesDbExist","newDbName","db","encodedPassword","migrationsTableExists","lastLines","output","count","parentSpinner","apiDir","migrationSpinner","buildCmd","runnerCmd","seedSpinner","seedCmd","handleError","REGISTRY_URL","DEPENDENCY_FIELDS","detectReleaseChannel","cliVersion","resolveDistTag","packageName","channel","res","collectPackageJsonPaths","entries","results","entry","isMercurPackage","applyReleaseChannel","packageJsonPaths","resolved","pinnedVersion","packageJsonPath","packageJson","changed","field","version","resolveTemplateRef","DEFAULT_BRANCH","MIN_SUPPORTED_NODE_VERSION","CREATE_TEMPLATES","create","Command","createStart","validateNodeVersion","resolveChannel","projectName","enteredName","validateProjectName","template","addStorefront","wantsStorefront","preparedDb","prepareSpinner","feedbackOutro","createOrFindProjectDir","downloadSpinner","tarballPath","ref","downloadRepoTarball","extractTemplate","storefrontSpinner","extractStorefront","channelSpinner","pinned","updateRootPackageJson","initialInstallSpinner","installStart","installDeps","installDuration","dbConnectionString","dbResult","dbSpinner","initGit","totalDuration","inviteUrl","serverProcess","spawn","printRestartHint","successMessage","waitOn","serverUrls","open","tag","nonHidden","f","proceed","preferredRef","refs","pipeline","Readable","extractRepoDir","repoPath","strip","filter","x","p","relativePath","header","createTerminalLink","terminalLink","getNodeVersion","major","nodeVersion"],"mappings":"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","file":"chunk-HJ32GBX7.js","sourcesContent":["{\n \"name\": \"create-mercur-app\",\n \"version\": \"2.4.1\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/mercurjs/mercur\",\n \"directory\": \"packages/create-mercur-app\"\n },\n \"type\": \"module\",\n \"description\": \"Create a new Mercur marketplace project\",\n \"author\": \"MercurJS (https://github.com/mercurjs)\",\n \"keywords\": [\n \"marketplace\",\n \"multi-vendor\",\n \"medusajs\",\n \"ecommerce\",\n \"open-source-marketplace\",\n \"headless-commerce\",\n \"create-mercur-app\",\n \"marketplace-framework\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-mercur-app\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": \"./dist/lib.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"^30.3.0\",\n \"commander\": \"^15.0.0\",\n \"execa\": \"^10.0.0\",\n \"fs-extra\": \"^11.3.2\",\n \"kleur\": \"^4.1.5\",\n \"open\": \"^11.0.0\",\n \"ora\": \"^9.0.0\",\n \"pg\": \"^8.17.1\",\n \"prompts\": \"^2.4.2\",\n \"tar\": \"^7.5.2\",\n \"terminal-link\": \"^5.0.0\",\n \"validate-npm-package-name\": \"^8.0.0\",\n \"wait-on\": \"^9.0.3\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/pg\": \"^8.16.0\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/tar\": \"^7.0.87\",\n \"@types/validate-npm-package-name\": \"^4.0.2\",\n \"@types/wait-on\": \"^5.3.4\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"5.9.3\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import { detect } from \"@antfu/ni\";\nimport { execa } from \"execa\";\n\nexport type PackageManager = \"yarn\" | \"pnpm\" | \"bun\" | \"npm\" | \"deno\";\n\nconst SUPPORTED_PACKAGE_MANAGERS: PackageManager[] = [\n \"bun\",\n \"yarn\",\n \"pnpm\",\n \"deno\",\n \"npm\",\n];\n\nfunction normalizePackageManager(\n value: string | null | undefined,\n): PackageManager | undefined {\n if (!value) return undefined;\n return SUPPORTED_PACKAGE_MANAGERS.find((pm) => value.startsWith(pm));\n}\n\n/**\n * Detect the package manager that invoked the CLI from `npm_config_user_agent`.\n * This is the most reliable signal for what the user actually has and intends\n * to use (e.g. `npx`, `bunx`, `pnpm dlx`, `yarn dlx`).\n */\nexport function getPackageManagerFromUserAgent(): PackageManager | undefined {\n return normalizePackageManager(process.env.npm_config_user_agent);\n}\n\n/**\n * Check whether a package manager is actually installed and runnable, so we\n * never hand back a manager that would crash with `spawn <pm> ENOENT`.\n */\nexport async function isPackageManagerInstalled(\n packageManager: PackageManager,\n): Promise<boolean> {\n try {\n await execa(packageManager, [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getPackageManager(\n targetDir: string,\n): Promise<PackageManager> {\n const detected = normalizePackageManager(\n await detect({ programmatic: true, cwd: targetDir }),\n );\n\n // Respect the project's declared/lockfile package manager, but only if it is\n // actually installed — otherwise commands like `<pm> --version` blow up.\n if (detected && (await isPackageManagerInstalled(detected))) {\n return detected;\n }\n\n const fromUserAgent = getPackageManagerFromUserAgent();\n if (fromUserAgent && (await isPackageManagerInstalled(fromUserAgent))) {\n return fromUserAgent;\n }\n\n return \"npm\";\n}\n\n/**\n * Resolve the package manager to use for a brand-new project.\n *\n * Mirrors how the Medusa CLI picks a package manager: detect what the user\n * invoked the CLI with (`npm_config_user_agent`), verify it is actually\n * installed, and fall back to npm otherwise. The downloaded template's own\n * `packageManager` field (e.g. `yarn@4.6.0`) is intentionally ignored — it\n * reflects the template author's tooling, not the user's environment, and was\n * the cause of `spawn yarn ENOENT` crashes for users without yarn installed.\n */\nexport async function resolveProjectPackageManager(): Promise<PackageManager> {\n const fromUserAgent = getPackageManagerFromUserAgent();\n if (fromUserAgent && (await isPackageManagerInstalled(fromUserAgent))) {\n return fromUserAgent;\n }\n\n return \"npm\";\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd);\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\";\n\n if (packageManager === \"bun\") return \"bunx\";\n\n return \"npx\";\n}\n","import kleur from \"kleur\";\n\nexport const highlighter = {\n error: (text: string) => kleur.red(text),\n warn: (text: string) => kleur.yellow(text),\n info: (text: string) => kleur.blue(text),\n success: (text: string) => kleur.green(text),\n dim: (text: string) => kleur.cyan(text),\n};\n","export const importRuntime = <T>(m: string): Promise<T> => {\n return (Function(\"mm\", \"return import(mm)\") as any)(m);\n};\n\nfunction getVendor() {\n const hasAny = (...keys: string[]) =>\n keys.some((k) => Boolean(process.env[k]));\n\n if (\n hasAny(\n \"MEDUSA_CLOUD_ENVIRONMENT_HANDLE\",\n \"MEDUSA_CLOUD_SANDBOX_HANDLE\",\n \"MEDUSA_CLOUD_API_KEY\",\n )\n ) {\n return \"medusa-cloud\";\n }\n\n if (\n hasAny(\n \"RENDER\",\n \"RENDER_URL\",\n \"RENDER_INTERNAL_HOSTNAME\",\n \"RENDER_SERVICE_ID\",\n )\n ) {\n return \"render\";\n }\n\n if (hasAny(\"FLY_APP_NAME\", \"FLY_REGION\", \"FLY_ALLOC_ID\")) return \"fly-io\";\n\n if (hasAny(\"RAILWAY_STATIC_URL\", \"RAILWAY_ENVIRONMENT_NAME\"))\n return \"railway\";\n\n if (hasAny(\"DYNO\", \"HEROKU_APP_NAME\")) return \"heroku\";\n\n if (hasAny(\"DO_DEPLOYMENT_ID\", \"DO_APP_NAME\", \"DIGITALOCEAN\"))\n return \"digitalocean\";\n\n if (hasAny(\"KOYEB\", \"KOYEB_DEPLOYMENT_ID\", \"KOYEB_APP_NAME\")) return \"koyeb\";\n\n return null;\n}\n\nexport async function detectSystemInfo() {\n try {\n //check if it's cloudflare\n const os = await importRuntime<typeof import(\"os\")>(\"os\");\n const cpus = os.cpus();\n return {\n deploymentVendor: getVendor(),\n systemPlatform: os.platform(),\n systemRelease: os.release(),\n systemArchitecture: os.arch(),\n cpuCount: cpus.length,\n cpuModel: cpus.length ? cpus[0]!.model : null,\n cpuSpeed: cpus.length ? cpus[0]!.speed : null,\n memory: os.totalmem(),\n isWSL: await isWsl(),\n isDocker: await isDocker(),\n isTTY:\n typeof process !== \"undefined\" && (process as any).stdout\n ? (process as any).stdout.isTTY\n : null,\n };\n } catch {\n return {\n systemPlatform: null,\n systemRelease: null,\n systemArchitecture: null,\n cpuCount: null,\n cpuModel: null,\n cpuSpeed: null,\n memory: null,\n isWSL: null,\n isDocker: null,\n isTTY: null,\n };\n }\n}\n\n\nasync function isWsl() {\n try {\n if (typeof process === \"undefined\" || process?.platform !== \"linux\") {\n return false;\n }\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n const os = await importRuntime<typeof import(\"os\")>(\"os\");\n if (os.release().toLowerCase().includes(\"microsoft\")) {\n if (await isInsideContainer()) {\n return false;\n }\n\n return true;\n }\n\n return fs\n .readFileSync(\"/proc/version\", \"utf8\")\n .toLowerCase()\n .includes(\"microsoft\")\n ? !(await isInsideContainer())\n : false;\n } catch {\n return false;\n }\n}\nconst hasContainerEnv = async () => {\n try {\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n fs.statSync(\"/run/.containerenv\");\n return true;\n } catch {\n return false;\n }\n};\n\nasync function isDocker() {\n return (await hasDockerEnv()) || (await hasDockerCGroup());\n}\n\n\nasync function hasDockerEnv() {\n try {\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n fs.statSync(\"/.dockerenv\");\n return true;\n } catch {\n return false;\n }\n}\n\nasync function hasDockerCGroup() {\n try {\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n return fs.readFileSync(\"/proc/self/cgroup\", \"utf8\").includes(\"docker\");\n } catch {\n return false;\n }\n}\n\n\nasync function isInsideContainer() {\n return (await hasContainerEnv()) || (await isDocker());\n}","import { createHash } from \"crypto\";\n\nconst PROJECT_ID_SALT = \"mercur-telemetry-v1\";\n\n/**\n * Same salt and encoding as `@mercurjs/core`, so a scaffolded project and the\n * server later built from it share one `project_id`.\n */\nexport const hashProjectKey = (input: string): string =>\n createHash(\"sha256\").update(`${PROJECT_ID_SALT}:${input}`).digest(\"base64url\");\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { randomUUID } from \"crypto\";\n\ninterface TelemetryConfig {\n telemetry_enabled: boolean;\n notice_shown: boolean;\n device_id: string | null;\n}\n\nconst DEFAULTS: TelemetryConfig = {\n telemetry_enabled: true,\n notice_shown: false,\n device_id: null,\n};\n\n/**\n * XDG config location, the same convention `@medusajs/telemetry` follows for\n * `~/.config/medusa/config.json`.\n */\nexport const resolveConfigDir = (env: NodeJS.ProcessEnv = process.env, platform = process.platform) => {\n if (platform === \"win32\") {\n return join(env.APPDATA || join(homedir(), \"AppData\", \"Roaming\"), \"mercur\");\n }\n return join(env.XDG_CONFIG_HOME || join(homedir(), \".config\"), \"mercur\");\n};\n\nconst LEGACY_CONFIG_PATH = join(homedir(), \".mercur\", \"config.json\");\n\nclass ConfigStore {\n private readonly path: string;\n private readonly dir: string;\n\n constructor(dir = resolveConfigDir()) {\n this.dir = dir;\n this.path = join(dir, \"config.json\");\n }\n\n get<K extends keyof TelemetryConfig>(key: K): TelemetryConfig[K] {\n return this.read()[key];\n }\n\n set<K extends keyof TelemetryConfig>(key: K, value: TelemetryConfig[K]): void {\n const config = this.read();\n config[key] = value;\n this.write(config);\n }\n\n deviceId(): string {\n const existing = this.get(\"device_id\");\n if (existing) {\n return existing;\n }\n const id = randomUUID();\n this.set(\"device_id\", id);\n return id;\n }\n\n private read(): TelemetryConfig {\n try {\n if (existsSync(this.path)) {\n return { ...DEFAULTS, ...JSON.parse(readFileSync(this.path, \"utf-8\")) };\n }\n return this.migrateLegacy();\n } catch {\n return { ...DEFAULTS };\n }\n }\n\n // Carries an opt-out made under the old ~/.mercur location across the move.\n private migrateLegacy(): TelemetryConfig {\n const config = { ...DEFAULTS };\n try {\n if (existsSync(LEGACY_CONFIG_PATH)) {\n const legacy = JSON.parse(readFileSync(LEGACY_CONFIG_PATH, \"utf-8\"));\n if (typeof legacy.telemetry_enabled === \"boolean\") {\n config.telemetry_enabled = legacy.telemetry_enabled;\n }\n if (typeof legacy.notice_shown === \"boolean\") {\n config.notice_shown = legacy.notice_shown;\n }\n this.write(config);\n }\n } catch {\n // Unreadable legacy file: fall back to defaults.\n }\n return config;\n }\n\n private write(config: TelemetryConfig): void {\n try {\n mkdirSync(this.dir, { recursive: true, mode: 0o700 });\n writeFileSync(this.path, JSON.stringify(config, null, 2) + \"\\n\", { mode: 0o600 });\n } catch {\n // Telemetry config is non-critical.\n }\n }\n}\n\nexport const configStore = new ConfigStore();\n","import { execSync } from \"child_process\";\nimport path from \"path\";\n\nimport fs from \"fs-extra\";\n\nimport packageJson from \"../../package.json\";\nimport { getPackageManagerFromUserAgent } from \"../utils/get-package-manager\";\nimport { highlighter } from \"../utils/highlighter\";\nimport { detectSystemInfo } from \"./detect-system-info\";\nimport { hashProjectKey } from \"./hash\";\nimport { configStore } from \"./store\";\n\nconst DEFAULT_TELEMETRY_HOST = \"https://telemetry.mercurjs.com\";\nconst REQUEST_TIMEOUT_MS = 2_000;\nconst SCHEMA_VERSION = 1;\nconst PLACEHOLDER_API_KEY = \"mercur\";\n\nexport const TELEMETRY_DOCS_URL = \"https://docs.mercurjs.com/telemetry\";\n\nconst CI_ENV_KEYS = [\"CI\", \"GITHUB_ACTIONS\", \"GITLAB_CI\", \"CIRCLECI\", \"BUILDKITE\", \"JENKINS_URL\", \"TF_BUILD\", \"TEAMCITY_VERSION\", \"DRONE\"];\nconst AGENT_ENV_KEYS = [\"CLAUDECODE\", \"CLAUDE_CODE\", \"CURSOR_AGENT\", \"CODEX_SANDBOX\", \"GEMINI_CLI\", \"COPILOT_AGENT\", \"OPENCODE_CLIENT\"];\n\nexport const ErrorCategory = {\n NETWORK: \"network\",\n FS: \"fs\",\n VALIDATION: \"validation\",\n REGISTRY: \"registry\",\n INSTALL: \"install\",\n DATABASE: \"database\",\n UNKNOWN: \"unknown\",\n} as const;\n\nexport type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory];\n\nexport interface TelemetryEvent {\n event: string;\n properties?: Record<string, unknown>;\n}\n\nconst isTruthy = (value: string | undefined) =>\n value !== undefined && [\"1\", \"true\", \"yes\"].includes(value.toLowerCase());\n\nexport const isCi = () => CI_ENV_KEYS.some((key) => Boolean(process.env[key]));\n\nexport const isTelemetryEnabled = () => {\n if (isTruthy(process.env.MERCUR_TELEMETRY_FORCE_ENABLED)) return true;\n if (isTruthy(process.env.MERCUR_DISABLE_TELEMETRY)) return false;\n if (isTruthy(process.env.DO_NOT_TRACK)) return false;\n if (isCi()) return false;\n return configStore.get(\"telemetry_enabled\");\n};\n\nexport const showTelemetryNoticeIfNeeded = () => {\n if (configStore.get(\"notice_shown\")) {\n return;\n }\n\n configStore.set(\"notice_shown\", true);\n\n if (!isTelemetryEnabled()) {\n return;\n }\n\n console.error(\n [\n \"\",\n \"Mercur collects anonymous usage data to improve the CLI experience.\",\n `You can disable this at any time by running: ${highlighter.info(\"mercurjs telemetry --disable\")}`,\n `Or by setting ${highlighter.info(\"MERCUR_DISABLE_TELEMETRY=true\")}`,\n `Learn more: ${highlighter.info(TELEMETRY_DOCS_URL)}`,\n \"\",\n ].join(\"\\n\")\n );\n};\n\nconst getGitRemote = (cwd: string) => {\n try {\n return execSync(\"git config --local --get remote.origin.url\", {\n cwd,\n stdio: \"pipe\",\n timeout: 1000,\n })\n .toString()\n .trim();\n } catch {\n return null;\n }\n};\n\nexport const getProjectId = (cwd: string): string => hashProjectKey(getGitRemote(cwd) || cwd);\n\nconst readJson = async (file: string): Promise<Record<string, unknown> | null> => {\n try {\n return await fs.readJSON(file);\n } catch {\n return null;\n }\n};\n\n/**\n * The scaffolded project always has the template layout, so plain reads at\n * known paths are enough to pick up the pinned framework versions.\n */\nconst readVersions = async (cwd: string) => {\n const [rootPkg, apiPkg] = await Promise.all([\n readJson(path.join(cwd, \"package.json\")),\n readJson(path.join(cwd, \"packages/api/package.json\")),\n ]);\n const deps = (pkg: Record<string, unknown> | null) =>\n (pkg?.dependencies ?? {}) as Record<string, string | undefined>;\n const find = (name: string) => deps(rootPkg)[name] ?? deps(apiPkg)[name];\n\n return {\n mercur_version: find(\"@mercurjs/core\") ?? find(\"@mercurjs/cli\"),\n medusa_version: find(\"@medusajs/framework\"),\n };\n};\n\nconst baseProperties = async (cwd: string) => {\n const [versions, systemInfo] = await Promise.all([readVersions(cwd), detectSystemInfo()]);\n const projectId = getProjectId(cwd);\n\n return {\n schema_version: SCHEMA_VERSION,\n source: \"create-mercur-app\",\n cli_version: packageJson.version,\n ...versions,\n node_version: process.version,\n runtime: process.versions.bun ? \"bun\" : \"node\",\n package_manager: getPackageManagerFromUserAgent(),\n os: systemInfo.systemPlatform,\n arch: systemInfo.systemArchitecture,\n is_ci: isCi(),\n is_tty: Boolean(process.stdout.isTTY),\n is_agent: AGENT_ENV_KEYS.some((key) => Boolean(process.env[key])),\n is_docker: systemInfo.isDocker,\n is_wsl: systemInfo.isWSL,\n cloud_provider: systemInfo.deploymentVendor,\n project_id: projectId,\n $groups: { project: projectId },\n $geoip_disable: true,\n };\n};\n\nexport const sendTelemetryEvent = async (event: TelemetryEvent, options: { cwd: string }) => {\n try {\n if (!isTelemetryEnabled()) {\n return;\n }\n\n const body = {\n api_key: PLACEHOLDER_API_KEY,\n batch: [\n {\n event: event.event,\n distinct_id: configStore.deviceId(),\n timestamp: new Date().toISOString(),\n properties: { ...(await baseProperties(options.cwd)), ...event.properties },\n },\n ],\n };\n\n if (isTruthy(process.env.MERCUR_TELEMETRY_DEBUG)) {\n console.error(`[telemetry] ${JSON.stringify(body.batch, null, 2)}`);\n return;\n }\n\n const host = (process.env.MERCUR_TELEMETRY_PROXY_URL || DEFAULT_TELEMETRY_HOST).replace(/\\/+$/, \"\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n try {\n await fetch(`${host}/batch`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // Telemetry must never fail a command.\n }\n};\n\nexport const categorizeError = (error: unknown): ErrorCategory => {\n if (error && typeof error === \"object\") {\n const name = (error as { name?: string }).name ?? \"\";\n const code = (error as { code?: string }).code ?? \"\";\n const message = (error as { message?: string }).message ?? \"\";\n if ((Object.values(ErrorCategory) as string[]).includes(name)) return name as ErrorCategory;\n if (name === \"ZodError\") return ErrorCategory.VALIDATION;\n if ([\"ENOTFOUND\", \"ECONNREFUSED\", \"ECONNRESET\", \"ETIMEDOUT\", \"EAI_AGAIN\"].includes(code) || /fetch failed/i.test(message)) {\n return ErrorCategory.NETWORK;\n }\n if ([\"ENOENT\", \"EACCES\", \"EPERM\", \"EEXIST\", \"ENOTDIR\", \"EISDIR\"].includes(code)) return ErrorCategory.FS;\n }\n return ErrorCategory.UNKNOWN;\n};\n","import type { Command } from \"commander\";\nimport { categorizeError, sendTelemetryEvent } from \"./index\";\n\n/**\n * Flag values are only kept when they cannot carry user data: booleans, and\n * the enumerated choices listed here. Everything else is redacted.\n */\nconst SAFE_FLAG_VALUES: Record<string, string[]> = {\n template: [\"basic\", \"plugin\", \"registry\"],\n tag: [\"latest\", \"rc\", \"canary\"],\n};\n\ntype RunningCommand = {\n name: string;\n flags: Record<string, unknown>;\n cwd: string;\n startedAt: number;\n};\n\nlet running: RunningCommand | null = null;\n\nconst redactFlags = (command: Command): Record<string, unknown> => {\n const flags: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(command.opts())) {\n if (command.getOptionValueSource(key) !== \"cli\") continue;\n if (typeof value === \"boolean\") {\n flags[key] = value;\n } else if (typeof value === \"string\" && SAFE_FLAG_VALUES[key]?.includes(value)) {\n flags[key] = value;\n } else {\n flags[key] = \"<redacted>\";\n }\n }\n return flags;\n};\n\nexport const beginCommand = (command: Command) => {\n const opts = command.opts() as { cwd?: string };\n running = {\n name: command.name(),\n flags: redactFlags(command),\n cwd: typeof opts.cwd === \"string\" ? opts.cwd : process.cwd(),\n startedAt: Date.now(),\n };\n};\n\nexport const finishCommand = async (exitCode: number, error?: unknown) => {\n if (!running) return;\n const current = running;\n running = null;\n\n await sendTelemetryEvent(\n {\n event: \"cli_command_executed\",\n properties: {\n command: current.name,\n flags: current.flags,\n exit_code: exitCode,\n duration_ms: Date.now() - current.startedAt,\n ...(exitCode !== 0 ? { error_category: categorizeError(error) } : {}),\n },\n },\n { cwd: current.cwd }\n );\n};\n\nexport const registerCommandTracking = (program: Command) => {\n program.hook(\"preAction\", (_this, actionCommand) => beginCommand(actionCommand));\n program.hook(\"postAction\", async () => {\n await finishCommand(0);\n });\n};\n","import { highlighter } from \"./highlighter\";\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")));\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")));\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")));\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")));\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"));\n },\n break() {\n console.log(\"\");\n },\n};\n","import pg from \"pg\";\n\nimport { highlighter } from \"./highlighter\";\nimport { logger } from \"./logger\";\n\nexport type PostgresFailure = {\n ok: false;\n reason: \"unreachable\" | \"auth\" | \"missing-database\" | \"unknown\";\n message: string;\n};\n\nexport type PostgresCheckResult = { ok: true } | PostgresFailure;\n\nconst UNREACHABLE_CODES = [\"ECONNREFUSED\", \"ENOTFOUND\", \"EHOSTUNREACH\", \"ETIMEDOUT\", \"EAI_AGAIN\"];\n\nexport function classifyPostgresError(error: unknown): PostgresFailure {\n const code = (error as { code?: string } | null)?.code ?? \"\";\n // Node raises an AggregateError with an empty message when both the IPv4 and\n // IPv6 attempts are refused.\n const nested = error instanceof AggregateError ? error.errors[0] : undefined;\n const message =\n (error instanceof Error && error.message) ||\n (nested instanceof Error && nested.message) ||\n code ||\n String(error);\n\n if (UNREACHABLE_CODES.includes(code) || /timeout|ECONNREFUSED/i.test(message)) {\n return { ok: false, reason: \"unreachable\", message };\n }\n // 28P01 invalid_password, 28000 invalid_authorization_specification\n if (code === \"28P01\" || code === \"28000\") {\n return { ok: false, reason: \"auth\", message };\n }\n if (code === \"3D000\") {\n return { ok: false, reason: \"missing-database\", message };\n }\n return { ok: false, reason: \"unknown\", message };\n}\n\nexport async function checkPostgres(\n target: { connectionString: string } | { host: string; port: number }\n): Promise<PostgresCheckResult> {\n const client = new pg.Client(\n \"connectionString\" in target\n ? { connectionString: target.connectionString, connectionTimeoutMillis: 5000 }\n : {\n host: target.host,\n port: target.port,\n user: \"postgres\",\n password: \"\",\n database: \"postgres\",\n connectionTimeoutMillis: 5000,\n }\n );\n\n try {\n await client.connect();\n await client.query(\"SELECT 1\");\n return { ok: true };\n } catch (error) {\n return classifyPostgresError(error);\n } finally {\n await client.end().catch(() => {});\n }\n}\n\nexport function hostAndPort(\n connectionString: string,\n fallback: { host: string; port: number }\n): { host: string; port: number } {\n try {\n const url = new URL(connectionString);\n return { host: url.hostname || fallback.host, port: Number(url.port) || fallback.port };\n } catch {\n return fallback;\n }\n}\n\nfunction startCommands(port: number): string[] {\n const docker = `docker run -d --name mercur-postgres -p ${port}:5432 -e POSTGRES_PASSWORD=postgres postgres:17`;\n\n if (process.platform === \"darwin\") {\n return [\n `brew install postgresql@17 && brew services start postgresql@17`,\n `or: ${docker}`,\n ];\n }\n if (process.platform === \"linux\") {\n return [`sudo systemctl start postgresql`, `or: ${docker}`];\n }\n return [docker, `or start the \"postgresql\" service from services.msc`];\n}\n\nexport function printPostgresFix(\n result: PostgresFailure,\n { host, port }: { host: string; port: number }\n): void {\n const target = `${host}:${port}`;\n const lines: string[] = [];\n\n switch (result.reason) {\n case \"unreachable\":\n lines.push(`PostgreSQL is not reachable at ${target} (${result.message}).`);\n lines.push(\"Start it, then run this command again:\");\n lines.push(...startCommands(port).map((cmd) => ` ${highlighter.info(cmd)}`));\n break;\n case \"auth\":\n lines.push(`PostgreSQL at ${target} rejected the credentials (${result.message}).`);\n lines.push(\"Pass a working user and password, for example:\");\n lines.push(\n ` ${highlighter.info(`--db-connection-string postgresql://<user>:<password>@${host}:${port}/postgres`)}`\n );\n break;\n case \"missing-database\":\n lines.push(`The database does not exist on ${target} (${result.message}).`);\n lines.push(\"Create it first, or point the connection string at an existing database:\");\n lines.push(` ${highlighter.info(`createdb -h ${host} -p ${port} <database>`)}`);\n break;\n default:\n lines.push(`Could not connect to PostgreSQL at ${target}: ${result.message}`);\n lines.push(`Check that it is running: ${highlighter.info(`pg_isready -h ${host} -p ${port}`)}`);\n }\n\n lines.push(`To scaffold without a database, pass ${highlighter.info(\"--skip-db\")}.`);\n\n logger.break();\n for (const line of lines) {\n logger.log(line);\n }\n logger.break();\n}\n","import { logger } from \"./logger\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nconst sanitizeEnv = ({\n contents,\n databaseUri,\n}: {\n contents: string;\n databaseUri?: string;\n}): string => {\n const seenKeys = new Set<string>();\n\n let withDefaults = contents;\n\n // Add DATABASE_URL if not present\n if (!contents.includes(\"DATABASE_URL\")) {\n withDefaults += \"\\nDATABASE_URL=your-connection-string-here\";\n }\n\n const updatedEnv = withDefaults\n .split(\"\\n\")\n .map((line) => {\n if (line.startsWith(\"#\") || !line.includes(\"=\")) {\n return line;\n }\n\n const [key] = line.split(\"=\");\n\n if (!key) {\n return;\n }\n\n if (key === \"DATABASE_URL\") {\n const placeholderUri =\n databaseUri || \"postgresql://localhost:5432/your-database-name\";\n line = `DATABASE_URL=${placeholderUri}`;\n }\n\n // Handle duplicates\n if (seenKeys.has(key)) {\n return null;\n }\n\n seenKeys.add(key);\n\n return line;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return updatedEnv;\n};\n\nconst setEnvValue = (contents: string, key: string, value: string): string => {\n const line = `${key}=${value}`;\n const pattern = new RegExp(`^${key}=.*$`, \"m\");\n\n if (pattern.test(contents)) {\n return contents.replace(pattern, line);\n }\n\n return `${contents}${contents.endsWith(\"\\n\") || contents === \"\" ? \"\" : \"\\n\"}${line}`;\n};\n\nconst APP_PATHS = [\n { path: \"packages/api\" },\n { path: \"apps/vendor\" },\n { path: \"apps/admin\" },\n { path: \"apps/storefront\" },\n];\n\nexport async function manageEnvFiles({\n projectDir,\n databaseUri,\n publishableKey,\n}: {\n projectDir: string;\n databaseUri?: string;\n publishableKey?: string;\n}): Promise<void> {\n try {\n await Promise.all(\n APP_PATHS.map(async ({ path: appPath }) => {\n const appDir = path.join(projectDir, appPath);\n\n if (!fs.existsSync(appDir)) {\n return;\n }\n\n const envTemplatePath = path.join(appDir, \".env.template\");\n const envPath = path.join(appDir, \".env\");\n\n const isApi = appPath.includes(\"api\");\n const isStorefront = appPath.includes(\"storefront\");\n // if not API, just copy the .env.template file\n if (!isApi) {\n if (fs.existsSync(envTemplatePath) && !fs.existsSync(envPath)) {\n await fs.copy(envTemplatePath, envPath);\n }\n\n // Inject the seeded publishable key into the storefront env so the\n // storefront can talk to the Store API out of the box.\n if (isStorefront && publishableKey && fs.existsSync(envPath)) {\n const contents = await fs.readFile(envPath, \"utf8\");\n await fs.writeFile(\n envPath,\n setEnvValue(\n contents,\n \"NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY\",\n publishableKey\n )\n );\n }\n return;\n }\n\n let templateEnv = \"\";\n\n if (fs.existsSync(envTemplatePath)) {\n const envTemplateContents = await fs.readFile(\n envTemplatePath,\n \"utf8\"\n );\n templateEnv = sanitizeEnv({\n contents: envTemplateContents,\n databaseUri,\n });\n }\n\n if (!fs.existsSync(envPath)) {\n const envContent = sanitizeEnv({\n contents: templateEnv,\n databaseUri,\n });\n await fs.writeFile(envPath, envContent);\n } else {\n const envContents = await fs.readFile(envPath, \"utf8\");\n const updatedEnvContents = sanitizeEnv({\n contents: envContents,\n databaseUri,\n });\n await fs.writeFile(envPath, updatedEnvContents);\n }\n })\n );\n } catch (err: unknown) {\n logger.error(\"Unable to manage environment files\");\n if (err instanceof Error) {\n logger.error(err.message);\n }\n process.exit(1);\n }\n}\n","import { randomUUID } from \"crypto\";\nimport pg from \"pg\";\n\nimport { logger } from \"./logger\";\n\n/**\n * Stamps the telemetry installation row so the server's heartbeats report\n * `demo_data: true`. The row is a singleton the server would otherwise create\n * on first boot; the migrations that created the table already ran.\n */\nexport async function markDemoDataSeeded({\n connectionString,\n}: {\n connectionString: string;\n}): Promise<boolean> {\n const client = new pg.Client({ connectionString });\n\n try {\n await client.connect();\n await client.query(\n `INSERT INTO telemetry_installation (id, installation_id, milestones, demo_data_seeded_at)\n VALUES ('singleton', $1, '{}', now())\n ON CONFLICT (id) DO UPDATE\n SET demo_data_seeded_at = COALESCE(telemetry_installation.demo_data_seeded_at, now()),\n updated_at = now();`,\n [randomUUID()]\n );\n return true;\n } catch (err) {\n logger.error(\n `Error marking demo data${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return false;\n } finally {\n await client.end().catch(() => {});\n }\n}\n","import ora, { type Options } from \"ora\";\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean;\n }\n) {\n return ora({\n text,\n isSilent: options?.silent ?? false,\n });\n}\n","import {\n checkPostgres,\n classifyPostgresError,\n hostAndPort,\n printPostgresFix,\n} from \"./check-postgres\";\nimport { getPackageManager } from \"./get-package-manager\";\nimport { logger } from \"./logger\";\nimport { manageEnvFiles } from \"./manage-env-files\";\nimport { markDemoDataSeeded } from \"./mark-demo-data\";\nimport { spinner } from \"./spinner\";\nimport { execa } from \"execa\";\nimport type { Ora } from \"ora\";\nimport path from \"path\";\nimport pg from \"pg\";\nimport prompts from \"prompts\";\n\nconst DEFAULT_DB_HOST = \"localhost\";\nconst DEFAULT_DB_PORT = 5432;\nconst API_DIR = \"packages/api\";\nconst ADMIN_EMAIL = \"admin@mercur-test.com\";\n\ninterface DbSetupArgs {\n projectDir: string;\n spinner?: Ora;\n}\n\nexport interface PreparedDatabase {\n dbName: string;\n connectionString: string;\n}\n\nexport interface SetupDatabaseResult {\n success: boolean;\n dbName: string;\n connectionString: string | null;\n inviteToken?: string | null;\n publishableKey?: string | null;\n}\n\n/**\n * Resolves credentials and creates the project database before anything is\n * downloaded or installed, so a missing or misconfigured PostgreSQL fails in\n * seconds instead of after the dependency install.\n */\nexport async function prepareDatabase(args: {\n projectName: string;\n dbConnectionString?: string;\n dbHost?: string;\n dbPort?: number;\n spinner?: Ora;\n}): Promise<PreparedDatabase | null> {\n const host = args.dbHost ?? DEFAULT_DB_HOST;\n const port = args.dbPort ?? DEFAULT_DB_PORT;\n\n if (args.dbConnectionString) {\n const check = await checkPostgres({ connectionString: args.dbConnectionString });\n if (!check.ok) {\n args.spinner?.stop();\n printPostgresFix(check, hostAndPort(args.dbConnectionString, { host, port }));\n return null;\n }\n return {\n dbName: databaseNameOf(args.dbConnectionString) ?? args.projectName,\n connectionString: args.dbConnectionString,\n };\n }\n\n const credentials = await resolveCredentials({ host, port, spinner: args.spinner });\n if (!credentials) {\n return null;\n }\n\n const { client } = credentials;\n try {\n const dbName = await pickDatabaseName(\n client,\n args.projectName.replace(/[^a-zA-Z0-9]/g, \"-\"),\n args.spinner\n );\n if (!dbName) {\n return null;\n }\n\n if (args.spinner) {\n args.spinner.text = `Creating database \"${dbName}\"...`;\n }\n await client.query(`CREATE DATABASE \"${dbName}\"`);\n\n return {\n dbName,\n connectionString: formatConnectionString({\n user: credentials.user,\n password: credentials.password,\n host,\n port,\n db: dbName,\n }),\n };\n } catch (err) {\n args.spinner?.stop();\n logger.error(\n `Error creating database${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return null;\n } finally {\n await client.end().catch(() => {});\n }\n}\n\nexport async function initializeDatabase(\n args: DbSetupArgs & PreparedDatabase\n): Promise<SetupDatabaseResult> {\n const { projectDir, spinner, dbName, connectionString } = args;\n\n // Medusa needs DATABASE_URL in .env before running migrations\n await manageEnvFiles({\n projectDir,\n databaseUri: connectionString,\n });\n\n const migrated = await runMigrations({ projectDir, spinner, connectionString });\n if (!migrated) {\n return { success: false, dbName, connectionString: null };\n }\n\n const seeded = await seedDatabase({ projectDir, spinner });\n if (!seeded) {\n return { success: false, dbName, connectionString: null };\n }\n\n await markDemoDataSeeded({ connectionString });\n\n const inviteToken = await createAdminInvite({ projectDir });\n\n const publishableKey = await getPublishableKey({ connectionString });\n\n // Now that the storefront .env exists, inject the seeded publishable key.\n if (publishableKey) {\n await manageEnvFiles({\n projectDir,\n databaseUri: connectionString,\n publishableKey,\n });\n }\n\n return {\n success: true,\n dbName,\n connectionString,\n inviteToken,\n publishableKey,\n };\n}\n\nasync function getPublishableKey({\n connectionString,\n}: {\n connectionString: string;\n}): Promise<string | null> {\n const client = new pg.Client({ connectionString });\n\n try {\n await client.connect();\n const result = await client.query(\n `SELECT token FROM api_key WHERE type = 'publishable' AND revoked_at IS NULL AND deleted_at IS NULL ORDER BY created_at ASC LIMIT 1;`\n );\n return result.rows[0]?.token ?? null;\n } catch (err) {\n logger.error(\n `Error reading publishable API key${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return null;\n } finally {\n await client.end().catch(() => {});\n }\n}\n\ninterface Credentials {\n client: pg.Client;\n user: string;\n password: string;\n}\n\n/**\n * Connects to the `postgres` maintenance database, falling back to the\n * connection's default database (Postgres resolves it to the username) on\n * servers where `postgres` was dropped.\n */\nasync function connectToMaintenanceDb(connection: {\n user: string;\n password: string;\n host: string;\n port: number;\n}): Promise<pg.Client> {\n const connect = async (database?: string) => {\n const client = new pg.Client({ ...connection, database, connectionTimeoutMillis: 5000 });\n try {\n await client.connect();\n return client;\n } catch (err) {\n await client.end().catch(() => {});\n throw err;\n }\n };\n\n try {\n return await connect(\"postgres\");\n } catch (err) {\n if (classifyPostgresError(err).reason !== \"missing-database\") {\n throw err;\n }\n return connect();\n }\n}\n\nasync function resolveCredentials({\n host,\n port,\n spinner: spinnerRef,\n}: {\n host: string;\n port: number;\n spinner?: Ora;\n}): Promise<Credentials | null> {\n if (spinnerRef) {\n spinnerRef.text = `Connecting to PostgreSQL at ${host}:${port}...`;\n }\n\n try {\n const client = await connectToMaintenanceDb({ user: \"postgres\", password: \"\", host, port });\n return { client, user: \"postgres\", password: \"\" };\n } catch (err) {\n const result = classifyPostgresError(err);\n if (result.reason !== \"auth\") {\n spinnerRef?.stop();\n printPostgresFix(result, { host, port });\n return null;\n }\n }\n\n spinnerRef?.stop();\n\n if (!process.stdin.isTTY) {\n printPostgresFix(\n { ok: false, reason: \"auth\", message: `user \"postgres\" without a password was rejected` },\n { host, port }\n );\n return null;\n }\n\n logger.break();\n logger.log(\n `Couldn't connect to PostgreSQL at ${host}:${port} as \"postgres\" without a password. Enter the credentials Mercur should use to create the project database.`\n );\n logger.break();\n\n const MAX_ATTEMPTS = 3;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n const attemptSuffix = attempt > 1 ? ` (attempt ${attempt}/${MAX_ATTEMPTS})` : \"\";\n\n const answers = await prompts([\n {\n type: \"text\",\n name: \"postgresUsername\",\n message: `Enter your Postgres username${attemptSuffix}`,\n initial: \"postgres\",\n },\n {\n type: \"password\",\n name: \"postgresPassword\",\n message: \"Enter your Postgres password\",\n },\n ]);\n\n // User cancelled (Ctrl+C) or no TTY\n if (!answers.postgresUsername) {\n printPostgresFix(\n { ok: false, reason: \"auth\", message: \"no credentials entered\" },\n { host, port }\n );\n return null;\n }\n\n const user = answers.postgresUsername as string;\n const password = (answers.postgresPassword as string | undefined) ?? \"\";\n\n spinnerRef?.start(\"Connecting to PostgreSQL...\");\n\n try {\n const client = await connectToMaintenanceDb({ user, password, host, port });\n return { client, user, password };\n } catch (err) {\n spinnerRef?.stop();\n const result = classifyPostgresError(err);\n if (attempt < MAX_ATTEMPTS && result.reason === \"auth\") {\n logger.warn(`Attempt ${attempt}/${MAX_ATTEMPTS} failed: ${result.message}`);\n continue;\n }\n printPostgresFix(result, { host, port });\n return null;\n }\n }\n\n return null;\n}\n\nasync function pickDatabaseName(\n client: pg.Client,\n initial: string,\n spinnerRef?: Ora\n): Promise<string | null> {\n let dbName = initial;\n\n while (await doesDbExist(client, dbName)) {\n spinnerRef?.stop();\n const { newDbName } = !process.stdin.isTTY ? { newDbName: undefined } : await prompts({\n type: \"text\",\n name: \"newDbName\",\n message: `A database named \"${dbName}\" already exists. Enter a name for the new database:`,\n initial: `${initial}-2`,\n validate: (input: string) => (input && input.trim().length > 0) || \"Name is required\",\n });\n\n if (!newDbName) {\n logger.error(\n `Database \"${dbName}\" already exists. Drop it (dropdb ${dbName}), choose another project name, or pass --db-connection-string to use it as is.`\n );\n return null;\n }\n\n dbName = (newDbName as string).trim();\n spinnerRef?.start(`Checking database \"${dbName}\"...`);\n }\n\n return dbName;\n}\n\nasync function doesDbExist(\n client: pg.Client,\n dbName: string\n): Promise<boolean> {\n const result = await client.query(\n \"SELECT 1 FROM pg_catalog.pg_database WHERE datname = $1\",\n [dbName]\n );\n return (result.rowCount ?? 0) > 0;\n}\n\nfunction databaseNameOf(connectionString: string): string | null {\n try {\n const name = decodeURIComponent(new URL(connectionString).pathname.slice(1));\n return name || null;\n } catch {\n return null;\n }\n}\n\nfunction formatConnectionString({\n user,\n password,\n host,\n port = DEFAULT_DB_PORT,\n db,\n}: {\n user: string;\n password: string;\n host: string;\n port?: number;\n db: string;\n}): string {\n const encodedPassword = encodeURIComponent(password);\n return `postgresql://${encodeURIComponent(user)}:${encodedPassword}@${host}:${port}/${db}`;\n}\n\nasync function migrationsTableExists(connectionString: string): Promise<boolean> {\n const client = new pg.Client({ connectionString });\n try {\n await client.connect();\n const result = await client.query(\n \"SELECT to_regclass('public.mikro_orm_migrations') IS NOT NULL AS exists\"\n );\n return Boolean(result.rows[0]?.exists);\n } catch {\n return false;\n } finally {\n await client.end().catch(() => {});\n }\n}\n\nfunction lastLines(output: string, count = 20): string {\n return output.trim().split(\"\\n\").slice(-count).join(\"\\n\");\n}\n\nasync function runMigrations({\n projectDir,\n spinner: parentSpinner,\n connectionString,\n}: DbSetupArgs & { connectionString: string }): Promise<boolean> {\n const apiDir = path.join(projectDir, API_DIR);\n const packageManager = await getPackageManager(apiDir);\n const migrationSpinner = parentSpinner || spinner(\"Running migrations...\").start();\n\n const buildCmd = packageManager === \"yarn\"\n ? [\"yarn\", \"run\", \"build\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"run\", \"build\"]\n : packageManager === \"bun\"\n ? [\"bun\", \"run\", \"build\"]\n : [\"npm\", \"run\", \"build\"];\n\n const runnerCmd = packageManager === \"yarn\"\n ? [\"yarn\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"exec\"]\n : packageManager === \"bun\"\n ? [\"bunx\"]\n : [\"npx\"];\n\n let output = \"\";\n try {\n // Build first - compiles TypeScript so ts-node is not needed\n migrationSpinner.text = \"Building project...\";\n await execa(buildCmd[0], buildCmd.slice(1), { cwd: apiDir });\n\n migrationSpinner.text = \"Running database migrations...\";\n const result = await execa(\n runnerCmd[0],\n [...runnerCmd.slice(1), \"medusa\", \"db:migrate\"],\n { cwd: apiDir, all: true }\n );\n output = result.all ?? \"\";\n } catch (err) {\n output =\n (err as { all?: string }).all ?? (err instanceof Error ? err.message : String(err));\n }\n\n // `db:migrate` can exit 0 without migrating, so confirm against the database.\n if (await migrationsTableExists(connectionString)) {\n if (!parentSpinner) {\n migrationSpinner.succeed(\"Migrations completed successfully.\");\n }\n return true;\n }\n\n migrationSpinner.fail(\"Failed to run migrations.\");\n if (output) {\n logger.log(lastLines(output));\n }\n const check = await checkPostgres({ connectionString });\n if (!check.ok) {\n printPostgresFix(\n check,\n hostAndPort(connectionString, { host: DEFAULT_DB_HOST, port: DEFAULT_DB_PORT })\n );\n }\n return false;\n}\n\nasync function createAdminInvite({ projectDir }: { projectDir: string }): Promise<string | null> {\n const apiDir = path.join(projectDir, API_DIR);\n const packageManager = await getPackageManager(apiDir);\n\n const runnerCmd = packageManager === \"yarn\"\n ? [\"yarn\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"exec\"]\n : packageManager === \"bun\"\n ? [\"bunx\"]\n : [\"npx\"];\n\n try {\n const result = await execa(runnerCmd[0], [...runnerCmd.slice(1), \"medusa\", \"user\", \"-e\", ADMIN_EMAIL, \"--invite\"], {\n cwd: apiDir,\n });\n\n // Parse token from stdout - same approach as Medusa CLI\n const match = result.stdout.match(/Invite token: (?<token>.+)/);\n return match?.groups?.token || null;\n } catch (err) {\n logger.error(\n `Error creating admin invite${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return null;\n }\n}\n\nasync function seedDatabase({ projectDir, spinner: parentSpinner }: DbSetupArgs): Promise<boolean> {\n const apiDir = path.join(projectDir, API_DIR);\n const packageManager = await getPackageManager(apiDir);\n const seedSpinner = parentSpinner || spinner(\"Seeding database...\").start();\n\n try {\n const seedCmd = packageManager === \"yarn\"\n ? [\"yarn\", \"seed\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"run\", \"seed\"]\n : packageManager === \"bun\"\n ? [\"bun\", \"run\", \"seed\"]\n : [\"npm\", \"run\", \"seed\"];\n\n seedSpinner.text = \"Seeding database with demo data...\";\n await execa(seedCmd[0], seedCmd.slice(1), { cwd: apiDir });\n\n if (!parentSpinner) {\n seedSpinner.succeed(\"Database seeded successfully.\");\n }\n return true;\n } catch (err) {\n seedSpinner.fail(\"Failed to seed database.\");\n logger.error(\n `Error seeding database${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return false;\n }\n}\n","import { logger } from \"./logger\";\nimport { finishCommand } from \"../telemetry/command-tracking\";\n\nexport async function handleError(error: unknown) {\n await finishCommand(1, error);\n logger.break();\n logger.error(\n `Something went wrong. Please check the error below for more details.`\n );\n logger.error(`If the problem persists, please open an issue on GitHub.`);\n logger.error(\"\");\n\n if (typeof error === \"string\") {\n logger.error(error);\n } else if (error instanceof Error) {\n logger.error(error.message);\n }\n\n logger.break();\n process.exit(1);\n}\n","import path from \"path\";\n\nimport fs from \"fs-extra\";\n\nexport type ReleaseChannel = \"latest\" | \"rc\" | \"canary\";\n\nconst REGISTRY_URL = \"https://registry.npmjs.org\";\n\nconst DEPENDENCY_FIELDS = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n] as const;\n\nexport function detectReleaseChannel(cliVersion: string): ReleaseChannel {\n if (cliVersion.includes(\"-canary\")) {\n return \"canary\";\n }\n\n if (cliVersion.includes(\"-rc\")) {\n return \"rc\";\n }\n\n return \"latest\";\n}\n\nexport async function resolveDistTag(\n packageName: string,\n channel: ReleaseChannel\n): Promise<string | null> {\n try {\n const res = await fetch(\n `${REGISTRY_URL}/-/package/${packageName}/dist-tags`\n );\n\n if (!res.ok) {\n return null;\n }\n\n const tags = (await res.json()) as Record<string, string>;\n return tags[channel] ?? null;\n } catch {\n return null;\n }\n}\n\nasync function collectPackageJsonPaths(dir: string): Promise<string[]> {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const results: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) {\n continue;\n }\n results.push(\n ...(await collectPackageJsonPaths(path.join(dir, entry.name)))\n );\n } else if (entry.name === \"package.json\") {\n results.push(path.join(dir, entry.name));\n }\n }\n\n return results;\n}\n\nfunction isMercurPackage(name: string): boolean {\n return name.startsWith(\"@mercurjs/\") || name === \"mercurjs\";\n}\n\n// The templates are the production starting point, so they pin stable\n// `@mercurjs/*` versions. When the user runs a pre-release of this CLI\n// (`create-mercur-app@canary`), those pins are repointed at the matching\n// dist-tag so the generated project matches the CLI that scaffolded it.\n// Returns the version everything was pinned to, or null if that channel has\n// no published release.\nexport async function applyReleaseChannel({\n projectDir,\n channel,\n}: {\n projectDir: string;\n channel: ReleaseChannel;\n}): Promise<string | null> {\n if (channel === \"latest\") {\n return null;\n }\n\n const packageJsonPaths = await collectPackageJsonPaths(projectDir);\n const resolved = new Map<string, string | null>();\n let pinnedVersion: string | null = null;\n\n for (const packageJsonPath of packageJsonPaths) {\n const packageJson = await fs.readJSON(packageJsonPath);\n let changed = false;\n\n for (const field of DEPENDENCY_FIELDS) {\n const deps = packageJson[field] as Record<string, string> | undefined;\n if (!deps) {\n continue;\n }\n\n for (const name of Object.keys(deps)) {\n if (!isMercurPackage(name)) {\n continue;\n }\n\n if (!resolved.has(name)) {\n resolved.set(name, await resolveDistTag(name, channel));\n }\n\n const version = resolved.get(name);\n if (!version) {\n continue;\n }\n\n pinnedVersion ??= version;\n\n if (deps[name] !== version) {\n deps[name] = version;\n changed = true;\n }\n }\n }\n\n if (changed) {\n await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 });\n }\n }\n\n return pinnedVersion;\n}\n\n// Medusa versions and the patches `@mercurjs/core` applies to them move in\n// lockstep, so the template has to come from the same commit as the packages\n// it pins. `main` runs ahead of the latest release and pins Medusa versions the\n// published `@mercurjs/core` does not support yet.\nexport async function resolveTemplateRef(\n channel: ReleaseChannel\n): Promise<string | null> {\n const version = await resolveDistTag(\"@mercurjs/core\", channel);\n return version ? `v${version}` : null;\n}\n","import { spawn } from \"node:child_process\";\nimport os from \"node:os\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport path from \"path\";\n\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport fs from \"fs-extra\";\nimport kleur from \"kleur\";\nimport open from \"open\";\nimport prompts from \"prompts\";\nimport { x } from \"tar\";\nimport terminalLink from \"terminal-link\";\nimport validateProjectName from \"validate-npm-package-name\";\nimport waitOn from \"wait-on\";\n\nimport packageJson from \"../../package.json\";\nimport { ErrorCategory, sendTelemetryEvent, showTelemetryNoticeIfNeeded } from \"../telemetry\";\nimport { finishCommand } from \"../telemetry/command-tracking\";\nimport {\n initializeDatabase,\n prepareDatabase,\n type PreparedDatabase,\n type SetupDatabaseResult,\n} from \"../utils/create-db\";\nimport {\n resolveProjectPackageManager,\n type PackageManager,\n} from \"../utils/get-package-manager\";\nimport { handleError } from \"../utils/handle-error\";\nimport { highlighter } from \"../utils/highlighter\";\nimport { logger } from \"../utils/logger\";\nimport { manageEnvFiles } from \"../utils/manage-env-files\";\nimport {\n applyReleaseChannel,\n detectReleaseChannel,\n resolveTemplateRef,\n type ReleaseChannel,\n} from \"../utils/release-channel\";\nimport { spinner } from \"../utils/spinner\";\n\nconst DEFAULT_BRANCH = \"main\";\nconst MIN_SUPPORTED_NODE_VERSION = 20;\n\nconst CREATE_TEMPLATES = {\n basic: {\n path: \"basic\",\n description: \"Full marketplace starter — sellers, products, orders, admin & vendor panels\",\n },\n // todo: uncomment registry template\n // registry: {\n // path: \"registry\",\n // description: \"Create and publish your own block registry\",\n // },\n plugin: {\n path: \"plugin\",\n description: \"MedusaJS plugin template — for building reusable marketplace extensions\",\n },\n} as const;\n\nexport const create = new Command()\n .name(\"create\")\n .description(\"create a new Mercur project\")\n .argument(\"[name]\", \"the name of your project\")\n .option(\n \"-t, --template <template>\",\n \"the template to use. e.g. basic, registry, or plugin\"\n )\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"--no-deps\", \"skip installing dependencies.\")\n .option(\"--skip-storefront\", \"skip adding the Next.js storefront.\", false)\n .option(\"--skip-db\", \"skip database configuration.\", false)\n .option(\"--skip-email\", \"deprecated: the email prompt was removed, this flag has no effect.\", false)\n .option(\n \"--tag <tag>\",\n \"the release channel to pin @mercurjs/* packages to: latest, rc, or canary. defaults to the channel of this CLI.\"\n )\n .option(\"--db-connection-string <string>\", \"PostgreSQL connection string.\")\n .option(\"--db-host <host>\", \"PostgreSQL host.\", \"localhost\")\n .option(\"--db-port <port>\", \"PostgreSQL port.\", \"5432\")\n .action(async (name, opts) => {\n try {\n const createStart = Date.now();\n validateNodeVersion();\n const channel = resolveChannel(opts.tag);\n showTelemetryNoticeIfNeeded();\n\n let projectName = name;\n if (!projectName) {\n const { enteredName } = await prompts({\n type: \"text\",\n name: \"enteredName\",\n message: \"What is your project named?\",\n initial: opts.template ? `${opts.template}-app` : \"my-mercur\",\n format: (value: string) => value.trim(),\n validate: (name) => {\n const validation = validateProjectName(\n path.basename(path.resolve(name))\n );\n if (validation.validForNewPackages) {\n return true;\n }\n return \"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore.\";\n },\n });\n\n if (!enteredName) {\n process.exit(0);\n }\n\n projectName = enteredName;\n }\n\n let template = opts.template;\n if (!template) {\n // todo: re-enable template selection once more templates are ready\n // const { selectedTemplate } = await prompts({\n // type: \"select\",\n // name: \"selectedTemplate\",\n // message: `Which ${highlighter.info(\n // \"template\"\n // )} would you like to use?`,\n // choices: Object.entries(CREATE_TEMPLATES).map(([key, tmpl]) => ({\n // title: key,\n // value: key,\n // description: tmpl.description,\n // })),\n // });\n //\n // if (!selectedTemplate) {\n // process.exit(0);\n // }\n //\n // template = selectedTemplate;\n template = \"basic\";\n }\n\n let addStorefront = false;\n if (template === \"basic\" && !opts.skipStorefront) {\n const { wantsStorefront } = await prompts({\n type: \"confirm\",\n name: \"wantsStorefront\",\n message: `Add a ${highlighter.info(\"Next.js storefront\")}?`,\n initial: true,\n });\n\n addStorefront = Boolean(wantsStorefront);\n }\n\n let preparedDb: PreparedDatabase | null = null;\n if (!opts.skipDb) {\n const prepareSpinner = spinner(\"Preparing database...\").start();\n preparedDb = await prepareDatabase({\n projectName,\n dbConnectionString: opts.dbConnectionString,\n dbHost: opts.dbHost,\n dbPort: parseInt(opts.dbPort, 10),\n spinner: prepareSpinner,\n });\n\n if (!preparedDb) {\n prepareSpinner.fail(\"Failed to prepare database.\");\n logger.log(feedbackOutro());\n await finishCommand(1, { name: ErrorCategory.DATABASE });\n process.exit(1);\n }\n prepareSpinner.succeed(`Database ${highlighter.info(preparedDb.dbName)} is ready.`);\n }\n\n const projectDir = path.resolve(opts.cwd, projectName);\n\n await createOrFindProjectDir(projectDir);\n\n const downloadSpinner = spinner(\"Downloading template...\").start();\n // Fetch the repo tarball once, then extract each subpath from it locally\n // so opting into the storefront doesn't trigger a second network download.\n const { tarballPath, ref } = await downloadRepoTarball(\n await resolveTemplateRef(channel)\n );\n try {\n await extractTemplate({ tarballPath, ref, projectDir, template });\n downloadSpinner.succeed(\"Template downloaded successfully.\");\n\n if (addStorefront) {\n const storefrontSpinner = spinner(\"Adding Next.js storefront...\").start();\n try {\n await extractStorefront({ tarballPath, ref, projectDir });\n storefrontSpinner.succeed(\"Next.js storefront added successfully.\");\n } catch (error) {\n storefrontSpinner.fail(\n `Failed to add storefront${error instanceof Error ? `: ${error.message}` : \"\"}.`\n );\n }\n }\n } finally {\n await fs.remove(tarballPath).catch(() => null);\n }\n\n if (channel !== \"latest\") {\n const channelSpinner = spinner(\n `Pinning Mercur packages to the ${channel} release...`\n ).start();\n const pinned = await applyReleaseChannel({ projectDir, channel });\n if (pinned) {\n channelSpinner.succeed(`Mercur packages pinned to ${pinned}.`);\n } else {\n channelSpinner.warn(\n `No ${channel} release found — keeping the template's pinned versions.`\n );\n }\n }\n\n const packageManager = await resolveProjectPackageManager();\n await updateRootPackageJson(projectDir, projectName, packageManager);\n\n if (!opts.deps) {\n spinner(\"Dependency installation skipped.\").warn();\n } else {\n const initialInstallSpinner = spinner(\"Installing dependencies...\").start();\n const installStart = Date.now();\n const result = await installDeps({\n projectDir,\n packageManager,\n });\n const installDuration = ((Date.now() - installStart) / 1000).toFixed(1);\n if (result) {\n initialInstallSpinner.succeed(`Dependencies installed successfully in ${installDuration}s.`);\n } else {\n initialInstallSpinner.fail(`Failed to install dependencies`);\n await finishCommand(1, { name: ErrorCategory.INSTALL });\n process.exit(1);\n }\n }\n\n let dbConnectionString: string | undefined = opts.dbConnectionString;\n let dbResult: SetupDatabaseResult | undefined;\n\n if (preparedDb) {\n const dbSpinner = spinner(\"Setting up database...\").start();\n dbResult = await initializeDatabase({\n projectDir,\n spinner: dbSpinner,\n ...preparedDb,\n });\n\n if (dbResult.success) {\n dbSpinner.succeed(\n `Database ${highlighter.info(dbResult.dbName)} setup successfully.`\n );\n dbConnectionString = dbResult.connectionString!;\n } else {\n dbSpinner.fail(\"Failed to setup database.\");\n logger.log(feedbackOutro());\n await finishCommand(1, { name: ErrorCategory.DATABASE });\n process.exit(1);\n }\n } else {\n spinner(\"Database setup skipped.\").warn();\n }\n\n await manageEnvFiles({\n projectDir,\n databaseUri: dbConnectionString,\n });\n\n await initGit(projectDir);\n\n await sendTelemetryEvent(\n {\n event: \"project_created\",\n properties: {\n template,\n package_manager: packageManager,\n with_storefront: addStorefront,\n skip_db: Boolean(opts.skipDb),\n },\n },\n { cwd: projectDir }\n );\n\n const totalDuration = ((Date.now() - createStart) / 1000).toFixed(1);\n spinner(`Mercur project successfully created! (${totalDuration}s)`).succeed();\n\n if (dbResult?.success) {\n spinner(\"Starting development server...\").info();\n\n const inviteUrl = dbResult.inviteToken\n ? `http://localhost:9000/dashboard/invite?token=${dbResult.inviteToken}&first_run=true`\n : \"http://localhost:9000/dashboard\";\n\n const devCmd = packageManager === \"npm\" ? \"npm\" : packageManager;\n const devArgs = packageManager === \"npm\" ? [\"run\", \"dev\"] : [\"dev\"];\n\n const serverProcess = spawn(devCmd, devArgs, {\n cwd: projectDir,\n stdio: \"inherit\",\n env: process.env,\n });\n\n const printRestartHint = () => {\n logger.break();\n logger.log(kleur.bgGreen(kleur.black(\" Project stopped. To start again: \")));\n logger.log(successMessage(projectDir, packageManager));\n logger.log(feedbackOutro());\n logger.break();\n };\n\n // Ctrl+C sends SIGINT to the whole process group (parent + child).\n // Suppress Node's default exit so we can wait for the child to close first.\n process.on(\"SIGINT\", () => { });\n\n serverProcess.on(\"close\", () => {\n printRestartHint();\n process.exit(0);\n });\n\n waitOn({\n resources: [\"http://localhost:9000/health\"],\n timeout: 60000,\n }).then(async () => {\n logger.break();\n logger.log(serverUrls());\n try {\n await open(inviteUrl);\n spinner(\"Admin panel opened in your browser.\").succeed();\n } catch {\n spinner(\"Open this URL in your browser to create your admin account:\").info();\n logger.log(highlighter.info(inviteUrl));\n }\n }).catch(() => {\n spinner(\"To create your admin account, visit:\").info();\n logger.log(highlighter.info(inviteUrl));\n });\n } else {\n logger.log(kleur.bgGreen(kleur.black(\" Next Steps \")));\n logger.log(successMessage(projectDir, packageManager));\n logger.log(feedbackOutro());\n logger.break();\n }\n } catch (error) {\n logger.break();\n handleError(error);\n }\n });\n\nfunction resolveChannel(tag?: string): ReleaseChannel {\n if (!tag) {\n return detectReleaseChannel(packageJson.version ?? \"\");\n }\n\n if (tag !== \"latest\" && tag !== \"rc\" && tag !== \"canary\") {\n throw new Error(\n `Unknown --tag \"${tag}\". Expected one of: latest, rc, canary.`\n );\n }\n\n return tag;\n}\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fs.pathExists(projectDir);\n if (!pathExists) {\n await fs.mkdir(projectDir);\n return;\n }\n\n const files = await fs.readdir(projectDir);\n const nonHidden = files.filter((f) => !f.startsWith(\".\"));\n if (nonHidden.length > 0) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Directory ${highlighter.info(path.basename(projectDir))} already exists and contains ${nonHidden.length} file(s). Continue and overwrite?`,\n initial: false,\n });\n\n if (!proceed) {\n process.exit(0);\n }\n }\n}\n\n// Downloads the repo tarball once to a temp file. Callers then extract whichever\n// subpaths they need from it locally, avoiding a network fetch per directory.\n// Falls back to the default branch when the release tag can't be fetched.\nasync function downloadRepoTarball(\n preferredRef: string | null\n): Promise<{ tarballPath: string; ref: string }> {\n const refs = preferredRef ? [preferredRef, DEFAULT_BRANCH] : [DEFAULT_BRANCH];\n\n for (const ref of refs) {\n const url = `https://codeload.github.com/mercurjs/mercur/tar.gz/${ref}`;\n const res = await fetch(url);\n\n if (!res.ok || !res.body) {\n if (ref !== DEFAULT_BRANCH) {\n continue;\n }\n throw new Error(`Failed to download: ${url}`);\n }\n\n const tarballPath = path.join(\n os.tmpdir(),\n `mercur-${ref.replaceAll(\"/\", \"-\")}-${process.pid}.tar.gz`\n );\n await pipeline(\n Readable.from(res.body as unknown as NodeJS.ReadableStream),\n fs.createWriteStream(tarballPath)\n );\n\n return { tarballPath, ref };\n }\n\n throw new Error(\"Failed to download the Mercur template.\");\n}\n\n// Extracts a single directory out of the local tarball. `strip` controls how many\n// leading path segments are removed so files land at the right place under `cwd`.\nasync function extractRepoDir({\n tarballPath,\n ref,\n cwd,\n repoPath,\n strip,\n}: {\n tarballPath: string;\n ref: string;\n cwd: string;\n repoPath: string;\n strip: number;\n}) {\n const branchDir = `mercur-${ref.replace(/^v/, \"\").replaceAll(\"/\", \"-\")}`;\n const filter = `${branchDir}/${repoPath}/`;\n\n await x({\n file: tarballPath,\n cwd,\n filter: (p) => p.includes(filter),\n strip,\n });\n}\n\nasync function extractTemplate({\n tarballPath,\n ref,\n projectDir,\n template,\n}: {\n tarballPath: string;\n ref: string;\n projectDir: string;\n template: keyof typeof CREATE_TEMPLATES;\n}) {\n const templatePath = CREATE_TEMPLATES[template].path;\n const repoPath = `templates/${templatePath}`;\n\n // Drop the branch dir + every segment of `repoPath` so the template root\n // becomes the project root.\n await extractRepoDir({\n tarballPath,\n ref,\n cwd: projectDir,\n repoPath,\n strip: 1 + repoPath.split(\"/\").length,\n });\n}\n\nasync function extractStorefront({\n tarballPath,\n ref,\n projectDir,\n}: {\n tarballPath: string;\n ref: string;\n projectDir: string;\n}) {\n await fs.ensureDir(path.join(projectDir, \"apps\"));\n\n // Drop only the branch dir so files keep their `apps/storefront/...` prefix\n // and land alongside the other workspace apps.\n await extractRepoDir({\n tarballPath,\n ref,\n cwd: projectDir,\n repoPath: \"apps/storefront\",\n strip: 1,\n });\n}\n\nasync function installDeps({\n projectDir,\n packageManager,\n}: {\n projectDir: string;\n packageManager: PackageManager;\n}): Promise<boolean> {\n let cmd = \"npm\";\n let args = [\"install\"];\n\n if (packageManager === \"yarn\") {\n cmd = \"yarn\";\n args = [];\n } else if (packageManager === \"pnpm\") {\n cmd = \"pnpm\";\n args = [\"install\"];\n } else if (packageManager === \"bun\") {\n cmd = \"bun\";\n args = [\"install\"];\n }\n\n try {\n await execa(cmd, args, {\n cwd: path.resolve(projectDir),\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n env: { ...process.env, npm_config_yes: \"true\" },\n });\n return true;\n } catch (err: unknown) {\n logger.error(\n `Error installing dependencies${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return false;\n }\n}\n\nfunction successMessage(\n projectDir: string,\n packageManager: PackageManager\n): string {\n const relativePath = path.relative(process.cwd(), projectDir);\n const header = (message: string) => kleur.bold(message);\n\n // todo: make sure the links are correct\n return `\n${header(\"Launch Application:\")}\n\n - cd ./${relativePath}\n - ${packageManager === \"npm\" ? \"npm run\" : packageManager} dev\n\n${header(\"Create your first seller:\")}\n\n Once the server is running, open the Vendor Panel and register at:\n ${highlighter.info(\"http://localhost:9000/seller/register\")}\n\n${header(\"Documentation:\")}\n\n - ${createTerminalLink(\"Getting Started\", \"https://docs.mercurjs.com/welcome\")}\n`;\n}\n\nfunction serverUrls(): string {\n const header = (message: string) => kleur.bold(message);\n return `\n${header(\"Your marketplace is running:\")}\n\n API: ${highlighter.info(\"http://localhost:9000\")}\n Admin Panel: ${highlighter.info(\"http://localhost:9000/dashboard\")}\n Vendor Panel: ${highlighter.info(\"http://localhost:9000/seller\")}\n\n${header(\"Create your first seller:\")}\n\n Open the Vendor Panel and register a new account at:\n ${highlighter.info(\"http://localhost:9000/seller/register\")}\n`;\n}\n\nfunction feedbackOutro(): string {\n return `${kleur.bgCyan(kleur.black(\" Have feedback? \"))} Visit us on ${createTerminalLink(\"GitHub\", \"https://github.com/mercurjs/mercur\")}.\\n${kleur.bgMagenta(kleur.black(\" Join the community! \"))} Chat with us on ${createTerminalLink(\"Discord\", \"https://discord.gg/hnZBzc4NJU\")}.`;\n}\n\nfunction createTerminalLink(text: string, url: string) {\n return terminalLink(text, url, {\n fallback: (text, url) => `${text}: ${kleur.cyan().underline(url)}`,\n });\n}\n\nasync function updateRootPackageJson(\n projectDir: string,\n projectName: string,\n packageManager: string\n): Promise<void> {\n const packageJsonPath = path.join(projectDir, \"package.json\");\n const packageJson = await fs.readJSON(packageJsonPath);\n\n packageJson.name = projectName;\n\n try {\n const { stdout: version } = await execa(packageManager, [\"--version\"]);\n packageJson.packageManager = `${packageManager}@${version.trim()}`;\n } catch {\n // A bare manager name is not a valid `packageManager` value — Turborepo and\n // corepack expect `name@version`. If the version lookup fails, keep the\n // template's default `packageManager` rather than writing an invalid value\n // that would break `turbo run` on the first command.\n }\n\n await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 });\n}\n\nasync function initGit(projectDir: string): Promise<void> {\n try {\n await execa(\"git\", [\"init\"], { cwd: projectDir });\n logger.info(\"Initialized a git repository.\");\n } catch {\n throw new Error(\"Failed to initialize git repository.\");\n }\n}\n\nfunction getNodeVersion(): number {\n const [major] = process.versions.node.split(\".\").map(Number);\n return major;\n}\n\nfunction validateNodeVersion(): void {\n const nodeVersion = getNodeVersion();\n if (nodeVersion < MIN_SUPPORTED_NODE_VERSION) {\n throw new Error(\n `Mercur requires at least v${MIN_SUPPORTED_NODE_VERSION} of Node.js. You're using v${nodeVersion}. Please install at least v${MIN_SUPPORTED_NODE_VERSION} and try again: https://nodejs.org/en/download`\n );\n }\n}\n"]}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  #!/usr/bin/env node
2
- import {a,b,c}from'./chunk-H4XYHNCO.js';import {Command}from'commander';process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));var r=new Command().name("create-mercur-app").description("create a new Mercur project").version(a.version||"0.0.0","-v, --version","display the version number");b(r);r.addCommand(c,{isDefault:true});r.parse();//# sourceMappingURL=index.js.map
2
+ import {a,b,c}from'./chunk-HJ32GBX7.js';import {Command}from'commander';process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));var r=new Command().name("create-mercur-app").description("create a new Mercur project").version(a.version||"0.0.0","-v, --version","display the version number");b(r);r.addCommand(c,{isDefault:true});r.parse();//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/lib.js CHANGED
@@ -1,2 +1,2 @@
1
- export{c as create}from'./chunk-H4XYHNCO.js';//# sourceMappingURL=lib.js.map
1
+ export{c as create}from'./chunk-HJ32GBX7.js';//# sourceMappingURL=lib.js.map
2
2
  //# sourceMappingURL=lib.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-mercur-app",
3
- "version": "2.3.9-canary.7",
3
+ "version": "2.4.1",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "https://github.com/mercurjs/mercur",
@@ -1,38 +0,0 @@
1
- import {spawn,execSync}from'child_process';import b,{join}from'path';import f from'fs-extra';import {detect}from'@antfu/ni';import {execa}from'execa';import w from'kleur';import {randomUUID,createHash}from'crypto';import {existsSync,readFileSync,mkdirSync,writeFileSync}from'fs';import vt,{homedir}from'os';import {Readable}from'stream';import {pipeline}from'stream/promises';import {Command}from'commander';import Pt from'open';import Q from'prompts';import {x as x$1}from'tar';import Rt from'terminal-link';import Nt from'validate-npm-package-name';import xt from'wait-on';import pt from'ora';import O from'pg';var R={name:"create-mercur-app",version:"2.3.9-canary.7",repository:{type:"git",url:"https://github.com/mercurjs/mercur",directory:"packages/create-mercur-app"},type:"module",description:"Create a new Mercur marketplace project",author:"MercurJS (https://github.com/mercurjs)",keywords:["marketplace","multi-vendor","medusajs","ecommerce","open-source-marketplace","headless-commerce","create-mercur-app","marketplace-framework"],publishConfig:{access:"public"},files:["dist"],bin:{"create-mercur-app":"./dist/index.js"},exports:{".":"./dist/lib.js","./package.json":"./package.json"},scripts:{typecheck:"tsc --noEmit",dev:"tsup --watch",build:"tsup"},dependencies:{"@antfu/ni":"^30.3.0",commander:"^15.0.0",execa:"^10.0.0","fs-extra":"^11.3.2",kleur:"^4.1.5",open:"^11.0.0",ora:"^9.0.0",pg:"^8.17.1",prompts:"^2.4.2",tar:"^7.5.2","terminal-link":"^5.0.0","validate-npm-package-name":"^8.0.0","wait-on":"^9.0.3"},devDependencies:{"@types/fs-extra":"^11.0.4","@types/pg":"^8.16.0","@types/prompts":"^2.4.9","@types/tar":"^7.0.87","@types/validate-npm-package-name":"^4.0.2","@types/wait-on":"^5.3.4",tsup:"^8.5.0",typescript:"5.9.3"},engines:{node:">=20"}};var Ie=["bun","yarn","pnpm","deno","npm"];function te(e){if(e)return Ie.find(t=>e.startsWith(t))}function N(){return te(process.env.npm_config_user_agent)}async function F(e){try{return await execa(e,["--version"]),!0}catch{return false}}async function x(e){let t=te(await detect({programmatic:true,cwd:e}));if(t&&await F(t))return t;let n=N();return n&&await F(n)?n:"npm"}async function ne(){let e=N();return e&&await F(e)?e:"npm"}var d={error:e=>w.red(e),warn:e=>w.yellow(e),info:e=>w.blue(e),success:e=>w.green(e),dim:e=>w.cyan(e)};var v=e=>Function("mm","return import(mm)")(e);function Le(){let e=(...t)=>t.some(n=>!!process.env[n]);return e("MEDUSA_CLOUD_ENVIRONMENT_HANDLE","MEDUSA_CLOUD_SANDBOX_HANDLE","MEDUSA_CLOUD_API_KEY")?"medusa-cloud":e("RENDER","RENDER_URL","RENDER_INTERNAL_HOSTNAME","RENDER_SERVICE_ID")?"render":e("FLY_APP_NAME","FLY_REGION","FLY_ALLOC_ID")?"fly-io":e("RAILWAY_STATIC_URL","RAILWAY_ENVIRONMENT_NAME")?"railway":e("DYNO","HEROKU_APP_NAME")?"heroku":e("DO_DEPLOYMENT_ID","DO_APP_NAME","DIGITALOCEAN")?"digitalocean":e("KOYEB","KOYEB_DEPLOYMENT_ID","KOYEB_APP_NAME")?"koyeb":null}async function se(){try{let e=await v("os"),t=e.cpus();return {deploymentVendor:Le(),systemPlatform:e.platform(),systemRelease:e.release(),systemArchitecture:e.arch(),cpuCount:t.length,cpuModel:t.length?t[0].model:null,cpuSpeed:t.length?t[0].speed:null,memory:e.totalmem(),isWSL:await Oe(),isDocker:await oe(),isTTY:typeof process<"u"&&process.stdout?process.stdout.isTTY:null}}catch{return {systemPlatform:null,systemRelease:null,systemArchitecture:null,cpuCount:null,cpuModel:null,cpuSpeed:null,memory:null,isWSL:null,isDocker:null,isTTY:null}}}async function Oe(){try{if(typeof process>"u"||process?.platform!=="linux")return !1;let e=await v("fs");return (await v("os")).release().toLowerCase().includes("microsoft")?!await re():e.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!await re():!1}catch{return false}}var je=async()=>{try{return (await v("fs")).statSync("/run/.containerenv"),!0}catch{return false}};async function oe(){return await Me()||await Ue()}async function Me(){try{return (await v("fs")).statSync("/.dockerenv"),!0}catch{return false}}async function Ue(){try{return (await v("fs")).readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return false}}async function re(){return await je()||await oe()}var Ye="mercur-telemetry-v1",ae=e=>createHash("sha256").update(`${Ye}:${e}`).digest("base64url");var Y={telemetry_enabled:true,notice_shown:false,device_id:null},Je=(e=process.env,t=process.platform)=>t==="win32"?join(e.APPDATA||join(homedir(),"AppData","Roaming"),"mercur"):join(e.XDG_CONFIG_HOME||join(homedir(),".config"),"mercur"),le=join(homedir(),".mercur","config.json"),K=class{path;dir;constructor(t=Je()){this.dir=t,this.path=join(t,"config.json");}get(t){return this.read()[t]}set(t,n){let r=this.read();r[t]=n,this.write(r);}deviceId(){let t=this.get("device_id");if(t)return t;let n=randomUUID();return this.set("device_id",n),n}read(){try{return existsSync(this.path)?{...Y,...JSON.parse(readFileSync(this.path,"utf-8"))}:this.migrateLegacy()}catch{return {...Y}}}migrateLegacy(){let t={...Y};try{if(existsSync(le)){let n=JSON.parse(readFileSync(le,"utf-8"));typeof n.telemetry_enabled=="boolean"&&(t.telemetry_enabled=n.telemetry_enabled),typeof n.notice_shown=="boolean"&&(t.notice_shown=n.notice_shown),this.write(t);}}catch{}return t}write(t){try{mkdirSync(this.dir,{recursive:!0,mode:448}),writeFileSync(this.path,JSON.stringify(t,null,2)+`
2
- `,{mode:384});}catch{}}},P=new K;var We="https://telemetry.mercurjs.com",ze=2e3,Xe=1,qe="mercur",Qe="https://docs.mercurjs.com/telemetry",Ze=["CI","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","BUILDKITE","JENKINS_URL","TF_BUILD","TEAMCITY_VERSION","DRONE"],et=["CLAUDECODE","CLAUDE_CODE","CURSOR_AGENT","CODEX_SANDBOX","GEMINI_CLI","COPILOT_AGENT","OPENCODE_CLIENT"],S={NETWORK:"network",FS:"fs",VALIDATION:"validation",REGISTRY:"registry",INSTALL:"install",DATABASE:"database",UNKNOWN:"unknown"},$=e=>e!==void 0&&["1","true","yes"].includes(e.toLowerCase()),de=()=>Ze.some(e=>!!process.env[e]),me=()=>$(process.env.MERCUR_TELEMETRY_FORCE_ENABLED)?true:$(process.env.MERCUR_DISABLE_TELEMETRY)||$(process.env.DO_NOT_TRACK)||de()?false:P.get("telemetry_enabled"),ge=()=>{P.get("notice_shown")||(P.set("notice_shown",true),me()&&console.error(["","Mercur collects anonymous usage data to improve the CLI experience.",`You can disable this at any time by running: ${d.info("mercurjs telemetry --disable")}`,`Or by setting ${d.info("MERCUR_DISABLE_TELEMETRY=true")}`,`Learn more: ${d.info(Qe)}`,""].join(`
3
- `)));},tt=e=>{try{return execSync("git config --local --get remote.origin.url",{cwd:e,stdio:"pipe",timeout:1e3}).toString().trim()}catch{return null}},nt=e=>ae(tt(e)||e),ue=async e=>{try{return await f.readJSON(e)}catch{return null}},rt=async e=>{let[t,n]=await Promise.all([ue(b.join(e,"package.json")),ue(b.join(e,"packages/api/package.json"))]),r=o=>o?.dependencies??{},s=o=>r(t)[o]??r(n)[o];return {mercur_version:s("@mercurjs/core")??s("@mercurjs/cli"),medusa_version:s("@medusajs/framework")}},st=async e=>{let[t,n]=await Promise.all([rt(e),se()]),r=nt(e);return {schema_version:Xe,source:"create-mercur-app",cli_version:R.version,...t,node_version:process.version,runtime:process.versions.bun?"bun":"node",package_manager:N(),os:n.systemPlatform,arch:n.systemArchitecture,is_ci:de(),is_tty:!!process.stdout.isTTY,is_agent:et.some(s=>!!process.env[s]),is_docker:n.isDocker,is_wsl:n.isWSL,cloud_provider:n.deploymentVendor,project_id:r,$groups:{project:r},$geoip_disable:true}},I=async(e,t)=>{try{if(!me())return;let n={api_key:qe,batch:[{event:e.event,distinct_id:P.deviceId(),timestamp:new Date().toISOString(),properties:{...await st(t.cwd),...e.properties}}]};if($(process.env.MERCUR_TELEMETRY_DEBUG)){console.error(`[telemetry] ${JSON.stringify(n.batch,null,2)}`);return}let r=(process.env.MERCUR_TELEMETRY_PROXY_URL||We).replace(/\/+$/,""),s=new AbortController,o=setTimeout(()=>s.abort(),ze);try{await fetch(`${r}/batch`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(n),signal:s.signal});}finally{clearTimeout(o);}}catch{}},fe=e=>{if(e&&typeof e=="object"){let t=e.name??"",n=e.code??"",r=e.message??"";if(Object.values(S).includes(t))return t;if(t==="ZodError")return S.VALIDATION;if(["ENOTFOUND","ECONNREFUSED","ECONNRESET","ETIMEDOUT","EAI_AGAIN"].includes(n)||/fetch failed/i.test(r))return S.NETWORK;if(["ENOENT","EACCES","EPERM","EEXIST","ENOTDIR","EISDIR"].includes(n))return S.FS}return S.UNKNOWN};var ot={template:["basic","plugin","registry"],tag:["latest","rc","canary"]},L=null,at=e=>{let t={};for(let[n,r]of Object.entries(e.opts()))e.getOptionValueSource(n)==="cli"&&(typeof r=="boolean"||typeof r=="string"&&ot[n]?.includes(r)?t[n]=r:t[n]="<redacted>");return t},it=e=>{let t=e.opts();L={name:e.name(),flags:at(e),cwd:typeof t.cwd=="string"?t.cwd:process.cwd(),startedAt:Date.now()};},D=async(e,t)=>{if(!L)return;let n=L;L=null,await I({event:"cli_command_executed",properties:{command:n.name,flags:n.flags,exit_code:e,duration_ms:Date.now()-n.startedAt,...e!==0?{error_category:fe(t)}:{}}},{cwd:n.cwd});},hn=e=>{e.hook("preAction",(t,n)=>it(n)),e.hook("postAction",async()=>{await D(0);});};var i={error(...e){console.log(d.error(e.join(" ")));},warn(...e){console.log(d.warn(e.join(" ")));},info(...e){console.log(d.info(e.join(" ")));},success(...e){console.log(d.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};var J=({contents:e,databaseUri:t})=>{let n=new Set,r=e;return e.includes("DATABASE_URL")||(r+=`
4
- DATABASE_URL=your-connection-string-here`),r.split(`
5
- `).map(o=>{if(o.startsWith("#")||!o.includes("="))return o;let[a]=o.split("=");if(a)return a==="DATABASE_URL"&&(o=`DATABASE_URL=${t||"postgresql://localhost:5432/your-database-name"}`),n.has(a)?null:(n.add(a),o)}).filter(Boolean).join(`
6
- `)},ct=(e,t,n)=>{let r=`${t}=${n}`,s=new RegExp(`^${t}=.*$`,"m");return s.test(e)?e.replace(s,r):`${e}${e.endsWith(`
7
- `)||e===""?"":`
8
- `}${r}`},lt=[{path:"packages/api"},{path:"apps/vendor"},{path:"apps/admin"},{path:"apps/storefront"}];async function T({projectDir:e,databaseUri:t,publishableKey:n}){try{await Promise.all(lt.map(async({path:r})=>{let s=b.join(e,r);if(!f.existsSync(s))return;let o=b.join(s,".env.template"),a=b.join(s,".env"),c=r.includes("api"),h=r.includes("storefront");if(!c){if(f.existsSync(o)&&!f.existsSync(a)&&await f.copy(o,a),h&&n&&f.existsSync(a)){let u=await f.readFile(a,"utf8");await f.writeFile(a,ct(u,"NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY",n));}return}let m="";if(f.existsSync(o)){let u=await f.readFile(o,"utf8");m=J({contents:u,databaseUri:t});}if(f.existsSync(a)){let u=await f.readFile(a,"utf8"),l=J({contents:u,databaseUri:t});await f.writeFile(a,l);}else {let u=J({contents:m,databaseUri:t});await f.writeFile(a,u);}}));}catch(r){i.error("Unable to manage environment files"),r instanceof Error&&i.error(r.message),process.exit(1);}}function g(e,t){return pt({text:e,isSilent:false})}var dt="localhost",we=5432,H="packages/api",mt="admin@mercur-test.com";async function Ee(e){let t=e.projectName.replace(/[^a-zA-Z0-9]/g,"-"),{client:n,dbConnectionString:r}=await ft({dbConnectionString:e.dbConnectionString,dbHost:e.dbHost??dt,dbPort:e.dbPort??we,dbName:t,spinner:e.spinner});if(!n||!r)return {success:false,dbName:t,connectionString:null};try{return e.spinner&&(e.spinner.text="Checking if database exists..."),await yt(n,t)?(await n.end(),ye({...e,dbName:t,connectionString:r,alreadyExists:!0})):(e.spinner&&(e.spinner.text=`Creating database "${t}"...`),await n.query(`CREATE DATABASE "${t}"`),await n.end(),ye({...e,dbName:t,connectionString:r,alreadyExists:!1}))}catch(s){return i.error(`Error creating database${s instanceof Error?`: ${s.message}`:""}.`),await n.end().catch(()=>{}),{success:false,dbName:t,connectionString:null}}}async function ye(e){let{projectDir:t,spinner:n,dbName:r,connectionString:s,alreadyExists:o}=e;if(await T({projectDir:t,databaseUri:s}),!await ht({projectDir:t,spinner:n}))return {success:false,dbName:r,connectionString:null};if(!await Et({projectDir:t,spinner:n}))return {success:false,dbName:r,connectionString:null};let h=await wt({projectDir:t}),m=await gt({connectionString:s});return m&&await T({projectDir:t,databaseUri:s,publishableKey:m}),{success:true,dbName:r,connectionString:s,alreadyExists:o,inviteToken:h,publishableKey:m}}async function gt({connectionString:e}){let t=new O.Client({connectionString:e});try{return await t.connect(),(await t.query("SELECT token FROM api_key WHERE type = 'publishable' AND revoked_at IS NULL AND deleted_at IS NULL ORDER BY created_at ASC LIMIT 1;")).rows[0]?.token??null}catch(n){return i.error(`Error reading publishable API key${n instanceof Error?`: ${n.message}`:""}.`),null}finally{await t.end().catch(()=>{});}}async function ft({dbConnectionString:e,dbHost:t,dbPort:n,dbName:r,spinner:s}){if(e)try{let a=new O.Client({connectionString:e});return await a.connect(),{client:a,dbConnectionString:e}}catch(a){return i.error(`Invalid database connection string${a instanceof Error?`: ${a.message}`:""}.`),{client:null,dbConnectionString:null}}s&&(s.text=`Trying default connection (postgres@${t}:${n})...`);try{let a=new O.Client({user:"postgres",password:"",host:t,port:n,database:"postgres",connectionTimeoutMillis:5e3});return await a.connect(),{client:a,dbConnectionString:he({user:"postgres",password:"",host:t,port:n,db:r})}}catch{}s?.stop(),i.break(),i.log(`PostgreSQL is required. Make sure it is installed and running on ${t}:${n}.`),i.break();let o=3;for(let a=1;a<=o;a++){let c=a>1?` (attempt ${a}/${o})`:"",h=await Q([{type:"text",name:"postgresUsername",message:`Enter your Postgres username${c}`,initial:"postgres"},{type:"password",name:"postgresPassword",message:'Enter your Postgres password (press Enter for "postgres")'}]);if(!h.postgresUsername)return {client:null,dbConnectionString:null};let m=h.postgresUsername,u=h.postgresPassword||"postgres";s?.start("Connecting to database...");try{let l=new O.Client({user:m,password:u,host:t,port:n,database:"postgres",connectionTimeoutMillis:5e3});return await l.connect(),{client:l,dbConnectionString:he({user:m,password:u,host:t,port:n,db:r})}}catch(l){s?.stop();let _=l instanceof Error?l.message:String(l);a<o?i.warn(`Attempt ${a}/${o} failed: ${_}`):i.error(`Couldn't connect to PostgreSQL: ${_}
9
- \u2192 Is PostgreSQL running? Try: pg_isready -h ${t} -p ${n}
10
- \u2192 Check your username, password, and that the server is accessible.`);}}return {client:null,dbConnectionString:null}}async function yt(e,t){return ((await e.query(`SELECT datname FROM pg_catalog.pg_database WHERE datname='${t}';`)).rowCount??0)>0}function he({user:e,password:t,host:n,port:r=we,db:s}){let o=encodeURIComponent(t);return `postgresql://${e}:${o}@${n}:${r}/${s}`}async function ht({projectDir:e,spinner:t}){let n=b.join(e,H),r=await x(n),s=t||g("Running migrations...").start(),o=r==="yarn"?["yarn","run","build"]:r==="pnpm"?["pnpm","run","build"]:r==="bun"?["bun","run","build"]:["npm","run","build"],a=r==="yarn"?["yarn"]:r==="pnpm"?["pnpm","exec"]:r==="bun"?["bunx"]:["npx"];try{return s.text="Building project...",await execa(o[0],o.slice(1),{cwd:n}),s.text="Running database migrations...",await execa(a[0],[...a.slice(1),"medusa","db:migrate"],{cwd:n}),t||s.succeed("Migrations completed successfully."),!0}catch(c){return s.fail("Failed to run migrations."),i.error(`Error running migrations${c instanceof Error?`: ${c.message}`:""}.`),false}}async function wt({projectDir:e}){let t=b.join(e,H),n=await x(t),r=n==="yarn"?["yarn"]:n==="pnpm"?["pnpm","exec"]:n==="bun"?["bunx"]:["npx"];try{return (await execa(r[0],[...r.slice(1),"medusa","user","-e",mt,"--invite"],{cwd:t})).stdout.match(/Invite token: (?<token>.+)/)?.groups?.token||null}catch(s){return i.error(`Error creating admin invite${s instanceof Error?`: ${s.message}`:""}.`),null}}async function Et({projectDir:e,spinner:t}){let n=b.join(e,H),r=await x(n),s=t||g("Seeding database...").start();try{let o=r==="yarn"?["yarn","seed"]:r==="pnpm"?["pnpm","run","seed"]:r==="bun"?["bun","run","seed"]:["npm","run","seed"];return s.text="Seeding database with demo data...",await execa(o[0],o.slice(1),{cwd:n}),t||s.succeed("Database seeded successfully."),!0}catch(o){return s.fail("Failed to seed database."),i.error(`Error seeding database${o instanceof Error?`: ${o.message}`:""}.`),false}}async function be(e){await D(1,e),i.break(),i.error("Something went wrong. Please check the error below for more details."),i.error("If the problem persists, please open an issue on GitHub."),i.error(""),typeof e=="string"?i.error(e):e instanceof Error&&i.error(e.message),i.break(),process.exit(1);}var bt="https://registry.npmjs.org",St=["dependencies","devDependencies","peerDependencies","optionalDependencies"];function ke(e){return e.includes("-canary")?"canary":e.includes("-rc")?"rc":"latest"}async function _e(e,t){try{let n=await fetch(`${bt}/-/package/${e}/dist-tags`);return n.ok?(await n.json())[t]??null:null}catch{return null}}async function ve(e){let t=await f.readdir(e,{withFileTypes:true}),n=[];for(let r of t)if(r.isDirectory()){if(r.name==="node_modules"||r.name.startsWith("."))continue;n.push(...await ve(b.join(e,r.name)));}else r.name==="package.json"&&n.push(b.join(e,r.name));return n}function kt(e){return e.startsWith("@mercurjs/")||e==="mercurjs"}async function Ce({projectDir:e,channel:t}){if(t==="latest")return null;let n=await ve(e),r=new Map,s=null;for(let o of n){let a=await f.readJSON(o),c=false;for(let h of St){let m=a[h];if(m)for(let u of Object.keys(m)){if(!kt(u))continue;r.has(u)||r.set(u,await _e(u,t));let l=r.get(u);l&&(s??=l,m[u]!==l&&(m[u]=l,c=true));}}c&&await f.writeJSON(o,a,{spaces:2});}return s}async function De(e){let t=await _e("@mercurjs/core",e);return t?`v${t}`:null}var z="main",X=20,$t={basic:{path:"basic",description:"Full marketplace starter \u2014 sellers, products, orders, admin & vendor panels"},plugin:{path:"plugin",description:"MedusaJS plugin template \u2014 for building reusable marketplace extensions"}},gr=new Command().name("create").description("create a new Mercur project").argument("[name]","the name of your project").option("-t, --template <template>","the template to use. e.g. basic, registry, or plugin").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("--no-deps","skip installing dependencies.").option("--skip-storefront","skip adding the Next.js storefront.",false).option("--skip-db","skip database configuration.",false).option("--skip-email","deprecated: the email prompt was removed, this flag has no effect.",false).option("--tag <tag>","the release channel to pin @mercurjs/* packages to: latest, rc, or canary. defaults to the channel of this CLI.").option("--db-connection-string <string>","PostgreSQL connection string.").option("--db-host <host>","PostgreSQL host.","localhost").option("--db-port <port>","PostgreSQL port.","5432").action(async(e,t)=>{try{let n=Date.now();Gt();let r=It(t.tag);ge();let s=e;if(!s){let{enteredName:p}=await Q({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-mercur",format:y=>y.trim(),validate:y=>Nt(b.basename(b.resolve(y))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});p||process.exit(0),s=p;}let o=t.template;o||(o="basic");let a=!1;if(o==="basic"&&!t.skipStorefront){let{wantsStorefront:p}=await Q({type:"confirm",name:"wantsStorefront",message:`Add a ${d.info("Next.js storefront")}?`,initial:!0});a=!!p;}let c=b.resolve(t.cwd,s);await Lt(c);let h=g("Downloading template...").start(),{tarballPath:m,ref:u}=await Ot(await De(r));try{if(await jt({tarballPath:m,ref:u,projectDir:c,template:o}),h.succeed("Template downloaded successfully."),a){let p=g("Adding Next.js storefront...").start();try{await Mt({tarballPath:m,ref:u,projectDir:c}),p.succeed("Next.js storefront added successfully.");}catch(y){p.fail(`Failed to add storefront${y instanceof Error?`: ${y.message}`:""}.`);}}}finally{await f.remove(m).catch(()=>null);}if(r!=="latest"){let p=g(`Pinning Mercur packages to the ${r} release...`).start(),y=await Ce({projectDir:c,channel:r});y?p.succeed(`Mercur packages pinned to ${y}.`):p.warn(`No ${r} release found \u2014 keeping the template's pinned versions.`);}let l=await ne();if(await Yt(c,s,l),!t.deps)g("Dependency installation skipped.").warn();else {let p=g("Installing dependencies...").start(),y=Date.now(),M=await Ut({projectDir:c,packageManager:l}),U=((Date.now()-y)/1e3).toFixed(1);M?p.succeed(`Dependencies installed successfully in ${U}s.`):(p.fail("Failed to install dependencies"),await D(1,{name:S.INSTALL}),process.exit(1));}let _=t.dbConnectionString,E;if(t.skipDb)g("Database setup skipped.").warn();else {let p=g("Setting up database...").start();E=await Ee({projectDir:c,projectName:s,dbConnectionString:_,dbHost:t.dbHost,dbPort:parseInt(t.dbPort,10),spinner:p}),E.success?(E.alreadyExists?p.warn(`Database ${d.info(E.dbName)} already exists. Skipping database creation.`):p.succeed(`Database ${d.info(E.dbName)} setup successfully.`),_=E.connectionString):(p.fail("Failed to setup database."),i.log(q()),await D(1,{name:S.DATABASE}),process.exit(1));}await T({projectDir:c,databaseUri:_}),await Bt(c),await I({event:"project_created",properties:{template:o,package_manager:l,with_storefront:a,skip_db:!!t.skipDb}},{cwd:c});let Te=((Date.now()-n)/1e3).toFixed(1);if(g(`Mercur project successfully created! (${Te}s)`).succeed(),E?.success){g("Starting development server...").info();let p=E.inviteToken?`http://localhost:9000/dashboard/invite?token=${E.inviteToken}&first_run=true`:"http://localhost:9000/dashboard",U=spawn(l==="npm"?"npm":l,l==="npm"?["run","dev"]:["dev"],{cwd:c,stdio:"inherit",env:process.env}),Re=()=>{i.break(),i.log(w.bgGreen(w.black(" Project stopped. To start again: "))),i.log(Ae(c,l)),i.log(q()),i.break();};process.on("SIGINT",()=>{}),U.on("close",()=>{Re(),process.exit(0);}),xt({resources:["http://localhost:9000/health"],timeout:6e4}).then(async()=>{i.break(),i.log(Ft());try{await Pt(p),g("Admin panel opened in your browser.").succeed();}catch{g("Open this URL in your browser to create your admin account:").info(),i.log(d.info(p));}}).catch(()=>{g("To create your admin account, visit:").info(),i.log(d.info(p));});}else i.log(w.bgGreen(w.black(" Next Steps "))),i.log(Ae(c,l)),i.log(q()),i.break();}catch(n){i.break(),be(n);}});function It(e){if(!e)return ke(R.version??"");if(e!=="latest"&&e!=="rc"&&e!=="canary")throw new Error(`Unknown --tag "${e}". Expected one of: latest, rc, canary.`);return e}async function Lt(e){if(!await f.pathExists(e)){await f.mkdir(e);return}let r=(await f.readdir(e)).filter(s=>!s.startsWith("."));if(r.length>0){let{proceed:s}=await Q({type:"confirm",name:"proceed",message:`Directory ${d.info(b.basename(e))} already exists and contains ${r.length} file(s). Continue and overwrite?`,initial:false});s||process.exit(0);}}async function Ot(e){let t=e?[e,z]:[z];for(let n of t){let r=`https://codeload.github.com/mercurjs/mercur/tar.gz/${n}`,s=await fetch(r);if(!s.ok||!s.body){if(n!==z)continue;throw new Error(`Failed to download: ${r}`)}let o=b.join(vt.tmpdir(),`mercur-${n.replaceAll("/","-")}-${process.pid}.tar.gz`);return await pipeline(Readable.from(s.body),f.createWriteStream(o)),{tarballPath:o,ref:n}}throw new Error("Failed to download the Mercur template.")}async function Pe({tarballPath:e,ref:t,cwd:n,repoPath:r,strip:s}){let a=`${`mercur-${t.replace(/^v/,"").replaceAll("/","-")}`}/${r}/`;await x$1({file:e,cwd:n,filter:c=>c.includes(a),strip:s});}async function jt({tarballPath:e,ref:t,projectDir:n,template:r}){let o=`templates/${$t[r].path}`;await Pe({tarballPath:e,ref:t,cwd:n,repoPath:o,strip:1+o.split("/").length});}async function Mt({tarballPath:e,ref:t,projectDir:n}){await f.ensureDir(b.join(n,"apps")),await Pe({tarballPath:e,ref:t,cwd:n,repoPath:"apps/storefront",strip:1});}async function Ut({projectDir:e,packageManager:t}){let n="npm",r=["install"];t==="yarn"?(n="yarn",r=[]):t==="pnpm"?(n="pnpm",r=["install"]):t==="bun"&&(n="bun",r=["install"]);try{return await execa(n,r,{cwd:b.resolve(e),stdin:"inherit",stdout:"inherit",stderr:"inherit",env:{...process.env,npm_config_yes:"true"}}),!0}catch(s){return i.error(`Error installing dependencies${s instanceof Error?`: ${s.message}`:""}.`),false}}function Ae(e,t){let n=b.relative(process.cwd(),e),r=s=>w.bold(s);return `
11
- ${r("Launch Application:")}
12
-
13
- - cd ./${n}
14
- - ${t==="npm"?"npm run":t} dev
15
-
16
- ${r("Create your first seller:")}
17
-
18
- Once the server is running, open the Vendor Panel and register at:
19
- ${d.info("http://localhost:9000/seller/register")}
20
-
21
- ${r("Documentation:")}
22
-
23
- - ${Z("Getting Started","https://docs.mercurjs.com/welcome")}
24
- `}function Ft(){let e=t=>w.bold(t);return `
25
- ${e("Your marketplace is running:")}
26
-
27
- API: ${d.info("http://localhost:9000")}
28
- Admin Panel: ${d.info("http://localhost:9000/dashboard")}
29
- Vendor Panel: ${d.info("http://localhost:9000/seller")}
30
-
31
- ${e("Create your first seller:")}
32
-
33
- Open the Vendor Panel and register a new account at:
34
- ${d.info("http://localhost:9000/seller/register")}
35
- `}function q(){return `${w.bgCyan(w.black(" Have feedback? "))} Visit us on ${Z("GitHub","https://github.com/mercurjs/mercur")}.
36
- ${w.bgMagenta(w.black(" Join the community! "))} Chat with us on ${Z("Discord","https://discord.gg/hnZBzc4NJU")}.`}function Z(e,t){return Rt(e,t,{fallback:(n,r)=>`${n}: ${w.cyan().underline(r)}`})}async function Yt(e,t,n){let r=b.join(e,"package.json"),s=await f.readJSON(r);s.name=t;try{let{stdout:o}=await execa(n,["--version"]);s.packageManager=`${n}@${o.trim()}`;}catch{}await f.writeJSON(r,s,{spaces:2});}async function Bt(e){try{await execa("git",["init"],{cwd:e}),i.info("Initialized a git repository.");}catch{throw new Error("Failed to initialize git repository.")}}function Kt(){let[e]=process.versions.node.split(".").map(Number);return e}function Gt(){let e=Kt();if(e<X)throw new Error(`Mercur requires at least v${X} of Node.js. You're using v${e}. Please install at least v${X} and try again: https://nodejs.org/en/download`)}
37
- export{R as a,hn as b,gr as c};//# sourceMappingURL=chunk-H4XYHNCO.js.map
38
- //# sourceMappingURL=chunk-H4XYHNCO.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../package.json","../src/utils/get-package-manager.ts","../src/utils/highlighter.ts","../src/telemetry/detect-system-info.ts","../src/telemetry/hash.ts","../src/telemetry/store.ts","../src/telemetry/index.ts","../src/telemetry/command-tracking.ts","../src/utils/logger.ts","../src/utils/manage-env-files.ts","../src/utils/spinner.ts","../src/utils/create-db.ts","../src/utils/handle-error.ts","../src/utils/release-channel.ts","../src/commands/create.ts"],"names":["package_default","SUPPORTED_PACKAGE_MANAGERS","normalizePackageManager","value","pm","getPackageManagerFromUserAgent","isPackageManagerInstalled","packageManager","execa","getPackageManager","targetDir","detected","detect","fromUserAgent","resolveProjectPackageManager","highlighter","text","kleur","importRuntime","m","getVendor","hasAny","keys","k","detectSystemInfo","os","cpus","isWsl","isDocker","fs","isInsideContainer","hasContainerEnv","hasDockerEnv","hasDockerCGroup","PROJECT_ID_SALT","hashProjectKey","input","createHash","DEFAULTS","resolveConfigDir","env","platform","join","homedir","LEGACY_CONFIG_PATH","ConfigStore","dir","key","config","existing","id","randomUUID","existsSync","readFileSync","legacy","mkdirSync","writeFileSync","configStore","DEFAULT_TELEMETRY_HOST","REQUEST_TIMEOUT_MS","SCHEMA_VERSION","PLACEHOLDER_API_KEY","TELEMETRY_DOCS_URL","CI_ENV_KEYS","AGENT_ENV_KEYS","ErrorCategory","isTruthy","isCi","isTelemetryEnabled","showTelemetryNoticeIfNeeded","getGitRemote","cwd","execSync","getProjectId","readJson","file","readVersions","rootPkg","apiPkg","path","deps","pkg","find","name","baseProperties","versions","systemInfo","projectId","sendTelemetryEvent","event","options","body","host","controller","timer","categorizeError","error","code","message","SAFE_FLAG_VALUES","running","redactFlags","command","flags","beginCommand","opts","finishCommand","exitCode","current","registerCommandTracking","program","_this","actionCommand","logger","args","sanitizeEnv","contents","databaseUri","seenKeys","withDefaults","line","setEnvValue","pattern","APP_PATHS","manageEnvFiles","projectDir","publishableKey","appPath","appDir","envTemplatePath","envPath","isApi","isStorefront","templateEnv","envTemplateContents","envContents","updatedEnvContents","envContent","err","spinner","ora","dbHost","dbPort","API_DIR","ADMIN_EMAIL","setupDatabase","dbName","client","dbConnectionString","getDbClient","doesDbExist","runPostDbSetup","connectionString","alreadyExists","runMigrations","seedDatabase","inviteToken","createAdminInvite","getPublishableKey","pg","spinnerRef","formatConnectionString","MAX_ATTEMPTS","attempt","attemptSuffix","answers","prompts","username","password","user","port","db","encodedPassword","parentSpinner","apiDir","migrationSpinner","buildCmd","runnerCmd","seedSpinner","seedCmd","handleError","REGISTRY_URL","DEPENDENCY_FIELDS","detectReleaseChannel","cliVersion","resolveDistTag","packageName","channel","res","collectPackageJsonPaths","entries","results","entry","isMercurPackage","applyReleaseChannel","packageJsonPaths","resolved","pinnedVersion","packageJsonPath","packageJson","changed","field","version","resolveTemplateRef","DEFAULT_BRANCH","MIN_SUPPORTED_NODE_VERSION","CREATE_TEMPLATES","create","Command","createStart","validateNodeVersion","resolveChannel","projectName","enteredName","validateProjectName","template","addStorefront","wantsStorefront","createOrFindProjectDir","downloadSpinner","tarballPath","ref","downloadRepoTarball","extractTemplate","storefrontSpinner","extractStorefront","channelSpinner","pinned","updateRootPackageJson","initialInstallSpinner","installStart","result","installDeps","installDuration","dbResult","dbSpinner","feedbackOutro","initGit","totalDuration","inviteUrl","serverProcess","spawn","printRestartHint","successMessage","waitOn","serverUrls","open","tag","nonHidden","f","proceed","preferredRef","refs","url","pipeline","Readable","extractRepoDir","repoPath","strip","filter","x","p","cmd","relativePath","header","createTerminalLink","terminalLink","getNodeVersion","major","nodeVersion"],"mappings":"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","file":"chunk-H4XYHNCO.js","sourcesContent":["{\n \"name\": \"create-mercur-app\",\n \"version\": \"2.3.9-canary.7\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/mercurjs/mercur\",\n \"directory\": \"packages/create-mercur-app\"\n },\n \"type\": \"module\",\n \"description\": \"Create a new Mercur marketplace project\",\n \"author\": \"MercurJS (https://github.com/mercurjs)\",\n \"keywords\": [\n \"marketplace\",\n \"multi-vendor\",\n \"medusajs\",\n \"ecommerce\",\n \"open-source-marketplace\",\n \"headless-commerce\",\n \"create-mercur-app\",\n \"marketplace-framework\"\n ],\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"files\": [\n \"dist\"\n ],\n \"bin\": {\n \"create-mercur-app\": \"./dist/index.js\"\n },\n \"exports\": {\n \".\": \"./dist/lib.js\",\n \"./package.json\": \"./package.json\"\n },\n \"scripts\": {\n \"typecheck\": \"tsc --noEmit\",\n \"dev\": \"tsup --watch\",\n \"build\": \"tsup\"\n },\n \"dependencies\": {\n \"@antfu/ni\": \"^30.3.0\",\n \"commander\": \"^15.0.0\",\n \"execa\": \"^10.0.0\",\n \"fs-extra\": \"^11.3.2\",\n \"kleur\": \"^4.1.5\",\n \"open\": \"^11.0.0\",\n \"ora\": \"^9.0.0\",\n \"pg\": \"^8.17.1\",\n \"prompts\": \"^2.4.2\",\n \"tar\": \"^7.5.2\",\n \"terminal-link\": \"^5.0.0\",\n \"validate-npm-package-name\": \"^8.0.0\",\n \"wait-on\": \"^9.0.3\"\n },\n \"devDependencies\": {\n \"@types/fs-extra\": \"^11.0.4\",\n \"@types/pg\": \"^8.16.0\",\n \"@types/prompts\": \"^2.4.9\",\n \"@types/tar\": \"^7.0.87\",\n \"@types/validate-npm-package-name\": \"^4.0.2\",\n \"@types/wait-on\": \"^5.3.4\",\n \"tsup\": \"^8.5.0\",\n \"typescript\": \"5.9.3\"\n },\n \"engines\": {\n \"node\": \">=20\"\n }\n}\n","import { detect } from \"@antfu/ni\";\nimport { execa } from \"execa\";\n\nexport type PackageManager = \"yarn\" | \"pnpm\" | \"bun\" | \"npm\" | \"deno\";\n\nconst SUPPORTED_PACKAGE_MANAGERS: PackageManager[] = [\n \"bun\",\n \"yarn\",\n \"pnpm\",\n \"deno\",\n \"npm\",\n];\n\nfunction normalizePackageManager(\n value: string | null | undefined,\n): PackageManager | undefined {\n if (!value) return undefined;\n return SUPPORTED_PACKAGE_MANAGERS.find((pm) => value.startsWith(pm));\n}\n\n/**\n * Detect the package manager that invoked the CLI from `npm_config_user_agent`.\n * This is the most reliable signal for what the user actually has and intends\n * to use (e.g. `npx`, `bunx`, `pnpm dlx`, `yarn dlx`).\n */\nexport function getPackageManagerFromUserAgent(): PackageManager | undefined {\n return normalizePackageManager(process.env.npm_config_user_agent);\n}\n\n/**\n * Check whether a package manager is actually installed and runnable, so we\n * never hand back a manager that would crash with `spawn <pm> ENOENT`.\n */\nexport async function isPackageManagerInstalled(\n packageManager: PackageManager,\n): Promise<boolean> {\n try {\n await execa(packageManager, [\"--version\"]);\n return true;\n } catch {\n return false;\n }\n}\n\nexport async function getPackageManager(\n targetDir: string,\n): Promise<PackageManager> {\n const detected = normalizePackageManager(\n await detect({ programmatic: true, cwd: targetDir }),\n );\n\n // Respect the project's declared/lockfile package manager, but only if it is\n // actually installed — otherwise commands like `<pm> --version` blow up.\n if (detected && (await isPackageManagerInstalled(detected))) {\n return detected;\n }\n\n const fromUserAgent = getPackageManagerFromUserAgent();\n if (fromUserAgent && (await isPackageManagerInstalled(fromUserAgent))) {\n return fromUserAgent;\n }\n\n return \"npm\";\n}\n\n/**\n * Resolve the package manager to use for a brand-new project.\n *\n * Mirrors how the Medusa CLI picks a package manager: detect what the user\n * invoked the CLI with (`npm_config_user_agent`), verify it is actually\n * installed, and fall back to npm otherwise. The downloaded template's own\n * `packageManager` field (e.g. `yarn@4.6.0`) is intentionally ignored — it\n * reflects the template author's tooling, not the user's environment, and was\n * the cause of `spawn yarn ENOENT` crashes for users without yarn installed.\n */\nexport async function resolveProjectPackageManager(): Promise<PackageManager> {\n const fromUserAgent = getPackageManagerFromUserAgent();\n if (fromUserAgent && (await isPackageManagerInstalled(fromUserAgent))) {\n return fromUserAgent;\n }\n\n return \"npm\";\n}\n\nexport async function getPackageRunner(cwd: string) {\n const packageManager = await getPackageManager(cwd);\n\n if (packageManager === \"pnpm\") return \"pnpm dlx\";\n\n if (packageManager === \"bun\") return \"bunx\";\n\n return \"npx\";\n}\n","import kleur from \"kleur\";\n\nexport const highlighter = {\n error: (text: string) => kleur.red(text),\n warn: (text: string) => kleur.yellow(text),\n info: (text: string) => kleur.blue(text),\n success: (text: string) => kleur.green(text),\n dim: (text: string) => kleur.cyan(text),\n};\n","export const importRuntime = <T>(m: string): Promise<T> => {\n return (Function(\"mm\", \"return import(mm)\") as any)(m);\n};\n\nfunction getVendor() {\n const hasAny = (...keys: string[]) =>\n keys.some((k) => Boolean(process.env[k]));\n\n if (\n hasAny(\n \"MEDUSA_CLOUD_ENVIRONMENT_HANDLE\",\n \"MEDUSA_CLOUD_SANDBOX_HANDLE\",\n \"MEDUSA_CLOUD_API_KEY\",\n )\n ) {\n return \"medusa-cloud\";\n }\n\n if (\n hasAny(\n \"RENDER\",\n \"RENDER_URL\",\n \"RENDER_INTERNAL_HOSTNAME\",\n \"RENDER_SERVICE_ID\",\n )\n ) {\n return \"render\";\n }\n\n if (hasAny(\"FLY_APP_NAME\", \"FLY_REGION\", \"FLY_ALLOC_ID\")) return \"fly-io\";\n\n if (hasAny(\"RAILWAY_STATIC_URL\", \"RAILWAY_ENVIRONMENT_NAME\"))\n return \"railway\";\n\n if (hasAny(\"DYNO\", \"HEROKU_APP_NAME\")) return \"heroku\";\n\n if (hasAny(\"DO_DEPLOYMENT_ID\", \"DO_APP_NAME\", \"DIGITALOCEAN\"))\n return \"digitalocean\";\n\n if (hasAny(\"KOYEB\", \"KOYEB_DEPLOYMENT_ID\", \"KOYEB_APP_NAME\")) return \"koyeb\";\n\n return null;\n}\n\nexport async function detectSystemInfo() {\n try {\n //check if it's cloudflare\n const os = await importRuntime<typeof import(\"os\")>(\"os\");\n const cpus = os.cpus();\n return {\n deploymentVendor: getVendor(),\n systemPlatform: os.platform(),\n systemRelease: os.release(),\n systemArchitecture: os.arch(),\n cpuCount: cpus.length,\n cpuModel: cpus.length ? cpus[0]!.model : null,\n cpuSpeed: cpus.length ? cpus[0]!.speed : null,\n memory: os.totalmem(),\n isWSL: await isWsl(),\n isDocker: await isDocker(),\n isTTY:\n typeof process !== \"undefined\" && (process as any).stdout\n ? (process as any).stdout.isTTY\n : null,\n };\n } catch {\n return {\n systemPlatform: null,\n systemRelease: null,\n systemArchitecture: null,\n cpuCount: null,\n cpuModel: null,\n cpuSpeed: null,\n memory: null,\n isWSL: null,\n isDocker: null,\n isTTY: null,\n };\n }\n}\n\n\nasync function isWsl() {\n try {\n if (typeof process === \"undefined\" || process?.platform !== \"linux\") {\n return false;\n }\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n const os = await importRuntime<typeof import(\"os\")>(\"os\");\n if (os.release().toLowerCase().includes(\"microsoft\")) {\n if (await isInsideContainer()) {\n return false;\n }\n\n return true;\n }\n\n return fs\n .readFileSync(\"/proc/version\", \"utf8\")\n .toLowerCase()\n .includes(\"microsoft\")\n ? !(await isInsideContainer())\n : false;\n } catch {\n return false;\n }\n}\nconst hasContainerEnv = async () => {\n try {\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n fs.statSync(\"/run/.containerenv\");\n return true;\n } catch {\n return false;\n }\n};\n\nasync function isDocker() {\n return (await hasDockerEnv()) || (await hasDockerCGroup());\n}\n\n\nasync function hasDockerEnv() {\n try {\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n fs.statSync(\"/.dockerenv\");\n return true;\n } catch {\n return false;\n }\n}\n\nasync function hasDockerCGroup() {\n try {\n const fs = await importRuntime<typeof import(\"fs\")>(\"fs\");\n return fs.readFileSync(\"/proc/self/cgroup\", \"utf8\").includes(\"docker\");\n } catch {\n return false;\n }\n}\n\n\nasync function isInsideContainer() {\n return (await hasContainerEnv()) || (await isDocker());\n}","import { createHash } from \"crypto\";\n\nconst PROJECT_ID_SALT = \"mercur-telemetry-v1\";\n\n/**\n * Same salt and encoding as `@mercurjs/core`, so a scaffolded project and the\n * server later built from it share one `project_id`.\n */\nexport const hashProjectKey = (input: string): string =>\n createHash(\"sha256\").update(`${PROJECT_ID_SALT}:${input}`).digest(\"base64url\");\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\nimport { randomUUID } from \"crypto\";\n\ninterface TelemetryConfig {\n telemetry_enabled: boolean;\n notice_shown: boolean;\n device_id: string | null;\n}\n\nconst DEFAULTS: TelemetryConfig = {\n telemetry_enabled: true,\n notice_shown: false,\n device_id: null,\n};\n\n/**\n * XDG config location, the same convention `@medusajs/telemetry` follows for\n * `~/.config/medusa/config.json`.\n */\nexport const resolveConfigDir = (env: NodeJS.ProcessEnv = process.env, platform = process.platform) => {\n if (platform === \"win32\") {\n return join(env.APPDATA || join(homedir(), \"AppData\", \"Roaming\"), \"mercur\");\n }\n return join(env.XDG_CONFIG_HOME || join(homedir(), \".config\"), \"mercur\");\n};\n\nconst LEGACY_CONFIG_PATH = join(homedir(), \".mercur\", \"config.json\");\n\nclass ConfigStore {\n private readonly path: string;\n private readonly dir: string;\n\n constructor(dir = resolveConfigDir()) {\n this.dir = dir;\n this.path = join(dir, \"config.json\");\n }\n\n get<K extends keyof TelemetryConfig>(key: K): TelemetryConfig[K] {\n return this.read()[key];\n }\n\n set<K extends keyof TelemetryConfig>(key: K, value: TelemetryConfig[K]): void {\n const config = this.read();\n config[key] = value;\n this.write(config);\n }\n\n deviceId(): string {\n const existing = this.get(\"device_id\");\n if (existing) {\n return existing;\n }\n const id = randomUUID();\n this.set(\"device_id\", id);\n return id;\n }\n\n private read(): TelemetryConfig {\n try {\n if (existsSync(this.path)) {\n return { ...DEFAULTS, ...JSON.parse(readFileSync(this.path, \"utf-8\")) };\n }\n return this.migrateLegacy();\n } catch {\n return { ...DEFAULTS };\n }\n }\n\n // Carries an opt-out made under the old ~/.mercur location across the move.\n private migrateLegacy(): TelemetryConfig {\n const config = { ...DEFAULTS };\n try {\n if (existsSync(LEGACY_CONFIG_PATH)) {\n const legacy = JSON.parse(readFileSync(LEGACY_CONFIG_PATH, \"utf-8\"));\n if (typeof legacy.telemetry_enabled === \"boolean\") {\n config.telemetry_enabled = legacy.telemetry_enabled;\n }\n if (typeof legacy.notice_shown === \"boolean\") {\n config.notice_shown = legacy.notice_shown;\n }\n this.write(config);\n }\n } catch {\n // Unreadable legacy file: fall back to defaults.\n }\n return config;\n }\n\n private write(config: TelemetryConfig): void {\n try {\n mkdirSync(this.dir, { recursive: true, mode: 0o700 });\n writeFileSync(this.path, JSON.stringify(config, null, 2) + \"\\n\", { mode: 0o600 });\n } catch {\n // Telemetry config is non-critical.\n }\n }\n}\n\nexport const configStore = new ConfigStore();\n","import { execSync } from \"child_process\";\nimport path from \"path\";\n\nimport fs from \"fs-extra\";\n\nimport packageJson from \"../../package.json\";\nimport { getPackageManagerFromUserAgent } from \"../utils/get-package-manager\";\nimport { highlighter } from \"../utils/highlighter\";\nimport { detectSystemInfo } from \"./detect-system-info\";\nimport { hashProjectKey } from \"./hash\";\nimport { configStore } from \"./store\";\n\nconst DEFAULT_TELEMETRY_HOST = \"https://telemetry.mercurjs.com\";\nconst REQUEST_TIMEOUT_MS = 2_000;\nconst SCHEMA_VERSION = 1;\nconst PLACEHOLDER_API_KEY = \"mercur\";\n\nexport const TELEMETRY_DOCS_URL = \"https://docs.mercurjs.com/telemetry\";\n\nconst CI_ENV_KEYS = [\"CI\", \"GITHUB_ACTIONS\", \"GITLAB_CI\", \"CIRCLECI\", \"BUILDKITE\", \"JENKINS_URL\", \"TF_BUILD\", \"TEAMCITY_VERSION\", \"DRONE\"];\nconst AGENT_ENV_KEYS = [\"CLAUDECODE\", \"CLAUDE_CODE\", \"CURSOR_AGENT\", \"CODEX_SANDBOX\", \"GEMINI_CLI\", \"COPILOT_AGENT\", \"OPENCODE_CLIENT\"];\n\nexport const ErrorCategory = {\n NETWORK: \"network\",\n FS: \"fs\",\n VALIDATION: \"validation\",\n REGISTRY: \"registry\",\n INSTALL: \"install\",\n DATABASE: \"database\",\n UNKNOWN: \"unknown\",\n} as const;\n\nexport type ErrorCategory = (typeof ErrorCategory)[keyof typeof ErrorCategory];\n\nexport interface TelemetryEvent {\n event: string;\n properties?: Record<string, unknown>;\n}\n\nconst isTruthy = (value: string | undefined) =>\n value !== undefined && [\"1\", \"true\", \"yes\"].includes(value.toLowerCase());\n\nexport const isCi = () => CI_ENV_KEYS.some((key) => Boolean(process.env[key]));\n\nexport const isTelemetryEnabled = () => {\n if (isTruthy(process.env.MERCUR_TELEMETRY_FORCE_ENABLED)) return true;\n if (isTruthy(process.env.MERCUR_DISABLE_TELEMETRY)) return false;\n if (isTruthy(process.env.DO_NOT_TRACK)) return false;\n if (isCi()) return false;\n return configStore.get(\"telemetry_enabled\");\n};\n\nexport const showTelemetryNoticeIfNeeded = () => {\n if (configStore.get(\"notice_shown\")) {\n return;\n }\n\n configStore.set(\"notice_shown\", true);\n\n if (!isTelemetryEnabled()) {\n return;\n }\n\n console.error(\n [\n \"\",\n \"Mercur collects anonymous usage data to improve the CLI experience.\",\n `You can disable this at any time by running: ${highlighter.info(\"mercurjs telemetry --disable\")}`,\n `Or by setting ${highlighter.info(\"MERCUR_DISABLE_TELEMETRY=true\")}`,\n `Learn more: ${highlighter.info(TELEMETRY_DOCS_URL)}`,\n \"\",\n ].join(\"\\n\")\n );\n};\n\nconst getGitRemote = (cwd: string) => {\n try {\n return execSync(\"git config --local --get remote.origin.url\", {\n cwd,\n stdio: \"pipe\",\n timeout: 1000,\n })\n .toString()\n .trim();\n } catch {\n return null;\n }\n};\n\nexport const getProjectId = (cwd: string): string => hashProjectKey(getGitRemote(cwd) || cwd);\n\nconst readJson = async (file: string): Promise<Record<string, unknown> | null> => {\n try {\n return await fs.readJSON(file);\n } catch {\n return null;\n }\n};\n\n/**\n * The scaffolded project always has the template layout, so plain reads at\n * known paths are enough to pick up the pinned framework versions.\n */\nconst readVersions = async (cwd: string) => {\n const [rootPkg, apiPkg] = await Promise.all([\n readJson(path.join(cwd, \"package.json\")),\n readJson(path.join(cwd, \"packages/api/package.json\")),\n ]);\n const deps = (pkg: Record<string, unknown> | null) =>\n (pkg?.dependencies ?? {}) as Record<string, string | undefined>;\n const find = (name: string) => deps(rootPkg)[name] ?? deps(apiPkg)[name];\n\n return {\n mercur_version: find(\"@mercurjs/core\") ?? find(\"@mercurjs/cli\"),\n medusa_version: find(\"@medusajs/framework\"),\n };\n};\n\nconst baseProperties = async (cwd: string) => {\n const [versions, systemInfo] = await Promise.all([readVersions(cwd), detectSystemInfo()]);\n const projectId = getProjectId(cwd);\n\n return {\n schema_version: SCHEMA_VERSION,\n source: \"create-mercur-app\",\n cli_version: packageJson.version,\n ...versions,\n node_version: process.version,\n runtime: process.versions.bun ? \"bun\" : \"node\",\n package_manager: getPackageManagerFromUserAgent(),\n os: systemInfo.systemPlatform,\n arch: systemInfo.systemArchitecture,\n is_ci: isCi(),\n is_tty: Boolean(process.stdout.isTTY),\n is_agent: AGENT_ENV_KEYS.some((key) => Boolean(process.env[key])),\n is_docker: systemInfo.isDocker,\n is_wsl: systemInfo.isWSL,\n cloud_provider: systemInfo.deploymentVendor,\n project_id: projectId,\n $groups: { project: projectId },\n $geoip_disable: true,\n };\n};\n\nexport const sendTelemetryEvent = async (event: TelemetryEvent, options: { cwd: string }) => {\n try {\n if (!isTelemetryEnabled()) {\n return;\n }\n\n const body = {\n api_key: PLACEHOLDER_API_KEY,\n batch: [\n {\n event: event.event,\n distinct_id: configStore.deviceId(),\n timestamp: new Date().toISOString(),\n properties: { ...(await baseProperties(options.cwd)), ...event.properties },\n },\n ],\n };\n\n if (isTruthy(process.env.MERCUR_TELEMETRY_DEBUG)) {\n console.error(`[telemetry] ${JSON.stringify(body.batch, null, 2)}`);\n return;\n }\n\n const host = (process.env.MERCUR_TELEMETRY_PROXY_URL || DEFAULT_TELEMETRY_HOST).replace(/\\/+$/, \"\");\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);\n try {\n await fetch(`${host}/batch`, {\n method: \"POST\",\n headers: { \"content-type\": \"application/json\" },\n body: JSON.stringify(body),\n signal: controller.signal,\n });\n } finally {\n clearTimeout(timer);\n }\n } catch {\n // Telemetry must never fail a command.\n }\n};\n\nexport const categorizeError = (error: unknown): ErrorCategory => {\n if (error && typeof error === \"object\") {\n const name = (error as { name?: string }).name ?? \"\";\n const code = (error as { code?: string }).code ?? \"\";\n const message = (error as { message?: string }).message ?? \"\";\n if ((Object.values(ErrorCategory) as string[]).includes(name)) return name as ErrorCategory;\n if (name === \"ZodError\") return ErrorCategory.VALIDATION;\n if ([\"ENOTFOUND\", \"ECONNREFUSED\", \"ECONNRESET\", \"ETIMEDOUT\", \"EAI_AGAIN\"].includes(code) || /fetch failed/i.test(message)) {\n return ErrorCategory.NETWORK;\n }\n if ([\"ENOENT\", \"EACCES\", \"EPERM\", \"EEXIST\", \"ENOTDIR\", \"EISDIR\"].includes(code)) return ErrorCategory.FS;\n }\n return ErrorCategory.UNKNOWN;\n};\n","import type { Command } from \"commander\";\nimport { categorizeError, sendTelemetryEvent } from \"./index\";\n\n/**\n * Flag values are only kept when they cannot carry user data: booleans, and\n * the enumerated choices listed here. Everything else is redacted.\n */\nconst SAFE_FLAG_VALUES: Record<string, string[]> = {\n template: [\"basic\", \"plugin\", \"registry\"],\n tag: [\"latest\", \"rc\", \"canary\"],\n};\n\ntype RunningCommand = {\n name: string;\n flags: Record<string, unknown>;\n cwd: string;\n startedAt: number;\n};\n\nlet running: RunningCommand | null = null;\n\nconst redactFlags = (command: Command): Record<string, unknown> => {\n const flags: Record<string, unknown> = {};\n for (const [key, value] of Object.entries(command.opts())) {\n if (command.getOptionValueSource(key) !== \"cli\") continue;\n if (typeof value === \"boolean\") {\n flags[key] = value;\n } else if (typeof value === \"string\" && SAFE_FLAG_VALUES[key]?.includes(value)) {\n flags[key] = value;\n } else {\n flags[key] = \"<redacted>\";\n }\n }\n return flags;\n};\n\nexport const beginCommand = (command: Command) => {\n const opts = command.opts() as { cwd?: string };\n running = {\n name: command.name(),\n flags: redactFlags(command),\n cwd: typeof opts.cwd === \"string\" ? opts.cwd : process.cwd(),\n startedAt: Date.now(),\n };\n};\n\nexport const finishCommand = async (exitCode: number, error?: unknown) => {\n if (!running) return;\n const current = running;\n running = null;\n\n await sendTelemetryEvent(\n {\n event: \"cli_command_executed\",\n properties: {\n command: current.name,\n flags: current.flags,\n exit_code: exitCode,\n duration_ms: Date.now() - current.startedAt,\n ...(exitCode !== 0 ? { error_category: categorizeError(error) } : {}),\n },\n },\n { cwd: current.cwd }\n );\n};\n\nexport const registerCommandTracking = (program: Command) => {\n program.hook(\"preAction\", (_this, actionCommand) => beginCommand(actionCommand));\n program.hook(\"postAction\", async () => {\n await finishCommand(0);\n });\n};\n","import { highlighter } from \"./highlighter\";\n\nexport const logger = {\n error(...args: unknown[]) {\n console.log(highlighter.error(args.join(\" \")));\n },\n warn(...args: unknown[]) {\n console.log(highlighter.warn(args.join(\" \")));\n },\n info(...args: unknown[]) {\n console.log(highlighter.info(args.join(\" \")));\n },\n success(...args: unknown[]) {\n console.log(highlighter.success(args.join(\" \")));\n },\n log(...args: unknown[]) {\n console.log(args.join(\" \"));\n },\n break() {\n console.log(\"\");\n },\n};\n","import { logger } from \"./logger\";\nimport fs from \"fs-extra\";\nimport path from \"path\";\n\nconst sanitizeEnv = ({\n contents,\n databaseUri,\n}: {\n contents: string;\n databaseUri?: string;\n}): string => {\n const seenKeys = new Set<string>();\n\n let withDefaults = contents;\n\n // Add DATABASE_URL if not present\n if (!contents.includes(\"DATABASE_URL\")) {\n withDefaults += \"\\nDATABASE_URL=your-connection-string-here\";\n }\n\n const updatedEnv = withDefaults\n .split(\"\\n\")\n .map((line) => {\n if (line.startsWith(\"#\") || !line.includes(\"=\")) {\n return line;\n }\n\n const [key] = line.split(\"=\");\n\n if (!key) {\n return;\n }\n\n if (key === \"DATABASE_URL\") {\n const placeholderUri =\n databaseUri || \"postgresql://localhost:5432/your-database-name\";\n line = `DATABASE_URL=${placeholderUri}`;\n }\n\n // Handle duplicates\n if (seenKeys.has(key)) {\n return null;\n }\n\n seenKeys.add(key);\n\n return line;\n })\n .filter(Boolean)\n .join(\"\\n\");\n\n return updatedEnv;\n};\n\nconst setEnvValue = (contents: string, key: string, value: string): string => {\n const line = `${key}=${value}`;\n const pattern = new RegExp(`^${key}=.*$`, \"m\");\n\n if (pattern.test(contents)) {\n return contents.replace(pattern, line);\n }\n\n return `${contents}${contents.endsWith(\"\\n\") || contents === \"\" ? \"\" : \"\\n\"}${line}`;\n};\n\nconst APP_PATHS = [\n { path: \"packages/api\" },\n { path: \"apps/vendor\" },\n { path: \"apps/admin\" },\n { path: \"apps/storefront\" },\n];\n\nexport async function manageEnvFiles({\n projectDir,\n databaseUri,\n publishableKey,\n}: {\n projectDir: string;\n databaseUri?: string;\n publishableKey?: string;\n}): Promise<void> {\n try {\n await Promise.all(\n APP_PATHS.map(async ({ path: appPath }) => {\n const appDir = path.join(projectDir, appPath);\n\n if (!fs.existsSync(appDir)) {\n return;\n }\n\n const envTemplatePath = path.join(appDir, \".env.template\");\n const envPath = path.join(appDir, \".env\");\n\n const isApi = appPath.includes(\"api\");\n const isStorefront = appPath.includes(\"storefront\");\n // if not API, just copy the .env.template file\n if (!isApi) {\n if (fs.existsSync(envTemplatePath) && !fs.existsSync(envPath)) {\n await fs.copy(envTemplatePath, envPath);\n }\n\n // Inject the seeded publishable key into the storefront env so the\n // storefront can talk to the Store API out of the box.\n if (isStorefront && publishableKey && fs.existsSync(envPath)) {\n const contents = await fs.readFile(envPath, \"utf8\");\n await fs.writeFile(\n envPath,\n setEnvValue(\n contents,\n \"NEXT_PUBLIC_MEDUSA_PUBLISHABLE_KEY\",\n publishableKey\n )\n );\n }\n return;\n }\n\n let templateEnv = \"\";\n\n if (fs.existsSync(envTemplatePath)) {\n const envTemplateContents = await fs.readFile(\n envTemplatePath,\n \"utf8\"\n );\n templateEnv = sanitizeEnv({\n contents: envTemplateContents,\n databaseUri,\n });\n }\n\n if (!fs.existsSync(envPath)) {\n const envContent = sanitizeEnv({\n contents: templateEnv,\n databaseUri,\n });\n await fs.writeFile(envPath, envContent);\n } else {\n const envContents = await fs.readFile(envPath, \"utf8\");\n const updatedEnvContents = sanitizeEnv({\n contents: envContents,\n databaseUri,\n });\n await fs.writeFile(envPath, updatedEnvContents);\n }\n })\n );\n } catch (err: unknown) {\n logger.error(\"Unable to manage environment files\");\n if (err instanceof Error) {\n logger.error(err.message);\n }\n process.exit(1);\n }\n}\n","import ora, { type Options } from \"ora\";\n\nexport function spinner(\n text: Options[\"text\"],\n options?: {\n silent?: boolean;\n }\n) {\n return ora({\n text,\n isSilent: options?.silent ?? false,\n });\n}\n","import { getPackageManager } from \"./get-package-manager\";\nimport { logger } from \"./logger\";\nimport { manageEnvFiles } from \"./manage-env-files\";\nimport { spinner } from \"./spinner\";\nimport { execa } from \"execa\";\nimport type { Ora } from \"ora\";\nimport path from \"path\";\nimport pg from \"pg\";\nimport prompts from \"prompts\";\n\nconst dbHost = \"localhost\";\nconst dbPort = 5432;\nconst API_DIR = \"packages/api\";\nconst ADMIN_EMAIL = \"admin@mercur-test.com\";\n\ninterface DbSetupArgs {\n projectDir: string;\n spinner?: Ora;\n}\n\nexport interface SetupDatabaseResult {\n success: boolean;\n dbName: string;\n connectionString: string | null;\n alreadyExists?: boolean;\n inviteToken?: string | null;\n publishableKey?: string | null;\n}\n\nexport async function setupDatabase(args: {\n projectDir: string;\n projectName: string;\n dbConnectionString?: string;\n dbHost?: string;\n dbPort?: number;\n spinner?: Ora;\n}): Promise<SetupDatabaseResult> {\n const dbName = args.projectName.replace(/[^a-zA-Z0-9]/g, \"-\");\n\n const { client, dbConnectionString } = await getDbClient({\n dbConnectionString: args.dbConnectionString,\n dbHost: args.dbHost ?? dbHost,\n dbPort: args.dbPort ?? dbPort,\n dbName,\n spinner: args.spinner,\n });\n\n if (!client || !dbConnectionString) {\n return { success: false, dbName, connectionString: null };\n }\n\n try {\n if (args.spinner) {\n args.spinner.text = \"Checking if database exists...\";\n }\n const exists = await doesDbExist(client, dbName);\n\n if (exists) {\n await client.end();\n return runPostDbSetup({\n ...args,\n dbName,\n connectionString: dbConnectionString,\n alreadyExists: true,\n });\n }\n\n if (args.spinner) {\n args.spinner.text = `Creating database \"${dbName}\"...`;\n }\n await client.query(`CREATE DATABASE \"${dbName}\"`);\n await client.end();\n\n return runPostDbSetup({\n ...args,\n dbName,\n connectionString: dbConnectionString,\n alreadyExists: false,\n });\n } catch (err) {\n logger.error(\n `Error creating database${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n await client.end().catch(() => {});\n return { success: false, dbName, connectionString: null };\n }\n}\n\nasync function runPostDbSetup(args: DbSetupArgs & {\n dbName: string;\n connectionString: string;\n alreadyExists: boolean;\n}): Promise<SetupDatabaseResult> {\n const { projectDir, spinner, dbName, connectionString, alreadyExists } = args;\n\n // Medusa needs DATABASE_URL in .env before running migrations\n await manageEnvFiles({\n projectDir,\n databaseUri: connectionString,\n });\n\n const migrated = await runMigrations({ projectDir, spinner });\n if (!migrated) {\n return { success: false, dbName, connectionString: null };\n }\n\n const seeded = await seedDatabase({ projectDir, spinner });\n if (!seeded) {\n return { success: false, dbName, connectionString: null };\n }\n\n const inviteToken = await createAdminInvite({ projectDir });\n\n const publishableKey = await getPublishableKey({ connectionString });\n\n // Now that the storefront .env exists, inject the seeded publishable key.\n if (publishableKey) {\n await manageEnvFiles({\n projectDir,\n databaseUri: connectionString,\n publishableKey,\n });\n }\n\n return {\n success: true,\n dbName,\n connectionString,\n alreadyExists,\n inviteToken,\n publishableKey,\n };\n}\n\nasync function getPublishableKey({\n connectionString,\n}: {\n connectionString: string;\n}): Promise<string | null> {\n const client = new pg.Client({ connectionString });\n\n try {\n await client.connect();\n const result = await client.query(\n `SELECT token FROM api_key WHERE type = 'publishable' AND revoked_at IS NULL AND deleted_at IS NULL ORDER BY created_at ASC LIMIT 1;`\n );\n return result.rows[0]?.token ?? null;\n } catch (err) {\n logger.error(\n `Error reading publishable API key${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return null;\n } finally {\n await client.end().catch(() => {});\n }\n}\n\ninterface DbClientResult {\n client: pg.Client | null;\n dbConnectionString: string | null;\n}\n\nasync function getDbClient({\n dbConnectionString,\n dbHost,\n dbPort,\n dbName,\n spinner: spinnerRef,\n}: {\n dbConnectionString?: string;\n dbHost: string;\n dbPort: number;\n dbName: string;\n spinner?: Ora;\n}): Promise<DbClientResult> {\n if (dbConnectionString) {\n try {\n const client = new pg.Client({ connectionString: dbConnectionString });\n await client.connect();\n return { client, dbConnectionString };\n } catch (error) {\n logger.error(\n `Invalid database connection string${error instanceof Error ? `: ${error.message}` : \"\"}.`\n );\n return { client: null, dbConnectionString: null };\n }\n }\n\n // Step 1: silent default attempt (postgres / no password)\n if (spinnerRef) {\n spinnerRef.text = `Trying default connection (postgres@${dbHost}:${dbPort})...`;\n }\n\n try {\n const client = new pg.Client({\n user: \"postgres\",\n password: \"\",\n host: dbHost,\n port: dbPort,\n database: \"postgres\",\n connectionTimeoutMillis: 5000,\n });\n await client.connect();\n return {\n client,\n dbConnectionString: formatConnectionString({\n user: \"postgres\",\n password: \"\",\n host: dbHost,\n port: dbPort,\n db: dbName,\n }),\n };\n } catch {\n // Default connection failed — ask the user for credentials\n }\n\n spinnerRef?.stop();\n\n logger.break();\n logger.log(`PostgreSQL is required. Make sure it is installed and running on ${dbHost}:${dbPort}.`);\n logger.break();\n\n // Step 2: prompt with up to 3 retry attempts\n const MAX_ATTEMPTS = 3;\n\n for (let attempt = 1; attempt <= MAX_ATTEMPTS; attempt++) {\n const attemptSuffix = attempt > 1 ? ` (attempt ${attempt}/${MAX_ATTEMPTS})` : \"\";\n\n const answers = await prompts([\n {\n type: \"text\",\n name: \"postgresUsername\",\n message: `Enter your Postgres username${attemptSuffix}`,\n initial: \"postgres\",\n },\n {\n type: \"password\",\n name: \"postgresPassword\",\n message: 'Enter your Postgres password (press Enter for \"postgres\")',\n },\n ]);\n\n // User cancelled (Ctrl+C)\n if (!answers.postgresUsername) {\n return { client: null, dbConnectionString: null };\n }\n\n const username = answers.postgresUsername as string;\n const password = (answers.postgresPassword as string) || \"postgres\";\n\n spinnerRef?.start(\"Connecting to database...\");\n\n try {\n const client = new pg.Client({\n user: username,\n password,\n host: dbHost,\n port: dbPort,\n database: \"postgres\",\n connectionTimeoutMillis: 5000,\n });\n await client.connect();\n return {\n client,\n dbConnectionString: formatConnectionString({\n user: username,\n password,\n host: dbHost,\n port: dbPort,\n db: dbName,\n }),\n };\n } catch (err) {\n spinnerRef?.stop();\n const message = err instanceof Error ? err.message : String(err);\n\n if (attempt < MAX_ATTEMPTS) {\n logger.warn(`Attempt ${attempt}/${MAX_ATTEMPTS} failed: ${message}`);\n } else {\n logger.error(\n `Couldn't connect to PostgreSQL: ${message}\\n` +\n ` → Is PostgreSQL running? Try: pg_isready -h ${dbHost} -p ${dbPort}\\n` +\n ` → Check your username, password, and that the server is accessible.`\n );\n }\n }\n }\n\n return { client: null, dbConnectionString: null };\n}\n\nasync function doesDbExist(\n client: pg.Client,\n dbName: string\n): Promise<boolean> {\n const result = await client.query(\n `SELECT datname FROM pg_catalog.pg_database WHERE datname='${dbName}';`\n );\n return (result.rowCount ?? 0) > 0;\n}\n\nfunction formatConnectionString({\n user,\n password,\n host,\n port = dbPort,\n db,\n}: {\n user: string;\n password: string;\n host: string;\n port?: number;\n db: string;\n}): string {\n const encodedPassword = encodeURIComponent(password);\n return `postgresql://${user}:${encodedPassword}@${host}:${port}/${db}`;\n}\n\nasync function runMigrations({ projectDir, spinner: parentSpinner }: DbSetupArgs): Promise<boolean> {\n const apiDir = path.join(projectDir, API_DIR);\n const packageManager = await getPackageManager(apiDir);\n const migrationSpinner = parentSpinner || spinner(\"Running migrations...\").start();\n\n const buildCmd = packageManager === \"yarn\"\n ? [\"yarn\", \"run\", \"build\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"run\", \"build\"]\n : packageManager === \"bun\"\n ? [\"bun\", \"run\", \"build\"]\n : [\"npm\", \"run\", \"build\"];\n\n const runnerCmd = packageManager === \"yarn\"\n ? [\"yarn\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"exec\"]\n : packageManager === \"bun\"\n ? [\"bunx\"]\n : [\"npx\"];\n\n try {\n // Build first - compiles TypeScript so ts-node is not needed\n migrationSpinner.text = \"Building project...\";\n await execa(buildCmd[0], buildCmd.slice(1), { cwd: apiDir });\n\n migrationSpinner.text = \"Running database migrations...\";\n await execa(runnerCmd[0], [...runnerCmd.slice(1), \"medusa\", \"db:migrate\"], { cwd: apiDir });\n\n if (!parentSpinner) {\n migrationSpinner.succeed(\"Migrations completed successfully.\");\n }\n return true;\n } catch (err) {\n migrationSpinner.fail(\"Failed to run migrations.\");\n logger.error(\n `Error running migrations${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return false;\n }\n}\n\nasync function createAdminInvite({ projectDir }: { projectDir: string }): Promise<string | null> {\n const apiDir = path.join(projectDir, API_DIR);\n const packageManager = await getPackageManager(apiDir);\n\n const runnerCmd = packageManager === \"yarn\"\n ? [\"yarn\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"exec\"]\n : packageManager === \"bun\"\n ? [\"bunx\"]\n : [\"npx\"];\n\n try {\n const result = await execa(runnerCmd[0], [...runnerCmd.slice(1), \"medusa\", \"user\", \"-e\", ADMIN_EMAIL, \"--invite\"], {\n cwd: apiDir,\n });\n\n // Parse token from stdout - same approach as Medusa CLI\n const match = result.stdout.match(/Invite token: (?<token>.+)/);\n return match?.groups?.token || null;\n } catch (err) {\n logger.error(\n `Error creating admin invite${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return null;\n }\n}\n\nasync function seedDatabase({ projectDir, spinner: parentSpinner }: DbSetupArgs): Promise<boolean> {\n const apiDir = path.join(projectDir, API_DIR);\n const packageManager = await getPackageManager(apiDir);\n const seedSpinner = parentSpinner || spinner(\"Seeding database...\").start();\n\n try {\n const seedCmd = packageManager === \"yarn\"\n ? [\"yarn\", \"seed\"]\n : packageManager === \"pnpm\"\n ? [\"pnpm\", \"run\", \"seed\"]\n : packageManager === \"bun\"\n ? [\"bun\", \"run\", \"seed\"]\n : [\"npm\", \"run\", \"seed\"];\n\n seedSpinner.text = \"Seeding database with demo data...\";\n await execa(seedCmd[0], seedCmd.slice(1), { cwd: apiDir });\n\n if (!parentSpinner) {\n seedSpinner.succeed(\"Database seeded successfully.\");\n }\n return true;\n } catch (err) {\n seedSpinner.fail(\"Failed to seed database.\");\n logger.error(\n `Error seeding database${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return false;\n }\n}\n","import { logger } from \"./logger\";\nimport { finishCommand } from \"../telemetry/command-tracking\";\n\nexport async function handleError(error: unknown) {\n await finishCommand(1, error);\n logger.break();\n logger.error(\n `Something went wrong. Please check the error below for more details.`\n );\n logger.error(`If the problem persists, please open an issue on GitHub.`);\n logger.error(\"\");\n\n if (typeof error === \"string\") {\n logger.error(error);\n } else if (error instanceof Error) {\n logger.error(error.message);\n }\n\n logger.break();\n process.exit(1);\n}\n","import path from \"path\";\n\nimport fs from \"fs-extra\";\n\nexport type ReleaseChannel = \"latest\" | \"rc\" | \"canary\";\n\nconst REGISTRY_URL = \"https://registry.npmjs.org\";\n\nconst DEPENDENCY_FIELDS = [\n \"dependencies\",\n \"devDependencies\",\n \"peerDependencies\",\n \"optionalDependencies\",\n] as const;\n\nexport function detectReleaseChannel(cliVersion: string): ReleaseChannel {\n if (cliVersion.includes(\"-canary\")) {\n return \"canary\";\n }\n\n if (cliVersion.includes(\"-rc\")) {\n return \"rc\";\n }\n\n return \"latest\";\n}\n\nexport async function resolveDistTag(\n packageName: string,\n channel: ReleaseChannel\n): Promise<string | null> {\n try {\n const res = await fetch(\n `${REGISTRY_URL}/-/package/${packageName}/dist-tags`\n );\n\n if (!res.ok) {\n return null;\n }\n\n const tags = (await res.json()) as Record<string, string>;\n return tags[channel] ?? null;\n } catch {\n return null;\n }\n}\n\nasync function collectPackageJsonPaths(dir: string): Promise<string[]> {\n const entries = await fs.readdir(dir, { withFileTypes: true });\n const results: string[] = [];\n\n for (const entry of entries) {\n if (entry.isDirectory()) {\n if (entry.name === \"node_modules\" || entry.name.startsWith(\".\")) {\n continue;\n }\n results.push(\n ...(await collectPackageJsonPaths(path.join(dir, entry.name)))\n );\n } else if (entry.name === \"package.json\") {\n results.push(path.join(dir, entry.name));\n }\n }\n\n return results;\n}\n\nfunction isMercurPackage(name: string): boolean {\n return name.startsWith(\"@mercurjs/\") || name === \"mercurjs\";\n}\n\n// The templates are the production starting point, so they pin stable\n// `@mercurjs/*` versions. When the user runs a pre-release of this CLI\n// (`create-mercur-app@canary`), those pins are repointed at the matching\n// dist-tag so the generated project matches the CLI that scaffolded it.\n// Returns the version everything was pinned to, or null if that channel has\n// no published release.\nexport async function applyReleaseChannel({\n projectDir,\n channel,\n}: {\n projectDir: string;\n channel: ReleaseChannel;\n}): Promise<string | null> {\n if (channel === \"latest\") {\n return null;\n }\n\n const packageJsonPaths = await collectPackageJsonPaths(projectDir);\n const resolved = new Map<string, string | null>();\n let pinnedVersion: string | null = null;\n\n for (const packageJsonPath of packageJsonPaths) {\n const packageJson = await fs.readJSON(packageJsonPath);\n let changed = false;\n\n for (const field of DEPENDENCY_FIELDS) {\n const deps = packageJson[field] as Record<string, string> | undefined;\n if (!deps) {\n continue;\n }\n\n for (const name of Object.keys(deps)) {\n if (!isMercurPackage(name)) {\n continue;\n }\n\n if (!resolved.has(name)) {\n resolved.set(name, await resolveDistTag(name, channel));\n }\n\n const version = resolved.get(name);\n if (!version) {\n continue;\n }\n\n pinnedVersion ??= version;\n\n if (deps[name] !== version) {\n deps[name] = version;\n changed = true;\n }\n }\n }\n\n if (changed) {\n await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 });\n }\n }\n\n return pinnedVersion;\n}\n\n// Medusa versions and the patches `@mercurjs/core` applies to them move in\n// lockstep, so the template has to come from the same commit as the packages\n// it pins. `main` runs ahead of the latest release and pins Medusa versions the\n// published `@mercurjs/core` does not support yet.\nexport async function resolveTemplateRef(\n channel: ReleaseChannel\n): Promise<string | null> {\n const version = await resolveDistTag(\"@mercurjs/core\", channel);\n return version ? `v${version}` : null;\n}\n","import { spawn } from \"node:child_process\";\nimport os from \"node:os\";\nimport { Readable } from \"node:stream\";\nimport { pipeline } from \"node:stream/promises\";\nimport path from \"path\";\n\nimport { Command } from \"commander\";\nimport { execa } from \"execa\";\nimport fs from \"fs-extra\";\nimport kleur from \"kleur\";\nimport open from \"open\";\nimport prompts from \"prompts\";\nimport { x } from \"tar\";\nimport terminalLink from \"terminal-link\";\nimport validateProjectName from \"validate-npm-package-name\";\nimport waitOn from \"wait-on\";\n\nimport packageJson from \"../../package.json\";\nimport { ErrorCategory, sendTelemetryEvent, showTelemetryNoticeIfNeeded } from \"../telemetry\";\nimport { finishCommand } from \"../telemetry/command-tracking\";\nimport { setupDatabase, type SetupDatabaseResult } from \"../utils/create-db\";\nimport {\n resolveProjectPackageManager,\n type PackageManager,\n} from \"../utils/get-package-manager\";\nimport { handleError } from \"../utils/handle-error\";\nimport { highlighter } from \"../utils/highlighter\";\nimport { logger } from \"../utils/logger\";\nimport { manageEnvFiles } from \"../utils/manage-env-files\";\nimport {\n applyReleaseChannel,\n detectReleaseChannel,\n resolveTemplateRef,\n type ReleaseChannel,\n} from \"../utils/release-channel\";\nimport { spinner } from \"../utils/spinner\";\n\nconst DEFAULT_BRANCH = \"main\";\nconst MIN_SUPPORTED_NODE_VERSION = 20;\n\nconst CREATE_TEMPLATES = {\n basic: {\n path: \"basic\",\n description: \"Full marketplace starter — sellers, products, orders, admin & vendor panels\",\n },\n // todo: uncomment registry template\n // registry: {\n // path: \"registry\",\n // description: \"Create and publish your own block registry\",\n // },\n plugin: {\n path: \"plugin\",\n description: \"MedusaJS plugin template — for building reusable marketplace extensions\",\n },\n} as const;\n\nexport const create = new Command()\n .name(\"create\")\n .description(\"create a new Mercur project\")\n .argument(\"[name]\", \"the name of your project\")\n .option(\n \"-t, --template <template>\",\n \"the template to use. e.g. basic, registry, or plugin\"\n )\n .option(\n \"-c, --cwd <cwd>\",\n \"the working directory. defaults to the current directory.\",\n process.cwd()\n )\n .option(\"--no-deps\", \"skip installing dependencies.\")\n .option(\"--skip-storefront\", \"skip adding the Next.js storefront.\", false)\n .option(\"--skip-db\", \"skip database configuration.\", false)\n .option(\"--skip-email\", \"deprecated: the email prompt was removed, this flag has no effect.\", false)\n .option(\n \"--tag <tag>\",\n \"the release channel to pin @mercurjs/* packages to: latest, rc, or canary. defaults to the channel of this CLI.\"\n )\n .option(\"--db-connection-string <string>\", \"PostgreSQL connection string.\")\n .option(\"--db-host <host>\", \"PostgreSQL host.\", \"localhost\")\n .option(\"--db-port <port>\", \"PostgreSQL port.\", \"5432\")\n .action(async (name, opts) => {\n try {\n const createStart = Date.now();\n validateNodeVersion();\n const channel = resolveChannel(opts.tag);\n showTelemetryNoticeIfNeeded();\n\n let projectName = name;\n if (!projectName) {\n const { enteredName } = await prompts({\n type: \"text\",\n name: \"enteredName\",\n message: \"What is your project named?\",\n initial: opts.template ? `${opts.template}-app` : \"my-mercur\",\n format: (value: string) => value.trim(),\n validate: (name) => {\n const validation = validateProjectName(\n path.basename(path.resolve(name))\n );\n if (validation.validForNewPackages) {\n return true;\n }\n return \"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore.\";\n },\n });\n\n if (!enteredName) {\n process.exit(0);\n }\n\n projectName = enteredName;\n }\n\n let template = opts.template;\n if (!template) {\n // todo: re-enable template selection once more templates are ready\n // const { selectedTemplate } = await prompts({\n // type: \"select\",\n // name: \"selectedTemplate\",\n // message: `Which ${highlighter.info(\n // \"template\"\n // )} would you like to use?`,\n // choices: Object.entries(CREATE_TEMPLATES).map(([key, tmpl]) => ({\n // title: key,\n // value: key,\n // description: tmpl.description,\n // })),\n // });\n //\n // if (!selectedTemplate) {\n // process.exit(0);\n // }\n //\n // template = selectedTemplate;\n template = \"basic\";\n }\n\n let addStorefront = false;\n if (template === \"basic\" && !opts.skipStorefront) {\n const { wantsStorefront } = await prompts({\n type: \"confirm\",\n name: \"wantsStorefront\",\n message: `Add a ${highlighter.info(\"Next.js storefront\")}?`,\n initial: true,\n });\n\n addStorefront = Boolean(wantsStorefront);\n }\n\n const projectDir = path.resolve(opts.cwd, projectName);\n\n await createOrFindProjectDir(projectDir);\n\n const downloadSpinner = spinner(\"Downloading template...\").start();\n // Fetch the repo tarball once, then extract each subpath from it locally\n // so opting into the storefront doesn't trigger a second network download.\n const { tarballPath, ref } = await downloadRepoTarball(\n await resolveTemplateRef(channel)\n );\n try {\n await extractTemplate({ tarballPath, ref, projectDir, template });\n downloadSpinner.succeed(\"Template downloaded successfully.\");\n\n if (addStorefront) {\n const storefrontSpinner = spinner(\"Adding Next.js storefront...\").start();\n try {\n await extractStorefront({ tarballPath, ref, projectDir });\n storefrontSpinner.succeed(\"Next.js storefront added successfully.\");\n } catch (error) {\n storefrontSpinner.fail(\n `Failed to add storefront${error instanceof Error ? `: ${error.message}` : \"\"}.`\n );\n }\n }\n } finally {\n await fs.remove(tarballPath).catch(() => null);\n }\n\n if (channel !== \"latest\") {\n const channelSpinner = spinner(\n `Pinning Mercur packages to the ${channel} release...`\n ).start();\n const pinned = await applyReleaseChannel({ projectDir, channel });\n if (pinned) {\n channelSpinner.succeed(`Mercur packages pinned to ${pinned}.`);\n } else {\n channelSpinner.warn(\n `No ${channel} release found — keeping the template's pinned versions.`\n );\n }\n }\n\n const packageManager = await resolveProjectPackageManager();\n await updateRootPackageJson(projectDir, projectName, packageManager);\n\n if (!opts.deps) {\n spinner(\"Dependency installation skipped.\").warn();\n } else {\n const initialInstallSpinner = spinner(\"Installing dependencies...\").start();\n const installStart = Date.now();\n const result = await installDeps({\n projectDir,\n packageManager,\n });\n const installDuration = ((Date.now() - installStart) / 1000).toFixed(1);\n if (result) {\n initialInstallSpinner.succeed(`Dependencies installed successfully in ${installDuration}s.`);\n } else {\n initialInstallSpinner.fail(`Failed to install dependencies`);\n await finishCommand(1, { name: ErrorCategory.INSTALL });\n process.exit(1);\n }\n }\n\n let dbConnectionString: string | undefined = opts.dbConnectionString;\n let dbResult: SetupDatabaseResult | undefined;\n\n if (!opts.skipDb) {\n const dbSpinner = spinner(\"Setting up database...\").start();\n dbResult = await setupDatabase({\n projectDir,\n projectName,\n dbConnectionString,\n dbHost: opts.dbHost,\n dbPort: parseInt(opts.dbPort, 10),\n spinner: dbSpinner,\n });\n\n if (dbResult.success) {\n if (dbResult.alreadyExists) {\n dbSpinner.warn(\n `Database ${highlighter.info(dbResult.dbName)} already exists. Skipping database creation.`\n );\n } else {\n dbSpinner.succeed(\n `Database ${highlighter.info(dbResult.dbName)} setup successfully.`\n );\n }\n dbConnectionString = dbResult.connectionString!;\n } else {\n dbSpinner.fail(\"Failed to setup database.\");\n logger.log(feedbackOutro());\n await finishCommand(1, { name: ErrorCategory.DATABASE });\n process.exit(1);\n }\n } else {\n spinner(\"Database setup skipped.\").warn();\n }\n\n await manageEnvFiles({\n projectDir,\n databaseUri: dbConnectionString,\n });\n\n await initGit(projectDir);\n\n await sendTelemetryEvent(\n {\n event: \"project_created\",\n properties: {\n template,\n package_manager: packageManager,\n with_storefront: addStorefront,\n skip_db: Boolean(opts.skipDb),\n },\n },\n { cwd: projectDir }\n );\n\n const totalDuration = ((Date.now() - createStart) / 1000).toFixed(1);\n spinner(`Mercur project successfully created! (${totalDuration}s)`).succeed();\n\n if (dbResult?.success) {\n spinner(\"Starting development server...\").info();\n\n const inviteUrl = dbResult.inviteToken\n ? `http://localhost:9000/dashboard/invite?token=${dbResult.inviteToken}&first_run=true`\n : \"http://localhost:9000/dashboard\";\n\n const devCmd = packageManager === \"npm\" ? \"npm\" : packageManager;\n const devArgs = packageManager === \"npm\" ? [\"run\", \"dev\"] : [\"dev\"];\n\n const serverProcess = spawn(devCmd, devArgs, {\n cwd: projectDir,\n stdio: \"inherit\",\n env: process.env,\n });\n\n const printRestartHint = () => {\n logger.break();\n logger.log(kleur.bgGreen(kleur.black(\" Project stopped. To start again: \")));\n logger.log(successMessage(projectDir, packageManager));\n logger.log(feedbackOutro());\n logger.break();\n };\n\n // Ctrl+C sends SIGINT to the whole process group (parent + child).\n // Suppress Node's default exit so we can wait for the child to close first.\n process.on(\"SIGINT\", () => { });\n\n serverProcess.on(\"close\", () => {\n printRestartHint();\n process.exit(0);\n });\n\n waitOn({\n resources: [\"http://localhost:9000/health\"],\n timeout: 60000,\n }).then(async () => {\n logger.break();\n logger.log(serverUrls());\n try {\n await open(inviteUrl);\n spinner(\"Admin panel opened in your browser.\").succeed();\n } catch {\n spinner(\"Open this URL in your browser to create your admin account:\").info();\n logger.log(highlighter.info(inviteUrl));\n }\n }).catch(() => {\n spinner(\"To create your admin account, visit:\").info();\n logger.log(highlighter.info(inviteUrl));\n });\n } else {\n logger.log(kleur.bgGreen(kleur.black(\" Next Steps \")));\n logger.log(successMessage(projectDir, packageManager));\n logger.log(feedbackOutro());\n logger.break();\n }\n } catch (error) {\n logger.break();\n handleError(error);\n }\n });\n\nfunction resolveChannel(tag?: string): ReleaseChannel {\n if (!tag) {\n return detectReleaseChannel(packageJson.version ?? \"\");\n }\n\n if (tag !== \"latest\" && tag !== \"rc\" && tag !== \"canary\") {\n throw new Error(\n `Unknown --tag \"${tag}\". Expected one of: latest, rc, canary.`\n );\n }\n\n return tag;\n}\n\nasync function createOrFindProjectDir(projectDir: string): Promise<void> {\n const pathExists = await fs.pathExists(projectDir);\n if (!pathExists) {\n await fs.mkdir(projectDir);\n return;\n }\n\n const files = await fs.readdir(projectDir);\n const nonHidden = files.filter((f) => !f.startsWith(\".\"));\n if (nonHidden.length > 0) {\n const { proceed } = await prompts({\n type: \"confirm\",\n name: \"proceed\",\n message: `Directory ${highlighter.info(path.basename(projectDir))} already exists and contains ${nonHidden.length} file(s). Continue and overwrite?`,\n initial: false,\n });\n\n if (!proceed) {\n process.exit(0);\n }\n }\n}\n\n// Downloads the repo tarball once to a temp file. Callers then extract whichever\n// subpaths they need from it locally, avoiding a network fetch per directory.\n// Falls back to the default branch when the release tag can't be fetched.\nasync function downloadRepoTarball(\n preferredRef: string | null\n): Promise<{ tarballPath: string; ref: string }> {\n const refs = preferredRef ? [preferredRef, DEFAULT_BRANCH] : [DEFAULT_BRANCH];\n\n for (const ref of refs) {\n const url = `https://codeload.github.com/mercurjs/mercur/tar.gz/${ref}`;\n const res = await fetch(url);\n\n if (!res.ok || !res.body) {\n if (ref !== DEFAULT_BRANCH) {\n continue;\n }\n throw new Error(`Failed to download: ${url}`);\n }\n\n const tarballPath = path.join(\n os.tmpdir(),\n `mercur-${ref.replaceAll(\"/\", \"-\")}-${process.pid}.tar.gz`\n );\n await pipeline(\n Readable.from(res.body as unknown as NodeJS.ReadableStream),\n fs.createWriteStream(tarballPath)\n );\n\n return { tarballPath, ref };\n }\n\n throw new Error(\"Failed to download the Mercur template.\");\n}\n\n// Extracts a single directory out of the local tarball. `strip` controls how many\n// leading path segments are removed so files land at the right place under `cwd`.\nasync function extractRepoDir({\n tarballPath,\n ref,\n cwd,\n repoPath,\n strip,\n}: {\n tarballPath: string;\n ref: string;\n cwd: string;\n repoPath: string;\n strip: number;\n}) {\n const branchDir = `mercur-${ref.replace(/^v/, \"\").replaceAll(\"/\", \"-\")}`;\n const filter = `${branchDir}/${repoPath}/`;\n\n await x({\n file: tarballPath,\n cwd,\n filter: (p) => p.includes(filter),\n strip,\n });\n}\n\nasync function extractTemplate({\n tarballPath,\n ref,\n projectDir,\n template,\n}: {\n tarballPath: string;\n ref: string;\n projectDir: string;\n template: keyof typeof CREATE_TEMPLATES;\n}) {\n const templatePath = CREATE_TEMPLATES[template].path;\n const repoPath = `templates/${templatePath}`;\n\n // Drop the branch dir + every segment of `repoPath` so the template root\n // becomes the project root.\n await extractRepoDir({\n tarballPath,\n ref,\n cwd: projectDir,\n repoPath,\n strip: 1 + repoPath.split(\"/\").length,\n });\n}\n\nasync function extractStorefront({\n tarballPath,\n ref,\n projectDir,\n}: {\n tarballPath: string;\n ref: string;\n projectDir: string;\n}) {\n await fs.ensureDir(path.join(projectDir, \"apps\"));\n\n // Drop only the branch dir so files keep their `apps/storefront/...` prefix\n // and land alongside the other workspace apps.\n await extractRepoDir({\n tarballPath,\n ref,\n cwd: projectDir,\n repoPath: \"apps/storefront\",\n strip: 1,\n });\n}\n\nasync function installDeps({\n projectDir,\n packageManager,\n}: {\n projectDir: string;\n packageManager: PackageManager;\n}): Promise<boolean> {\n let cmd = \"npm\";\n let args = [\"install\"];\n\n if (packageManager === \"yarn\") {\n cmd = \"yarn\";\n args = [];\n } else if (packageManager === \"pnpm\") {\n cmd = \"pnpm\";\n args = [\"install\"];\n } else if (packageManager === \"bun\") {\n cmd = \"bun\";\n args = [\"install\"];\n }\n\n try {\n await execa(cmd, args, {\n cwd: path.resolve(projectDir),\n stdin: \"inherit\",\n stdout: \"inherit\",\n stderr: \"inherit\",\n env: { ...process.env, npm_config_yes: \"true\" },\n });\n return true;\n } catch (err: unknown) {\n logger.error(\n `Error installing dependencies${err instanceof Error ? `: ${err.message}` : \"\"}.`\n );\n return false;\n }\n}\n\nfunction successMessage(\n projectDir: string,\n packageManager: PackageManager\n): string {\n const relativePath = path.relative(process.cwd(), projectDir);\n const header = (message: string) => kleur.bold(message);\n\n // todo: make sure the links are correct\n return `\n${header(\"Launch Application:\")}\n\n - cd ./${relativePath}\n - ${packageManager === \"npm\" ? \"npm run\" : packageManager} dev\n\n${header(\"Create your first seller:\")}\n\n Once the server is running, open the Vendor Panel and register at:\n ${highlighter.info(\"http://localhost:9000/seller/register\")}\n\n${header(\"Documentation:\")}\n\n - ${createTerminalLink(\"Getting Started\", \"https://docs.mercurjs.com/welcome\")}\n`;\n}\n\nfunction serverUrls(): string {\n const header = (message: string) => kleur.bold(message);\n return `\n${header(\"Your marketplace is running:\")}\n\n API: ${highlighter.info(\"http://localhost:9000\")}\n Admin Panel: ${highlighter.info(\"http://localhost:9000/dashboard\")}\n Vendor Panel: ${highlighter.info(\"http://localhost:9000/seller\")}\n\n${header(\"Create your first seller:\")}\n\n Open the Vendor Panel and register a new account at:\n ${highlighter.info(\"http://localhost:9000/seller/register\")}\n`;\n}\n\nfunction feedbackOutro(): string {\n return `${kleur.bgCyan(kleur.black(\" Have feedback? \"))} Visit us on ${createTerminalLink(\"GitHub\", \"https://github.com/mercurjs/mercur\")}.\\n${kleur.bgMagenta(kleur.black(\" Join the community! \"))} Chat with us on ${createTerminalLink(\"Discord\", \"https://discord.gg/hnZBzc4NJU\")}.`;\n}\n\nfunction createTerminalLink(text: string, url: string) {\n return terminalLink(text, url, {\n fallback: (text, url) => `${text}: ${kleur.cyan().underline(url)}`,\n });\n}\n\nasync function updateRootPackageJson(\n projectDir: string,\n projectName: string,\n packageManager: string\n): Promise<void> {\n const packageJsonPath = path.join(projectDir, \"package.json\");\n const packageJson = await fs.readJSON(packageJsonPath);\n\n packageJson.name = projectName;\n\n try {\n const { stdout: version } = await execa(packageManager, [\"--version\"]);\n packageJson.packageManager = `${packageManager}@${version.trim()}`;\n } catch {\n // A bare manager name is not a valid `packageManager` value — Turborepo and\n // corepack expect `name@version`. If the version lookup fails, keep the\n // template's default `packageManager` rather than writing an invalid value\n // that would break `turbo run` on the first command.\n }\n\n await fs.writeJSON(packageJsonPath, packageJson, { spaces: 2 });\n}\n\nasync function initGit(projectDir: string): Promise<void> {\n try {\n await execa(\"git\", [\"init\"], { cwd: projectDir });\n logger.info(\"Initialized a git repository.\");\n } catch {\n throw new Error(\"Failed to initialize git repository.\");\n }\n}\n\nfunction getNodeVersion(): number {\n const [major] = process.versions.node.split(\".\").map(Number);\n return major;\n}\n\nfunction validateNodeVersion(): void {\n const nodeVersion = getNodeVersion();\n if (nodeVersion < MIN_SUPPORTED_NODE_VERSION) {\n throw new Error(\n `Mercur requires at least v${MIN_SUPPORTED_NODE_VERSION} of Node.js. You're using v${nodeVersion}. Please install at least v${MIN_SUPPORTED_NODE_VERSION} and try again: https://nodejs.org/en/download`\n );\n }\n}\n"]}