UNPKG

@gqty/cli

Version:

## Visit [https://gqty.dev/docs/cli/codegen](https://gqty.dev/docs/cli/codegen)

3 lines (2 loc) 5.59 kB
#!/usr/bin/env node 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"commander";import"cross-fetch";import"fast-glob";import"graphql";import u from"inquirer";import"lodash-es/sortBy.js";import"mkdirp";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=i=>i.name(H()).usage("[options] [endpoints...]").argument("[endpoints...]","GraphQL endpoints or schema files.").option("-H, --header <header>","Custom header for the introspection query.",(e,n)=>[...n,e],[]).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(e,n)=>{var g,y,w,v,b,j,_,x,S,k,q,O,T,C;const t=await W("gqty").search().then(o=>{var m;return(m=o==null?void 0:o.config)!=null?m:{}});let s=e;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 d=await D(s,{headers:(w=A(n.header))!=null?w:(y=t.introspection)==null?void 0:y.headers,headersByEndpoint:t.introspections}).catch(Z);Object.keys((v=t.introspections)!=null?v:{}).length>0,(b=t.react)!=null||(t.react=n.react),n.subscriptions!==void 0&&(t.subscriptions=n.subscriptions||!1),n.typescript&&(t.javascriptOutput=!1),n.target&&(t.destination=n.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)),d.getSubscriptionType()&&((q=t.subscriptions)!=null||(t.subscriptions="graphql-ws")),e.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(e[0])&&(t.endpoint=e[0]),await M(d,{destination:"",...t}),e.length===0&&n.install===void 0?await J(t):c&&n.install!==!1&&await N(c,t),n.watch){const{printSchema:o}=await import("graphql"),{FasterSMA:m}=await import("trading-signals"),{default:R}=await import("lodash-es/throttle.js"),{default:{isMatch:I}}=await import("micromatch"),l=new m(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(n.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(d);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 i=>{const{endpoints:e}=await u.prompt({name:"endpoints",type:"input",message:"Where is your GraphQL endpoint or schema files?",default:i});return e.split(/[,\s+]/).map(n=>n.trim()).filter(Boolean)},$=async i=>{const{target:e}=await u.prompt({name:"target",type:"input",message:"Where should the client be generated?",default:i});return e},z=async i=>{const{react:e}=await u.prompt({name:"react",type:"confirm",message:"Are you using React with GQty?",default:i});return e},K=async i=>{const{subscriptions:e}=await u.prompt({name:"subscriptions",type:"input",message:'Do you need a subscription client? (Enter "-" to skip)',default:(i==null?void 0:i.trim())||void 0});return(e==null?void 0:e.trim().replace(/^\-$/,""))||!1},X=async i=>{const{typescript:e}=await u.prompt({name:"typescript",type:"confirm",message:"Do you want a TypeScript client over vanilla.js?",default:i});return e},Z=i=>{throw i instanceof Error&&(p.error(i.message),process.exit(1)),i};export{U as addCommand};