/**
 * Minified by jsDelivr using Terser v5.39.0.
 * Original file: /npm/massimo-cli@1.2.0/index.js
 *
 * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files
 */
#! /usr/bin/env node
import{access,mkdir,readFile,rm,writeFile}from"fs/promises";import graphql from"graphql";import helpMe from"help-me";import parseArgs from"minimist";import{join,dirname}from"path";import pino from"pino";import pinoPretty from"pino-pretty";import{getGlobalDispatcher,interceptors,request}from"undici";import YAML from"yaml";import{processFrontendOpenAPI}from"./lib/frontend-openapi-generator.js";import{processGraphQL}from"./lib/graphql-generator.js";import{processOpenAPI}from"./lib/openapi-generator.js";function parseFile(e){let t=!1;const r=[JSON.parse,YAML.parse];for(const n of r)try{t=n(e)}catch(e){}return t}export async function isFileAccessible(e){try{return await access(e),!0}catch(e){return!1}}export async function createDirectory(e,t=!1){return t&&await rm(e,{force:!0,recursive:!0}),mkdir(e,{recursive:!0,maxRetries:10,retryDelay:1e3})}export async function detectModuleFormat(e,t){if(t){if("esm"===t||"cjs"===t)return t;throw new Error(`Invalid module format: ${t}. Valid values are 'esm' or 'cjs'`)}let r=e;for(;r!==dirname(r);){const e=join(r,"package.json");if(await isFileAccessible(e))try{return"module"===JSON.parse(await readFile(e,"utf8")).type?"esm":"cjs"}catch(e){}r=dirname(r)}return"esm"}export async function determineTypeExtension(e,t,r,n,o=!0){if(r)return"esm"===t?"d.mts":"d.cts";if(!n&&!o)return"d.ts";if(!n&&o)return"d.ts";let i=e;for(;i!==dirname(i);){const e=join(i,"package.json");if(await isFileAccessible(e))try{const r=JSON.parse(await readFile(e,"utf8"));return t===("module"===r.type?"esm":"cjs")?"d.ts":"esm"===t?"d.mts":"d.cts"}catch(e){}i=dirname(i)}return n?"esm"===t?"d.mts":"d.cts":"d.ts"}async function writeOpenAPIClient(e,t,r,n,o,i,a,s,l,p,d,m,c,u,f,h,y,w){await createDirectory(e);const g=parseFile(r);if(!g)throw new Error("Cannot parse OpenAPI file. Please make sure is a JSON or a YAML file.");if(o||await writeFile(join(e,`${t}.openapi.json`),JSON.stringify(g,null,2)),p){const r=await determineTypeExtension(e,h,y,w,n),{types:o,implementation:s}=processFrontendOpenAPI({schema:g,name:t,fullRequest:i,fullResponse:a,language:d,logger:c,withCredentials:u,propsOptional:f,typeExt:r});if(await writeFile(join(e,`${t}-types.${r}`),o),n){const r="js"===d?"mjs":"mts";await writeFile(join(e,`${t}.${r}`),s)}}else{const{types:r,implementation:p}=processOpenAPI({schema:g,name:t,fullResponse:a,fullRequest:i,optionalHeaders:s,validateResponse:l,typesComment:m,propsOptional:f,moduleFormat:h}),d=await determineTypeExtension(e,h,y,w,n),c="esm"===h?"mjs":"cjs";await writeFile(join(e,`${t}.${d}`),r),n&&await writeFile(join(e,`${t}.${c}`),p),o||await writeFile(join(e,"package.json"),await getPackageJSON({name:t,generateImplementation:n,moduleFormat:h,folder:e,typeExtension:y,explicitModuleFormat:w}))}}async function writeGraphQLClient(e,t,r,n,o,i,a,s){await createDirectory(e,{recursive:!0});const{types:l,implementation:p}=processGraphQL({schema:r,name:t,folder:e,url:n,moduleFormat:i}),d=graphql.buildClientSchema(r),m=graphql.printSchema(d),c=await determineTypeExtension(e,i,a,s,o),u="esm"===i?"mjs":"cjs";await writeFile(join(e,`${t}.schema.graphql`),m),await writeFile(join(e,`${t}.${c}`),l),o&&await writeFile(join(e,`${t}.${u}`),p),await writeFile(join(e,"package.json"),await getPackageJSON({name:t,generateImplementation:o,moduleFormat:i,folder:e,typeExtension:a,explicitModuleFormat:s}))}async function downloadAndWriteOpenAPI(e,t,r,n,o,i,a,s,l,p,d,m,c,u,f,h,y,w,g,F){let j;if(e.debug(`Trying to download OpenAPI schema from ${t}`),c)try{j={headers:JSON.parse(c)}}catch(t){e.error(t)}const A=y?getGlobalDispatcher().compose([interceptors.retry({minTimeout:y})]):void 0,x=await request(t,{...j,dispatcher:A});if(200===x.statusCode){const t=await x.body.text();try{await writeOpenAPIClient(r,n,t,o,i,a,s,l,p,d,m,u,e,f,h,w,g,F)}catch(t){return e.error(t),!1}return"openapi"}return x.body.resume(),!1}async function downloadAndWriteGraphQL(e,t,r,n,o,i,a,s){e.debug(`Trying to download GraphQL schema from ${t}`);const l=graphql.getIntrospectionQuery(),p=await request(t,{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({query:l})}),d=await p.body.text();if(200!==p.statusCode)return!1;const{data:m}=JSON.parse(d);return await writeGraphQLClient(r,n,m,t,o,i,a,s),"graphql"}async function readFromFileAndWrite(e,t,r,n,o,i,a,s,l,p,d,m,c,u,f,h,y,w){e.info(`Trying to read schema from file ${t}`);const g=await readFile(t,"utf8");try{return await writeOpenAPIClient(r,n,g,o,i,a,s,l,p,d,m,c,e,u,f,h,y,w),"openapi"}catch(t){e.error(t,`Error parsing OpenAPI definition: "${t.message}". Trying with GraphQL`);const i=graphql.buildSchema(g),a=graphql.introspectionFromSchema(i);return await writeGraphQLClient(r,n,a,"http://localhost:3042/graphql",o,h,y,w),"graphql"}}async function downloadAndProcess(e){const{url:t,name:r,folder:n,logger:o,typesOnly:i,fullRequest:a,fullResponse:s,optionalHeaders:l,validateResponse:p,isFrontend:d,language:m,type:c,urlAuthHeaders:u,typesComment:f,withCredentials:h,propsOptional:y,retryTimeoutMs:w,moduleFormat:g,typeExtension:F,explicitModuleFormat:j,skipPrefixedUrl:A}=e,x=e.generateImplementation;let O=!1;const b=[];t.startsWith("http")?"openapi"===c?(A||b.push(downloadAndWriteOpenAPI.bind(null,o,t+"/documentation/json",n,r,x,i,a,s,l,p,d,m,u,f,h,y,w,g,F,j)),b.push(downloadAndWriteOpenAPI.bind(null,o,t,n,r,x,i,a,s,l,p,d,m,u,f,h,y,w,g,F,j))):"graphql"===e.type?(A||b.push(downloadAndWriteGraphQL.bind(null,o,t+"/graphql",n,r,x,g,F,j)),b.push(downloadAndWriteGraphQL.bind(null,o,t,n,r,x,g,F,j))):(A||(b.push(downloadAndWriteOpenAPI.bind(null,o,t+"/documentation/json",n,r,x,i,a,s,l,p,d,m,u,f,h,y,w,g,F,j)),b.push(downloadAndWriteGraphQL.bind(null,o,t+"/graphql",n,r,x,g,F,j))),b.push(downloadAndWriteOpenAPI.bind(null,o,t,n,r,x,i,a,s,l,p,d,m,u,f,h,y,w,g,F,j)),b.push(downloadAndWriteGraphQL.bind(null,o,t,n,r,x,g,F,j))):b.push(readFromFileAndWrite.bind(null,o,t,n,r,x,i,a,s,l,p,d,m,f,h,y,g,F,j));for(const e of b)if(O=await e(),O)break;if(!O)throw new Error(`Could not find a valid OpenAPI or GraphQL schema at ${t}`)}async function getPackageJSON({name:e,generateImplementation:t,moduleFormat:r,folder:n,typeExtension:o,explicitModuleFormat:i}){const a="esm"===r,s={name:e,types:`./${e}.${await determineTypeExtension(n,r,o,i,t)}`};return a&&(s.type="module"),t&&(s.main=`./${e}.${a?"mjs":"cjs"}`),JSON.stringify(s,null,2)}export async function command(e){const t=helpMe({dir:join(import.meta.dirname,"help"),ext:".txt"}),{_:[r],...n}=parseArgs(e,{string:["name","folder","optional-headers","language","type","url-auth-headers","types-comment","module"],boolean:["typescript","full-response","types-only","full-request","full","frontend","validate-response","props-optional","type-extension","skip-prefixed-url"],default:{typescript:!1,language:"js",full:!0,"props-optional":!0},alias:{n:"name",f:"folder",t:"typescript",c:"config",F:"full",h:"help"}});(n.full||n.F)&&(n["full-request"]=!0,n["full-response"]=!0);const o=pinoPretty({translateTime:"SYS:HH:MM:ss",ignore:"hostname,pid",minimumLevel:"debug",sync:!0}),i=pino(o);r&&!n.help||(await t.toStdout(),process.exit(1));try{n.isFrontend=!!n.frontend,n["types-only"]?(n.generateImplementation=!1,n.typesOnly=!0):n.generateImplementation=!!n.isFrontend||!n.config,n.fullRequest=n["full-request"],n.fullResponse=n["full-response"],n.propsOptional=n["props-optional"],n.optionalHeaders=n["optional-headers"]?n["optional-headers"].split(",").map((e=>e.trim())):[],n.validateResponse=n["validate-response"],n.name||(n.name=n.isFrontend?"api":"client"),n.folder=n.folder||join(process.cwd(),n.name),n.moduleFormat=await detectModuleFormat(n.folder,n.module),n.module||i.info(`Module format detected: ${n.moduleFormat}`),n.urlAuthHeaders=n["url-auth-headers"],n.typesComment=n["types-comment"],n.withCredentials=n["with-credentials"],n.retryTimeoutMs=n["retry-timeout-ms"],n.typeExtension=n["type-extension"],n.skipPrefixedUrl=n["skip-prefixed-url"],n.explicitModuleFormat=!!n.module,await downloadAndProcess({url:r,...n,logger:i}),i.info(`Client generated successfully into ${n.folder}`),i.info("Check out the docs to know more: https://docs.platformatic.dev/docs/service/overview")}catch(e){i.error(e.message),process.exit(1)}}import.meta.main&&command(process.argv.slice(2));export*as errors from"./lib/errors.js";
//# sourceMappingURL=/sm/f4bfa17b72cadd2591d6d1ef41b905825200db820975708cc95489d9018ead21.map