@mercurjs/cli 2.3.9-canary.3 → 2.3.9-canary.5
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/dist/index.js +21 -21
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/dist/index.js
CHANGED
|
@@ -1,42 +1,42 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import {Command}from'commander';import*as
|
|
2
|
+
import {Command}from'commander';import*as x from'path';import x__default,{join,basename}from'path';import yt from'prompts';import {z}from'zod';import st,{promises,existsSync,readFileSync,mkdirSync,writeFileSync,statSync}from'fs';import {cosmiconfig}from'cosmiconfig';import {loadConfig,createMatchPath}from'tsconfig-paths';import Et from'fs-extra';import at from'fast-glob';import on,{randomUUID,createHash}from'crypto';import Xt from'deepmerge';import*as A from'fs/promises';import A__default,{writeFile,rm}from'fs/promises';import sn,{homedir,tmpdir}from'os';import {Project,ScriptKind}from'ts-morph';import xe from'kleur';import {execSync}from'child_process';import {detect}from'@antfu/ni';import {execa}from'execa';import bs from'ora';import {diffLines}from'diff';import {builtinModules}from'module';import {generatePluginEntryModule}from'@mercurjs/dashboard-sdk/vite';var Oe={version:"2.3.9-canary.5"};var Pt="MISSING_DIR_OR_EMPTY_PROJECT",_="MISSING_CONFIG",L="BUILD_MISSING_REGISTRY_FILE";var no=z.enum(["registry:api","registry:vendor","registry:admin"]),Ot=z.object({path:z.string(),content:z.string().optional(),type:no,target:z.string().optional()}),Nt=z.object({$schema:z.string().optional(),name:z.string(),title:z.string().optional(),author:z.string().min(2).optional(),description:z.string().optional(),dependencies:z.array(z.string()).optional(),devDependencies:z.array(z.string()).optional(),registryDependencies:z.array(z.string()).optional(),meta:z.record(z.string(),z.any()).optional(),docs:z.string().optional(),categories:z.array(z.string()).optional()}),O=Nt.extend({files:z.array(Ot)}),V=z.object({name:z.string(),homepage:z.string(),items:z.array(O)}),Zn=z.array(Nt),jt=O.pick({dependencies:true,devDependencies:true,files:true,docs:true}),io=z.union([z.string(),z.object({url:z.string(),params:z.record(z.string(),z.string()).optional(),headers:z.record(z.string(),z.string()).optional()})]),Ft=z.record(z.string().refine(e=>e.startsWith("@"),{message:"Registry names must start with @ (e.g., @mercurjs)"}),io);var Ne="https://registry.mercurjs.com/registry.json",Dt="https://registry.mercurjs.com/registry-item.json",he=process.env.REGISTRY_URL??"https://raw.githubusercontent.com/mercurjs/mercur/main/packages/registry/r",T={"@mercurjs":`${he}/{name}.json`};var N={NOT_FOUND:"NOT_FOUND",UNAUTHORIZED:"UNAUTHORIZED",FORBIDDEN:"FORBIDDEN",FETCH_ERROR:"FETCH_ERROR",NOT_CONFIGURED:"NOT_CONFIGURED",INVALID_CONFIG:"INVALID_CONFIG",MISSING_ENV_VARS:"MISSING_ENV_VARS",LOCAL_FILE_ERROR:"LOCAL_FILE_ERROR",PARSE_ERROR:"PARSE_ERROR",VALIDATION_ERROR:"VALIDATION_ERROR",UNKNOWN_ERROR:"UNKNOWN_ERROR"},v=class extends Error{code;statusCode;context;suggestion;timestamp;cause;constructor(t,r={}){super(t),this.name="RegistryError",this.code=r.code||N.UNKNOWN_ERROR,this.statusCode=r.statusCode,this.cause=r.cause,this.context=r.context,this.suggestion=r.suggestion,this.timestamp=new Date,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor);}},oe=class extends v{constructor(r,o){let s=`The item at ${r} was not found. It may not exist at the registry.`;super(s,{code:N.NOT_FOUND,statusCode:404,cause:o,context:{url:r},suggestion:"Check if the item name is correct and the registry URL is accessible."});this.url=r;this.name="RegistryNotFoundError";}url},je=class extends v{constructor(r,o){let s=`You are not authorized to access the item at ${r}. If this is a remote registry, you may need to authenticate.`;super(s,{code:N.UNAUTHORIZED,statusCode:401,cause:o,context:{url:r},suggestion:"Check your authentication credentials and environment variables."});this.url=r;this.name="RegistryUnauthorizedError";}url},Fe=class extends v{constructor(r,o){let s=`You are not authorized to access the item at ${r}. If this is a remote registry, you may need to authenticate.`;super(s,{code:N.FORBIDDEN,statusCode:403,cause:o,context:{url:r},suggestion:"Check your authentication credentials and environment variables."});this.url=r;this.name="RegistryForbiddenError";}url},De=class extends v{constructor(r,o,s,n){let i=o?`Failed to fetch from registry (${o}): ${r}`:`Failed to fetch from registry: ${r}`,f=typeof n=="string"&&n?`${i} - ${n}`:i,c="Check your network connection and try again.";o===404?c="The requested resource was not found. Check the URL or item name.":o===500?c="The registry server encountered an error. Try again later.":o&&o>=400&&o<500&&(c="There was a client error. Check your request parameters.");super(f,{code:N.FETCH_ERROR,statusCode:o,cause:n,context:{url:r,responseBody:s},suggestion:c});this.url=r;this.responseBody=s;this.name="RegistryFetchError";}url;responseBody},H=class extends v{constructor(r){let o=r?`Unknown registry "${r}". Make sure it is defined in agents.json as follows:
|
|
3
3
|
{
|
|
4
4
|
"registries": {
|
|
5
5
|
"${r}": "[URL_TO_REGISTRY]"
|
|
6
6
|
}
|
|
7
|
-
}`:'Unknown registry. Make sure it is defined in blocks.json under "registries".';super(o,{code:
|
|
7
|
+
}`:'Unknown registry. Make sure it is defined in blocks.json under "registries".';super(o,{code:N.NOT_CONFIGURED,context:{registryName:r},suggestion:"Add the registry configuration to your blocks.json file. Consult the registry documentation for the correct format."});this.registryName=r;this.name="RegistryNotConfiguredError";}registryName},J=class extends v{constructor(r,o){super(`Failed to read local registry file: ${r}`,{code:N.LOCAL_FILE_ERROR,cause:o,context:{filePath:r},suggestion:"Check if the file exists and you have read permissions."});this.filePath=r;this.name="RegistryLocalFileError";}filePath},P=class extends v{constructor(r,o){let s=`Failed to parse registry item: ${r}`;o instanceof z.ZodError&&(s=`Failed to parse registry item: ${r}
|
|
8
8
|
${o.issues.map(n=>` - ${n.path.join(".")}: ${n.message}`).join(`
|
|
9
|
-
`)}`);super(s,{code:
|
|
9
|
+
`)}`);super(s,{code:N.PARSE_ERROR,cause:o,context:{item:r},suggestion:"The registry item may be corrupted or have an invalid format. Please make sure it returns a valid JSON object."});this.item=r;this.parseError=o,this.name="RegistryParseError";}item;parseError},$e=class extends v{constructor(r,o){let s=`Registry "${r}" requires the following environment variables:
|
|
10
10
|
|
|
11
11
|
`+o.map(n=>` \u2022 ${n}`).join(`
|
|
12
|
-
`);super(s,{code:
|
|
12
|
+
`);super(s,{code:N.MISSING_ENV_VARS,context:{registryName:r,missingVars:o},suggestion:"Set the required environment variables to your .env or .env.local file."});this.registryName=r;this.missingVars=o;this.name="RegistryMissingEnvironmentVariablesError";}registryName;missingVars},Ae=class extends v{constructor(r){let o=`Invalid registry namespace: "${r}". Registry names must start with @ (e.g., @mercurjs).`;super(o,{code:N.VALIDATION_ERROR,context:{name:r},suggestion:"Use a valid registry name starting with @ or provide a direct URL to the registry."});this.name=r;this.name="RegistryInvalidNamespaceError";}name};var Le=class extends v{constructor(r,o){let s=`Invalid blocks.json configuration in ${r}.`;o instanceof z.ZodError&&(s=`Invalid blocks.json configuration in ${r}:
|
|
13
13
|
${o.issues.map(n=>` - ${n.path.join(".")}: ${n.message}`).join(`
|
|
14
|
-
`)}`);super(s,{code:F.INVALID_CONFIG,cause:o,context:{cwd:r},suggestion:"Check your blocks.json file for syntax errors or invalid configuration. Run '@mercurjs/cli init' to regenerate a valid configuration."});this.cwd=r;this.name="ConfigParseError";}cwd};var L=z.object({$schema:z.string().optional(),aliases:z.object({api:z.string(),vendor:z.string(),admin:z.string()}),registries:Tt.optional()}).strict(),Ot=L.extend({resolvedPaths:z.object({cwd:z.string(),api:z.string(),vendor:z.string(),admin:z.string()})});async function ne(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>true,[".ts",".tsx"])}var Xr="packages/api/src",Qr="apps/vendor/src",eo="apps/admin/src",to=cosmiconfig("blocks",{searchPlaces:["blocks.json"]});async function R(e){let t=await ro(e);return t?await et(e,t):null}async function et(e,t){t.registries={...t.registries||{},..._};let r=await loadConfig(e);if(r.resultType==="failed")throw new Error(`Failed to load tsconfig.json. ${r.message??""}`.trim());return Ot.parse({...t,resolvedPaths:{cwd:e,api:await ne(t.aliases.api,r),vendor:await ne(t.aliases.vendor,r),admin:await ne(t.aliases.admin,r)}})}async function ro(e){try{let t=await to.search(e);if(!t)return null;let r=L.parse(t.config);if(r.registries){for(let o of Object.keys(r.registries))if(o in _)throw new Error(`"${o}" is a built-in registry and cannot be overridden.`)}return r}catch(t){throw t instanceof Error&&t.message.includes("reserved registry")?t:new $e(e,t)}}function U(e){let t={resolvedPaths:{cwd:process.cwd(),api:"",vendor:"",admin:""},aliases:{api:Xr,vendor:Qr,admin:eo},registries:{..._}};return e?{...t,...e,resolvedPaths:{...t.resolvedPaths,...e.resolvedPaths||{}},aliases:{...t.aliases,...e.aliases||{}},registries:{...t.registries,...e.registries||{}}}:t}var rt=["**/node_modules/**","public","dist"];async function k(e){let[t,r,o,s,n,i]=await Promise.all([gt.pathExists(b__default.resolve(e,"src")),so(e),ge(e),no(e),io(e),ao(e)]);return {isSrcDir:t,aliasPrefix:r,packageJson:o,medusaConfigFile:s?.file??null,medusaVersion:n,mercurVersion:i}}async function so(e){let t=loadConfig(e);if(t.resultType==="failed")return null;let r=t.paths||{},o=Object.keys(r);if(o.length===0)return null;let s=o[0];return s?.includes("*")?s.replace("/*",""):s?.replace("/","")??null}function ge(e="",t=true){let r=b__default.join(e,"package.json");return gt.readJSONSync(r,{throws:t})}async function no(e){let t=await tt.glob("medusa-config.*",{cwd:e,deep:3,ignore:rt});if(!t.length)return null;let r=t[0];return {file:r,dir:b__default.resolve(e,b__default.dirname(r))}}async function io(e){let r=ge(e,false)?.dependencies?.["@medusajs/framework"];if(r)return r;let o=await tt.glob("**/package.json",{cwd:e,deep:3,ignore:rt});for(let s of o){let i=ge(b__default.join(e,b__default.dirname(s)),false)?.dependencies?.["@medusajs/framework"];if(i)return i}return null}async function ao(e){let r=ge(e,false)?.dependencies?.["@mercurjs/cli"];if(r)return r;let o=await tt.glob("**/package.json",{cwd:e,deep:3,ignore:rt});for(let s of o){let i=ge(b__default.join(e,b__default.dirname(s)),false)?.dependencies?.["@mercurjs/cli"];if(i)return i}return null}z.object({cwd:z.string(),blocks:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),silent:z.boolean()});async function $t(e){let t={},r=b__default.resolve(e.cwd);if(!existsSync(r))return t[kt]=true,{errors:t,config:null};let o=await R(r);if(!o)return t[P]=true,{errors:t,config:null};let s=await k(r);return {errors:t,config:o,projectInfo:s}}var De={headers:{}};function ot(e){De.headers={...De.headers,...e};}function Dt(e){return De.headers[e]||{}}function C(){De.headers={};}function ie(e){let t={aliases:{api:"packages/api/src",vendor:"apps/vendor/src",admin:"apps/admin/src"},registries:_};return {...t,...e||{},aliases:{...t.aliases,...e?.aliases||{}},registries:{...e?.registries||{},..._}}}function he(e){return e.replace(/\${(\w+)}/g,(t,r)=>process.env[r]||"")}function ye(e){let t=[],r=/\${(\w+)}/g,o=r.exec(e);for(;o!==null;){let s=o[1];s&&t.push(s),o=r.exec(e);}return t}var fo=/^(@[a-zA-Z0-9](?:[a-zA-Z0-9-_]*[a-zA-Z0-9])?)\/(.+)$/;function ae(e){if(!e.startsWith("@"))return {registry:null,item:e};let t=e.match(fo);return t?{registry:t[1],item:t[2]}:{registry:null,item:e}}var At=[".tsx",".ts"],Mt=["lib/utils.ts"],ho=[/^(react|react-dom)(\/.*)?$/,/^(node|jsr|npm):.*$/],yo=new Project({compilerOptions:{}});function wo(e){if(ho.some(t=>t.test(e)))return null;if(!e.startsWith("@")&&e.includes("/")&&(e=e.split("/")[0]),e.startsWith("@")){let t=e.split("/");t.length>2&&(e=t.slice(0,2).join("/"));}return e}async function st(e,t,r,o=new Set){let s=b.resolve(t.resolvedPaths.cwd,e),n=b.relative(t.resolvedPaths.cwd,s);if(Mt.includes(n))return {dependencies:[],files:[]};let i=b.extname(e);if(!At.includes(i))return {dependencies:[],files:[]};if(o.has(n))return {dependencies:[],files:[]};o.add(n);try{if(!(await A.stat(s)).isFile())return {dependencies:[],files:[]}}catch{return {dependencies:[],files:[]}}let f=await A.readFile(s,"utf-8"),c=await Ro(b.basename(s)),a=yo.createSourceFile(c,f,{scriptKind:ScriptKind.TSX}),m=await loadConfig(t.resolvedPaths.cwd);if(m.resultType==="failed")return {dependencies:[],files:[]};let p=[],d=new Set,h=Lt(e),w={path:n,type:h,target:"",content:""};p.push(w);let x=a.getImportDeclarations();for(let I of x){let N=I.getModuleSpecifierValue(),te=N.startsWith(".");if(!(r.aliasPrefix&&N.startsWith(`${r.aliasPrefix}/`))&&!te){let $=wo(N);$&&d.add($);continue}let re=await ne(N,m);if(te&&(re=b.resolve(b.dirname(s),N)),!re)continue;if(!b.extname(re))for(let $ of At){let It=`${re}${$}`;try{await A.access(It),re=It;break}catch{continue}}let Ce=b.relative(t.resolvedPaths.cwd,re);if(o.has(Ce)||Mt.includes(Ce))continue;let Gr=Lt(N),Vr={path:Ce,type:Gr,target:"",content:""};p.push(Vr);let Pe=await st(Ce,t,r,o);if(Pe.files)for(let $ of Pe.files)o.has($.path)||(o.add($.path),p.push($));Pe.dependencies&&Pe.dependencies.forEach($=>d.add($));}let v=Array.from(new Map(p.map(I=>[I.path,I])).values());return {dependencies:Array.from(d),files:v}}async function Ro(e){let t=await A.mkdtemp(b.join(tmpdir(),"mercur-"));return b.join(t,e)}function Lt(e){return e.includes("/vendor")?"registry:vendor":e.includes("/admin")?"registry:admin":"registry:api"}function W(e){try{return new URL(e),!0}catch{return false}}function Z(e){return e.endsWith(".json")&&!W(e)}function xo(e){let t=new Set;if(typeof e=="string")for(let r of ye(e))t.add(r);else {for(let r of ye(e.url))t.add(r);if(e.params)for(let r of Object.values(e.params))for(let o of ye(r))t.add(o);if(e.headers)for(let r of Object.values(e.headers))for(let o of ye(r))t.add(o);}return Array.from(t)}function Ut(e,t){let o=xo(t).filter(s=>!process.env[s]);if(o.length>0)throw new Oe(e,o)}var Ae="{name}",Eo=`${Ae}.json`,zt=/\${(\w+)}/g,Bt="?",bo="&";function vo(e){return e.includes(Ae)}function Wt(e){return vo(e)?e:`${e.endsWith("/")?e:`${e}/`}${Eo}`}function we(e,t){let{registry:r,item:o}=ae(e);if(!r)return null;let n=(t?.registries||{})[r];if(!n)throw new H(r);return Ut(r,n),{url:Io(o,n),headers:So(n)}}function Io(e,t,r){if(typeof t=="string"){let i=Wt(t).replace(Ae,e);return he(i)}let s=Wt(t.url).replace(Ae,e);return s=he(s),t.params?ko(s,t.params):s}function So(e){if(typeof e=="string"||!e.headers)return {};let t={};for(let[r,o]of Object.entries(e.headers)){let s=he(o);Co(o,s)&&(t[r]=s);}return t}function ko(e,t){let r=new URLSearchParams;for(let[n,i]of Object.entries(t)){let f=he(i);f&&r.append(n,f);}let o=r.toString();if(!o)return e;let s=e.includes(Bt)?bo:Bt;return `${e}${s}${o}`}function Co(e,t){let r=t.trim();if(!r)return false;if(e.includes("${")&&e.match(zt)){let s=e.replace(zt,"").trim();return r!==s}return true}function Gt(e){return W(e)||Z(e)?e:`${de}/${e}`}var Me=new Map;async function Po(e){let t=e;t.startsWith("file://")&&(t=t.slice(7)),t.startsWith("~/")&&(t=b__default.join(homedir(),t.slice(2)));let r=b__default.resolve(t);try{let o=await promises.readFile(r,"utf8");return JSON.parse(o)}catch(o){throw o instanceof Error&&(o.message.includes("ENOENT")||o.message.includes("no such file"))?new K(e,o):new K(e,o)}}async function X(e){return await Promise.all(e.map(async r=>{let o=Gt(r);if(Me.has(o))return Me.get(o);if(Z(o)){let n=Po(o);return Me.set(o,n),n}let s=(async()=>{let n=Dt(o),i=await fetch(o,{headers:{...n}});if(!i.ok){let f;if(i.headers.get("content-type")?.includes("application/json")){let c=await i.json(),a=z.object({detail:z.string().optional(),title:z.string().optional(),message:z.string().optional(),error:z.string().optional()}).safeParse(c);a.success&&(f=a.data.detail||a.data.message,a.data.error&&(f=`[${a.data.error}] ${f}`));}throw i.status===401?new Te(o,f):i.status===404?new se(o,f):i.status===403?new je(o,f):new Fe(o,i.status,f)}return i.json()})();return Me.set(o,s),s}))}async function Jt(e){try{let t=e;e.startsWith("~/")&&(t=b__default.join(homedir(),e.slice(2)));let r=b__default.resolve(t),o=await promises.readFile(r,"utf8"),s=JSON.parse(o);try{return j.parse(s)}catch(n){throw new T(e,n)}}catch(t){throw t instanceof Error&&(t.message.includes("ENOENT")||t.message.includes("no such file"))?new K(e,t):t instanceof T?t:new K(e,t)}}j.extend({_source:z.string().optional()});function nt(e,t){let r={},o=[...e];if(!t?.registries)return ot({}),o;for(let s=0;s<o.length;s++){let n=we(o[s],t);n&&(o[s]=n.url,Object.keys(n.headers).length>0&&(r[n.url]=n.headers));}return ot(r),o}async function Ue(e,t){return await Promise.all(e.map(async o=>{if(Z(o))return Jt(o);if(W(o)){let[i]=await X([o]);try{return j.parse(i)}catch(f){throw new T(o,f)}}if(o.startsWith("@")&&t?.registries){let i=nt([o],t),[f]=await X(i);try{return j.parse(f)}catch(c){throw new T(o,c)}}let s=`${de}/${o}.json`,[n]=await X([s]);try{return j.parse(n)}catch(i){throw new T(o,i)}}))}async function it(e,t){let r=[],o=[],s=Array.from(new Set(e)),n=await Ue(s,t),i=new Map;for(let a=0;a<n.length;a++)n[a]&&i.set(s[a],n[a]);for(let[a,m]of Array.from(i.entries())){let p={...m,_source:a};if(r.push(p),m.registryDependencies){let d=m.registryDependencies;if(t?.registries)d=nt(m.registryDependencies,t);else {let w=m.registryDependencies.filter(x=>x.startsWith("@"));if(w.length>0){let{registry:x}=ae(w[0]);throw new H(x)}}let{blocks:h}=await qt(d,t,new Set(s));o.push(...h);}}r.push(...o);let f=new Map;for(let a of r){let m=a._source||a.name;f.set(a,m);}return r=Fo(r,f),_t.parse({dependencies:Ht.all(r.map(a=>a.dependencies??[])),devDependencies:Ht.all(r.map(a=>a.devDependencies??[])),files:Oo(r.map(a=>a.files??[])),docs:r.map(a=>a.docs).filter(Boolean).join(`
|
|
15
|
-
`)})}async function
|
|
14
|
+
`)}`);super(s,{code:N.INVALID_CONFIG,cause:o,context:{cwd:r},suggestion:"Check your blocks.json file for syntax errors or invalid configuration. Run '@mercurjs/cli init' to regenerate a valid configuration."});this.cwd=r;this.name="ConfigParseError";}cwd};var M=z.object({$schema:z.string().optional(),aliases:z.object({api:z.string(),vendor:z.string(),admin:z.string()}),registries:Ft.optional()}).strict(),At=M.extend({resolvedPaths:z.object({cwd:z.string(),api:z.string(),vendor:z.string(),admin:z.string()})});async function se(e,t){return createMatchPath(t.absoluteBaseUrl,t.paths)(e,void 0,()=>true,[".ts",".tsx"])}var fo="packages/api/src",mo="apps/vendor/src",po="apps/admin/src",uo=cosmiconfig("blocks",{searchPlaces:["blocks.json"]});async function b(e){let t=await go(e);return t?await it(e,t):null}async function it(e,t){t.registries={...t.registries||{},...T};let r=await loadConfig(e);if(r.resultType==="failed")throw new Error(`Failed to load tsconfig.json. ${r.message??""}`.trim());return At.parse({...t,resolvedPaths:{cwd:e,api:await se(t.aliases.api,r),vendor:await se(t.aliases.vendor,r),admin:await se(t.aliases.admin,r)}})}async function go(e){try{let t=await uo.search(e);if(!t)return null;let r=M.parse(t.config);if(r.registries){for(let o of Object.keys(r.registries))if(o in T)throw new Error(`"${o}" is a built-in registry and cannot be overridden.`)}return r}catch(t){throw t instanceof Error&&t.message.includes("reserved registry")?t:new Le(e,t)}}function U(e){let t={resolvedPaths:{cwd:process.cwd(),api:"",vendor:"",admin:""},aliases:{api:fo,vendor:mo,admin:po},registries:{...T}};return e?{...t,...e,resolvedPaths:{...t.resolvedPaths,...e.resolvedPaths||{}},aliases:{...t.aliases,...e.aliases||{}},registries:{...t.registries,...e.registries||{}}}:t}var ct=["**/node_modules/**","public","dist"];async function C(e){let[t,r,o,s,n,i]=await Promise.all([Et.pathExists(x__default.resolve(e,"src")),yo(e),ye(e),wo(e),Ro(e),Eo(e)]);return {isSrcDir:t,aliasPrefix:r,packageJson:o,medusaConfigFile:s?.file??null,medusaVersion:n,mercurVersion:i}}async function yo(e){let t=loadConfig(e);if(t.resultType==="failed")return null;let r=t.paths||{},o=Object.keys(r);if(o.length===0)return null;let s=o[0];return s?.includes("*")?s.replace("/*",""):s?.replace("/","")??null}function ye(e="",t=true){let r=x__default.join(e,"package.json");return Et.readJSONSync(r,{throws:t})}async function wo(e){let t=await at.glob("medusa-config.*",{cwd:e,deep:3,ignore:ct});if(!t.length)return null;let r=t[0];return {file:r,dir:x__default.resolve(e,x__default.dirname(r))}}async function Ro(e){let r=ye(e,false)?.dependencies?.["@medusajs/framework"];if(r)return r;let o=await at.glob("**/package.json",{cwd:e,deep:3,ignore:ct});for(let s of o){let i=ye(x__default.join(e,x__default.dirname(s)),false)?.dependencies?.["@medusajs/framework"];if(i)return i}return null}async function Eo(e){let r=ye(e,false)?.dependencies?.["@mercurjs/cli"];if(r)return r;let o=await at.glob("**/package.json",{cwd:e,deep:3,ignore:ct});for(let s of o){let i=ye(x__default.join(e,x__default.dirname(s)),false)?.dependencies?.["@mercurjs/cli"];if(i)return i}return null}z.object({cwd:z.string(),blocks:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),silent:z.boolean()});async function Mt(e){let t={},r=x__default.resolve(e.cwd);if(!existsSync(r))return t[Pt]=true,{errors:t,config:null};let o=await b(r);if(!o)return t[_]=true,{errors:t,config:null};let s=await C(r);return {errors:t,config:o,projectInfo:s}}var Me={headers:{}};function lt(e){Me.headers={...Me.headers,...e};}function Ut(e){return Me.headers[e]||{}}function k(){Me.headers={};}function ne(e){let t={aliases:{api:"packages/api/src",vendor:"apps/vendor/src",admin:"apps/admin/src"},registries:T};return {...t,...e||{},aliases:{...t.aliases,...e?.aliases||{}},registries:{...e?.registries||{},...T}}}function we(e){return e.replace(/\${(\w+)}/g,(t,r)=>process.env[r]||"")}function Re(e){let t=[],r=/\${(\w+)}/g,o=r.exec(e);for(;o!==null;){let s=o[1];s&&t.push(s),o=r.exec(e);}return t}var Io=/^(@[a-zA-Z0-9](?:[a-zA-Z0-9-_]*[a-zA-Z0-9])?)\/(.+)$/;function ie(e){if(!e.startsWith("@"))return {registry:null,item:e};let t=e.match(Io);return t?{registry:t[1],item:t[2]}:{registry:null,item:e}}var zt=[".tsx",".ts"],Bt=["lib/utils.ts"],_o=[/^(react|react-dom)(\/.*)?$/,/^(node|jsr|npm):.*$/],To=new Project({compilerOptions:{}});function Po(e){if(_o.some(t=>t.test(e)))return null;if(!e.startsWith("@")&&e.includes("/")&&(e=e.split("/")[0]),e.startsWith("@")){let t=e.split("/");t.length>2&&(e=t.slice(0,2).join("/"));}return e}async function ft(e,t,r,o=new Set){let s=x.resolve(t.resolvedPaths.cwd,e),n=x.relative(t.resolvedPaths.cwd,s);if(Bt.includes(n))return {dependencies:[],files:[]};let i=x.extname(e);if(!zt.includes(i))return {dependencies:[],files:[]};if(o.has(n))return {dependencies:[],files:[]};o.add(n);try{if(!(await A.stat(s)).isFile())return {dependencies:[],files:[]}}catch{return {dependencies:[],files:[]}}let f=await A.readFile(s,"utf-8"),c=await Oo(x.basename(s)),a=To.createSourceFile(c,f,{scriptKind:ScriptKind.TSX}),m=await loadConfig(t.resolvedPaths.cwd);if(m.resultType==="failed")return {dependencies:[],files:[]};let p=[],d=new Set,h=Gt(e),w={path:n,type:h,target:"",content:""};p.push(w);let R=a.getImportDeclarations();for(let S of R){let F=S.getModuleSpecifierValue(),ee=F.startsWith(".");if(!(r.aliasPrefix&&F.startsWith(`${r.aliasPrefix}/`))&&!ee){let D=Po(F);D&&d.add(D);continue}let te=await se(F,m);if(ee&&(te=x.resolve(x.dirname(s),F)),!te)continue;if(!x.extname(te))for(let D of zt){let Tt=`${te}${D}`;try{await A.access(Tt),te=Tt;break}catch{continue}}let Te=x.relative(t.resolvedPaths.cwd,te);if(o.has(Te)||Bt.includes(Te))continue;let ro=Gt(F),oo={path:Te,type:ro,target:"",content:""};p.push(oo);let Pe=await ft(Te,t,r,o);if(Pe.files)for(let D of Pe.files)o.has(D.path)||(o.add(D.path),p.push(D));Pe.dependencies&&Pe.dependencies.forEach(D=>d.add(D));}let I=Array.from(new Map(p.map(S=>[S.path,S])).values());return {dependencies:Array.from(d),files:I}}async function Oo(e){let t=await A.mkdtemp(x.join(tmpdir(),"mercur-"));return x.join(t,e)}function Gt(e){return e.includes("/vendor")?"registry:vendor":e.includes("/admin")?"registry:admin":"registry:api"}function G(e){try{return new URL(e),!0}catch{return false}}function q(e){return e.endsWith(".json")&&!G(e)}function No(e){let t=new Set;if(typeof e=="string")for(let r of Re(e))t.add(r);else {for(let r of Re(e.url))t.add(r);if(e.params)for(let r of Object.values(e.params))for(let o of Re(r))t.add(o);if(e.headers)for(let r of Object.values(e.headers))for(let o of Re(r))t.add(o);}return Array.from(t)}function Wt(e,t){let o=No(t).filter(s=>!process.env[s]);if(o.length>0)throw new $e(e,o)}var Ue="{name}",jo=`${Ue}.json`,Yt=/\${(\w+)}/g,Vt="?",Fo="&";function Do(e){return e.includes(Ue)}function Ht(e){return Do(e)?e:`${e.endsWith("/")?e:`${e}/`}${jo}`}function Ee(e,t){let{registry:r,item:o}=ie(e);if(!r)return null;let n=(t?.registries||{})[r];if(!n)throw new H(r);return Wt(r,n),{url:$o(o,n),headers:Ao(n)}}function $o(e,t,r){if(typeof t=="string"){let i=Ht(t).replace(Ue,e);return we(i)}let s=Ht(t.url).replace(Ue,e);return s=we(s),t.params?Lo(s,t.params):s}function Ao(e){if(typeof e=="string"||!e.headers)return {};let t={};for(let[r,o]of Object.entries(e.headers)){let s=we(o);Mo(o,s)&&(t[r]=s);}return t}function Lo(e,t){let r=new URLSearchParams;for(let[n,i]of Object.entries(t)){let f=we(i);f&&r.append(n,f);}let o=r.toString();if(!o)return e;let s=e.includes(Vt)?Fo:Vt;return `${e}${s}${o}`}function Mo(e,t){let r=t.trim();if(!r)return false;if(e.includes("${")&&e.match(Yt)){let s=e.replace(Yt,"").trim();return r!==s}return true}function Jt(e){return G(e)||q(e)?e:`${he}/${e}`}var ze=new Map;async function Uo(e){let t=e;t.startsWith("file://")&&(t=t.slice(7)),t.startsWith("~/")&&(t=x__default.join(homedir(),t.slice(2)));let r=x__default.resolve(t);try{let o=await promises.readFile(r,"utf8");return JSON.parse(o)}catch(o){throw o instanceof Error&&(o.message.includes("ENOENT")||o.message.includes("no such file"))?new J(e,o):new J(e,o)}}async function Z(e){return await Promise.all(e.map(async r=>{let o=Jt(r);if(ze.has(o))return ze.get(o);if(q(o)){let n=Uo(o);return ze.set(o,n),n}let s=(async()=>{let n=Ut(o),i=await fetch(o,{headers:{...n}});if(!i.ok){let f;if(i.headers.get("content-type")?.includes("application/json")){let c=await i.json(),a=z.object({detail:z.string().optional(),title:z.string().optional(),message:z.string().optional(),error:z.string().optional()}).safeParse(c);a.success&&(f=a.data.detail||a.data.message,a.data.error&&(f=`[${a.data.error}] ${f}`));}throw i.status===401?new je(o,f):i.status===404?new oe(o,f):i.status===403?new Fe(o,f):new De(o,i.status,f)}return i.json()})();return ze.set(o,s),s}))}async function Zt(e){try{let t=e;e.startsWith("~/")&&(t=x__default.join(homedir(),e.slice(2)));let r=x__default.resolve(t),o=await promises.readFile(r,"utf8"),s=JSON.parse(o);try{return O.parse(s)}catch(n){throw new P(e,n)}}catch(t){throw t instanceof Error&&(t.message.includes("ENOENT")||t.message.includes("no such file"))?new J(e,t):t instanceof P?t:new J(e,t)}}O.extend({_source:z.string().optional()});function mt(e,t){let r={},o=[...e];if(!t?.registries)return lt({}),o;for(let s=0;s<o.length;s++){let n=Ee(o[s],t);n&&(o[s]=n.url,Object.keys(n.headers).length>0&&(r[n.url]=n.headers));}return lt(r),o}async function Ge(e,t){return await Promise.all(e.map(async o=>{if(q(o))return Zt(o);if(G(o)){let[i]=await Z([o]);try{return O.parse(i)}catch(f){throw new P(o,f)}}if(o.startsWith("@")&&t?.registries){let i=mt([o],t),[f]=await Z(i);try{return O.parse(f)}catch(c){throw new P(o,c)}}let s=`${he}/${o}.json`,[n]=await Z([s]);try{return O.parse(n)}catch(i){throw new P(o,i)}}))}async function pt(e,t){let r=[],o=[],s=Array.from(new Set(e)),n=await Ge(s,t),i=new Map;for(let a=0;a<n.length;a++)n[a]&&i.set(s[a],n[a]);for(let[a,m]of Array.from(i.entries())){let p={...m,_source:a};if(r.push(p),m.registryDependencies){let d=m.registryDependencies;if(t?.registries)d=mt(m.registryDependencies,t);else {let w=m.registryDependencies.filter(R=>R.startsWith("@"));if(w.length>0){let{registry:R}=ie(w[0]);throw new H(R)}}let{blocks:h}=await er(d,t,new Set(s));o.push(...h);}}r.push(...o);let f=new Map;for(let a of r){let m=a._source||a.name;f.set(a,m);}return r=Wo(r,f),jt.parse({dependencies:Xt.all(r.map(a=>a.dependencies??[])),devDependencies:Xt.all(r.map(a=>a.devDependencies??[])),files:Yo(r.map(a=>a.files??[])),docs:r.map(a=>a.docs).filter(Boolean).join(`
|
|
15
|
+
`)})}async function er(e,t,r=new Set){let o=[];for(let s of e){if(r.has(s))continue;if(r.add(s),s.startsWith("@")&&t?.registries){let{registry:i}=ie(s);if(i&&!(i in t.registries))throw new H(i)}let[n]=await Ge([s],t);if(n&&(o.push({...n,_source:s}),n.registryDependencies)){let i=t?.registries?mt(n.registryDependencies,t):n.registryDependencies,f=await er(i,t,r);o.push(...f.blocks);}}return {blocks:o}}function W(e,t){let r=t||e.name,o=createHash("sha256").update(r).digest("hex").substring(0,8);return `${e.name}::${o}`}function Go(e){if(G(e)){let o=new URL(e).pathname,s=o.match(/\/([^/]+)\.json$/),n=s?s[1]:x__default.basename(o,".json");return {name:n,hash:W({name:n},e)}}if(q(e)){let r=e.match(/\/([^/]+)\.json$/),o=r?r[1]:x__default.basename(e,".json");return {name:o,hash:W({name:o},e)}}let{item:t}=ie(e);return {name:t,hash:W({name:t},e)}}function Wo(e,t){let r=new Map,o=new Map,s=new Map,n=new Map;for(let a of e){let m=t.get(a)||a.name,p=W(a,m);r.set(p,a),o.set(p,a),s.set(p,0),n.set(p,[]);}let i=new Map;for(let a of e){let m=t.get(a)||a.name,p=W(a,m);i.has(a.name)||i.set(a.name,[]),i.get(a.name).push(p),m!==a.name&&(i.has(m)||i.set(m,[]),i.get(m).push(p));}for(let a of e){let m=t.get(a)||a.name,p=W(a,m);if(a.registryDependencies)for(let d of a.registryDependencies){let h,w=i.get(d)||[];if(w.length===1)h=w[0];else if(w.length>1)h=w[0];else {let{name:R}=Go(d),I=i.get(R)||[];I.length>0&&(h=I[0]);}h&&r.has(h)&&(n.get(h).push(p),s.set(p,s.get(p)+1));}}let f=[],c=[];for(let[a,m]of s)m===0&&f.push(a);for(;f.length>0;){let a=f.shift(),m=r.get(a);c.push(m);for(let p of n.get(a)){let d=s.get(p)-1;s.set(p,d),d===0&&f.push(p);}}if(c.length!==e.length){let a=Array.from(r.keys()).filter(m=>!c.some(p=>W(p,t.get(p))===m));console.warn(`Warning: Circular dependencies detected. Some items may not be sorted correctly: ${a.join(", ")}`);for(let[m,p]of r.entries())c.some(d=>W(d,t.get(d))===m)||c.push(p);}return c}function Yo(e){let t=new Map,r=[];for(let o of e)if(o)for(let s of o){let n=s.target||s.path;t.has(n)||(t.set(n,s),r.push(s));}return r}var u={error:e=>xe.red(e),warn:e=>xe.yellow(e),info:e=>xe.blue(e),success:e=>xe.green(e),dim:e=>xe.cyan(e)};var l={error(...e){console.log(u.error(e.join(" ")));},warn(...e){console.log(u.warn(e.join(" ")));},info(...e){console.log(u.info(e.join(" ")));},success(...e){console.log(u.success(e.join(" ")));},log(...e){console.log(e.join(" "));},break(){console.log("");}};var ut={telemetry_enabled:true,notice_shown:false,device_id:null},Ko=(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"),or=join(homedir(),".mercur","config.json"),gt=class{path;dir;constructor(t=Ko()){this.dir=t,this.path=join(t,"config.json");}get(t){return this.read()[t]}set(t,r){let o=this.read();o[t]=r,this.write(o);}deviceId(){let t=this.get("device_id");if(t)return t;let r=randomUUID();return this.set("device_id",r),r}read(){try{return existsSync(this.path)?{...ut,...JSON.parse(readFileSync(this.path,"utf-8"))}:this.migrateLegacy()}catch{return {...ut}}}migrateLegacy(){let t={...ut};try{if(existsSync(or)){let r=JSON.parse(readFileSync(or,"utf-8"));typeof r.telemetry_enabled=="boolean"&&(t.telemetry_enabled=r.telemetry_enabled),typeof r.notice_shown=="boolean"&&(t.notice_shown=r.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)+`
|
|
16
|
+
`,{mode:384});}catch{}}},Y=new gt;var ce=e=>Function("mm","return import(mm)")(e);function qo(){let e=(...t)=>t.some(r=>!!process.env[r]);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 nr(){try{let e=await ce("os"),t=e.cpus();return {deploymentVendor:qo(),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 Zo(),isDocker:await ir(),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 Zo(){try{if(typeof process>"u"||process?.platform!=="linux")return !1;let e=await ce("fs");return (await ce("os")).release().toLowerCase().includes("microsoft")?!await sr():e.readFileSync("/proc/version","utf8").toLowerCase().includes("microsoft")?!await sr():!1}catch{return false}}var Xo=async()=>{try{return (await ce("fs")).statSync("/run/.containerenv"),!0}catch{return false}};async function ir(){return await Qo()||await es()}async function Qo(){try{return (await ce("fs")).statSync("/.dockerenv"),!0}catch{return false}}async function es(){try{return (await ce("fs")).readFileSync("/proc/self/cgroup","utf8").includes("docker")}catch{return false}}async function sr(){return await Xo()||await ir()}var os=["bun","yarn","pnpm","deno","npm"];function cr(e){if(e)return os.find(t=>e.startsWith(t))}function ss(){return cr(process.env.npm_config_user_agent)}async function ar(e){try{return await execa(e,["--version"]),!0}catch{return false}}async function We(e){let t=cr(await detect({programmatic:true,cwd:e}));if(t&&await ar(t))return t;let r=ss();return r&&await ar(r)?r:"npm"}var is="mercur-telemetry-v1",lr=e=>createHash("sha256").update(`${is}:${e}`).digest("base64url");var cs="https://telemetry.mercurjs.com",ls=2e3,fs=1,ms="mercur",Ve="https://docs.mercurjs.com/telemetry",ps=["CI","GITHUB_ACTIONS","GITLAB_CI","CIRCLECI","BUILDKITE","JENKINS_URL","TF_BUILD","TEAMCITY_VERSION","DRONE"],us=["CLAUDECODE","CLAUDE_CODE","CURSOR_AGENT","CODEX_SANDBOX","GEMINI_CLI","COPILOT_AGENT","OPENCODE_CLIENT"],le={NETWORK:"network",FS:"fs",VALIDATION:"validation",REGISTRY:"registry",INSTALL:"install",DATABASE:"database",UNKNOWN:"unknown"},Ye=e=>e!==void 0&&["1","true","yes"].includes(e.toLowerCase()),fr=()=>ps.some(e=>!!process.env[e]),mr=e=>{Y.set("telemetry_enabled",e);},pr=()=>Ye(process.env.MERCUR_TELEMETRY_FORCE_ENABLED)?true:Ye(process.env.MERCUR_DISABLE_TELEMETRY)||Ye(process.env.DO_NOT_TRACK)||fr()?false:Y.get("telemetry_enabled"),fe=()=>{Y.get("notice_shown")||(Y.set("notice_shown",true),pr()&&console.error(["","Mercur collects anonymous usage data to improve the CLI experience.",`You can disable this at any time by running: ${u.info("mercurjs telemetry --disable")}`,`Or by setting ${u.info("MERCUR_DISABLE_TELEMETRY=true")}`,`Learn more: ${u.info(Ve)}`,""].join(`
|
|
17
|
+
`)));},ds=e=>{try{return execSync("git config --local --get remote.origin.url",{cwd:e,stdio:"pipe",timeout:1e3}).toString().trim()}catch{return null}},gs=e=>lr(ds(e)||e),hs=async e=>{let[t,r,o]=await Promise.all([C(e).catch(()=>null),nr(),We(e).catch(()=>{})]),s=gs(e);return {schema_version:fs,source:"cli",cli_version:Oe.version,mercur_version:t?.mercurVersion??void 0,medusa_version:t?.medusaVersion??void 0,node_version:process.version,runtime:process.versions.bun?"bun":"node",package_manager:o,os:r.systemPlatform,arch:r.systemArchitecture,is_src_dir:t?.isSrcDir,is_ci:fr(),is_tty:!!process.stdout.isTTY,is_agent:us.some(n=>!!process.env[n]),is_docker:r.isDocker,is_wsl:r.isWSL,cloud_provider:r.deploymentVendor,project_id:s,$groups:{project:s},$geoip_disable:true}},He=async(e,t)=>{try{if(!pr())return;let r={api_key:ms,batch:[{event:e.event,distinct_id:Y.deviceId(),timestamp:new Date().toISOString(),properties:{...await hs(t.cwd),...e.properties}}]};if(Ye(process.env.MERCUR_TELEMETRY_DEBUG)){console.error(`[telemetry] ${JSON.stringify(r.batch,null,2)}`);return}let o=(process.env.MERCUR_TELEMETRY_PROXY_URL||cs).replace(/\/+$/,""),s=new AbortController,n=setTimeout(()=>s.abort(),ls);try{await fetch(`${o}/batch`,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(r),signal:s.signal});}finally{clearTimeout(n);}}catch{}},ur=e=>{if(e&&typeof e=="object"){let t=e.name??"",r=e.code??"",o=e.message??"";if(Object.values(le).includes(t))return t;if(t==="ZodError")return le.VALIDATION;if(t.startsWith("Registry"))return le.REGISTRY;if(["ENOTFOUND","ECONNREFUSED","ECONNRESET","ETIMEDOUT","EAI_AGAIN"].includes(r)||/fetch failed/i.test(o))return le.NETWORK;if(["ENOENT","EACCES","EPERM","EEXIST","ENOTDIR","EISDIR"].includes(r))return le.FS}return le.UNKNOWN};var ys={template:["basic","plugin","registry"],tag:["latest","rc","canary"]},Je=null,ws=e=>{let t={};for(let[r,o]of Object.entries(e.opts()))e.getOptionValueSource(r)==="cli"&&(typeof o=="boolean"||typeof o=="string"&&ys[r]?.includes(o)?t[r]=o:t[r]="<redacted>");return t},Rs=e=>{let t=e.opts();Je={name:e.name(),flags:ws(e),cwd:typeof t.cwd=="string"?t.cwd:process.cwd(),startedAt:Date.now()};},me=async(e,t)=>{if(!Je)return;let r=Je;Je=null,await He({event:"cli_command_executed",properties:{command:r.name,flags:r.flags,exit_code:e,duration_ms:Date.now()-r.startedAt,...e!==0?{error_category:ur(t)}:{}}},{cwd:r.cwd});},dr=e=>{e.hook("preAction",(t,r)=>Rs(r)),e.hook("postAction",async()=>{await me(0);});};async function y(e){if(await me(1,e),l.break(),l.error("Something went wrong. Please check the error below for more details."),l.error("If the problem persists, please open an issue on GitHub."),l.error(""),typeof e=="string"&&(l.error(e),l.break(),process.exit(1)),e instanceof v&&(e.message&&(l.error(e.cause?"Error:":"Message:"),l.error(e.message)),e.cause&&(l.error(`
|
|
16
18
|
Message:`),l.error(e.cause)),e.suggestion&&(l.error(`
|
|
17
|
-
Suggestion:`),l.error(e.suggestion)),l.break(),process.exit(1)),e instanceof z.ZodError){l.error("Validation failed:");for(let t of e.issues){let r=t.path.join(".")||"root";l.error(`- ${u.info(r)}: ${t.message}`);}l.break(),process.exit(1);}e instanceof Error&&(l.error(e.message),l.break(),process.exit(1)),l.break(),process.exit(1);}function E(e,t){return
|
|
19
|
+
Suggestion:`),l.error(e.suggestion)),l.break(),process.exit(1)),e instanceof z.ZodError){l.error("Validation failed:");for(let t of e.issues){let r=t.path.join(".")||"root";l.error(`- ${u.info(r)}: ${t.message}`);}l.break(),process.exit(1);}e instanceof Error&&(l.error(e.message),l.break(),process.exit(1)),l.break(),process.exit(1);}function E(e,t){return bs({text:e,isSilent:t?.silent??false})}async function gr(e,t,r,o={}){if(e=Array.from(new Set(e||[])),t=Array.from(new Set(t||[])),!e?.length&&!t?.length)return;o={silent:false,...o};let s=E("Installing dependencies.",{silent:o.silent})?.start(),n=await We(r.resolvedPaths.cwd);s?.start(),await xs(n,e,t,r.resolvedPaths.cwd),s?.succeed();}async function xs(e,t,r,o){if(e==="npm")return Is(t,r,o);if(e==="deno")return Ss(t,r,o);t?.length&&await execa(e,["add",...t],{cwd:o}),r?.length&&await execa(e,["add","-D",...r],{cwd:o});}async function Is(e,t,r){e.length&&await execa("npm",["install",...e],{cwd:r}),t.length&&await execa("npm",["install","-D",...t],{cwd:r});}async function Ss(e,t,r){e?.length&&await execa("deno",["add",...e.map(o=>`npm:${o}`)],{cwd:r}),t?.length&&await execa("deno",["add","-D",...t.map(o=>`npm:${o}`)],{cwd:r});}function hr(e,t,r={}){let{ignoreImports:o=false}=r,s=e.replace(/\r\n/g,`
|
|
18
20
|
`).trim(),n=t.replace(/\r\n/g,`
|
|
19
|
-
`).trim();if(s===n)return true;if(!o)return false;let i=/^(import\s+(?:type\s+)?(?:\*\s+as\s+\w+|\{[^}]*\}|\w+)?(?:\s*,\s*(?:\{[^}]*\}|\w+))?\s+from\s+["'])([^"']+)(["'])/gm,f=m=>m.replace(i,(p,d,h,w)=>{if(h.startsWith("."))return `${d}${h}${w}`;let
|
|
20
|
-
File: ${u.info(h)}`),
|
|
21
|
+
`).trim();if(s===n)return true;if(!o)return false;let i=/^(import\s+(?:type\s+)?(?:\*\s+as\s+\w+|\{[^}]*\}|\w+)?(?:\s*,\s*(?:\{[^}]*\}|\w+))?\s+from\s+["'])([^"']+)(["'])/gm,f=m=>m.replace(i,(p,d,h,w)=>{if(h.startsWith("."))return `${d}${h}${w}`;let R=h.split("/"),I=R[R.length-1];return `${d}@normalized/${I}${w}`}),c=f(s),a=f(n);return c===a}function vs(e,t){if(e.type==="registry:api")return t.resolvedPaths.api;if(e.type==="registry:vendor")return t.resolvedPaths.vendor;if(e.type==="registry:admin")return t.resolvedPaths.admin;throw new Error(`Unknown file type: ${e.type}`)}function Ke(e,t,r){let o=vs(e,t);if(e.type==="registry:api"){let i=e.path.replace(/^\/|\/$/g,"").split("/").slice(1).join("/");return x__default.join(o,i)}let s=Cs(e.path,o);return x__default.join(o,s)}function Cs(e,t){let r=e.replace(/^\/|\/$/g,""),o=t.replace(/^\/|\/$/g,""),s=r.split("/"),n=o.split("/");for(let i=n.length-1;i>=0;i--){let f=s.findIndex(c=>c===n[i]);if(f!==-1)return s.slice(f+1).join("/")}return s[s.length-1]}var Ps=new Project({compilerOptions:{}});async function Os(e){let t=await promises.mkdtemp(x__default.join(tmpdir(),"mercurjs-")),r=x__default.basename(e,x__default.extname(e));return x__default.join(t,`${r}.ts`)}function Ns(e){switch(x__default.extname(e).toLowerCase()){case ".tsx":case ".ts":return ScriptKind.TS;default:return ScriptKind.Unknown}}async function qe(e){let t=x__default.extname(e.filename).toLowerCase();if(![".tsx",".ts"].includes(t))return e.raw;let r=Ns(e.filename),o=await Os(e.filename),s=Ps.createSourceFile(o,e.raw,{scriptKind:r});for(let n of s.getImportStringLiterals()){let i=js(n.getLiteralValue(),e.config);n.setLiteralValue(i);}return s.getText()}function js(e,t){if(e.startsWith("@/workflows/")){let r=e.replace(/^@\/workflows\//,"");return `${t.aliases.api}/workflows/${r}`}if(e==="@/workflows")return `${t.aliases.api}/workflows`;if(e.startsWith("@/api/")){let r=e.replace(/^@\/api\//,"");return `${t.aliases.api}/api/${r}`}if(e==="@/api")return `${t.aliases.api}/api`;if(e.startsWith("@/links/")){let r=e.replace(/^@\/links\//,"");return `${t.aliases.api}/links/${r}`}if(e==="@/links")return `${t.aliases.api}/links`;if(e.startsWith("@/modules/")){let r=e.replace(/^@\/modules\//,"");return `${t.aliases.api}/modules/${r}`}if(e==="@/modules")return `${t.aliases.api}/modules`;if(e.startsWith("@/lib/")){let r=e.replace(/^@\/lib\//,"");return `${t.aliases.api}/lib/${r}`}if(e==="@/lib")return `${t.aliases.api}/lib`;if(e.startsWith("@/vendor/")){let r=e.replace(/^@\/vendor\//,"");return `${t.aliases.vendor}/${r}`}if(e==="@/vendor")return t.aliases.vendor;if(e.startsWith("@/admin/")){let r=e.replace(/^@\/admin\//,"");return `${t.aliases.admin}/${r}`}return e==="@/admin"?t.aliases.admin:e}async function Er(e,t,r){if(!e?.length)return {filesCreated:[],filesUpdated:[],filesSkipped:[],filesDeclined:[]};r={overwrite:false,silent:false,yes:false,...r};let o=E("Updating files.",{silent:r.silent})?.start(),s=await C(t.resolvedPaths.cwd),n=[],i=[],f=[],c=[];for(let p of e){let d=Ke(p,t,{isSrcDir:s?.isSrcDir??false,path:r.path??""}),h=basename(p.path),w=x__default.dirname(d),R=existsSync(d);if(R&&statSync(d).isDirectory())throw new Error(`Cannot write to ${d}: path exists and is a directory. Please provide a file path instead.`);let I=await qe({filename:p.path,raw:p.content,config:t});if(R&&!r.overwrite){let S=await promises.readFile(d,"utf-8");if(hr(S,I)){f.push(x__default.relative(t.resolvedPaths.cwd,d));continue}if(!r.yes){o.stop();let F=diffLines(S,I);l.info(`
|
|
22
|
+
File: ${u.info(h)}`),Us(F);let{overwrite:ee}=await yt({type:"confirm",name:"overwrite",message:`The file ${u.info(h)} already exists. Would you like to overwrite?`,initial:false});if(!ee){c.push(x__default.relative(t.resolvedPaths.cwd,d));continue}}}existsSync(w)||await promises.mkdir(w,{recursive:true}),await promises.writeFile(d,I,"utf-8"),R?i.push(x__default.relative(t.resolvedPaths.cwd,d)):n.push(x__default.relative(t.resolvedPaths.cwd,d));}let a=n.length+i.length,m=f.length+c.length;if(a>0){if(o?.succeed(),m>0&&!r.silent){let p=[];a===1?p.push("1 file updated"):p.push(`${a} files updated`),m===1?p.push("1 file skipped"):p.push(`${m} files skipped`),l.info(`${p.join(", ")}.`);}}else c.length?o?.info("No files were updated."):f.length?o?.info("Already up to date."):o?.info("No files to update.");return {filesCreated:n,filesUpdated:i,filesSkipped:f,filesDeclined:c}}var Ls=3;function Ms(e,t=Ls){let r=[],o=new Set;for(let n=0;n<e.length;n++)(e[n]?.added||e[n]?.removed)&&o.add(n);if(o.size===0)return r;let s=new Map;for(let n=0;n<e.length;n++){let i=e[n];if(i)if(i.added||i.removed)s.set(n,"full");else {let f=o.has(n-1),c=o.has(n+1);f&&c?s.set(n,"both"):f?s.set(n,"start"):c&&s.set(n,"end");}}for(let n=0;n<e.length;n++){let i=e[n],f=s.get(n);if(!(!i||!f))if(i.added){let c=i.value.split(`
|
|
21
23
|
`);c[c.length-1]===""&&c.pop();for(let a of c)r.push(`+ ${a}`);}else if(i.removed){let c=i.value.split(`
|
|
22
24
|
`);c[c.length-1]===""&&c.pop();for(let a of c)r.push(`- ${a}`);}else {let c=i.value.split(`
|
|
23
|
-
`);c[c.length-1]===""&&c.pop();let a=[];f==="full"||c.length<=t*2+1?a=c.map(m=>` ${m}`):f==="start"?(a=c.slice(0,t).map(m=>` ${m}`),c.length>t&&a.push(` ... ${c.length-t} lines hidden ...`)):f==="end"?(c.length>t&&a.push(` ... ${c.length-t} lines hidden ...`),a.push(...c.slice(-t).map(m=>` ${m}`))):f==="both"&&(c.length<=t*2+1?a=c.map(m=>` ${m}`):a=[...c.slice(0,t).map(m=>` ${m}`),` ... ${c.length-t*2} lines hidden ...`,...c.slice(-t).map(m=>` ${m}`)]),r.push(...a);}}return r}function
|
|
25
|
+
`);c[c.length-1]===""&&c.pop();let a=[];f==="full"||c.length<=t*2+1?a=c.map(m=>` ${m}`):f==="start"?(a=c.slice(0,t).map(m=>` ${m}`),c.length>t&&a.push(` ... ${c.length-t} lines hidden ...`)):f==="end"?(c.length>t&&a.push(` ... ${c.length-t} lines hidden ...`),a.push(...c.slice(-t).map(m=>` ${m}`))):f==="both"&&(c.length<=t*2+1?a=c.map(m=>` ${m}`):a=[...c.slice(0,t).map(m=>` ${m}`),` ... ${c.length-t*2} lines hidden ...`,...c.slice(-t).map(m=>` ${m}`)]),r.push(...a);}}return r}function Us(e){let t=Ms(e);if(t.length!==0)for(let r of t)r.startsWith("+ ")?process.stdout.write(`${u.success(r)}
|
|
24
26
|
`):r.startsWith("- ")?process.stdout.write(`${u.error(r)}
|
|
25
27
|
`):r.includes("lines hidden")?process.stdout.write(`${u.info(r)}
|
|
26
28
|
`):process.stdout.write(`${r}
|
|
27
|
-
`);}async function
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
`,"utf8"),o.succeed(),await et(e.cwd,r)}async function Ps(e){if(e.defaults)return L.parse({$schema:_e,aliases:{api:"packages/api/src",vendor:"apps/vendor/src",admin:"apps/admin/src"},registries:_});l.info("");let t=await pt([{type:"text",name:"api",message:`Configure the import alias for ${u.info("api")}:`,initial:"packages/api/src"},{type:"text",name:"vendor",message:`Configure the import alias for ${u.info("vendor")}:`,initial:"apps/vendor/src"},{type:"text",name:"admin",message:`Configure the import alias for ${u.info("admin")}:`,initial:"apps/admin/src"}],{onCancel:()=>{process.exit(0);}});return L.parse({$schema:_e,aliases:{api:t.api??"packages/api/src",vendor:t.vendor??"apps/vendor/src",admin:t.admin??"apps/admin/src"},registries:_})}async function _s(e,t){if(t.defaults)return L.parse({$schema:_e,aliases:{api:"packages/api/src",vendor:"apps/vendor/src",admin:"apps/admin/src"},registries:_});let r=await pt([{type:"text",name:"api",message:`Configure the import alias for ${u.info("api")}:`,initial:e.aliases.api},{type:"text",name:"vendor",message:`Configure the import alias for ${u.info("vendor")}:`,initial:e.aliases.vendor},{type:"text",name:"admin",message:`Configure the import alias for ${u.info("admin")}:`,initial:e.aliases.admin}],{onCancel:()=>{process.exit(0);}});return L.parse({$schema:e.$schema,aliases:{api:r.api??e.aliases.api,vendor:r.vendor??e.aliases.vendor,admin:r.admin??e.aliases.admin}})}var Os=z.object({blocks:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),silent:z.boolean()}),gr=new Command().name("add").description("add blocks to your project").argument("[blocks...]","names of blocks to add").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{me();let r=Os.parse({blocks:e,cwd:b__default.resolve(t.cwd),...t}),o=await R(r.cwd);o||(o=U({resolvedPaths:{cwd:r.cwd}})),r.blocks?.length||(l.error("Please specify at least one item to add."),process.exit(1));let{errors:s}=await $t(r);if(s[P]){let{proceed:n}=await pt({type:"confirm",name:"proceed",message:`You need to create a ${u.info("blocks.json")} file to add items. Proceed?`,initial:!0});n||(l.break(),process.exit(1)),o=await ut({cwd:r.cwd,yes:!0,defaults:!1,silent:r.silent});}if(!o)throw new Error(`Failed to read config at ${u.info(r.cwd)}.`);await nr(r.blocks,o,{overwrite:r.overwrite,silent:r.silent,yes:r.yes,path:r.cwd}),await Y({type:"add",payload:{outcome:"success",blocks:r.blocks}},{cwd:r.cwd});}catch(r){l.break(),y(r);}finally{C();}});async function hr(e){let t={},r={cwd:e.cwd,registryFile:b__default.resolve(e.cwd,e.registryFile),outputDir:b__default.resolve(e.cwd,e.outputDir)};if(!gt.existsSync(r.registryFile))return t[M]=true,{errors:t,resolvePaths:null,config:null};if(!gt.existsSync(b__default.resolve(e.cwd,"blocks.json")))return t[P]=true,{errors:t,resolvePaths:null,config:null};await gt.mkdir(r.outputDir,{recursive:true});try{let o=await R(e.cwd);return {errors:t,config:o,resolvePaths:r}}catch{l.break(),l.error(`An invalid ${u.info("blocks.json")} file was found at ${u.info(e.cwd)}.
|
|
32
|
-
Before you can build the registry, you must create a valid ${u.info("blocks.json")} file by running the ${u.info("init")} command.`),l.break(),process.exit(1);}}var $s=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),yr=new Command().name("registry:build").description("builds the registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await Ds({cwd:b.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function Ds(e){try{me();let t=$s.parse(e),[{errors:r,resolvePaths:o,config:s},n]=await Promise.all([hr(t),k(t.cwd)]);(r[P]||!n)&&(l.error(`A ${u.info("blocks.json")} file is required to build the registry. Run ${u.info("mercur init")} to create one.`),l.break(),await Y({type:"build",payload:{outcome:"missing_config"}},{cwd:t.cwd}),process.exit(1)),(r[M]||!o)&&(l.error(`We could not find a registry file at ${u.info(b.resolve(t.cwd,t.registryFile))}.`),l.break(),await Y({type:"build",payload:{outcome:"missing_registry_file"}},{cwd:t.cwd}),process.exit(1));let i=await A.readFile(o.registryFile,"utf-8"),f=J.safeParse(JSON.parse(i));f.success||(l.error(`Invalid registry file found at ${u.info(o.registryFile)}.`),l.break(),process.exit(1));let c=E("Building registry..."),a=await As(f.data,s,n);for(let m of a.items)m.files=m.files?.filter((p,d,h)=>d===h.findIndex(w=>w.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,d,h)=>d===h.findIndex(w=>w===p)));for(let m of a.items){if(!m.files)continue;c.start(`Building ${m.name}...`),m.$schema=jt;for(let d of m.files){let h=n.isSrcDir?"src":"",w=b.resolve(o.cwd,h,d.path);try{if(!(await A.stat(w)).isFile())continue;d.content=await A.readFile(w,"utf-8");}catch(x){console.error("Error reading file in registry build:",w,x);continue}}let p=j.safeParse(m);if(!p.success){l.error(`Invalid registry item found for ${u.info(m.name)}.`);continue}await A.writeFile(b.resolve(o.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await A.copyFile(o.registryFile,b.resolve(o.outputDir,"registry.json")),c.succeed("Building registry."),t.verbose){E(`The registry has ${u.info(a.items.length.toString())} items:`).succeed();for(let m of a.items){l.log(` - ${m.name}`);for(let p of m.files??[])l.log(` - ${p.path}`);}}await Y({type:"build",payload:{outcome:"success"}},{cwd:t.cwd});}catch(t){l.break(),y(t);}}async function As(e,t,r){for(let o of e.items)if(o.files?.length)for(let s of o.files){let n=await st(s.path,t,r);n.files=n.files?.filter(i=>i.path!==s.path),n.files&&o.files.push(...n.files),n.dependencies&&(o.dependencies=o.dependencies?o.dependencies.concat(n.dependencies):n.dependencies);}return e}var Ve=".mercur",ee=/route\.(ts|js)$/;async function yt(e,t={}){let{pathnameFilter:r,ignoreFilter:o,ignorePartFilter:s,sortPathnames:n=true}=t,i=[],f=[e];for(;f.length>0;){let c=await Promise.all(f.map(async a=>{let m={directories:[],pathnames:[]};try{let p=await A__default.readdir(a,{withFileTypes:!0});for(let d of p){if(s&&s(d.name))continue;let h=b__default.join(a,d.name);o&&o(h)||(d.isDirectory()?m.directories.push(h):(!r||r(h))&&m.pathnames.push(h));}}catch(p){if(p.code!=="ENOENT"||a===e)throw p;return null}return m}));f=[];for(let a of c)a&&(f.push(...a.directories),i.push(...a.pathnames));}return n&&i.sort(),i}async function Ye(e){return await A__default.stat(e).catch(()=>null)!==null}async function Je(e){await Ye(e)||await A__default.mkdir(e,{recursive:true});}var Bs="https://raw.githubusercontent.com/mercurjs/mercur/canary/packages/cli/routes-manifest.json",Ws=5e3;function Gs(e){let t=Ls.createHash("sha256").update(e).digest("hex").slice(0,16);return b__default.join(Us.tmpdir(),`mercur-routes-manifest-${t}.json`)}async function He(){let e=process.env.MERCUR_ROUTES_MANIFEST_URL??Bs,t=Gs(e);try{let r=new AbortController,o=setTimeout(()=>r.abort(),Ws),s=await fetch(e,{signal:r.signal});if(clearTimeout(o),!s.ok)throw new Error(`Request failed with status ${s.status}`);let n=await s.json();return await A__default.writeFile(t,JSON.stringify(n),"utf-8").catch(()=>{}),n}catch{try{return JSON.parse(await A__default.readFile(t,"utf-8"))}catch{throw new Error(`Failed to fetch the routes manifest from ${e} and no cached copy is available. Connect to the network and re-run codegen.`)}}}function ue(e){return e.replace(/\\/g,"/")}function Se(e){return e.split("/").reduce((r,o)=>{if(!o||ee.test(o))return r;if(o.startsWith("[")&&o.endsWith("]")){let s=o.slice(1,-1);return `${r}/:${s}`}return `${r}/${o}`},"")||"/"}async function wt(e){return await Ye(e)?(await yt(e,{pathnameFilter:o=>ee.test(o),ignorePartFilter:o=>o.startsWith("_")||o==="node_modules"})).map(o=>{let s=b__default.relative(e,o);return {filePath:ue(s),route:Se(ue(s))}}):[]}function Rt(e){return e.replace(/[-_]+(.)?/g,(t,r)=>r?r.toUpperCase():"").replace(/^[A-Z]/,t=>t.toLowerCase())}function Ys(e){return `../src/api/${e.replace(/\.ts$/,"")}`}function Js(e){return e.startsWith(":")?`$${Rt(e.slice(1))}`:Rt(e)}function Rr(){return {children:new Map}}function Hs(e){let t=Rr();for(let[r,o]of e){let s=r.split("/").filter(Boolean),n=t;for(let i of s){let f=Js(i);n.children.has(f)||n.children.set(f,Rr()),n=n.children.get(f);}n.importType=o;}return t}function Er(e,t=" "){let r=[];if(e.importType&&r.push(e.importType),e.children.size>0){let o=[];for(let[s,n]of e.children){let i=Er(n,t+" ");o.push(`${t} ${s}: ${i}`);}r.push(`{
|
|
29
|
+
`);}async function br(e,t,r){if(r={overwrite:false,silent:false,yes:false,...r},!e.length)return;let o=E("Checking registry.",{silent:r.silent})?.start(),s=await pt(e,ne(t));if(!s)return o?.fail(),y(new Error("Failed to fetch items from registry."));o?.succeed();let{filesCreated:n,filesUpdated:i}=await Er(s.files,t,{overwrite:r.overwrite,silent:r.silent,path:r.path,yes:r.yes});(n.length||i.length)&&await gr(s.dependencies,s.devDependencies,t,{silent:r.silent}),s.docs&&l.info(s.docs);}z.object({cwd:z.string(),yes:z.boolean(),defaults:z.boolean(),silent:z.boolean()});async function xr(e){let t={},r=x__default.resolve(e.cwd);existsSync(r)||(t.MISSING_DIR=true);let o=await C(r);return {errors:t,projectInfo:o}}var Ys=z.object({cwd:z.string(),yes:z.boolean(),defaults:z.boolean(),silent:z.boolean()}),Sr=new Command().name("init").description("initialize your project and install dependencies").option("-y, --yes","skip confirmation prompt.",true).option("-d, --defaults","use default configuration.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async e=>{try{fe();let t=Ys.parse({cwd:x__default.resolve(e.cwd),...e});await wt(t),l.log(`${u.success("Success!")} Project initialization completed.
|
|
30
|
+
You may now add blocks.`),l.break();}catch(t){l.break(),y(t);}finally{k();}});async function wt(e){await xr(e);let t=await b(e.cwd),r=t?await Hs(t,e):await Vs(e);if(!e.yes){let{proceed:n}=await yt({type:"confirm",name:"proceed",message:`Write configuration to ${u.info("blocks.json")}. Proceed?`,initial:true});n||process.exit(0);}let o=E("Writing blocks.json.").start(),s=x__default.resolve(e.cwd,"blocks.json");return r.registries=Object.fromEntries(Object.entries(r.registries||{}).filter(([n])=>!Object.keys(T).includes(n))),await promises.writeFile(s,`${JSON.stringify(r,null,2)}
|
|
31
|
+
`,"utf8"),o.succeed(),await it(e.cwd,r)}async function Vs(e){if(e.defaults)return M.parse({$schema:Ne,aliases:{api:"packages/api/src",vendor:"apps/vendor/src",admin:"apps/admin/src"},registries:T});l.info("");let t=await yt([{type:"text",name:"api",message:`Configure the import alias for ${u.info("api")}:`,initial:"packages/api/src"},{type:"text",name:"vendor",message:`Configure the import alias for ${u.info("vendor")}:`,initial:"apps/vendor/src"},{type:"text",name:"admin",message:`Configure the import alias for ${u.info("admin")}:`,initial:"apps/admin/src"}],{onCancel:()=>{process.exit(0);}});return M.parse({$schema:Ne,aliases:{api:t.api??"packages/api/src",vendor:t.vendor??"apps/vendor/src",admin:t.admin??"apps/admin/src"},registries:T})}async function Hs(e,t){if(t.defaults)return M.parse({$schema:Ne,aliases:{api:"packages/api/src",vendor:"apps/vendor/src",admin:"apps/admin/src"},registries:T});let r=await yt([{type:"text",name:"api",message:`Configure the import alias for ${u.info("api")}:`,initial:e.aliases.api},{type:"text",name:"vendor",message:`Configure the import alias for ${u.info("vendor")}:`,initial:e.aliases.vendor},{type:"text",name:"admin",message:`Configure the import alias for ${u.info("admin")}:`,initial:e.aliases.admin}],{onCancel:()=>{process.exit(0);}});return M.parse({$schema:e.$schema,aliases:{api:r.api??e.aliases.api,vendor:r.vendor??e.aliases.vendor,admin:r.admin??e.aliases.admin}})}var vr="@mercurjs",Cr=e=>{let t=e.match(/^(@[^/]+)\/(.+)$/),r=t?t[1]:vr,o=t?t[2]:e,s=r===vr;return {block:s?o:"<custom-registry>",registry_kind:s?"official":"custom"}};var Zs=z.object({blocks:z.array(z.string()).optional(),yes:z.boolean(),overwrite:z.boolean(),cwd:z.string(),silent:z.boolean()}),kr=new Command().name("add").description("add blocks to your project").argument("[blocks...]","names of blocks to add").option("-y, --yes","skip confirmation prompt.",false).option("-o, --overwrite","overwrite existing files.",false).option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-s, --silent","mute output.",false).action(async(e,t)=>{try{fe();let r=Zs.parse({blocks:e,cwd:x__default.resolve(t.cwd),...t}),o=await b(r.cwd);o||(o=U({resolvedPaths:{cwd:r.cwd}})),r.blocks?.length||(l.error("Please specify at least one item to add."),process.exit(1));let{errors:s}=await Mt(r);if(s[_]){let{proceed:n}=await yt({type:"confirm",name:"proceed",message:`You need to create a ${u.info("blocks.json")} file to add items. Proceed?`,initial:!0});n||(l.break(),process.exit(1)),o=await wt({cwd:r.cwd,yes:!0,defaults:!1,silent:r.silent});}if(!o)throw new Error(`Failed to read config at ${u.info(r.cwd)}.`);await br(r.blocks,o,{overwrite:r.overwrite,silent:r.silent,yes:r.yes,path:r.cwd});for(let n of r.blocks)await He({event:"block_added",properties:{...Cr(n),overwrite:r.overwrite}},{cwd:r.cwd});}catch(r){l.break(),y(r);}finally{k();}});async function _r(e){let t={},r={cwd:e.cwd,registryFile:x__default.resolve(e.cwd,e.registryFile),outputDir:x__default.resolve(e.cwd,e.outputDir)};if(!Et.existsSync(r.registryFile))return t[L]=true,{errors:t,resolvePaths:null,config:null};if(!Et.existsSync(x__default.resolve(e.cwd,"blocks.json")))return t[_]=true,{errors:t,resolvePaths:null,config:null};await Et.mkdir(r.outputDir,{recursive:true});try{let o=await b(e.cwd);return {errors:t,config:o,resolvePaths:r}}catch{l.break(),l.error(`An invalid ${u.info("blocks.json")} file was found at ${u.info(e.cwd)}.
|
|
32
|
+
Before you can build the registry, you must create a valid ${u.info("blocks.json")} file by running the ${u.info("init")} command.`),l.break(),process.exit(1);}}var Qs=z.object({cwd:z.string(),registryFile:z.string(),outputDir:z.string(),verbose:z.boolean().optional().default(false)}),Tr=new Command().name("registry:build").description("builds the registry").argument("[registry]","path to registry.json file","./registry.json").option("-o, --output <path>","destination directory for json files","./r").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-v, --verbose","verbose output").action(async(e,t)=>{await en({cwd:x.resolve(t.cwd),registryFile:e,outputDir:t.output,verbose:t.verbose});});async function en(e){try{fe();let t=Qs.parse(e),[{errors:r,resolvePaths:o,config:s},n]=await Promise.all([_r(t),C(t.cwd)]);(r[_]||!n)&&(l.error(`A ${u.info("blocks.json")} file is required to build the registry. Run ${u.info("mercur init")} to create one.`),l.break(),await me(1),process.exit(1)),(r[L]||!o)&&(l.error(`We could not find a registry file at ${u.info(x.resolve(t.cwd,t.registryFile))}.`),l.break(),await me(1),process.exit(1));let i=await A.readFile(o.registryFile,"utf-8"),f=V.safeParse(JSON.parse(i));f.success||(l.error(`Invalid registry file found at ${u.info(o.registryFile)}.`),l.break(),process.exit(1));let c=E("Building registry..."),a=await tn(f.data,s,n);for(let m of a.items)m.files=m.files?.filter((p,d,h)=>d===h.findIndex(w=>w.path===p.path)),m.dependencies&&(m.dependencies=m.dependencies.filter((p,d,h)=>d===h.findIndex(w=>w===p)));for(let m of a.items){if(!m.files)continue;c.start(`Building ${m.name}...`),m.$schema=Dt;for(let d of m.files){let h=n.isSrcDir?"src":"",w=x.resolve(o.cwd,h,d.path);try{if(!(await A.stat(w)).isFile())continue;d.content=await A.readFile(w,"utf-8");}catch(R){console.error("Error reading file in registry build:",w,R);continue}}let p=O.safeParse(m);if(!p.success){l.error(`Invalid registry item found for ${u.info(m.name)}.`);continue}await A.writeFile(x.resolve(o.outputDir,`${p.data.name}.json`),JSON.stringify(p.data,null,2));}if(await A.copyFile(o.registryFile,x.resolve(o.outputDir,"registry.json")),c.succeed("Building registry."),t.verbose){E(`The registry has ${u.info(a.items.length.toString())} items:`).succeed();for(let m of a.items){l.log(` - ${m.name}`);for(let p of m.files??[])l.log(` - ${p.path}`);}}}catch(t){l.break(),y(t);}}async function tn(e,t,r){for(let o of e.items)if(o.files?.length)for(let s of o.files){let n=await ft(s.path,t,r);n.files=n.files?.filter(i=>i.path!==s.path),n.files&&o.files.push(...n.files),n.dependencies&&(o.dependencies=o.dependencies?o.dependencies.concat(n.dependencies):n.dependencies);}return e}var Ze=".mercur",Q=/route\.(ts|js)$/;async function xt(e,t={}){let{pathnameFilter:r,ignoreFilter:o,ignorePartFilter:s,sortPathnames:n=true}=t,i=[],f=[e];for(;f.length>0;){let c=await Promise.all(f.map(async a=>{let m={directories:[],pathnames:[]};try{let p=await A__default.readdir(a,{withFileTypes:!0});for(let d of p){if(s&&s(d.name))continue;let h=x__default.join(a,d.name);o&&o(h)||(d.isDirectory()?m.directories.push(h):(!r||r(h))&&m.pathnames.push(h));}}catch(p){if(p.code!=="ENOENT"||a===e)throw p;return null}return m}));f=[];for(let a of c)a&&(f.push(...a.directories),i.push(...a.pathnames));}return n&&i.sort(),i}async function Xe(e){return await A__default.stat(e).catch(()=>null)!==null}async function Qe(e){await Xe(e)||await A__default.mkdir(e,{recursive:true});}var an="https://raw.githubusercontent.com/mercurjs/mercur/canary/packages/cli/routes-manifest.json",cn=5e3;function ln(e){let t=on.createHash("sha256").update(e).digest("hex").slice(0,16);return x__default.join(sn.tmpdir(),`mercur-routes-manifest-${t}.json`)}async function et(){let e=process.env.MERCUR_ROUTES_MANIFEST_URL??an,t=ln(e);try{let r=new AbortController,o=setTimeout(()=>r.abort(),cn),s=await fetch(e,{signal:r.signal});if(clearTimeout(o),!s.ok)throw new Error(`Request failed with status ${s.status}`);let n=await s.json();return await A__default.writeFile(t,JSON.stringify(n),"utf-8").catch(()=>{}),n}catch{try{return JSON.parse(await A__default.readFile(t,"utf-8"))}catch{throw new Error(`Failed to fetch the routes manifest from ${e} and no cached copy is available. Connect to the network and re-run codegen.`)}}}function ge(e){return e.replace(/\\/g,"/")}function ke(e){return e.split("/").reduce((r,o)=>{if(!o||Q.test(o))return r;if(o.startsWith("[")&&o.endsWith("]")){let s=o.slice(1,-1);return `${r}/:${s}`}return `${r}/${o}`},"")||"/"}async function It(e){return await Xe(e)?(await xt(e,{pathnameFilter:o=>Q.test(o),ignorePartFilter:o=>o.startsWith("_")||o==="node_modules"})).map(o=>{let s=x__default.relative(e,o);return {filePath:ge(s),route:ke(ge(s))}}):[]}function St(e){return e.replace(/[-_]+(.)?/g,(t,r)=>r?r.toUpperCase():"").replace(/^[A-Z]/,t=>t.toLowerCase())}function mn(e){return `../src/api/${e.replace(/\.ts$/,"")}`}function pn(e){return e.startsWith(":")?`$${St(e.slice(1))}`:St(e)}function Or(){return {children:new Map}}function un(e){let t=Or();for(let[r,o]of e){let s=r.split("/").filter(Boolean),n=t;for(let i of s){let f=pn(i);n.children.has(f)||n.children.set(f,Or()),n=n.children.get(f);}n.importType=o;}return t}function jr(e,t=" "){let r=[];if(e.importType&&r.push(e.importType),e.children.size>0){let o=[];for(let[s,n]of e.children){let i=jr(n,t+" ");o.push(`${t} ${s}: ${i}`);}r.push(`{
|
|
33
33
|
${o.join(`;
|
|
34
34
|
`)};
|
|
35
|
-
${t}}`);}return r.length===0?"{}":r.length===1?r[0]:r.join(" & ")}function
|
|
35
|
+
${t}}`);}return r.length===0?"{}":r.length===1?r[0]:r.join(" & ")}function Fr(e,t,r){let o=new Map;for(let[f,c]of Object.entries(t))o.set(f,c);let s=r??mn;for(let f of e){let c=s(f.filePath);o.set(f.route,`typeof import("${c}")`);}let n=un(o);return `// This file is generated automatically by Mercur CLI
|
|
36
36
|
// Do not edit this file manually
|
|
37
37
|
|
|
38
|
-
export type Routes = ${
|
|
39
|
-
`}async function
|
|
40
|
-
Before you can run registry:codegen, you must create a valid ${u.info("blocks.json")} file by running the ${u.info("init")} command.`),l.break(),process.exit(1);}}var
|
|
41
|
-
File: ${u.info(c.path)}`),
|
|
38
|
+
export type Routes = ${jr(n,"")};
|
|
39
|
+
`}async function Dr(e){let t=x__default.join(e,Ze,"routes.d.ts"),r=x__default.join(e,"src","api"),o=x__default.dirname(t);await Qe(o);let s=await et(),n=await It(r),i=Fr(n,s);await A__default.writeFile(t,i,"utf-8");}async function $r(e,t){let r=x__default.join(e,Ze,"index.d.ts"),o=x__default.dirname(r);await Qe(o);let s=t.map(c=>{let a=c.indexOf("/api/"),m=a!==-1?c.slice(a+5):c;return {filePath:c,route:ke(ge(m))}}),n=c=>`../src/${c.replace(/\.ts$/,"")}`,i=await et(),f=Fr(s,i,n);await A__default.writeFile(r,f,"utf-8");}async function Mr(e){let t={},r={cwd:e.cwd,registryFile:x__default.resolve(e.cwd,e.registryFile)};if(!Et.existsSync(r.registryFile))return t[L]=true,{errors:t,resolvePaths:null,config:null};if(!Et.existsSync(x__default.resolve(e.cwd,"blocks.json")))return t[_]=true,{errors:t,resolvePaths:null,config:null};try{let o=await b(e.cwd);return {errors:t,config:o,resolvePaths:r}}catch{l.break(),l.error(`An invalid ${u.info("blocks.json")} file was found at ${u.info(e.cwd)}.
|
|
40
|
+
Before you can run registry:codegen, you must create a valid ${u.info("blocks.json")} file by running the ${u.info("init")} command.`),l.break(),process.exit(1);}}var gn=z.object({cwd:z.string(),registryFile:z.string()}),zr=new Command().name("registry:codegen").description("generate type definitions for registry block API routes").argument("[registry]","path to registry.json file","./registry.json").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{await hn({cwd:x.resolve(t.cwd),registryFile:e});});async function hn(e){try{let t=gn.parse(e),{errors:r,resolvePaths:o}=await Mr(t);r[_]&&(l.error(`A ${u.info("blocks.json")} file is required to run registry:codegen. Run ${u.info("mercur init")} to create one.`),l.break(),process.exit(1)),(r[L]||!o)&&(l.error(`Could not find a registry file at ${u.info(x.resolve(t.cwd,t.registryFile))}.`),l.break(),process.exit(1));let s=await A.readFile(o.registryFile,"utf-8"),n=V.safeParse(JSON.parse(s));n.success||(l.error(`Invalid registry file at ${u.info(o.registryFile)}.`),l.break(),process.exit(1));let i=[];for(let c of n.data.items)if(c.files)for(let a of c.files)a.type==="registry:api"&&Q.test(a.path)&&i.push(a.path);if(i.length===0){l.warn("No API route files found in registry.");return}let f=E("Generating registry route types...");await $r(t.cwd,i),f.succeed("Registry route types generated successfully."),l.break();}catch(t){l.break(),y(t);}}var wn=z.object({cwd:z.string()}),Wr=new Command().name("codegen").description("generate type definitions for API routes").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{await Rn({cwd:x.resolve(e.cwd)});});async function Rn(e){try{let t=wn.parse(e),r=E("Generating route types...");await Dr(t.cwd),r.succeed("Route types generated successfully."),l.break();}catch(t){l.break(),y(t);}}async function Yr(e,t){let{config:r}=t||{};if(G(e)){let[i]=await Z([e]);try{return V.parse(i)}catch(f){throw new P(e,f)}}if(!e.startsWith("@"))throw new Ae(e);let o=e;o.endsWith("/registry")||(o=`${o}/registry`);let s=Ee(o,ne(r));if(!s?.url)throw new oe(o);let[n]=await Z([s.url]);try{return V.parse(n)}catch(i){throw new P(o,i)}}async function tt(e,t){let{config:r}=t||{};return k(),Ge(e,ne(r))}var vn=z.object({blocks:z.array(z.string()).optional(),cwd:z.string()}),Vr=new Command().name("diff").description("check for updates against the registry").argument("[blocks...]","the block names to diff").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=vn.parse({blocks:e,cwd:x__default.resolve(t.cwd),type:t.type}),o=await b(r.cwd);o||(o=U({resolvedPaths:{cwd:r.cwd}})),r.blocks?.length||(l.error("Please specify at least one block to diff."),process.exit(1));let s=await tt(r.blocks,{config:o}),n=r.blocks.filter(f=>!s.some(c=>c.name===f));n.length>0&&(l.error(`Blocks ${n.join(", ")} not found in registry.`),process.exit(1));let i=await C(o.resolvedPaths.cwd);for(let f of s)for(let c of f.files){let a=Ke(c,o,{isSrcDir:i?.isSrcDir??!1,path:r.cwd});if(!existsSync(a)){l.info(`File ${a} does not exist locally.`);continue}let m=await promises.readFile(a,"utf-8"),p=await qe({filename:c.path,raw:c.content,config:o,isRemote:!1}),d=diffLines(m,p);d.length>1&&(l.info(`
|
|
41
|
+
File: ${u.info(c.path)}`),Cn(d));}}catch(r){y(r);}finally{k();}});function Cn(e){for(let t of e)t&&(t.added?process.stdout.write(u.success(t.value)):t.removed?process.stdout.write(u.error(t.value)):process.stdout.write(t.value));}var Hr=new Command().name("info").description("get information about your project").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{l.info("> project info"),console.log(await C(e.cwd)),l.break(),l.info("> blocks.json"),console.log(await b(e.cwd));}catch(t){y(t);}});var Pn=z.object({cwd:z.string(),query:z.string().optional(),registry:z.string().optional()}),Jr=new Command().name("search").description("search blocks from registries").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-q, --query <query>","query string").option("-r, --registry <registry>","the registry to search from (default: @mercurjs)","@mercurjs").action(async e=>{try{let t=Pn.parse({cwd:x__default.resolve(e.cwd),query:e.query,type:e.type,registry:e.registry}),r=await b(t.cwd);r||(r=U({resolvedPaths:{cwd:t.cwd}}));let s=(await Yr(t.registry??"@mercurjs",{config:r})).items;if(t.query){let n=t.query.toLowerCase();s=s.filter(i=>i.name.toLowerCase().includes(n)||i.description?.toLowerCase().includes(n));}console.log(JSON.stringify(s,null,2)),process.exit(0);}catch(t){y(t);}finally{k();}});var Kr=new Command().name("telemetry").description("manage the collection of anonymous usage data").option("--enable","enable telemetry").option("--disable","disable telemetry").action(async e=>{try{if(e.enable&&e.disable){l.error("Cannot use --enable and --disable together.");return}if(!e.enable&&!e.disable){let r=Y.get("telemetry_enabled"),o=process.env.MERCUR_DISABLE_TELEMETRY==="true",s=r&&!o,n=s?"enabled":"disabled";l.log(`Telemetry is currently ${n}.`),o&&r&&l.log("(Disabled via MERCUR_DISABLE_TELEMETRY environment variable)"),l.log(s?'Run "mercurjs telemetry --disable" to opt out.':'Run "mercurjs telemetry --enable" to opt in.'),l.log(`Learn more: ${Ve}`);return}let t=!!e.enable;mr(t),t?l.success(`Telemetry enabled. Learn more: ${Ve}`):l.success("Telemetry disabled. No data will be collected.");}catch(t){y(t);}});var Fn=z.object({cwd:z.string()}),Zr=new Command().name("view").description("view block details from the registry").argument("<blocks...>","the block names to view").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async(e,t)=>{try{let r=Fn.parse({cwd:x__default.resolve(t.cwd),type:t.type}),o=await b(r.cwd);o||(o=U({resolvedPaths:{cwd:r.cwd}}));let s=await tt(e,{config:o});console.log(JSON.stringify(s,null,2)),process.exit(0);}catch(r){y(r);}finally{k();}});var Mn=[".tsx",".ts",".jsx",".js"];function Un(e){for(let t of Mn){let r=x__default.join(e,`index${t}`);if(st.existsSync(r))return r}return null}function zn(e,t){let r={};try{r=JSON.parse(readFileSync(x__default.resolve(e,"package.json"),"utf-8"));}catch{}return new Set([...Object.keys(r.dependencies||{}),...Object.keys(r.peerDependencies||{}),...Object.keys(r.devDependencies||{}),"react","react/jsx-runtime","react-dom","react-router-dom","react-i18next","i18next","@medusajs/js-sdk","@medusajs/admin-sdk","@medusajs/ui","@medusajs/icons","@mercurjs/client","@mercurjs/dashboard-shared","@tanstack/react-query",...t])}async function nt(e){let t=x__default.resolve(e.root,e.srcDir);if(!st.existsSync(t))return true;let r=await import('vite'),o=(await import('@vitejs/plugin-react')).default,s=zn(e.root,e.extraExternal??[]),n=x__default.resolve(e.root,e.outFile),i=x__default.dirname(n),f=x__default.basename(n,x__default.extname(n)),c=Un(t),a=x__default.join(t,"__dashboard-extensions__.js"),m=c??a;try{c||await writeFile(a,generatePluginEntryModule(t),"utf-8");let p=process.env.NODE_ENV;process.env.NODE_ENV="production",await r.build({build:{lib:{entry:m,formats:["es","cjs"],fileName:f},emptyOutDir:!1,minify:!1,outDir:i,watch:e.watch?{}:void 0,rollupOptions:{external:(w,R)=>{let I=w.split("/"),S=I[0]?.startsWith("@")?`${I[0]}/${I[1]}`:I[0],F=[...builtinModules,...builtinModules.map(ee=>`node:${ee}`)];return R?!!(S&&s.has(S)):!!(S&&s.has(S)||S&&F.includes(S))},output:{preserveModules:!1,chunkFileNames:()=>"_chunks/[name]-[hash]"}}},plugins:[o()],logLevel:"silent",clearScreen:!1}),process.env.NODE_ENV=p;let d=x__default.join(i,`${f}.es.js`),h=x__default.join(i,`${f}.mjs`);return st.existsSync(d)&&st.renameSync(d,h),!0}catch(p){return console.error(p),false}finally{if(!c)try{await rm(a,{force:!0});}catch{}}}var Qr=new Command().name("plugin:build").description("build a Medusa plugin").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).action(async e=>{try{let t=x__default.resolve(e.cwd),r=E("Building plugin..."),{Compiler:o}=await import('@medusajs/framework/build-tools'),s=new o(t,l),n=await s.loadTSConfigFile();n||(r.fail("Unable to compile plugin \u2014 tsconfig not found."),process.exit(1));let i=x__default.resolve(t,".medusa/server");(await Promise.all([s.buildPluginBackend(n),...["admin","vendor"].map(c=>nt({root:t,srcDir:`src/${c}`,outFile:x__default.join(i,"src",c,"index.mjs")}))])).every(c=>c===!0)?r.succeed("Plugin built successfully."):(r.fail("Plugin build failed."),process.exit(1));}catch(t){l.break(),y(t);}});var eo=["admin","vendor"],to=new Command().name("dashboard:build").description("build a dashboard extensions entry (routes, widgets, custom fields, layouts, i18n) from a source directory").option("-c, --cwd <cwd>","the working directory. defaults to the current directory.",process.cwd()).option("-a, --app <app>","which panel the entry targets (admin|vendor)","admin").option("-s, --src <src>","source directory to crawl. defaults to src/<app> when it exists, else src.").option("-o, --out <out>","output file. defaults to dist/<app>-extensions.mjs.").option("-w, --watch","rebuild on change",false).action(async e=>{try{let t=x__default.resolve(e.cwd);eo.includes(e.app)||(l.error(`--app must be one of: ${eo.join(", ")}`),process.exit(1));let r=e.src??(st.existsSync(x__default.join(t,"src",e.app))?x__default.join("src",e.app):"src"),o=e.out??`dist/${e.app}-extensions.mjs`,s=E(`Building ${e.app} extensions...`);await nt({root:t,srcDir:r,outFile:o,watch:e.watch})?s.succeed(`Built ${e.app} extensions.`):(s.fail(`Failed to build ${e.app} extensions.`),process.exit(1));}catch(t){l.break(),y(t);}});process.on("SIGINT",()=>process.exit(0));process.on("SIGTERM",()=>process.exit(0));async function Vn(){let e=new Command().name("@mercurjs/cli").description("Add blocks from registries to your project").version(Oe.version,"-v, --version","display the version number");dr(e),e.addCommand(kr).addCommand(Tr).addCommand(zr).addCommand(Wr).addCommand(Vr).addCommand(Hr).addCommand(Sr).addCommand(Jr).addCommand(Kr).addCommand(Zr).addCommand(Qr).addCommand(to),e.parse();}Vn();export{io as registryConfigItemSchema,Ft as registryConfigSchema,Zn as registryIndexSchema,Ot as registryItemFileSchema,O as registryItemSchema,no as registryItemTypeSchema,jt as registryResolvedItemsTreeSchema,V as registrySchema};//# sourceMappingURL=index.js.map
|
|
42
42
|
//# sourceMappingURL=index.js.map
|