UNPKG

@gqty/cli

Version:

Interactive codegen for GQty

167 lines (145 loc) • 12.5 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const gqty=require("gqty"),graphql=require("graphql"),config=require("./config.js");require("@commander-js/extra-typings");const core=require("@graphql-codegen/core"),typescript=require("@graphql-codegen/typescript"),utils=require("@graphql-tools/utils");require("@graphql-tools/wrap"),require("@inquirer/prompts"),require("cosmiconfig"),require("cross-fetch"),require("fast-glob");const sortBy_js=require("lodash-es/sortBy.js");require("prettier");const prettier=require("./prettier.js");function _interopDefaultLegacy(i){return i&&typeof i=="object"&&"default"in i?i:{default:i}}function _interopNamespace(i){if(i&&i.__esModule)return i;const $=Object.create(null);if(i){for(const y in i)if(y!=="default"){const m=Object.getOwnPropertyDescriptor(i,y);Object.defineProperty($,y,m.get?m:{enumerable:!0,get:function(){return i[y]}})}}return $.default=i,Object.freeze($)}const graphql__namespace=_interopNamespace(graphql),typescript__namespace=_interopNamespace(typescript),sortBy_js__default=_interopDefaultLegacy(sortBy_js),{isEnumType,isInputObjectType,isInterfaceType,isNullableType,isObjectType,isScalarType,isUnionType,lexicographicSortSchema,parse,isSchema,assertSchema}=graphql__namespace;async function generate(i,{enumsAsConst:$,enumsAsStrings:y,enumStyle:m=$?"assertion":y?"string":config.defaultConfig.enumStyle,introspection:ee=config.defaultConfig.introspections,endpoint:A=ee?.endpoint??config.defaultConfig.endpoint,javascriptOutput:d=config.defaultConfig.javascriptOutput,preImport:te=config.defaultConfig.preImport,react:_=config.defaultConfig.react,frameworks:I=config.defaultConfig.frameworks,scalarTypes:ne=config.defaultConfig.scalarTypes,subscriptions:g=config.defaultConfig.subscriptions,transformSchema:L=config.defaultConfig.transformSchema}={},{ignoreArgs:C}={}){d&&(m!=="string"&&m!==config.defaultConfig.enumStyle&&console.warn('"enumStyle" must be string unions with "javascriptOutput" enabled.'),m="string");const{format:M}=prettier.formatPrettier({parser:"typescript"});if(i=lexicographicSortSchema(assertSchema(i)),L&&(i=await L(i,graphql__namespace),!isSchema(i)))throw Error('"transformSchema" returned an invalid GraphQL Schema!');_??(_=I.includes("react"));const P=I.includes("solid-js"),re=core.codegen({schema:parse(utils.printSchemaWithDirectives(i)),config:{},documents:[],filename:"gqty.generated.ts",pluginMap:{typescript:typescript__namespace},plugins:[{typescript:{constEnums:m==="const",onlyOperationTypes:!0,declarationKind:"interface",addUnderscoreToArgsType:!0,scalars:ne,namingConvention:"keep",enumsAsTypes:m==="string",enumsAsConst:m==="assertion"}}]}),j=i.toConfig(),D=new Set,S=new Set,z=new Set,h={query:{},mutation:{},subscription:{}},x=j.query,F=j.mutation,V=j.subscription,v=new Map,O=new Map,b=new Map;function Q(e){if(Array.isArray(e)){const t=e[2]?b.get(e[0])?.[e[1]]?.[e[2]]:O.get(e[0])?.[e[1]];let r="";return t?.description&&(r+=` `+t.description.trim().split(` `).map(n=>"* "+n).join(` `)),t?.deprecated&&(r+=` * @deprecated `+t.deprecated.trim().replace(/\n/g,". ").trim()),t?.defaultValue&&(r+="\n* @defaultValue `"+t.defaultValue.trim()+"`"),r?`/** ${r} */ `:""}else{const t=v.get(e);return t?`/** ${t.trim().split(` `).map(r=>"* "+r).join(` `)} */ `:""}}const se=e=>{D.add(e.name);const t=e.getValues(),r={};for(const n of t)(n.deprecationReason||n.description)&&(r[n.name]={description:n.description,deprecated:n.deprecationReason});O.set(e.name,r)},oe=e=>{S.add(e.name)},ie=new Map,E=(e,t=e.name)=>{const r=e.getFields(),n=e.getInterfaces();if(n.length){ie.set(e.name,n.map(o=>o.name));for(const o of n){let u=f.get(o.name);u==null&&f.set(o.name,u=[]),u.push(e.name)}}const s={__typename:{__type:"String!"}},a={},c={};Object.entries(r).forEach(([o,u])=>{if((u.description||u.deprecationReason)&&(a[o]={description:u.description,deprecated:u.deprecationReason}),s[o]={__type:u.type.toString()},u.args.length){if(C&&u.args.every(({type:p})=>isNullableType(p))&&C(u))return;c[o]||(c[o]={}),s[o].__args=u.args.reduce((l,p)=>(l[p.name]=p.type.toString(),(p.description||p.deprecationReason||p.defaultValue!=null)&&(c[o][p.name]={defaultValue:p.defaultValue!=null?JSON.stringify(p.defaultValue):null,deprecated:p.deprecationReason,description:p.description}),l),{})}}),O.set(e.name,a),b.set(e.name,c),h[t]=s},f=new Map,ae=e=>{const t=e.getTypes(),r=[];f.set(e.name,r);for(const n of t)r.push(n.name);h[e.name]={__typename:{__type:"String!"}}},ce=e=>{z.add(e.name);const t=e.getFields(),r={};Object.entries(t).forEach(([n,s])=>{r[n]={__type:s.type.toString()},(s.description||s.deprecationReason||s.defaultValue)&&(s.description,s.deprecationReason,s.defaultValue!=null&&JSON.stringify(s.defaultValue))}),h[e.name]=r},ue=e=>{const t={__typename:{__type:"String!"}},r=e.getFields(),n={},s={};Object.entries(r).forEach(([a,c])=>{c.type.toString(),t[a]={__type:c.type.toString()};let o=!0;c.args.length?C&&c.args.every(({type:l})=>isNullableType(l))&&C(c)&&(o=!1):o=!1,o&&(s[a]||(s[a]={}),t[a].__args=c.args.reduce((u,l)=>(u[l.name]=l.type.toString(),(l.description||l.deprecationReason||l.defaultValue!=null)&&(s[a][l.name]={defaultValue:l.defaultValue!=null?JSON.stringify(l.defaultValue):null,deprecated:l.deprecationReason,description:l.description}),u),{})),(c.description||c.deprecationReason)&&(n[a]={description:c.description,deprecated:c.deprecationReason})}),O.set(e.name,n),b.set(e.name,s),h[e.name]=t};j.types.forEach(e=>{e.description&&v.set(e.name,e.description),!(e.name.startsWith("__")||e===x||e===F||e===V)&&(isScalarType(e)?oe(e):isObjectType(e)?E(e):isInterfaceType(e)?ue(e):isUnionType(e)?ae(e):isEnumType(e)?se(e):isInputObjectType(e)&&ce(e))}),x&&E(x,"query"),F&&E(F,"mutation"),V&&E(V,"subscription");const B=Array.from(f.entries()).reduce((e,[t,r])=>(h[t].$on={__type:`$${t}!`},e[t]=r,e),{});f.size&&(h[gqty.SchemaUnionsKey]=B);function le({pureType:e,isArray:t,nullableItems:r,isNullable:n,hasDefaultValue:s}){let a=S.has(e)?`Scalars["${e}"]["input"]`:e;return t&&(r&&(a=`Maybe<${a}>`),a=`Array<${a}>`),(n||s)&&(a=`Maybe<${a}>`),a}function pe({pureType:e,isArray:t,nullableItems:r,isNullable:n}){let s=S.has(e)?`Scalars["${e}"]["output"]`:e;return t&&(r&&(s=`Maybe<${s}>`),s=`Array<${s}>`),n&&(s=`Maybe<${s}>`),s}const de=new Map;let H=sortBy_js__default.default(Object.entries(h),e=>e[0]).reduce((e,[t,r])=>{const n=(()=>{switch(t){case"query":return"Query";case"mutation":return"Mutation";case"subscription":return"Subscription";default:return t}})();if(z.has(n))return e;const s=new Map;f.has(n)||de.set(n,s);const a=f.get(n);return e+=` ${Q(n)}export interface ${n} { __typename?: ${a?a.map(c=>`"${c}"`).join(" | "):`"${n}"`}; ${Object.entries(r).reduce((c,[o,u])=>{if(o==="__typename")return s.set(o,`?: "${n}"`),c;const l=b.has(n)?b.get(n):void 0,p=l&&l[o]?l[o]:{},q=gqty.parseSchemaType(u.__type),X=pe(q);let w;if(u.__args){const Z=Object.entries(u.__args);let J=!0;const $e=Z.reduce((K,[G,Se])=>{const R=gqty.parseSchemaType(Se,p[G]),be=R.isNullable||R.hasDefaultValue?"?:":":";R.isNullable||(J=!1);const _e=le(R);return K+=`${Q([n,o,G])}${G}${be} ${_e}; `,K},"");w=`: (args${J?"?:":":"} {${$e}}) => ${X}`}else w=`${q.isNullable||D.has(q.pureType)||S.has(q.pureType)?"?:":":"} ${X}`;return s.set(o,w),c+=` `+Q([n,o])+o+w,c},"")} } `,e},"");f.size&&(H+=sortBy_js__default.default(Array.from(f.entries()),([e])=>e).map(([e,t])=>` export interface $${e} { ${t.map(r=>`${r}?: ${r}`).join(` `)} }`).join("")),H+=` export interface GeneratedSchema { query: Query mutation: Mutation subscription: Subscription } `;function T(e){return`/** * @type {${e}} */ `}const fe=` ${d?T('import("gqty").QueryFetcher')+"const queryFetcher":"const queryFetcher: QueryFetcher"} = async function ({ query, variables, operationName }, fetchOptions) { // Modify "${A}" if needed const response = await fetch("${A}", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ query, variables, operationName, }), mode: "cors", ...fetchOptions }); return await defaultResponseHandler(response); }; `,U=!!f.size,N=Object.fromEntries([...S,...D].sort().map(e=>[e,!0])),Y=JSON.stringify(N),k=sortBy_js__default.default(Object.entries(h),e=>e[0]).reduceRight((e,[t,r])=>`${JSON.stringify(t)}:${JSON.stringify(r)}, ${e}`,U?`[SchemaUnionsKey]: ${JSON.stringify(B)}`:""),me=await M(` /** * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ ${U?'import { SchemaUnionsKey } from "gqty";':""} ${T('import("gqty").ScalarsEnumsHash')}export const scalarsEnumsHash = ${Y}; export const generatedSchema = {${k}}; `),W=[U&&"SchemaUnionsKey",!d&&"type ScalarsEnumsHash"].filter(e=>!!e),he=await M(` /** * GQty AUTO-GENERATED CODE: PLEASE DO NOT MODIFY MANUALLY */ ${te} ${W.length?`import { ${W.join(", ")} } from "gqty";`:""} ${await re} export${d?" declare":""} const scalarsEnumsHash: ScalarsEnumsHash${d?";":` = ${Y};`} export${d?" declare":""} const generatedSchema ${d?":":"="} {${k}}${d?"":" as const"}; ${H} `),ge=_?` export const { graphql, useQuery, usePaginatedQuery, useTransactionQuery, useLazyQuery, useRefetch, useMutation, useMetaState, prepareReactRender, useHydrateCache, prepareQuery, ${g?"useSubscription,":""} } = ${d?`${T('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():"",ye=P?` export const { createQuery } = createSolidClient(client); `:"";return{clientCode:await M(` /** * GQty: You can safely modify this file based on your needs. */ ${[_?'import { createReactClient } from "@gqty/react";':"",P?'import { createSolidClient } from "@gqty/solid";':"",g?`import { createClient as createSubscriptionsClient } from "${g===!0?"graphql-ws":g}";`:"",d?'import { Cache, createClient, defaultResponseHandler } from "gqty";':'import { Cache, createClient, defaultResponseHandler, type QueryFetcher } from "gqty";',d?'import { generatedSchema, scalarsEnumsHash } from "./schema.generated";':'import { generatedSchema, scalarsEnumsHash, type GeneratedSchema } from "./schema.generated";'].filter(Boolean).join(` `)} ${fe} ${g?`const subscriptionsClient = typeof window !== "undefined" ? createSubscriptionsClient({ lazy: true, url: () => { // Modify if needed const url = new URL("${A}", window.location.href); url.protocol = url.protocol.replace('http', 'ws'); return url.href; } }) : undefined;`:""} const cache = new Cache( undefined, /** * Cache is valid for 30 minutes, but starts revalidating after 5 seconds, * allowing soft refetches in background. */ { maxAge: 5000, staleWhileRevalidate: 30 * 60 * 1000, normalization: true, } ); ${d?`${T('import("gqty").GQtyClient<import("./schema.generated").GeneratedSchema>')}export const client = createClient({ schema: generatedSchema, scalars: scalarsEnumsHash, cache, fetchOptions: { fetcher: queryFetcher, ${g?"subscriber: subscriptionsClient":""} }, }); `:` export const client = createClient<GeneratedSchema>({ schema: generatedSchema, scalars: scalarsEnumsHash, cache, fetchOptions:{ fetcher: queryFetcher, ${g?"subscriber: subscriptionsClient":""} }, }); `} // Core functions export const { resolve, subscribe, schema } = client; // Legacy functions export const { query, mutation, mutate, subscription, resolved, refetch, track } = client; ${ge} ${ye} export * from "./schema.generated"; `),generatedSchema:h,isJavascriptOutput:d,javascriptSchemaCode:me,scalarsEnumsHash:N,schemaCode:he}}exports.generate=generate;