@membranehq/cli 1.1.5 → 1.1.6
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 +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -142,7 +142,7 @@ ${t.comment}`:t.comment}this.doc.range[2]=t.offset;break}default:this.errors.pus
|
|
|
142
142
|
`});return t.writeLine("// Generated TypeScript definitions for Membrane actions"),t.writeLine(`// Actions: ${e.map(n=>n.key).join(", ")}`),t.newLine(),Nd(t,e),t.newLine(),t.toString()}c($d,"generateTypeScriptContent");function Nd(s,e){e.forEach((t,n)=>{const r=bi(wi(t.key));s.writeLine(`export interface ${r}Request {`),s.indent(()=>{s.writeLine("readonly id: string"),s.writeLine(`readonly action: '${t.key}'`),t?.inputSchema?.properties&&pa(s,t.inputSchema.properties,t.inputSchema.required||[])}),s.writeLine("}"),s.writeLine(`export interface ${r}Response {`),s.indent(()=>{s.writeLine("readonly id: string"),s.writeLine("readonly success: boolean");const i=t?.customOutputSchema||t?.outputSchema;if(i){const o=i.properties;o&&Object.keys(o).length>0?(s.writeLine("readonly data: {"),s.indent(()=>{pa(s,o,i?.required||[])}),s.writeLine("}")):s.writeLine("readonly data?: Record<string, unknown>")}else s.writeLine("readonly data?: Record<string, unknown>")}),s.writeLine("}"),n<e.length-1&&s.newLine()})}c(Nd,"generateTypeScriptInterfaces");function pa(s,e,t){Object.entries(e).forEach(([n,r])=>{const o=t.includes(n)?"":"?",a=Dr(r);s.writeLine(`readonly ${n}${o}: ${a}`)})}c(pa,"generateTypeScriptProperties");function Dr(s){return s.type==="string"?s.enum?s.enum.map(e=>`'${e}'`).join(" | "):"string":s.type==="number"||s.type==="integer"?"number":s.type==="boolean"?"boolean":s.type==="array"?`${s.items?Dr(s.items):"unknown"}[]`:s.type==="object"?s.properties?`{ ${Object.entries(s.properties).map(([t,n])=>{const i=(s.required||[]).includes(t)?"":"?",o=Dr(n);return`readonly ${t}${i}: ${o}`}).join("; ")} }`:"Record<string, unknown>":"unknown"}c(Dr,"convertJsonSchemaToTypeScript");async function xd(s){const{out:e,target:t}=s;await M.promises.mkdir(e,{recursive:!0});const n=Rd(s),r=`${t}.${Pd(t)}`,i=K.join(e,r);await M.promises.writeFile(i,n,"utf-8")}c(xd,"generateCode");function Rd(s){switch(s.target){case"openapi":return Ad(s);case"typescript":return $d(s);default:throw new Error(`Unsupported target: ${s.target}`)}}c(Rd,"generateContent");function Pd(s){switch(s){case"openapi":return"json";case"typescript":return"ts";default:throw new Error(`Unsupported target: ${s}`)}}c(Pd,"getFileExtension");const jr=c(()=>[_.yellow("\u250C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510"),_.yellow("\u2502 \u26A0\uFE0F EXPERIMENTAL FEATURE WARNING \u2502"),_.yellow("\u251C\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2524"),_.yellow("\u2502 The codegen command is experimental and subject to rapid changes.\u2502"),_.yellow("\u2502 Features, APIs, and file structures may change without notice. \u2502"),_.yellow("\u2502 Use in production environments is not recommended. \u2502"),_.yellow("\u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518"),""].join(`
|
|
143
143
|
`),"createExperimentalWarning$1");function Md(s,e){s.command("codegen").alias("install").description("\u26A0\uFE0F EXPERIMENTAL: Generate code for easy integration within projects - This feature is experimental and will be changing rapidly. Use at your own risk. (Alias: install)").requiredOption("--actions <actions>",'Comma-separated list of action names (e.g., "list-files,get-file-by-id")').requiredOption("--out <path>","Output directory for generated files").requiredOption("--target <type>","Target format: openapi or typescript").requiredOption("--schemasOnly","Generate only schemas without implementation").addHelpText("after",jr()).addHelpText("after",["",_.bold("Examples:"),` ${_.gray("\u25B8")} ${_.cyan("membrane codegen --actions list-files,get-file-by-id --out src/generated --target openapi --schemasOnly")}`,` ${_.gray("\u25B8")} ${_.cyan("membrane install --actions delete-file --out src/generated --target typescript --schemasOnly")}`,"",jr()].join(`
|
|
144
144
|
`)).action(async t=>{try{console.warn(jr()),console.error(_.cyan("\u{1F527} Membrane Codegen")),console.error("Status: Loading membrane interfaces...");const n=await Ld(e,t),r={out:t.out,target:t.target,schemasOnly:t.schemasOnly,membraneInterfaces:n};console.error(`Output: ${r.out}`),console.error(`Target: ${r.target}`),console.error(`Schemas Only: ${r.schemasOnly?"Yes":"No"}`),console.error(`Loaded ${n.actions.length} membrane interfaces`),console.error("Status: Generating code..."),await xd(r),console.error(_.green("\u2705 Code generation completed successfully!")),process.exit(0)}catch(n){console.error(_.red("\u274C Code generation failed:")),console.error(n instanceof Error?n.message:"Unknown error occurred"),process.exit(1)}})}c(Md,"setupCodegenCommand");async function Ld(s,e){return await s.fetchElements(),{actions:[...s.getSyncedElementsByType(D.Action).map(t=>t.data)].filter(t=>e.actions.includes(t.key||""))}}c(Ld,"loadMembraneInterfaces");function Dd(s,e){s.command("init").description("Run interactive setup for Membrane project").option("--key <key>","Workspace key for non-interactive setup").option("--secret <secret>","Workspace secret for non-interactive setup").addHelpText("after",["","Examples:"," membrane init # Run interactive setup"," membrane init --key KEY --secret SEC # Non-interactive setup with key and secret",""].join(`
|
|
145
|
-
`)).action(t=>{t.key&&t.secret?Ft.saveToFile({workspaceKey:t.key,workspaceSecret:t.secret})?(console.error("\u2705 Configuration saved to membrane.config.yml"),process.exit(0)):(console.error("Error writing configuration file"),process.exit(1)):t.key||t.secret?(console.error("Error: Both --key and --secret must be provided for non-interactive mode"),process.exit(1)):wn(rt.createElement(rs,{membraneCLIService:e,children:rt.createElement(fa,{onComplete:c(()=>process.exit(0),"onComplete")})}))})}c(Dd,"setupInitCommand");async function ma(s,e,t){const n={iss:s,exp:Math.floor(Date.now()/1e3)+600,isAdmin:!0};return t&&(n.id=t),Fs.sign(n,e)}c(ma,"generateAdminAccessToken");async function jd(s,e){return(await qs.get(`${s}/docs-json`,{headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}})).data}c(jd,"fetchOpenApiSchema");function Ot(s,e=!0,t,n=new Set){if(!s)return e?U.string():U.string().optional();if(s.$ref){const i=s.$ref.replace("#/components/schemas/","");if(n.has(i))return U.any();if(n.add(i),t?.schemas?.[i]){const o=t.schemas[i];return Ot(o,e,t,n)}return U.any()}let r;if(s.type==="object"||s.properties){const i={};if(s.properties)for(const[o,a]of Object.entries(s.properties)){const l=s.required?.includes(o)??!1;i[o]=Ot(a,l,t,n)}r=Object.keys(i).length>0?U.object(i):U.record(U.string(),U.any()),s.additionalProperties&&typeof s.additionalProperties=="object"&&(r=U.record(U.string(),U.any()))}else if(s.type==="array"){const i=s.items?Ot(s.items,!0,t,n):U.any();r=U.array(i)}else if(s.anyOf)r=U.any();else{switch(s.type){case"integer":r=U.coerce.number().int();break;case"number":r=U.coerce.number();break;case"boolean":r=U.coerce.boolean();break;case"string":default:r=U.string();break}s.format==="uuid"?r=U.string().uuid():s.format==="email"?r=U.string().email():s.format==="date"?r=U.string().regex(/^\d{4}-\d{2}-\d{2}$/):s.format==="date-time"&&(r=U.string().datetime()),s.enum&&(r=U.enum(s.enum)),(s.type==="integer"||s.type==="number")&&(s.minimum!==void 0&&(r=r.min(s.minimum)),s.maximum!==void 0&&(r=r.max(s.maximum))),s.type==="string"&&(s.minLength!==void 0&&(r=r.min(s.minLength)),s.maxLength!==void 0&&(r=r.max(s.maxLength)))}return e?r:r.optional()}c(Ot,"convertOpenApiSchemaToZod");function ga(s){const e=s.match(/\{([^}]+)\}/g);return e?e.map(t=>t.slice(1,-1)):[]}c(ga,"extractPathParameters");function Fd(s,e,t,n,r,i,o,a){const l=s.operationId||`${t}_${e.replace(/[^a-zA-Z0-9]/g,"_")}`,u=s.description||s.summary||`${t.toUpperCase()} ${e}`,d={},f={},p={};if(s.parameters){for(const y of s.parameters)if(y.in==="path")f[y.name]=Ot(y.schema,!0,o).describe(y.description||`Path parameter: ${y.name}`);else if(y.in==="query"){const h=y.required===!0;p[y.name]=Ot(y.schema,h,o).describe(y.description||`Query parameter: ${y.name}`)}}if(Object.keys(f).length>0&&(d.params=U.object(f).describe("Path parameters")),Object.keys(p).length>0&&(d.query=U.object(p).describe("Query parameters")),s.requestBody&&s.requestBody.content){const y=s.requestBody.required===!0;if(s.requestBody.content["application/json"]){const h=s.requestBody.content["application/json"].schema;h?d.body=Ot(h,y,o).describe("Request body (JSON)"):d.body=U.any().describe("Request body (JSON)")}else s.requestBody.content["application/octet-stream"]||s.requestBody.content["text/plain"]?d.body=y?U.string().describe("Request body (binary/text)"):U.string().optional().describe("Request body (binary/text)"):d.body=U.any().describe("Request body")}const m=Object.keys(d).length>0?U.object(d):U.object({});return{name:l,description:u,parameters:m,async execute(y){try{const h=ga(e);if(h.length>0){if(!y.params)throw new Error(`Missing required path parameters: ${h.join(", ")}`);const N=h.filter(L=>!(L in y.params));if(N.length>0)throw new Error(`Missing required path parameters: ${N.join(", ")}`)}let w=`${n}${e}`;if(y.params)for(const[N,L]of Object.entries(y.params)){const A=`{${N}}`;w.includes(A)&&(w=w.replace(A,String(L)))}const k=ga(w);if(k.length>0)throw new Error(`Unresolved path parameters: ${k.join(", ")}`);const T=new URLSearchParams;if(y.query)for(const[N,L]of Object.entries(y.query))L!=null&&T.append(N,String(L));T.toString()&&(w+=`?${T.toString()}`);const I=await ma(r,i,a),E={method:t.toUpperCase(),headers:{Authorization:`Bearer ${I}`}};y.body&&t.toLowerCase()!=="get"&&(s.requestBody?.content?.["application/json"]?(E.headers["Content-Type"]="application/json",E.data=y.body):s.requestBody?.content?.["application/octet-stream"]?(E.headers["Content-Type"]="application/octet-stream",E.data=y.body):s.requestBody?.content?.["text/plain"]?(E.headers["Content-Type"]="text/plain",E.data=y.body):(E.headers["Content-Type"]="application/json",E.data=y.body));const $=await qs.request({url:w,...E});return{content:[{type:"text",text:JSON.stringify($.data,null,2)}]}}catch(h){return qs.isAxiosError(h)?{content:[{type:"text",text:`Error: ${h.response?.data?`HTTP ${h.response.status}: ${h.response.statusText} - ${JSON.stringify(h.response.data)}`:`HTTP ${h.response?.status||"unknown"}: ${h.message}`}`}],isError:!0}:h instanceof Error?{content:[{type:"text",text:`Error: API call failed: ${h.message}`}],isError:!0}:{content:[{type:"text",text:"Error: API call failed with unknown error"}],isError:!0}}}}}c(Fd,"createApiTool");function qd(s,e,t,n,r){const i=[];if(!s.paths)return i;const o=s.components||{};for(const[a,l]of Object.entries(s.paths))if(typeof l=="object"&&l!==null){for(const[u,d]of Object.entries(l))if(["get","post","put","delete","patch"].includes(u)&&d&&typeof d=="object"){const f=Fd(d,a,u,e,t,n,o,r);i.push(f)}}return i}c(qd,"convertOpenApiToTools");function Kd(s){s.command("mcp").description("Launch MCP server with OpenAPI endpoints as tools (API URI is read from environment variables or membrane.config.yml)").addHelpText("after",["","Examples:"," membrane mcp # Launch MCP server using API URI from env vars or membrane.config.yml",""].join(`
|
|
145
|
+
`)).action(t=>{t.key&&t.secret?Ft.saveToFile({workspaceKey:t.key,workspaceSecret:t.secret})?(console.error("\u2705 Configuration saved to membrane.config.yml"),process.exit(0)):(console.error("Error writing configuration file"),process.exit(1)):t.key||t.secret?(console.error("Error: Both --key and --secret must be provided for non-interactive mode"),process.exit(1)):wn(rt.createElement(rs,{membraneCLIService:e,children:rt.createElement(fa,{onComplete:c(()=>process.exit(0),"onComplete")})}))})}c(Dd,"setupInitCommand");async function ma(s,e,t){const n={iss:s,exp:Math.floor(Date.now()/1e3)+600,isAdmin:!0};return t&&(n.id=t),Fs.sign(n,e)}c(ma,"generateAdminAccessToken");async function jd(s,e){return(await qs.get(`${s}/docs-json`,{headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json"}})).data}c(jd,"fetchOpenApiSchema");function Ot(s,e=!0,t,n=new Set){if(!s)return e?U.string():U.string().optional();if(s.$ref){const i=s.$ref.replace("#/components/schemas/","");if(n.has(i))return U.any();if(n.add(i),t?.schemas?.[i]){const o=t.schemas[i];return Ot(o,e,t,n)}return U.any()}let r;if(s.type==="object"||s.properties){const i={};if(s.properties)for(const[o,a]of Object.entries(s.properties)){const l=s.required?.includes(o)??!1;i[o]=Ot(a,l,t,n)}r=Object.keys(i).length>0?U.object(i):U.record(U.string(),U.any()),s.additionalProperties&&typeof s.additionalProperties=="object"&&(r=U.record(U.string(),U.any()))}else if(s.type==="array"){const i=s.items?Ot(s.items,!0,t,n):U.any();r=U.array(i)}else if(s.anyOf)r=U.any();else{switch(s.type){case"integer":r=U.coerce.number().int();break;case"number":r=U.coerce.number();break;case"boolean":r=U.coerce.boolean();break;case"string":default:r=U.string();break}s.format==="uuid"?r=U.string().uuid():s.format==="email"?r=U.string().email():s.format==="date"?r=U.string().regex(/^\d{4}-\d{2}-\d{2}$/):s.format==="date-time"&&(r=U.string().datetime()),s.enum&&(r=U.enum(s.enum)),(s.type==="integer"||s.type==="number")&&(s.minimum!==void 0&&(r=r.min(s.minimum)),s.maximum!==void 0&&(r=r.max(s.maximum))),s.type==="string"&&(s.minLength!==void 0&&(r=r.min(s.minLength)),s.maxLength!==void 0&&(r=r.max(s.maxLength)))}return e?r:r.optional()}c(Ot,"convertOpenApiSchemaToZod");function ga(s){const e=s.match(/\{([^}]+)\}/g);return e?e.map(t=>t.slice(1,-1)):[]}c(ga,"extractPathParameters");function Fd(s,e,t,n,r,i,o,a){const l=s.operationId||`${t}_${e.replace(/[^a-zA-Z0-9]/g,"_")}`,u=s.description||s.summary||`${t.toUpperCase()} ${e}`,d={},f={},p={};if(s.parameters){for(const y of s.parameters)if(y.in==="path")f[y.name]=Ot(y.schema,!0,o).describe(y.description||`Path parameter: ${y.name}`);else if(y.in==="query"){const h=y.required===!0;p[y.name]=Ot(y.schema,h,o).describe(y.description||`Query parameter: ${y.name}`)}}if(Object.keys(f).length>0&&(d.params=U.object(f).describe("Path parameters")),Object.keys(p).length>0&&(d.query=U.object(p).describe("Query parameters")),s.requestBody&&s.requestBody.content){const y=s.requestBody.required===!0;if(s.requestBody.content["application/json"]){const h=s.requestBody.content["application/json"].schema;h?d.body=Ot(h,y,o).describe("Request body (JSON)"):d.body=U.any().describe("Request body (JSON)")}else s.requestBody.content["application/octet-stream"]||s.requestBody.content["text/plain"]?d.body=y?U.string().describe("Request body (binary/text)"):U.string().optional().describe("Request body (binary/text)"):d.body=U.any().describe("Request body")}const m=Object.keys(d).length>0?U.object(d):U.object({});return{name:l,description:u,parameters:m,async execute(y){try{const h=ga(e);if(h.length>0){if(!y.params)throw new Error(`Missing required path parameters: ${h.join(", ")}`);const N=h.filter(L=>!(L in y.params));if(N.length>0)throw new Error(`Missing required path parameters: ${N.join(", ")}`)}let w=`${n}${e}`;if(y.params)for(const[N,L]of Object.entries(y.params)){const A=`{${N}}`;w.includes(A)&&(w=w.replace(A,String(L)))}const k=ga(w);if(k.length>0)throw new Error(`Unresolved path parameters: ${k.join(", ")}`);const T=new URLSearchParams;if(y.query)for(const[N,L]of Object.entries(y.query))L!=null&&T.append(N,String(L));T.toString()&&(w+=`?${T.toString()}`);const I=await ma(r,i,a),E={method:t.toUpperCase(),headers:{Authorization:`Bearer ${I}`}};y.body&&t.toLowerCase()!=="get"&&(s.requestBody?.content?.["application/json"]?(E.headers["Content-Type"]="application/json",E.data=y.body):s.requestBody?.content?.["application/octet-stream"]?(E.headers["Content-Type"]="application/octet-stream",E.data=y.body):s.requestBody?.content?.["text/plain"]?(E.headers["Content-Type"]="text/plain",E.data=y.body):(E.headers["Content-Type"]="application/json",E.data=y.body));const $=await qs.request({url:w,...E});return{content:[{type:"text",text:$.data===""?"":JSON.stringify($.data,null,2)}]}}catch(h){return qs.isAxiosError(h)?{content:[{type:"text",text:`Error: ${h.response?.data?`HTTP ${h.response.status}: ${h.response.statusText} - ${JSON.stringify(h.response.data)}`:`HTTP ${h.response?.status||"unknown"}: ${h.message}`}`}],isError:!0}:h instanceof Error?{content:[{type:"text",text:`Error: API call failed: ${h.message}`}],isError:!0}:{content:[{type:"text",text:"Error: API call failed with unknown error"}],isError:!0}}}}}c(Fd,"createApiTool");function qd(s,e,t,n,r){const i=[];if(!s.paths)return i;const o=s.components||{};for(const[a,l]of Object.entries(s.paths))if(typeof l=="object"&&l!==null){for(const[u,d]of Object.entries(l))if(["get","post","put","delete","patch"].includes(u)&&d&&typeof d=="object"){const f=Fd(d,a,u,e,t,n,o,r);i.push(f)}}return i}c(qd,"convertOpenApiToTools");function Kd(s){s.command("mcp").description("Launch MCP server with OpenAPI endpoints as tools (API URI is read from environment variables or membrane.config.yml)").addHelpText("after",["","Examples:"," membrane mcp # Launch MCP server using API URI from env vars or membrane.config.yml",""].join(`
|
|
146
146
|
`)).action(async()=>{try{process.env.FASTMCP_SUPPRESS_WARNINGS="true";const e=$n();e||(console.error("No configuration found. Please set MEMBRANE_WORKSPACE_KEY and MEMBRANE_WORKSPACE_SECRET environment variables, or run `membrane init` first."),process.exit(1)),(!e.workspaceKey||!e.workspaceSecret)&&(console.error("Missing workspace credentials"),process.exit(1));const t=e.apiUri||Js,n=await ma(e.workspaceKey,e.workspaceSecret,e.testCustomerId),r=await jd(t,n),i=qd(r,t,e.workspaceKey,e.workspaceSecret,e.testCustomerId),o=new Qc({name:"Membrane API",instructions:`This MCP server lets you interact with Membrane to configure, run, and troubleshoot integrations.
|
|
147
147
|
Use it for anything related to Membrane or integrations.
|
|
148
148
|
`,version:"1.0.0"});for(const u of i){const d=u.execute;u.execute=async f=>(od(process.pid,process.cwd()),d(f)),o.addTool(u)}Or({isRunning:!0,startTime:new Date().toISOString(),toolsCount:i.length,lastActivity:new Date().toISOString(),processId:process.pid,cwd:process.cwd(),agentName:process.env.AGENT_NAME||"Unnamed Agent"});const a=setInterval(()=>{Or({processId:process.pid,cwd:process.cwd(),lastActivity:new Date().toISOString()})},5e3),l=c(async()=>{clearInterval(a),zt(process.pid,process.cwd());try{await o.stop()}catch{}},"cleanup");await o.start({transportType:"stdio"}),process.on("SIGINT",async()=>{await l(),process.exit(0)}),process.on("SIGTERM",async()=>{await l(),process.exit(0)}),process.on("exit",()=>{zt(process.pid,process.cwd())}),process.on("uncaughtException",async u=>{console.error("Uncaught exception:",u.message),await l(),process.exit(1)}),process.on("unhandledRejection",async u=>{console.error("Unhandled rejection:",u),await l(),process.exit(1)})}catch(e){e instanceof Error&&(console.error(e.message),process.exit(1)),console.error("An unknown error occurred"),process.exit(1)}})}c(Kd,"setupMcpCommand");const Bd={info:"\u{1F4DD}",success:"\u2728",warning:"\u26A0\uFE0F",error:"\u274C",debug:"\u{1F50D}"},Ud={info:_.blue,success:_.green,warning:_.yellow,error:_.red,debug:_.gray};class Q{static{c(this,"Logger")}static formatMessage(e,t,n={}){const r=n.timestamp?`${_.gray(new Date().toISOString())} `:"",i=n.prefix?`${_.gray(n.prefix)} `:"",o=n.suffix?` ${_.gray(n.suffix)}`:"",a=Bd[t],l=Ud[t];return`${r}${a} ${i}${l(e)}${o}`}static info(e,t){let n=_.blue;if(t?.color&&(n=_[t.color.toLowerCase()]||_.blue),t?.timestamp){const r=new Date().toLocaleTimeString();console.debug(`${_.gray(`[${r}]`)} ${n(e)}`)}else console.debug(n(e))}static group(e,t){}static groupEnd(){}static newLine(){}static success(e,t){console.debug(this.formatMessage(e,"success",t))}static warning(e,t){console.debug(this.formatMessage(e,"warning",t))}static error(e,t){console.error(this.formatMessage(e,"error",t))}static debug(e,t){t?.prefix?console.debug(_.gray(`[${t.prefix}] ${e}`),t.error?`
|