@gqty/cli
Version:
## Visit [https://gqty.dev/docs/cli/codegen](https://gqty.dev/docs/cli/codegen)
3 lines (2 loc) • 5.32 kB
JavaScript
import{cosmiconfig as W}from"cosmiconfig";import{readFile as B,watch as F}from"fs/promises";import"@graphql-codegen/core";import"@graphql-codegen/typescript";import"@graphql-tools/utils";import"@graphql-tools/wrap";import*as u from"@inquirer/prompts";import"commander";import"cross-fetch";import"fast-glob";import"graphql";import"lodash-es/sortBy.js";import"prettier";import{convertHeadersInput as A}from"./default/convertHeadersInput.mjs";import{fetchSchemas as D,isURL as L}from"./default/fetchSchema.mjs";import{generateClient as M}from"./default/generateClient.mjs";import{getCommandName as H}from"./default/getCommandName.mjs";import{logger as p}from"./default/logger.mjs";import{promptInstall as J,runInstall as N}from"./default/promptInstall.mjs";const U=e=>e.name(H()).usage("[options] [endpoints...]").argument("[endpoints...]","GraphQL endpoints or schema files.").option("-H, --header <header>","Custom header for the introspection query.",(n,i)=>[...i,n],[]).option("--react","Include React hooks in the generated client.").option("--no-react").option("--subscriptions [client]","Includes specified package as subscription client, must be graphql-ws compatible.").option("--no-subscriptions").option("--target <path>","Destination path for the generated client.").option("--typescript","Generates a TypeScript client over a JavaScript one.").option("--no-typescript").option("--install","Automatically install dependencies with current package manager.").option("--no-install").option("-w, --watch","Activate watch mode, regenerate on change changes.",!1).action(async(n,i)=>{var g,w,y,v,b,j,_,x,S,k,q,O,T,C;const t=await W("gqty").search().then(o=>{var d;return(d=o==null?void 0:o.config)!=null?d:{}});let s=n;if(s.length===0&&(process.stdin.isTTY||(p.error("Please provide your GraphQL endpoint(s)."),process.exit(1)),s=await Y(t.introspections?Object.keys(t.introspections).join(", "):(g=t.introspection)==null?void 0:g.endpoint)),s=s.map(o=>o.trim()).filter(Boolean),s.length===0)return p.error("Please provide your GraphQL endpoint(s).");t.introspections||(t.introspections={});const m=await D(s,{headers:(y=A(i.header))!=null?y:(w=t.introspection)==null?void 0:w.headers,headersByEndpoint:t.introspections}).catch(Z);Object.keys((v=t.introspections)!=null?v:{}).length>0,(b=t.react)!=null||(t.react=i.react),i.subscriptions!==void 0&&(t.subscriptions=i.subscriptions||!1),i.typescript&&(t.javascriptOutput=!1),i.target&&(t.destination=i.target);const c=await(async()=>{try{return JSON.parse(await B("package.json",{encoding:"utf-8"}))}catch{return}})();if(c&&((_=t.react)!=null||(t.react=((j=c.dependencies)==null?void 0:j.react)!==void 0),(k=t.javascriptOutput)!=null||(t.javascriptOutput=((x=c.dependencies)==null?void 0:x.typescript)===void 0&&((S=c.devDependencies)==null?void 0:S.typescript)===void 0)),m.getSubscriptionType()&&((q=t.subscriptions)!=null||(t.subscriptions="graphql-ws")),n.length===0&&(t.react=await z((O=t.react)!=null?O:!1),t.subscriptions=await K(t.subscriptions?t.subscriptions===!0?"graphql-ws":t.subscriptions:void 0),t.javascriptOutput=!await X(!t.javascriptOutput),(T=t.destination)!=null||(t.destination=await $(t.javascriptOutput?"gqty/index.js":"gqty/index.ts"))),(C=t.destination)!=null||(t.destination=t.javascriptOutput?"gqty/index.js":"gqty/index.ts"),L(n[0])&&(t.endpoint=n[0]),await M(m,{destination:"",...t}),n.length===0&&i.install===void 0?await J(t):c&&i.install!==!1&&await N(c,t),i.watch){const{printSchema:o}=await import("graphql"),{FasterSMA:d}=await import("trading-signals/dist/SMA/SMA"),{default:R}=await import("lodash-es/throttle.js"),{default:{isMatch:I}}=await import("micromatch"),l=new d(3),Q=()=>{try{return l.getResult()}catch{return l.prices.length===0?0:l.prices.reduce((r,a)=>r+a,0)/l.prices.length}},P=R(async()=>{if(f)return;f=!0;const r=Date.now();try{const a=await D(s,{headers:A(i.header),headersByEndpoint:t.introspections,silent:!0}).catch(h=>h instanceof Error?(p.errorProgress(h.message),Promise.resolve(void 0)):Promise.reject(h));if(!a)return;const G=o(a);G!==E&&(E=G,await M(a,{destination:"",...t}),l.update(Date.now()-r)),p.infoProgress("Watching for schema changes... (Ctrl+C to exit)")}finally{f=!1}},1e3,{leading:!0,trailing:!0});let f=!1,E=o(m);p.infoProgress("Watching for schema changes... (Ctrl+C to exit)"),s.some(r=>L(r))&&(async()=>{for(;;){const r=Math.max(5e3,Math.min(3e4,Q()*10));await new Promise(a=>setTimeout(a,r)),P()}})(),(async()=>{let r=!1;for await(const{filename:a}of F(".",{recursive:!0}))if(a&&I(a,s)){if(r)continue;r=!0,process.nextTick(()=>{r&&(r=!1,P())})}})()}}),Y=async e=>(await u.input({message:"Where is your GraphQL endpoint or schema files?",default:e})).split(/[,\s+]/).map(i=>i.trim()).filter(Boolean),$=async e=>await u.input({message:"Where should the client be generated?",default:e}),z=async e=>await u.confirm({message:"Are you using React with GQty?",default:e}),K=async e=>{const n=await u.input({message:'Do you need a subscription client? (Enter "-" to skip)',default:(e==null?void 0:e.trim())||void 0});return(n==null?void 0:n.trim().replace(/^\-$/,""))||!1},X=async e=>await u.confirm({message:"Do you want a TypeScript client over vanilla.js?",default:e}),Z=e=>{throw e instanceof Error&&(p.error(e.message),process.exit(1)),e};export{U as addCommand};