UNPKG

graphql-gene

Version:

Generates automatically an executable schema out of your ORM models

34 lines (29 loc) 7.92 kB
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("graphql"),a=require("./utils/index.cjs"),L=require("./resolvers.cjs"),j=require("./defaultResolver.cjs"),v=`<!doctype html> <html lang="en" class="hljs"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>GraphQL Schema</title> <link rel="stylesheet" href="https://unpkg.com/initialize-css@1.2.0/dist/initialize.min.css" /> <link rel="stylesheet" href="https://unpkg.com/@highlightjs/cdn-assets@11.9.0/styles/atom-one-dark-reasonable.css" /> </head> <body> <pre><code class="language-graphql lineHeightNormal"><%= code %></code></pre> <script src="https://unpkg.com/@highlightjs/cdn-assets@11.9.0/highlight.min.js"><\/script> <script> hljs.highlightAll() <\/script> </body> </html> `;function F(e){const r=e.resolvers?Object.values(e.resolvers).filter(y=>u.isScalarType(y)).map(({name:y})=>y):[],n=a.parseSchemaOption(e.schema,r),{typeDefsString:s,typeDefLines:t}=S({...e,schema:n}),i=n?u.extendSchema(n,u.parse(s)):u.buildSchema(s),f=i.getType("Query"),g=i.getType("Mutation");if(!f)throw new Error("Query root type must be provided.");if(!(f instanceof u.GraphQLObjectType))throw new Error("Query type is not a GraphQLObjectType.");const o={query:f},c=i.getTypeMap();if(g){if(!(g instanceof u.GraphQLObjectType))throw new Error("Mutation type is not a GraphQLObjectType.");o.mutation=g}e.resolvers&&Object.entries(e.resolvers).forEach(([y,h])=>{if(u.isScalarType(h)){Object.assign(c[y],h);return}Object.entries(h).forEach(([d,p])=>{const m=a.getFieldDefinition({schema:i,parent:y,field:d});if(m)m.resolve=p;else throw new Error(`No field definition found for "${d}" of type "${y}.`)})});let l=new u.GraphQLSchema({...i.toConfig(),...o,types:Object.values(c)});return l=L.addResolversToSchema({typeDefLines:t,schema:l,plugins:e.plugins||[],types:e.types}),{schema:l,get schemaString(){return a.printSchemaWithDirectives(l)},get typeDefs(){return u.parse(this.schemaString)},get resolvers(){const y={};return a.lookDeepInSchema({schema:l,each({field:h,fieldDef:d,parentType:p}){d.resolve&&(y[p]=y[p]||{},y[p][h]=d.resolve)}}),y},get schemaHtml(){return v.replace("<%= code %>",this.schemaString)}}}function S(e){const r={},n={},s=[];Object.entries(e.types).forEach(([o,c])=>{let l=!1;for(const y of e.plugins||[]){if(!y.isMatching(c))continue;const{afterTypeDefHooks:d}=$({directiveDefs:r,typeDefLines:n,types:e.types,schema:e.schema,resolvers:e.resolvers,plugin:y,modelKey:o,model:c,dataTypeMap:e.dataTypeMap});s.push(...d),k({typeDefLines:n,modelKey:o,model:c}),l=!0;break}!l&&(a.isArrayFieldConfig(c)||a.isObjectFieldConfig(c))&&T({directiveDefs:r,typeDefLines:n,graphqlType:o,fieldConfigs:c})});const t=a.getGloballyExtendedTypes();Object.entries(t.config).forEach(([o,c])=>{T({directiveDefs:r,typeDefLines:n,graphqlType:o,fieldConfigs:c}),Object.entries(c).forEach(([l,y])=>{const h=a.normalizeFieldConfig(y);a.isUsingDefaultResolver(h)&&j.generateDefaultQueryFilterTypeDefs({typeDefLines:n,graphqlType:o,fieldKey:l,fieldType:a.getReturnTypeName(h.returnType)})})}),s.forEach(o=>o());const i=[];let f=n;if("Query"in n){const{Query:o,...c}=n;f={Query:o,...c}}Object.entries(f).forEach(([o,c])=>{const l=A(o,c);l&&i.push(l)});let g=i.join(` `);return Object.entries(r).forEach(([o,c])=>{let l=`directive @${o}`;const h=Object.entries(c.argsDef).filter(([,p])=>[...p].some(m=>m!==null)),d=p=>{const m=[...p];return[m.filter(D=>D!==null),p.has(null)||m.some(D=>/^\[/.test(String(D)))?"":"!"].join("")};h.length&&(l+=`( `,l+=h.map(([p,m])=>` ${p}: ${d(m)}`).join(` `),l+=` )`),l+=" on OBJECT | FIELD_DEFINITION",g=`${l} ${g}`}),{typeDefsString:g,typeDefLines:n}}function $(e){const r=[],{afterTypeDefHooks:n}=b(e);r.push(...n),O(e);const s=a.getGeneConfigFromOptions(e);return Object.entries(s?.aliases||{}).forEach(([t,i])=>{const{afterTypeDefHooks:f}=b({...e,geneConfig:i,modelKey:t});r.push(...f),O({...e,geneConfig:i})}),{afterTypeDefHooks:r}}function k(e){E(e);const r=a.getGeneConfigFromOptions(e);r?.types&&Object.entries(r?.aliases||{}).forEach(([,n])=>{E({...e,geneConfig:n})})}function b(e){const r=a.getGeneConfigFromOptions(e),n=[];a.setGeneConfigByType(e.modelKey,r);const s={typeDefLines:e.typeDefLines,model:e.model,typeName:e.modelKey,isFieldIncluded:t=>a.isFieldIncluded(r,t),schemaOptions:e};if(e.plugin.populateTypeDefs){const{afterTypeDefHooks:t}=e.plugin.populateTypeDefs(s);n.push(...t)}else{const t=e.plugin.getTypeDef(s);e.typeDefLines[e.modelKey]=t}return C({configs:r?.directives,defs:e.directiveDefs,each:({directiveDef:t})=>{e.typeDefLines[e.modelKey].directives.add(t)}}),{afterTypeDefHooks:n}}function O(e){const r=a.getGeneConfigFromOptions(e);r?.types&&Object.entries(r.types).forEach(([n,s])=>{T({...e,graphqlType:n,fieldConfigs:s})})}function T(e){let r=e.fieldConfigs;if(e.typeDefLines[e.graphqlType]={...a.getDefaultTypeDefLinesObject(),...e.typeDefLines[e.graphqlType]},a.isObject(r)&&"geneConfig"in r&&r.geneConfig?.varType){const n=r.geneConfig.varType;if(e.typeDefLines[e.graphqlType].varType=n,n==="union"){const s={};Object.keys(r).filter(t=>t!=="geneConfig").forEach(t=>s[t]=""),r=s}}if(a.isArrayFieldConfig(e.fieldConfigs)){e.typeDefLines[e.graphqlType].varType="enum";const n={};e.fieldConfigs.forEach(s=>n[s]=""),r=n}else{const n=e.fieldConfigs.geneConfig;n?.varType&&(e.typeDefLines[e.graphqlType].varType=n.varType)}Object.entries(r).forEach(([n,s])=>{if(n==="geneConfig")return;const t=a.normalizeFieldConfig(s);e.typeDefLines[e.graphqlType].lines[n]={...a.getDefaultFieldLinesObject(),...e.typeDefLines[e.graphqlType].lines[n]};const i=e.typeDefLines[e.graphqlType].lines[n];t.returnType&&(i.typeDef=t.returnType),a.isUsingDefaultResolver(t)?j.populateArgsDefForDefaultResolver({fieldLineConfig:i,graphqlType:e.graphqlType,fieldKey:n,isList:a.isListType(u.parseType(i.typeDef))}):t.args&&Object.entries(t.args).forEach(([f,g])=>{typeof g=="string"&&(i.argsDef[f]=i.argsDef[f]||new Set([]),i.argsDef[f].add(g))}),t.directives&&C({configs:t.directives,defs:e.directiveDefs,each:({directiveDef:f})=>{e.typeDefLines[e.graphqlType].lines[n].directives.add(f)}})})}function E(e){const r=e.model,n=r?a.getGeneConfigFromOptions({model:r,...e}):void 0;n?.types&&Object.entries(n.types).forEach(([s,t])=>{Object.entries(t).forEach(([i,f])=>{const g=a.normalizeFieldConfig(f);a.isUsingDefaultResolver(g)&&j.generateDefaultQueryFilterTypeDefs({typeDefLines:e.typeDefLines,graphqlType:s,fieldKey:i,fieldType:a.getReturnTypeName(g.returnType)})})})}function C(e){e.configs?.forEach(r=>{e.defs[r.name]=e.defs[r.name]||{argsDef:{}},r.args&&Object.entries(r.args).forEach(([s,t])=>{Array.isArray(t)&&!t.length||(e.defs[r.name].argsDef=e.defs[r.name].argsDef||{},e.defs[r.name].argsDef[s]=e.defs[r.name].argsDef[s]||new Set([]),e.defs[r.name].argsDef[s].add(t===null?null:Array.isArray(t)&&!t.length?[]:a.getGraphqlType(t)))});const n=q(r);e.each({directiveDef:n,directive:r})})}function A(e,r){const n=i=>i.size?` ${[...i].join(" ")}`:"",s=Object.entries(r.lines).map(([i,f])=>{let g="";const o=Object.entries(f.argsDef);o.length&&(g+="(",g+=o.map(([l,y])=>`${l}: ${[...y].join(" | ")}`).join(", "),g+=")");let c=`${i}${g}`;return f.typeDef&&(c+=`: ${f.typeDef}${n(f.directives)}`),c});if(!s.length)return"";const t=(i=" ",f=` `)=>s.map(g=>`${i}${g}`).join(f);return r.varType==="union"?`union ${e} = ${t(""," | ")}`:[`${r.varType} ${e}${n(r.directives)} {`,t(),"}"].join(` `)}function q(e){let r=`@${e.name}`;if(e.args){const n=Object.entries(e.args).filter(([,s])=>Array.isArray(s)?!!s.length:s!==null);n.length&&(r+="(",r+=n.map(([s,t])=>{const i=Array.isArray(t)?`[${t.filter(f=>f!==null).map(f=>JSON.stringify(f)).join(", ")}]`:JSON.stringify(t);return`${s}: ${i}`}).join(", "),r+=")")}return r}exports.generateSchema=F; //# sourceMappingURL=schema.cjs.map