create-mercur-app 2.2.0-canary.40
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -0
- package/dist/chunk-VYHAHC4Y.js +36 -0
- package/dist/chunk-VYHAHC4Y.js.map +1 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -0
- package/dist/lib.d.ts +5 -0
- package/dist/lib.js +2 -0
- package/dist/lib.js.map +1 -0
- package/package.json +68 -0
package/README.md
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
# create-mercur-app
|
|
2
|
+
|
|
3
|
+
The fastest way to start a new [Mercur](https://mercurjs.com) marketplace project.
|
|
4
|
+
|
|
5
|
+
## Usage
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm create mercur-app@latest
|
|
9
|
+
# or
|
|
10
|
+
bun create mercur-app
|
|
11
|
+
# or
|
|
12
|
+
pnpm create mercur-app
|
|
13
|
+
# or
|
|
14
|
+
yarn create mercur-app
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
You can also pass a project name and options directly:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm create mercur-app@latest my-marketplace -- --template basic
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Options
|
|
24
|
+
|
|
25
|
+
| Option | Description |
|
|
26
|
+
| --- | --- |
|
|
27
|
+
| `-t, --template <template>` | Template to use (`basic` or `plugin`) |
|
|
28
|
+
| `-c, --cwd <cwd>` | Working directory (defaults to the current directory) |
|
|
29
|
+
| `--no-deps` | Skip installing dependencies |
|
|
30
|
+
| `--skip-db` | Skip database configuration |
|
|
31
|
+
| `--db-connection-string <string>` | PostgreSQL connection string |
|
|
32
|
+
| `--db-host <host>` | PostgreSQL host (default `localhost`) |
|
|
33
|
+
| `--db-port <port>` | PostgreSQL port (default `5432`) |
|
|
34
|
+
|
|
35
|
+
## Documentation
|
|
36
|
+
|
|
37
|
+
Visit [docs.mercurjs.com](https://docs.mercurjs.com) to learn more.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import {spawn,execSync}from'child_process';import {Readable}from'stream';import {pipeline}from'stream/promises';import h,{join}from'path';import {Command}from'commander';import {execa}from'execa';import w from'fs-extra';import y from'kleur';import ze from'open';import P from'prompts';import {x as x$1}from'tar';import Qe from'terminal-link';import Xe from'validate-npm-package-name';import Ze from'wait-on';import {detect}from'@antfu/ni';import {createHash}from'crypto';import {existsSync,readFileSync,mkdirSync,writeFileSync}from'fs';import {homedir}from'os';import Ie from'ora';import O from'pg';var C={name:"create-mercur-app",version:"2.2.0-canary.40",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":"^27.0.1",commander:"^14.0.2",execa:"^9.6.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":"^7.0.2","wait-on":"^9.0.3"},devDependencies:{"@types/fs-extra":"^11.0.4","@types/pg":"^8.16.0","@types/prompts":"^2.4.9","@types/tar":"^6.1.13","@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 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 fe=["bun","yarn","pnpm","deno","npm"];function G(e){if(e)return fe.find(t=>e.startsWith(t))}function H(){return G(process.env.npm_config_user_agent)}async function R(e){try{return await execa(e,["--version"]),!0}catch{return false}}async function E(e){let t=G(await detect({programmatic:true,cwd:e}));if(t&&await R(t))return t;let n=H();return n&&await R(n)?n:"npm"}async function K(){let e=H();return e&&await R(e)?e:"npm"}var k=e=>Function("mm","return import(mm)")(e);function ye(){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 z(){try{let e=await k("os"),t=e.cpus();return {deploymentVendor:ye(),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 we(),isDocker:await q(),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 we(){try{if(typeof process>"u"||process?.platform!=="linux")return !1;let e=await k("fs");return (await k("os")).release().toLowerCase().includes("microsoft")?!await W():e.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!await W():!1}catch{return false}}var he=async()=>{try{return (await k("fs")).statSync("/run/.containerenv"),!0}catch{return false}};async function q(){return await be()||await Ee()}async function be(){try{return (await k("fs")).statSync("/.dockerenv"),!0}catch{return false}}async function Ee(){try{return (await k("fs")).readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return false}}async function W(){return await he()||await q()}var $=e=>createHash("sha256").update(e).digest("base64");var X=join(homedir(),".mercur"),M=join(X,"config.json"),j={telemetry_enabled:true,telemetry_email:null,notice_shown:false},N=class{get(t){return this.read()[t]}set(t,n){let r=this.read();r[t]=n,this.write(r);}read(){try{if(!existsSync(M))return {...j};let t=readFileSync(M,"utf-8"),n=JSON.parse(t);return {...j,...n}}catch{return {...j}}}write(t){try{mkdirSync(X,{recursive:!0}),writeFileSync(M,JSON.stringify(t,null,2)+`
|
|
2
|
+
`,{mode:384});}catch{}}},S=new N;var _e=process.env.MERCUR_TELEMETRY_PROXY_URL||"https://telemetry.mercurjs.com/api/v1/events",te=e=>{S.set("telemetry_email",e);},Ae="https://docs.mercurjs.com/telemetry",ne=()=>{S.get("notice_shown")||(S.set("notice_shown",true),process.env.MERCUR_DISABLE_TELEMETRY!=="true"&&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(Ae)}`,""].join(`
|
|
3
|
+
`)));},Ce=()=>S.get("telemetry_enabled")&&process.env.MERCUR_DISABLE_TELEMETRY!=="true",x=async(e,t)=>{try{if(!Ce())return;let n=await je(t.cwd),r={nodeEnv:process.env.NODE_ENV||"development",nodeVersion:process.version,mercurVersion:n.mercurVersion,medusaVersion:n.medusaVersion,isSrcDir:n.isSrcDir,aliasPrefix:n.aliasPrefix,config:n.config,projectId:$e(t.cwd),systemInfo:await z(),packageManager:await E(t.cwd),email:Me()};await fetch(_e,{body:JSON.stringify({...r,...e}),headers:{"Content-Type":"application/json"},method:"post"});}catch{}},Re=()=>{try{let e=execSync("git config --local --get remote.origin.url",{stdio:"pipe",timeout:1e3});return String(e).trim()}catch{return null}},$e=e=>{let t=Re();return t?$(t):$(e)},Me=()=>S.get("telemetry_email")||void 0;async function je(e){let t=async g=>{try{return await w.readJSON(h.join(e,g))}catch{return null}},[n,r,s,o,c]=await Promise.all([w.pathExists(h.join(e,"src")),t("package.json"),t("packages/api/package.json"),t("blocks.json"),t("tsconfig.json")]),l=g=>g?.dependencies??{},u=g=>l(r)[g]??l(s)[g]??null,b=(c?.compilerOptions??{}).paths??{},i=Object.keys(b)[0],m=i?i.includes("*")?i.replace("/*",""):i.replace("/",""):null;return {isSrcDir:n,aliasPrefix:m,medusaVersion:u("@medusajs/framework"),mercurVersion:u("@mercurjs/cli"),config:o}}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 L=({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[c]=o.split("=");if(c)return c==="DATABASE_URL"&&(o=`DATABASE_URL=${t||"postgresql://localhost:5432/your-database-name"}`),n.has(c)?null:(n.add(c),o)}).filter(Boolean).join(`
|
|
6
|
+
`)},Ne=[{path:"packages/api"},{path:"apps/vendor"},{path:"apps/admin"}];async function T({projectDir:e,databaseUri:t}){try{await Promise.all(Ne.map(async({path:n})=>{let r=h.join(e,n);if(!w.existsSync(r))return;let s=h.join(r,".env.template"),o=h.join(r,".env");if(!n.includes("api")){w.existsSync(s)&&!w.existsSync(o)&&await w.copy(s,o);return}let l="";if(w.existsSync(s)){let u=await w.readFile(s,"utf8");l=L({contents:u,databaseUri:t});}if(w.existsSync(o)){let u=await w.readFile(o,"utf8"),d=L({contents:u,databaseUri:t});await w.writeFile(o,d);}else {let u=L({contents:l,databaseUri:t});await w.writeFile(o,u);}}));}catch(n){a.error("Unable to manage environment files"),n instanceof Error&&a.error(n.message),process.exit(1);}}function f(e,t){return Ie({text:e,isSilent:false})}var Oe="localhost",oe=5432,F="packages/api",Ue="admin@mercur-test.com";async function ae(e){let t=e.projectName.replace(/[^a-zA-Z0-9]/g,"-"),{client:n,dbConnectionString:r}=await Fe({dbConnectionString:e.dbConnectionString,dbHost:e.dbHost??Oe,dbPort:e.dbPort??oe,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 Ye(n,t)?(await n.end(),re({...e,dbName:t,connectionString:r,alreadyExists:!0})):(e.spinner&&(e.spinner.text=`Creating database "${t}"...`),await n.query(`CREATE DATABASE "${t}"`),await n.end(),re({...e,dbName:t,connectionString:r,alreadyExists:!1}))}catch(s){return a.error(`Error creating database${s instanceof Error?`: ${s.message}`:""}.`),await n.end().catch(()=>{}),{success:false,dbName:t,connectionString:null}}}async function re(e){let{projectDir:t,spinner:n,dbName:r,connectionString:s,alreadyExists:o}=e;if(await T({projectDir:t,databaseUri:s}),!await Ve({projectDir:t,spinner:n}))return {success:false,dbName:r,connectionString:null};if(!await Je({projectDir:t,spinner:n}))return {success:false,dbName:r,connectionString:null};let u=await Be({projectDir:t});return {success:true,dbName:r,connectionString:s,alreadyExists:o,inviteToken:u}}async function Fe({dbConnectionString:e,dbHost:t,dbPort:n,dbName:r,spinner:s}){if(e)try{let c=new O.Client({connectionString:e});return await c.connect(),{client:c,dbConnectionString:e}}catch(c){return a.error(`Invalid database connection string${c instanceof Error?`: ${c.message}`:""}.`),{client:null,dbConnectionString:null}}s&&(s.text=`Trying default connection (postgres@${t}:${n})...`);try{let c=new O.Client({user:"postgres",password:"",host:t,port:n,database:"postgres",connectionTimeoutMillis:5e3});return await c.connect(),{client:c,dbConnectionString:se({user:"postgres",password:"",host:t,port:n,db:r})}}catch{}s?.stop(),a.break(),a.log(`PostgreSQL is required. Make sure it is installed and running on ${t}:${n}.`),a.break();let o=3;for(let c=1;c<=o;c++){let l=c>1?` (attempt ${c}/${o})`:"",u=await P([{type:"text",name:"postgresUsername",message:`Enter your Postgres username${l}`,initial:"postgres"},{type:"password",name:"postgresPassword",message:'Enter your Postgres password (press Enter for "postgres")'}]);if(!u.postgresUsername)return {client:null,dbConnectionString:null};let d=u.postgresUsername,b=u.postgresPassword||"postgres";s?.start("Connecting to database...");try{let i=new O.Client({user:d,password:b,host:t,port:n,database:"postgres",connectionTimeoutMillis:5e3});return await i.connect(),{client:i,dbConnectionString:se({user:d,password:b,host:t,port:n,db:r})}}catch(i){s?.stop();let m=i instanceof Error?i.message:String(i);c<o?a.warn(`Attempt ${c}/${o} failed: ${m}`):a.error(`Couldn't connect to PostgreSQL: ${m}
|
|
7
|
+
\u2192 Is PostgreSQL running? Try: pg_isready -h ${t} -p ${n}
|
|
8
|
+
\u2192 Check your username, password, and that the server is accessible.`);}}return {client:null,dbConnectionString:null}}async function Ye(e,t){return ((await e.query(`SELECT datname FROM pg_catalog.pg_database WHERE datname='${t}';`)).rowCount??0)>0}function se({user:e,password:t,host:n,port:r=oe,db:s}){let o=encodeURIComponent(t);return `postgresql://${e}:${o}@${n}:${r}/${s}`}async function Ve({projectDir:e,spinner:t}){let n=h.join(e,F),r=await E(n),s=t||f("Running migrations...").start(),o=r==="yarn"?["yarn","run","build"]:r==="pnpm"?["pnpm","run","build"]:r==="bun"?["bun","run","build"]:["npm","run","build"],c=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(c[0],[...c.slice(1),"medusa","db:migrate"],{cwd:n}),t||s.succeed("Migrations completed successfully."),!0}catch(l){return s.fail("Failed to run migrations."),a.error(`Error running migrations${l instanceof Error?`: ${l.message}`:""}.`),false}}async function Be({projectDir:e}){let t=h.join(e,F),n=await E(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",Ue,"--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 Je({projectDir:e,spinner:t}){let n=h.join(e,F),r=await E(n),s=t||f("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}}function ie(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 et=C.version?.includes("-canary")||C.version?.includes("-rc"),ce=et?"canary":"main",Y=20,pe={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"}},kn=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-db","skip database configuration.",false).option("--skip-email","skip email prompt.",false).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();lt(),ne();let r=e;if(!r){let{enteredName:i}=await P({type:"text",name:"enteredName",message:"What is your project named?",initial:t.template?`${t.template}-app`:"my-mercur",format:m=>m.trim(),validate:m=>Xe(h.basename(h.resolve(m))).validForNewPackages?!0:"Invalid project name. Name should be lowercase, URL-friendly, and not start with a period or underscore."});i||process.exit(0),r=i;}let s=t.template;if(!s){let{selectedTemplate:i}=await P({type:"select",name:"selectedTemplate",message:`Which ${p.info("template")} would you like to use?`,choices:Object.entries(pe).map(([m,g])=>({title:m,value:m,description:g.description}))});i||process.exit(0),s=i;}if(!t.skipEmail){let{wantsEmail:i}=await P({type:"confirm",name:"wantsEmail",message:"Mind sharing your email? We reach out for priority support, community events, and invite-only meetups. We never spam.",initial:!1});if(i){let{email:m}=await P({type:"text",name:"email",message:"Enter your email:",format:g=>g.trim()});m&&te(m);}}let o=h.resolve(t.cwd,r);await tt(o);let c=f("Downloading template...").start();await nt({projectDir:o,template:s}),c.succeed("Template downloaded successfully.");let l=await K();if(await at(o,r,l),!t.deps)f("Dependency installation skipped.").warn();else {let i=f("Installing dependencies...").start(),m=Date.now(),g=await st({projectDir:o,packageManager:l}),A=((Date.now()-m)/1e3).toFixed(1);g?i.succeed(`Dependencies installed successfully in ${A}s.`):(i.fail("Failed to install dependencies"),await x({type:"create",payload:{outcome:"dependency_installation_failed",packageManager:l}},{cwd:o}),process.exit(1));}let u=t.dbConnectionString,d;if(t.skipDb)f("Database setup skipped.").warn();else {let i=f("Setting up database...").start();d=await ae({projectDir:o,projectName:r,dbConnectionString:u,dbHost:t.dbHost,dbPort:parseInt(t.dbPort,10),spinner:i}),d.success?(d.alreadyExists?i.warn(`Database ${p.info(d.dbName)} already exists. Skipping database creation.`):i.succeed(`Database ${p.info(d.dbName)} setup successfully.`),u=d.connectionString):(i.fail("Failed to setup database."),a.log(V()),await x({type:"create",payload:{outcome:"database_setup_failed"}},{cwd:o}),process.exit(1));}await T({projectDir:o,databaseUri:u}),await it(o),await x({type:"create",payload:{outcome:"created"}},{cwd:o});let b=((Date.now()-n)/1e3).toFixed(1);if(f(`Mercur project successfully created! (${b}s)`).succeed(),d?.success){f("Starting development server...").info();let i=d.inviteToken?`http://localhost:9000/dashboard/invite?token=${d.inviteToken}&first_run=true`:"http://localhost:9000/dashboard",A=spawn(l==="npm"?"npm":l,l==="npm"?["run","dev"]:["dev"],{cwd:o,stdio:"inherit",env:process.env}),ue=()=>{a.break(),a.log(y.bgGreen(y.black(" Project stopped. To start again: "))),a.log(le(o,l)),a.log(V()),a.break();};process.on("SIGINT",()=>{}),A.on("close",()=>{ue(),process.exit(0);}),Ze({resources:["http://localhost:9000/health"],timeout:6e4}).then(async()=>{a.break(),a.log(ot());try{await ze(i),f("Admin panel opened in your browser.").succeed();}catch{f("Open this URL in your browser to create your admin account:").info(),a.log(p.info(i));}}).catch(()=>{f("To create your admin account, visit:").info(),a.log(p.info(i));});}else a.log(y.bgGreen(y.black(" Next Steps "))),a.log(le(o,l)),a.log(V()),a.break();}catch(n){a.break(),ie(n);}});async function tt(e){if(!await w.pathExists(e)){await w.mkdir(e);return}let r=(await w.readdir(e)).filter(s=>!s.startsWith("."));if(r.length>0){let{proceed:s}=await P({type:"confirm",name:"proceed",message:`Directory ${p.info(h.basename(e))} already exists and contains ${r.length} file(s). Continue and overwrite?`,initial:false});s||process.exit(0);}}async function nt({projectDir:e,template:t}){let n=`https://codeload.github.com/mercurjs/mercur/tar.gz/${ce}`,r=pe[t].path,s=`mercur-${ce.replace(/^v/,"").replaceAll("/","-")}/templates/${r}/`;await pipeline(await rt(n),x$1({cwd:e,filter:o=>o.includes(s),strip:2+r.split("/").length}));}async function rt(e){let t=await fetch(e);if(!t.body)throw new Error(`Failed to download: ${e}`);return Readable.from(t.body)}async function st({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:h.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 le(e,t){let n=h.relative(process.cwd(),e),r=s=>y.bold(s);return `
|
|
9
|
+
${r("Launch Application:")}
|
|
10
|
+
|
|
11
|
+
- cd ./${n}
|
|
12
|
+
- ${t==="npm"?"npm run":t} dev
|
|
13
|
+
|
|
14
|
+
${r("Create your first seller:")}
|
|
15
|
+
|
|
16
|
+
Once the server is running, open the Vendor Panel and register at:
|
|
17
|
+
${p.info("http://localhost:9000/seller/register")}
|
|
18
|
+
|
|
19
|
+
${r("Documentation:")}
|
|
20
|
+
|
|
21
|
+
- ${B("Getting Started","https://docs.mercurjs.com/welcome")}
|
|
22
|
+
`}function ot(){let e=t=>y.bold(t);return `
|
|
23
|
+
${e("Your marketplace is running:")}
|
|
24
|
+
|
|
25
|
+
API: ${p.info("http://localhost:9000")}
|
|
26
|
+
Admin Panel: ${p.info("http://localhost:9000/dashboard")}
|
|
27
|
+
Vendor Panel: ${p.info("http://localhost:9000/seller")}
|
|
28
|
+
|
|
29
|
+
${e("Create your first seller:")}
|
|
30
|
+
|
|
31
|
+
Open the Vendor Panel and register a new account at:
|
|
32
|
+
${p.info("http://localhost:9000/seller/register")}
|
|
33
|
+
`}function V(){return `${y.bgCyan(y.black(" Have feedback? "))} Visit us on ${B("GitHub","https://github.com/mercurjs/mercur")}.
|
|
34
|
+
${y.bgMagenta(y.black(" Join the community! "))} Chat with us on ${B("Discord","https://discord.gg/hnZBzc4NJU")}.`}function B(e,t){return Qe(e,t,{fallback:(n,r)=>`${n}: ${y.cyan().underline(r)}`})}async function at(e,t,n){let r=h.join(e,"package.json"),s=await w.readJSON(r);s.name=t;try{let{stdout:o}=await execa(n,["--version"]);s.packageManager=`${n}@${o.trim()}`;}catch{s.packageManager=n;}await w.writeJSON(r,s,{spaces:2});}async function it(e){try{await execa("git",["init"],{cwd:e}),a.info("Initialized a git repository.");}catch{throw new Error("Failed to initialize git repository.")}}function ct(){let[e]=process.versions.node.split(".").map(Number);return e}function lt(){let e=ct();if(e<Y)throw new Error(`Mercur requires at least v${Y} of Node.js. You're using v${e}. Please install at least v${Y} and try again: https://nodejs.org/en/download`)}
|
|
35
|
+
export{C as a,kn as b};//# sourceMappingURL=chunk-VYHAHC4Y.js.map
|
|
36
|
+
//# sourceMappingURL=chunk-VYHAHC4Y.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../package.json","../src/utils/highlighter.ts","../src/utils/get-package-manager.ts","../src/telemetry/detect-system-info.ts","../src/telemetry/hash.ts","../src/telemetry/store.ts","../src/telemetry/index.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/commands/create.ts"],"names":["package_default","highlighter","text","kleur","SUPPORTED_PACKAGE_MANAGERS","normalizePackageManager","value","pm","getPackageManagerFromUserAgent","isPackageManagerInstalled","packageManager","execa","getPackageManager","targetDir","detected","detect","fromUserAgent","resolveProjectPackageManager","importRuntime","m","getVendor","hasAny","keys","k","detectSystemInfo","os","cpus","isWsl","isDocker","fs","isInsideContainer","hasContainerEnv","hasDockerEnv","hasDockerCGroup","hashToBase64","input","createHash","CONFIG_DIR","join","homedir","CONFIG_PATH","DEFAULTS","ConfigStore","key","config","existsSync","raw","readFileSync","parsed","mkdirSync","writeFileSync","configStore","TELEMETRY_URL","setTelemetryEmail","email","TELEMETRY_DOCS_URL","showTelemetryNoticeIfNeeded","isTelemetryEnabled","sendTelemetryEvent","event","options","projectInfo","getProjectInfo","baseEvent","getProjectId","getTelemetryEmail","getGitID","originBuffer","execSync","cwd","gitID","readJson","relPath","path","isSrcDir","rootPkg","apiPkg","tsconfig","dependenciesOf","pkg","findDep","name","paths","firstPath","aliasPrefix","logger","args","sanitizeEnv","contents","databaseUri","seenKeys","withDefaults","line","APP_PATHS","manageEnvFiles","projectDir","appPath","appDir","envTemplatePath","envPath","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","spinnerRef","pg","error","formatConnectionString","MAX_ATTEMPTS","attempt","attemptSuffix","answers","prompts","username","password","message","user","host","port","db","encodedPassword","parentSpinner","apiDir","migrationSpinner","buildCmd","runnerCmd","seedSpinner","seedCmd","handleError","IS_PRERELEASE","DEFAULT_BRANCH","MIN_SUPPORTED_NODE_VERSION","CREATE_TEMPLATES","create","Command","opts","createStart","validateNodeVersion","projectName","enteredName","validateProjectName","template","selectedTemplate","tmpl","wantsEmail","createOrFindProjectDir","downloadSpinner","downloadTemplate","updateRootPackageJson","initialInstallSpinner","installStart","result","installDeps","installDuration","dbResult","dbSpinner","feedbackOutro","initGit","totalDuration","inviteUrl","serverProcess","spawn","printRestartHint","successMessage","waitOn","serverUrls","open","nonHidden","f","proceed","url","templatePath","filter","pipeline","downloadTarStream","x","p","res","Readable","cmd","relativePath","header","createTerminalLink","terminalLink","packageJsonPath","packageJson","version","getNodeVersion","major","nodeVersion"],"mappings":"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","file":"chunk-VYHAHC4Y.js","sourcesContent":["{\n \"name\": \"create-mercur-app\",\n \"version\": \"2.2.0-canary.40\",\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\": \"^27.0.1\",\n \"commander\": \"^14.0.2\",\n \"execa\": \"^9.6.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\": \"^7.0.2\",\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\": \"^6.1.13\",\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 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","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","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\nexport const hashToBase64 = (input: string): string => {\n return createHash(\"sha256\").update(input).digest(\"base64\");\n};\n","import { existsSync, mkdirSync, readFileSync, writeFileSync } from \"fs\";\nimport { homedir } from \"os\";\nimport { join } from \"path\";\n\ninterface TelemetryConfig {\n telemetry_enabled: boolean;\n telemetry_email: string | null;\n notice_shown: boolean;\n}\n\nconst CONFIG_DIR = join(homedir(), \".mercur\");\nconst CONFIG_PATH = join(CONFIG_DIR, \"config.json\");\n\nconst DEFAULTS: TelemetryConfig = {\n telemetry_enabled: true,\n telemetry_email: null,\n notice_shown: false,\n};\n\nclass ConfigStore {\n get<K extends keyof TelemetryConfig>(key: K): TelemetryConfig[K] {\n const config = this.read();\n return config[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 private read(): TelemetryConfig {\n try {\n if (!existsSync(CONFIG_PATH)) {\n return { ...DEFAULTS };\n }\n const raw = readFileSync(CONFIG_PATH, \"utf-8\");\n const parsed = JSON.parse(raw);\n return { ...DEFAULTS, ...parsed };\n } catch {\n return { ...DEFAULTS };\n }\n }\n\n private write(config: TelemetryConfig): void {\n try {\n mkdirSync(CONFIG_DIR, { recursive: true });\n writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2) + \"\\n\", {\n mode: 0o600,\n });\n } catch {\n // Silently fail — 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 { highlighter } from \"../utils/highlighter\";\nimport { getPackageManager } from \"../utils/get-package-manager\";\nimport { detectSystemInfo } from \"./detect-system-info\";\nimport { hashToBase64 } from \"./hash\";\nimport { configStore } from \"./store\";\n\nconst TELEMETRY_URL =\n process.env.MERCUR_TELEMETRY_PROXY_URL ||\n \"https://telemetry.mercurjs.com/api/v1/events\";\n\nexport interface TelemetryEvent {\n type: string;\n payload?: Record<string, unknown>;\n}\n\nexport const setTelemetryEmail = (email: string) => {\n configStore.set(\"telemetry_email\", email);\n};\n\nexport const TELEMETRY_DOCS_URL = \"https://docs.mercurjs.com/telemetry\";\n\nexport const showTelemetryNoticeIfNeeded = () => {\n if (configStore.get(\"notice_shown\")) {\n return;\n }\n\n configStore.set(\"notice_shown\", true);\n\n if (process.env.MERCUR_DISABLE_TELEMETRY === \"true\") {\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 isTelemetryEnabled = () => {\n return (\n configStore.get(\"telemetry_enabled\") &&\n process.env.MERCUR_DISABLE_TELEMETRY !== \"true\"\n );\n};\n\nexport const sendTelemetryEvent = async (\n event: TelemetryEvent,\n options: { cwd: string }\n) => {\n try {\n if (!isTelemetryEnabled()) {\n return;\n }\n\n const projectInfo = await getProjectInfo(options.cwd);\n\n const baseEvent = {\n nodeEnv: process.env.NODE_ENV || \"development\",\n nodeVersion: process.version,\n mercurVersion: projectInfo.mercurVersion,\n medusaVersion: projectInfo.medusaVersion,\n isSrcDir: projectInfo.isSrcDir,\n aliasPrefix: projectInfo.aliasPrefix,\n config: projectInfo.config,\n projectId: getProjectId(options.cwd),\n systemInfo: await detectSystemInfo(),\n packageManager: await getPackageManager(options.cwd),\n email: getTelemetryEmail(),\n };\n\n await fetch(TELEMETRY_URL, {\n body: JSON.stringify({ ...baseEvent, ...event }),\n headers: {\n \"Content-Type\": \"application/json\",\n },\n method: \"post\",\n });\n } catch {\n // Eat any errors in sending telemetry event\n }\n};\n\nconst getGitID = () => {\n try {\n const originBuffer = execSync(\n \"git config --local --get remote.origin.url\",\n {\n stdio: \"pipe\",\n timeout: 1000,\n }\n );\n\n return String(originBuffer).trim();\n } catch {\n return null;\n }\n};\n\nconst getProjectId = (cwd: string): string => {\n const gitID = getGitID();\n if (gitID) {\n return hashToBase64(gitID);\n }\n\n return hashToBase64(cwd);\n};\n\nexport const getTelemetryEmail = () => {\n return configStore.get(\"telemetry_email\") || undefined;\n};\n\ninterface ProjectInfo {\n isSrcDir: boolean;\n aliasPrefix: string | null;\n medusaVersion: string | null;\n config: unknown;\n mercurVersion: string | null;\n}\n\n/**\n * Lightweight project introspection for freshly scaffolded projects. The full\n * CLI resolves this via tsconfig-paths/fast-glob/cosmiconfig; here the project\n * always has the template layout, so plain file reads at known paths suffice\n * and keep this package's dependency tree minimal.\n */\nasync function getProjectInfo(cwd: string): Promise<ProjectInfo> {\n const readJson = async (relPath: string): Promise<Record<string, unknown> | null> => {\n try {\n return await fs.readJSON(path.join(cwd, relPath));\n } catch {\n return null;\n }\n };\n\n const [isSrcDir, rootPkg, apiPkg, config, tsconfig] = await Promise.all([\n fs.pathExists(path.join(cwd, \"src\")),\n readJson(\"package.json\"),\n readJson(\"packages/api/package.json\"),\n readJson(\"blocks.json\"),\n readJson(\"tsconfig.json\"),\n ]);\n\n const dependenciesOf = (pkg: Record<string, unknown> | null) =>\n (pkg?.dependencies ?? {}) as Record<string, string | undefined>;\n\n const findDep = (name: string): string | null =>\n dependenciesOf(rootPkg)[name] ?? dependenciesOf(apiPkg)[name] ?? null;\n\n const compilerOptions = (tsconfig?.compilerOptions ?? {}) as {\n paths?: Record<string, unknown>;\n };\n const paths = compilerOptions.paths ?? {};\n const firstPath = Object.keys(paths)[0];\n const aliasPrefix = firstPath\n ? firstPath.includes(\"*\")\n ? firstPath.replace(\"/*\", \"\")\n : firstPath.replace(\"/\", \"\")\n : null;\n\n return {\n isSrcDir,\n aliasPrefix,\n medusaVersion: findDep(\"@medusajs/framework\"),\n mercurVersion: findDep(\"@mercurjs/cli\"),\n config,\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 APP_PATHS = [\n { path: \"packages/api\" },\n { path: \"apps/vendor\" },\n { path: \"apps/admin\" },\n];\n\nexport async function manageEnvFiles({\n projectDir,\n databaseUri,\n}: {\n projectDir: string;\n databaseUri?: 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 // 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 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}\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 return {\n success: true,\n dbName,\n connectionString,\n alreadyExists,\n inviteToken,\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\";\n\nexport function handleError(error: unknown) {\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 { spawn } from \"node:child_process\";\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 {\n sendTelemetryEvent,\n setTelemetryEmail,\n showTelemetryNoticeIfNeeded,\n} from \"../telemetry\";\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 { spinner } from \"../utils/spinner\";\n\nconst IS_PRERELEASE =\n packageJson.version?.includes(\"-canary\") || packageJson.version?.includes(\"-rc\");\nconst DEFAULT_BRANCH = IS_PRERELEASE ? \"canary\" : \"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-db\", \"skip database configuration.\", false)\n .option(\"--skip-email\", \"skip email prompt.\", false)\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 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 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 }\n\n if (!opts.skipEmail) {\n const { wantsEmail } = await prompts({\n type: \"confirm\",\n name: \"wantsEmail\",\n message: \"Mind sharing your email? We reach out for priority support, community events, and invite-only meetups. We never spam.\",\n initial: false,\n });\n\n if (wantsEmail) {\n const { email } = await prompts({\n type: \"text\",\n name: \"email\",\n message: \"Enter your email:\",\n format: (value: string) => value.trim(),\n });\n\n if (email) {\n setTelemetryEmail(email);\n }\n }\n }\n\n const projectDir = path.resolve(opts.cwd, projectName);\n\n await createOrFindProjectDir(projectDir);\n\n const downloadSpinner = spinner(\"Downloading template...\").start();\n await downloadTemplate({\n projectDir,\n template: template,\n });\n downloadSpinner.succeed(\"Template downloaded successfully.\");\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 sendTelemetryEvent({\n type: 'create',\n payload: {\n outcome: 'dependency_installation_failed',\n packageManager,\n }\n }, {\n cwd: projectDir,\n })\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 sendTelemetryEvent({\n type: 'create',\n payload: {\n outcome: 'database_setup_failed',\n }\n }, { cwd: projectDir });\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 type: 'create',\n payload: {\n outcome: 'created'\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\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\nasync function downloadTemplate({\n projectDir,\n template,\n}: {\n projectDir: string;\n template: keyof typeof CREATE_TEMPLATES;\n}) {\n const url = `https://codeload.github.com/mercurjs/mercur/tar.gz/${DEFAULT_BRANCH}`;\n const templatePath = CREATE_TEMPLATES[template].path;\n const filter = `mercur-${DEFAULT_BRANCH.replace(/^v/, \"\").replaceAll(\"/\", \"-\")}/templates/${templatePath}/`;\n\n await pipeline(\n await downloadTarStream(url),\n x({\n cwd: projectDir,\n filter: (p) => p.includes(filter),\n strip: 2 + templatePath.split(\"/\").length,\n })\n );\n}\n\nasync function downloadTarStream(url: string) {\n const res = await fetch(url);\n\n if (!res.body) {\n throw new Error(`Failed to download: ${url}`);\n }\n\n return Readable.from(res.body as unknown as NodeJS.ReadableStream);\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 // Pin the manager without a version rather than failing project creation\n // if the version lookup is unavailable for any reason.\n packageJson.packageManager = packageManager;\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.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import {a,b}from'./chunk-VYHAHC4Y.js';import {Command}from'commander';process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));var o=new Command().name("create-mercur-app").description("create a new Mercur project").version(a.version||"0.0.0","-v, --version","display the version number");o.addCommand(b,{isDefault:true});o.parse();//# sourceMappingURL=index.js.map
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["program","Command","package_default","create"],"mappings":";sEAMA,OAAA,CAAQ,GAAG,QAAA,CAAU,IAAM,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAC,EAC1C,OAAA,CAAQ,EAAA,CAAG,UAAW,IAAM,OAAA,CAAQ,KAAK,CAAC,CAAC,CAAA,CAE3C,IAAMA,CAAAA,CAAU,IAAIC,SAAQ,CACzB,IAAA,CAAK,mBAAmB,CAAA,CACxB,WAAA,CAAY,6BAA6B,CAAA,CACzC,OAAA,CACCC,CAAAA,CAAY,OAAA,EAAW,OAAA,CACvB,eAAA,CACA,4BACF,CAAA,CAEFF,CAAAA,CAAQ,WAAWG,CAAAA,CAAQ,CAAE,UAAW,IAAK,CAAC,CAAA,CAE9CH,CAAAA,CAAQ,KAAA,EAAM","file":"index.js","sourcesContent":["#!/usr/bin/env node\nimport { Command } from \"commander\";\n\nimport packageJson from \"../package.json\";\nimport { create } from \"./commands/create\";\n\nprocess.on(\"SIGINT\", () => process.exit(0));\nprocess.on(\"SIGTERM\", () => process.exit(0));\n\nconst program = new Command()\n .name(\"create-mercur-app\")\n .description(\"create a new Mercur project\")\n .version(\n packageJson.version || \"0.0.0\",\n \"-v, --version\",\n \"display the version number\"\n );\n\nprogram.addCommand(create, { isDefault: true });\n\nprogram.parse();\n"]}
|
package/dist/lib.d.ts
ADDED
package/dist/lib.js
ADDED
package/dist/lib.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":[],"names":[],"mappings":"","file":"lib.js"}
|
package/package.json
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "create-mercur-app",
|
|
3
|
+
"version": "2.2.0-canary.40",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "https://github.com/mercurjs/mercur",
|
|
7
|
+
"directory": "packages/create-mercur-app"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"description": "Create a new Mercur marketplace project",
|
|
11
|
+
"author": "MercurJS (https://github.com/mercurjs)",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"marketplace",
|
|
14
|
+
"multi-vendor",
|
|
15
|
+
"medusajs",
|
|
16
|
+
"ecommerce",
|
|
17
|
+
"open-source-marketplace",
|
|
18
|
+
"headless-commerce",
|
|
19
|
+
"create-mercur-app",
|
|
20
|
+
"marketplace-framework"
|
|
21
|
+
],
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"files": [
|
|
26
|
+
"dist"
|
|
27
|
+
],
|
|
28
|
+
"bin": {
|
|
29
|
+
"create-mercur-app": "./dist/index.js"
|
|
30
|
+
},
|
|
31
|
+
"exports": {
|
|
32
|
+
".": "./dist/lib.js",
|
|
33
|
+
"./package.json": "./package.json"
|
|
34
|
+
},
|
|
35
|
+
"scripts": {
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"dev": "tsup --watch",
|
|
38
|
+
"build": "tsup"
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@antfu/ni": "^27.0.1",
|
|
42
|
+
"commander": "^14.0.2",
|
|
43
|
+
"execa": "^9.6.0",
|
|
44
|
+
"fs-extra": "^11.3.2",
|
|
45
|
+
"kleur": "^4.1.5",
|
|
46
|
+
"open": "^11.0.0",
|
|
47
|
+
"ora": "^9.0.0",
|
|
48
|
+
"pg": "^8.17.1",
|
|
49
|
+
"prompts": "^2.4.2",
|
|
50
|
+
"tar": "^7.5.2",
|
|
51
|
+
"terminal-link": "^5.0.0",
|
|
52
|
+
"validate-npm-package-name": "^7.0.2",
|
|
53
|
+
"wait-on": "^9.0.3"
|
|
54
|
+
},
|
|
55
|
+
"devDependencies": {
|
|
56
|
+
"@types/fs-extra": "^11.0.4",
|
|
57
|
+
"@types/pg": "^8.16.0",
|
|
58
|
+
"@types/prompts": "^2.4.9",
|
|
59
|
+
"@types/tar": "^6.1.13",
|
|
60
|
+
"@types/validate-npm-package-name": "^4.0.2",
|
|
61
|
+
"@types/wait-on": "^5.3.4",
|
|
62
|
+
"tsup": "^8.5.0",
|
|
63
|
+
"typescript": "5.9.3"
|
|
64
|
+
},
|
|
65
|
+
"engines": {
|
|
66
|
+
"node": ">=20"
|
|
67
|
+
}
|
|
68
|
+
}
|