graphql-gene
Version:
Generates automatically an executable schema out of your ORM models
34 lines (29 loc) • 7.97 kB
JavaScript
;Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("graphql"),i=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=i.parseSchemaOption(e.schema,r),{typeDefsString:s,typeDefLines:t}=S({...e,schema:n}),a=n?u.extendSchema(n,u.parse(s)):u.buildSchema(s),f=a.getType("Query"),g=a.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=a.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=i.getFieldDefinition({schema:a,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({...a.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 i.printSchemaWithDirectives(l)},get typeDefs(){return u.parse(this.schemaString)},get resolvers(){const y={};return i.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&&(i.isArrayFieldConfig(c)||i.isObjectFieldConfig(c))&&T({directiveDefs:r,typeDefLines:n,graphqlType:o,fieldConfigs:c})});const t=i.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=i.normalizeFieldConfig(y);i.isUsingDefaultResolver(h)&&j.generateDefaultQueryFilterTypeDefs({typeDefLines:n,graphqlType:o,fieldKey:l,fieldType:i.getReturnTypeName(h.returnType)})})}),s.forEach(o=>o());const a=[];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&&a.push(l)});let g=a.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=i.getGeneConfigFromOptions(e);return Object.entries(s?.aliases||{}).forEach(([t,a])=>{const{afterTypeDefHooks:f}=b({...e,geneConfig:a,modelKey:t});r.push(...f),O({...e,geneConfig:a})}),{afterTypeDefHooks:r}}function k(e){E(e);const r=i.getGeneConfigFromOptions(e);r?.types&&Object.entries(r?.aliases||{}).forEach(([,n])=>{E({...e,geneConfig:n})})}function b(e){const r=i.getGeneConfigFromOptions(e),n=[];i.setGeneConfigByType(e.modelKey,r);const s={typeDefLines:e.typeDefLines,model:e.model,typeName:e.modelKey,isFieldIncluded:t=>i.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:i.parseGetterConfig(r?.directives),defs:e.directiveDefs,each:({directiveDef:t})=>{e.typeDefLines[e.modelKey].directives.add(t)}}),{afterTypeDefHooks:n}}function O(e){const r=i.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]={...i.getDefaultTypeDefLinesObject(),...e.typeDefLines[e.graphqlType]},i.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(i.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=i.normalizeFieldConfig(s);e.typeDefLines[e.graphqlType].lines[n]={...i.getDefaultFieldLinesObject(),...e.typeDefLines[e.graphqlType].lines[n]};const a=e.typeDefLines[e.graphqlType].lines[n];t.returnType&&(a.typeDef=t.returnType),i.isUsingDefaultResolver(t)?j.populateArgsDefForDefaultResolver({fieldLineConfig:a,graphqlType:e.graphqlType,fieldKey:n,isList:i.isListType(u.parseType(a.typeDef))}):t.args&&Object.entries(t.args).forEach(([f,g])=>{typeof g=="string"&&(a.argsDef[f]=a.argsDef[f]||new Set([]),a.argsDef[f].add(g))}),t.directives&&C({configs:i.parseGetterConfig(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?i.getGeneConfigFromOptions({model:r,...e}):void 0;n?.types&&Object.entries(n.types).forEach(([s,t])=>{Object.entries(t).forEach(([a,f])=>{const g=i.normalizeFieldConfig(f);i.isUsingDefaultResolver(g)&&j.generateDefaultQueryFilterTypeDefs({typeDefLines:e.typeDefLines,graphqlType:s,fieldKey:a,fieldType:i.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?[]:i.getGraphqlType(t)))});const n=q(r);e.each({directiveDef:n,directive:r})})}function A(e,r){const n=a=>a.size?` ${[...a].join(" ")}`:"",s=Object.entries(r.lines).map(([a,f])=>{let g="";const o=Object.entries(f.argsDef);o.length&&(g+="(",g+=o.map(([l,y])=>`${l}: ${[...y].join(" | ")}`).join(", "),g+=")");let c=`${a}${g}`;return f.typeDef&&(c+=`: ${f.typeDef}${n(f.directives)}`),c});if(!s.length)return"";const t=(a=" ",f=`
`)=>s.map(g=>`${a}${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 a=Array.isArray(t)?`[${t.filter(f=>f!==null).map(f=>JSON.stringify(f)).join(", ")}]`:JSON.stringify(t);return`${s}: ${a}`}).join(", "),r+=")")}return r}exports.generateSchema=F;
//# sourceMappingURL=schema.cjs.map