@gqty/cli
Version:
## Visit [https://gqty.dev/docs/cli/codegen](https://gqty.dev/docs/cli/codegen)
189 lines (166 loc) • 11.8 kB
JavaScript
import{SchemaUnionsKey as _e,parseSchemaType as ne}from"gqty/Schema";import*as re from"graphql";import{defaultConfig as y}from"./config.mjs";import*as g from"./deps.js";import{formatPrettier as we}from"./prettier.mjs";const{isEnumType:je,isInputObjectType:Te,isInterfaceType:Ce,isNullableType:se,isObjectType:Re,isScalarType:Me,isUnionType:xe,lexicographicSortSchema:ve,parse:De,isSchema:Qe,assertSchema:Ae}=re;async function Fe($,{endpoint:S,enumsAsConst:h,enumsAsStrings:b,introspection:q,javascriptOutput:I,preImport:w,react:E,scalarTypes:j,subscriptions:d,transformSchema:P}={},{ignoreArgs:T}={}){const p=I!=null?I:y.javascriptOutput;p?(b&&console.warn('"enumsAsStrings" is automatically set as "true" with "javascriptOutput" enabled.'),b=!0):b!=null||(b=!1),p&&(h&&console.warn('"enumsAsConst" is automatically set as "false" with "javascriptOutput" enabled.'),h=!1),h!=null||(h=h!=null?h:y.enumsAsConst),j||(j=j||y.scalarTypes),S||(S=S||(q==null?void 0:q.endpoint)||y.endpoint||y.introspection.endpoint),E!=null||(E=y.react),w!=null||(w=y.preImport),d!=null||(d=y.subscriptions);const{format:Q}=we({parser:"typescript"});if($=ve(Ae($)),P&&($=await P($,re),!Qe($)))throw Error('"transformSchema" returned an invalid GraphQL Schema!');const ae=g.codegen({schema:De(g.printSchemaWithDirectives($)),config:{},documents:[],filename:"gqty.generated.ts",pluginMap:{typescript:g.typescriptPlugin},plugins:[{typescript:{constEnums:!0,onlyOperationTypes:!0,declarationKind:"interface",addUnderscoreToArgsType:!0,scalars:j,namingConvention:"keep",enumsAsTypes:b,enumsAsConst:h}}]}),C=$.toConfig(),O={},A=[],k=new Set,m={query:{},mutation:{},subscription:{}},F=C.query,V=C.mutation,G=C.subscription,z=new Map,R=new Map,_=new Map;function U(e){var r,a,n;if(Array.isArray(e)){const t=e[2]?(a=(r=_.get(e[0]))==null?void 0:r[e[1]])==null?void 0:a[e[2]]:(n=R.get(e[0]))==null?void 0:n[e[1]];let s="";return t!=null&&t.description&&(s+=`
`+t.description.trim().split(`
`).map(i=>"* "+i).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=z.get(e);return t?`/**
${t.trim().split(`
`).map(s=>"* "+s).join(`
`)}
*/
`:""}}const oe=e=>{O[e.name]=!0,A.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});R.set(e.name,a)},ie=e=>{O[e.name]=!0},ce=new Map,M=(e,r=e.name)=>{const a=e.getFields(),n=e.getInterfaces();if(n.length){ce.set(e.name,n.map(o=>o.name));for(const o of n){let c=f.get(o.name);c==null&&f.set(o.name,c=[]),c.push(e.name)}}const t={__typename:{__type:"String!"}},s={},i={};Object.entries(a).forEach(([o,c])=>{if((c.description||c.deprecationReason)&&(s[o]={description:c.description,deprecated:c.deprecationReason}),t[o]={__type:c.type.toString()},c.args.length){if(T&&c.args.every(({type:l})=>se(l))&&T(c))return;i[o]||(i[o]={}),t[o].__args=c.args.reduce((u,l)=>(u[l.name]=l.type.toString(),(l.description||l.deprecationReason||l.defaultValue!=null)&&(i[o][l.name]={defaultValue:l.defaultValue!=null?JSON.stringify(l.defaultValue):null,deprecated:l.deprecationReason,description:l.description}),u),{})}}),R.set(e.name,s),_.set(e.name,i),m[r]=t},f=new Map,ue=e=>{const r=e.getTypes(),a=[];f.set(e.name,a);for(const n of r)a.push(n.name);m[e.name]={__typename:{__type:"String!"}}},le=e=>{k.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))}),m[e.name]=a},pe=e=>{const r={__typename:{__type:"String!"}},a=e.getFields(),n={},t={};Object.entries(a).forEach(([s,i])=>{i.type.toString(),r[s]={__type:i.type.toString()};let o=!0;i.args.length?T&&i.args.every(({type:u})=>se(u))&&T(i)&&(o=!1):o=!1,o&&(t[s]||(t[s]={}),r[s].__args=i.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),{})),(i.description||i.deprecationReason)&&(n[s]={description:i.description,deprecated:i.deprecationReason})}),R.set(e.name,n),_.set(e.name,t),m[e.name]=r};C.types.forEach(e=>{e.description&&z.set(e.name,e.description),!(e.name.startsWith("__")||e===F||e===V||e===G)&&(Me(e)?ie(e):Re(e)?M(e):Ce(e)?pe(e):xe(e)?ue(e):je(e)?oe(e):Te(e)&&le(e))}),F&&M(F,"query"),V&&M(V,"mutation"),G&&M(G,"subscription");const B=Array.from(f.entries()).reduce((e,[r,a])=>(m[r].$on={__type:`$${r}!`},e[r]=a,e),{});f.size&&(m[_e]=B);function de({pureType:e,isArray:r,nullableItems:a,isNullable:n,hasDefaultValue:t}){let s=[O[e]?A.includes(e)?e:`ScalarsEnums["${e}"]`:e];return r&&(s=["Array<",...a?["Maybe<",...s,">"]:s,">"]),(n||t)&&(s=["Maybe<",...s,">"]),s.join("")}function fe({pureType:e,isArray:r,nullableItems:a,isNullable:n}){let t=[O[e]?`ScalarsEnums["${e}"]`:e];return r&&(t=["Array<",...a?["Maybe<",...t,">"]:t,">"]),n&&(t=["Maybe<",...t,">"]),t.join("")}const me=new Map;let H=g.sortBy(Object.entries(m),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(k.has(n))return e;const t=new Map;f.has(n)||me.set(n,t);const s=f.get(n);return e+=`
${U(n)}export interface ${n} {
__typename?: ${s?s.map(i=>`"${i}"`).join(" | "):`"${n}"`}; ${Object.entries(a).reduce((i,[o,c])=>{if(o==="__typename")return t.set(o,`?: "${n}"`),i;const u=_.has(n)?_.get(n):void 0,l=u&&u[o]?u[o]:{},X=ne(c.__type),Z=fe(X);let v;if(c.__args){const K=Object.entries(c.__args);let ee=!0;const Se=K.reduce((te,[J,be])=>{const D=ne(be,l[J]),Oe=D.isNullable||D.hasDefaultValue?"?:":":";D.isNullable||(ee=!1);const Ee=de(D);return te+=`${U([n,o,J])}${J}${Oe} ${Ee};
`,te},"");v=`: (args${ee?"?:":":"} {${Se}}) => ${Z}`}else v=`${X.isNullable?"?:":":"} ${Z}`;return t.set(o,v),i+=`
`+U([n,o])+o+v,i},"")}
}
`,e},"");f.size&&(H+=`
${g.sortBy(Array.from(f.entries()),e=>e[0]).reduce((e,[r,a])=>(e+=`
export interface $${r} {
${a.map(n=>`${n}?:${n}`).join(`
`)}
}
`,e),"")}
`),H+=`
export interface GeneratedSchema {
query: Query
mutation: Mutation
subscription: Subscription
}
export type ScalarsEnums = {
[Key in keyof Scalars]: Scalars[Key] extends { output: unknown }
? Scalars[Key]['output']
: never;
} & {
${g.sortBy(A).reduce((e,r)=>(e+=`${r}: ${r};`,e),"")}
}
`;function x(e){return`/**
* @type {${e}}
*/
`}const he=`
${p?x('import("gqty").QueryFetcher')+"const queryFetcher":"const queryFetcher: QueryFetcher"} = async function ({ query, variables, operationName }, fetchOptions) {
// Modify "${S}" if needed
const response = await fetch("${S}", {
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
}\`
);
}
};
`,L=!!f.size,N=JSON.stringify(Object.keys(O).sort().reduce((e,r)=>(e[r]=!0,e),{})),Y=g.sortBy(Object.entries(m),e=>e[0]).reduceRight((e,[r,a])=>`${JSON.stringify(r)}:${JSON.stringify(a)}, ${e}`,L?`[SchemaUnionsKey]: ${JSON.stringify(B)}`:""),ye=await Q(`
/**
* GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY
*/
${L?'import { SchemaUnionsKey } from "gqty";':""}
${x('import("gqty").ScalarsEnumsHash')}export const scalarsEnumsHash = ${N};
export const generatedSchema = {${Y}};
`),W=[L&&"SchemaUnionsKey",!p&&"type ScalarsEnumsHash"].filter(e=>!!e),$e=await Q(`
/**
* GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY
*/
${w}
${W.length?`import { ${W.join(", ")} } from "gqty";`:""}
${await ae}
export${p?" declare":""} const scalarsEnumsHash: ScalarsEnumsHash${p?";":` = ${N};`}
export${p?" declare":""} const generatedSchema ${p?":":"="} {${Y}}${p?"":" as const"};
${H}
`),ge=E?`
export const {
graphql,
useQuery,
usePaginatedQuery,
useTransactionQuery,
useLazyQuery,
useRefetch,
useMutation,
useMetaState,
prepareReactRender,
useHydrateCache,
prepareQuery,
${d?"useSubscription,":""}
} = ${p?`${x('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 Q(`
/**
* GQty: You can safely modify this file based on your needs.
*/
${[E?'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(`
`)}
${he}
${d?`const subscriptionsClient =
typeof window !== "undefined" ?
createSubscriptionsClient({
lazy: true,
url: () => {
// Modify if needed
const url = new URL("${S}", 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?`${x('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;
${ge}
export * from "./schema.generated";
`),generatedSchema:m,isJavascriptOutput:p,javascriptSchemaCode:ye,scalarsEnumsHash:O,schemaCode:$e}}export{Fe as generate};