UNPKG

@gqty/cli

Version:

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

189 lines (165 loc) • 12.1 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const Schema=require("gqty/Schema"),graphql=require("graphql"),config=require("./config.js"),deps=require("./deps.js"),prettier=require("./prettier.js"),{isEnumType,isInputObjectType,isInterfaceType,isNullableType,isObjectType,isScalarType,isUnionType,lexicographicSortSchema,parse,isSchema,assertSchema}=graphql;async function generate(y,{endpoint:g,enumsAsConst:m,enumsAsStrings:$,introspection:H,javascriptOutput:L,preImport:_,react:b,scalarTypes:E,subscriptions:d,transformSchema:J}={},{ignoreArgs:j}={}){const p=L!=null?L:config.defaultConfig.javascriptOutput;p?($&&console.warn('"enumsAsStrings" is automatically set as "true" with "javascriptOutput" enabled.'),$=!0):$!=null||($=!1),p&&(m&&console.warn('"enumsAsConst" is automatically set as "false" with "javascriptOutput" enabled.'),m=!1),m!=null||(m=m!=null?m:config.defaultConfig.enumsAsConst),E||(E=E||config.defaultConfig.scalarTypes),g||(g=g||(H==null?void 0:H.endpoint)||config.defaultConfig.endpoint||config.defaultConfig.introspection.endpoint),b!=null||(b=config.defaultConfig.react),_!=null||(_=config.defaultConfig.preImport),d!=null||(d=config.defaultConfig.subscriptions);const{format:v}=prettier.formatPrettier({parser:"typescript"});if(y=lexicographicSortSchema(assertSchema(y)),J&&(y=await J(y,graphql),!isSchema(y)))throw Error('"transformSchema" returned an invalid GraphQL Schema!');const ee=deps.codegen({schema:parse(deps.printSchemaWithDirectives(y)),config:{},documents:[],filename:"gqty.generated.ts",pluginMap:{typescript:deps.typescriptPlugin},plugins:[{typescript:{onlyOperationTypes:!0,declarationKind:"interface",addUnderscoreToArgsType:!0,scalars:E,namingConvention:"keep",enumsAsTypes:$,enumsAsConst:m}}]}),C=y.toConfig(),S={},D=[],P=new Set,h={query:{},mutation:{},subscription:{}},Q=C.query,A=C.mutation,F=C.subscription,I=new Map,T=new Map,O=new Map;function V(e){var r,a,n;if(Array.isArray(e)){const t=e[2]?(a=(r=O.get(e[0]))==null?void 0:r[e[1]])==null?void 0:a[e[2]]:(n=T.get(e[0]))==null?void 0:n[e[1]];let s="";return t!=null&&t.description&&(s+=` `+t.description.trim().split(` `).map(o=>"* "+o).join(` `)),t!=null&&t.deprecated&&(s+=` * @deprecated `+t.deprecated.trim().replace(/\n/g,". ").trim()),t!=null&&t.defaultValue&&(s+="\n* @defaultValue `"+t.defaultValue.trim()+"`"),s?`/** ${s} */ `:""}else{const t=I.get(e);return t?`/** ${t.trim().split(` `).map(s=>"* "+s).join(` `)} */ `:""}}const te=e=>{S[e.name]=!0,D.push(e.name);const r=e.getValues(),a={};for(const n of r)(n.deprecationReason||n.description)&&(a[n.name]={description:n.description,deprecated:n.deprecationReason});T.set(e.name,a)},ne=e=>{S[e.name]=!0},re=new Map,w=(e,r=e.name)=>{const a=e.getFields(),n=e.getInterfaces();if(n.length){re.set(e.name,n.map(i=>i.name));for(const i of n){let c=f.get(i.name);c==null&&f.set(i.name,c=[]),c.push(e.name)}}const t={__typename:{__type:"String!"}},s={},o={};Object.entries(a).forEach(([i,c])=>{if((c.description||c.deprecationReason)&&(s[i]={description:c.description,deprecated:c.deprecationReason}),t[i]={__type:c.type.toString()},c.args.length){if(j&&c.args.every(({type:l})=>isNullableType(l))&&j(c))return;o[i]||(o[i]={}),t[i].__args=c.args.reduce((u,l)=>(u[l.name]=l.type.toString(),(l.description||l.deprecationReason||l.defaultValue!=null)&&(o[i][l.name]={defaultValue:l.defaultValue!=null?JSON.stringify(l.defaultValue):null,deprecated:l.deprecationReason,description:l.description}),u),{})}}),T.set(e.name,s),O.set(e.name,o),h[r]=t},f=new Map,se=e=>{const r=e.getTypes(),a=[];f.set(e.name,a);for(const n of r)a.push(n.name);h[e.name]={__typename:{__type:"String!"}}},ae=e=>{P.add(e.name);const r=e.getFields(),a={};Object.entries(r).forEach(([n,t])=>{a[n]={__type:t.type.toString()},(t.description||t.deprecationReason||t.defaultValue)&&(t.description,t.deprecationReason,t.defaultValue!=null&&JSON.stringify(t.defaultValue))}),h[e.name]=a},ie=e=>{const r={__typename:{__type:"String!"}},a=e.getFields(),n={},t={};Object.entries(a).forEach(([s,o])=>{o.type.toString(),r[s]={__type:o.type.toString()};let i=!0;o.args.length?j&&o.args.every(({type:u})=>isNullableType(u))&&j(o)&&(i=!1):i=!1,i&&(t[s]||(t[s]={}),r[s].__args=o.args.reduce((c,u)=>(c[u.name]=u.type.toString(),(u.description||u.deprecationReason||u.defaultValue!=null)&&(t[s][u.name]={defaultValue:u.defaultValue!=null?JSON.stringify(u.defaultValue):null,deprecated:u.deprecationReason,description:u.description}),c),{})),(o.description||o.deprecationReason)&&(n[s]={description:o.description,deprecated:o.deprecationReason})}),T.set(e.name,n),O.set(e.name,t),h[e.name]=r};C.types.forEach(e=>{e.description&&I.set(e.name,e.description),!(e.name.startsWith("__")||e===Q||e===A||e===F)&&(isScalarType(e)?ne(e):isObjectType(e)?w(e):isInterfaceType(e)?ie(e):isUnionType(e)?se(e):isEnumType(e)?te(e):isInputObjectType(e)&&ae(e))}),Q&&w(Q,"query"),A&&w(A,"mutation"),F&&w(F,"subscription");const N=Array.from(f.entries()).reduce((e,[r,a])=>(h[r].$on={__type:`$${r}!`},e[r]=a,e),{});f.size&&(h[Schema.SchemaUnionsKey]=N);function oe({pureType:e,isArray:r,nullableItems:a,isNullable:n,hasDefaultValue:t}){let s=[S[e]?D.includes(e)?e:`Scalars["${e}"]`:e];return r&&(s=["Array<",...a?["Maybe<",...s,">"]:s,">"]),(n||t)&&(s=["Maybe<",...s,">"]),s.join("")}function ce({pureType:e,isArray:r,nullableItems:a,isNullable:n}){let t=[S[e]?`ScalarsEnums["${e}"]`:e];return r&&(t=["Array<",...a?["Maybe<",...t,">"]:t,">"]),n&&(t=["Maybe<",...t,">"]),t.join("")}const ue=new Map;let G=deps.sortBy(Object.entries(h),e=>e[0]).reduce((e,[r,a])=>{const n=(()=>{switch(r){case"query":return"Query";case"mutation":return"Mutation";case"subscription":return"Subscription";default:return r}})();if(P.has(n))return e;const t=new Map;f.has(n)||ue.set(n,t);const s=f.get(n);return e+=` ${V(n)}export interface ${n} { __typename?: ${s?s.map(o=>`"${o}"`).join(" | "):`"${n}"`}; ${Object.entries(a).reduce((o,[i,c])=>{if(i==="__typename")return t.set(i,`?: "${n}"`),o;const u=O.has(n)?O.get(n):void 0,l=u&&u[i]?u[i]:{},Y=Schema.parseSchemaType(c.__type),W=ce(Y);let R;if(c.__args){const X=Object.entries(c.__args);let Z=!0;const he=X.reduce((K,[U,me])=>{const x=Schema.parseSchemaType(me,l[U]),ye=x.isNullable||x.hasDefaultValue?"?:":":";x.isNullable||(Z=!1);const ge=oe(x);return K+=`${V([n,i,U])}${U}${ye} ${ge}; `,K},"");R=`: (args${Z?"?:":":"} {${he}}) => ${W}`}else R=`${Y.isNullable?"?:":":"} ${W}`;return t.set(i,R),o+=` `+V([n,i])+i+R,o},"")} } `,e},"");f.size&&(G+=` ${deps.sortBy(Array.from(f.entries()),e=>e[0]).reduce((e,[r,a])=>(e+=` export interface $${r} { ${a.map(n=>`${n}?:${n}`).join(` `)} } `,e),"")} `),G+=` export interface GeneratedSchema { query: Query mutation: Mutation subscription: Subscription } export type MakeNullable<T> = { [K in keyof T]: T[K] | undefined; }; export interface ScalarsEnums extends MakeNullable<Scalars> { ${deps.sortBy(D).reduce((e,r)=>(e+=`${r}: ${r} | undefined;`,e),"")} } `;function M(e){return`/** * @type {${e}} */ `}const le=` ${p?M('import("gqty").QueryFetcher')+"const queryFetcher":"const queryFetcher: QueryFetcher"} = async function ({ query, variables, operationName }, fetchOptions) { // Modify "${g}" if needed const response = await fetch("${g}", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ query, variables, operationName, }), mode: "cors", ...fetchOptions }); if (response.status >= 400) { throw new GQtyError( \`GraphQL endpoint responded with HTTP status \${response.status}.\` ); } const text = await response.text(); try { return JSON.parse(text); } catch { throw new GQtyError( \`Malformed JSON response: \${ text.length > 50 ? text.slice(0, 50) + '...' : text }\` ); } }; `,q=!!f.size,k=JSON.stringify(Object.keys(S).sort().reduce((e,r)=>(e[r]=!0,e),{})),z=deps.sortBy(Object.entries(h),e=>e[0]).reduceRight((e,[r,a])=>`${JSON.stringify(r)}:${JSON.stringify(a)}, ${e}`,q?`[SchemaUnionsKey]: ${JSON.stringify(N)}`:""),pe=await v(` /** * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ ${q?'import { SchemaUnionsKey } from "gqty";':""} ${M('import("gqty").ScalarsEnumsHash')}export const scalarsEnumsHash = ${k}; export const generatedSchema = {${z}}; `),B=[q&&"SchemaUnionsKey",!p&&"type ScalarsEnumsHash"].filter(e=>!!e),de=await v(` /** * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ ${_} ${B.length?`import { ${B.join(", ")} } from "gqty";`:""} ${await ee} export${p?" declare":""} const scalarsEnumsHash: ScalarsEnumsHash${p?";":` = ${k};`} export${p?" declare":""} const generatedSchema ${p?":":"="} {${z}}${p?"":" as const"}; ${G} `),fe=b?` export const { graphql, useQuery, usePaginatedQuery, useTransactionQuery, useLazyQuery, useRefetch, useMutation, useMetaState, prepareReactRender, useHydrateCache, prepareQuery, ${d?"useSubscription,":""} } = ${p?`${M('import("@gqty/react").ReactClient<import("./schema.generated").GeneratedSchema>')}createReactClient(client, {`:"createReactClient<GeneratedSchema>(client, {"} defaults: { // Enable Suspense, you can override this option for each hook. suspense: true, } }); `.trim():"";return{clientCode:await v(` /** * GQty: You can safely modify this file based on your needs. */ ${[b?'import { createReactClient } from "@gqty/react";':"",d?`import { createClient as createSubscriptionsClient } from "${d===!0?"graphql-ws":d}";`:"",p?'import { Cache, GQtyError, createClient } from "gqty";':'import { Cache, GQtyError, createClient, type QueryFetcher } from "gqty";',p?'import { generatedSchema, scalarsEnumsHash } from "./schema.generated";':'import { generatedSchema, scalarsEnumsHash, type GeneratedSchema } from "./schema.generated";'].filter(Boolean).join(` `)} ${le} ${d?`const subscriptionsClient = typeof window !== "undefined" ? createSubscriptionsClient({ lazy: true, url: () => { // Modify if needed const url = new URL("${g}", window.location.href); url.protocol = url.protocol.replace('http', 'ws'); return url.href; } }) : undefined;`:""} const cache = new Cache( undefined, /** * Default option is immediate cache expiry but keep it for 5 minutes, * allowing soft refetches in background. */ { maxAge: 0, staleWhileRevalidate: 5 * 60 * 1000, normalization: true, } ); ${p?`${M('import("gqty").GQtyClient<import("./schema.generated").GeneratedSchema>')}export const client = createClient({ schema: generatedSchema, scalars: scalarsEnumsHash, cache, fetchOptions: { fetcher: queryFetcher, ${d?"subscriber: subscriptionsClient":""} }, }); `:` export const client = createClient<GeneratedSchema>({ schema: generatedSchema, scalars: scalarsEnumsHash, cache, fetchOptions:{ fetcher: queryFetcher, ${d?"subscriber: subscriptionsClient":""} }, }); `} // Core functions export const { resolve, subscribe, schema } = client; // Legacy functions export const { query, mutation, mutate, subscription, resolved, refetch, track } = client; ${fe} export * from "./schema.generated"; `),generatedSchema:h,isJavascriptOutput:p,javascriptSchemaCode:pe,scalarsEnumsHash:S,schemaCode:de}}exports.generate=generate;