1 | <!DOCTYPE html>
|
2 | <html lang="en">
|
3 | <head>
|
4 | <meta charset="utf-8">
|
5 | <meta name="viewport" content="width=device-width,initial-scale=1">
|
6 | <title>SchemaUtils.js - Documentation</title>
|
7 |
|
8 | <script src="scripts/prettify/prettify.js"></script>
|
9 | <script src="scripts/prettify/lang-css.js"></script>
|
10 | |
11 |
|
12 |
|
13 | <link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
|
14 | <link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
|
15 | <link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
|
16 | </head>
|
17 | <body>
|
18 |
|
19 | <input type="checkbox" id="nav-trigger" class="nav-trigger" />
|
20 | <label for="nav-trigger" class="navicon-button x">
|
21 | <div class="navicon"></div>
|
22 | </label>
|
23 |
|
24 | <label for="nav-trigger" class="overlay"></label>
|
25 |
|
26 | <nav>
|
27 | <li class="nav-link nav-home-link"><a href="index.html">Home</a></li><li class="nav-heading">Classes</li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="AwaitingPromiseError.html">AwaitingPromiseError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="AwaitingPromiseError.html#%25E2%258C%25BE%25E2%25A0%2580asyncFn">⌾⠀asyncFn</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="AwaitingPromiseError.html#%25E2%258C%25BE%25E2%25A0%2580setPromise">⌾⠀setPromise</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="AwaitingPromiseError_exports.AwaitingPromiseError.html">AwaitingPromiseError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="AwaitingPromiseError_exports.AwaitingPromiseError.html#setPromise">setPromise</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="Deferred_exports.Deferred.html">Deferred</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="DirectTypeAdd.html">DirectTypeAdd</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="FunctionExecutionError_FunctionExecutionError.html">FunctionExecutionError</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="GQLBase.html">GQLBase</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.apiDocs">apiDocs</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%258C%25BE%25E2%25A0%2580getMergedRoot">⌾⠀getMergedRoot</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%258C%25BE%25E2%25A0%2580getProp">⌾⠀getProp</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%258C%25BE%25E2%25A0%2580getResolver">⌾⠀getResolver</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%258C%25BE%25E2%25A0%2580IDLFilePath">⌾⠀IDLFilePath</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%258C%25BE%25E2%25A0%2580MUTATORS">⌾⠀MUTATORS</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%258C%25BE%25E2%25A0%2580RESOLVERS">⌾⠀RESOLVERS</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%258C%25BE%25E2%25A0%2580setupModel">⌾⠀setupModel</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580handler">⬇︎⠀handler</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#.%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580SCHEMA">⬇︎⠀SCHEMA</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%258C%25BE%25E2%25A0%2580applyAutoProps">⌾⠀applyAutoProps</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%258C%25BE%25E2%25A0%2580callProp">⌾⠀callProp</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%258C%25BE%25E2%25A0%2580extendModel">⌾⠀extendModel</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%258C%25BE%25E2%25A0%2580getModel">⌾⠀getModel</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%258C%25BE%25E2%25A0%2580getProp">⌾⠀getProp</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%258C%25BE%25E2%25A0%2580getResolver">⌾⠀getResolver</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%258C%25BE%25E2%25A0%2580setModel">⌾⠀setModel</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%25AC%2586%25EF%25B8%258E%25E2%25A0%2580requestData">⬆︎⠀requestData</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580requestData">⬇︎⠀requestData</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#~deleteProperty">deleteProperty</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBase.html#~set">set</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="GQLBase.%25E2%258E%2586%25E2%25A0%2580constructor.html">⎆⠀constructor</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="GQLEnum.html">GQLEnum</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#..get">.get</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#..set">.set</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#.valueFor">valueFor</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#.%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580enums">⬇︎⠀enums</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#.%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580name">⬇︎⠀name</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#.%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580value">⬇︎⠀value</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#.%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580values">⬇︎⠀values</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLEnum.html#GenerateEnumsProxyHandler">GenerateEnumsProxyHandler</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html">GQLExpressMiddleware</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#.clearCache">clearCache</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#.%25E2%258C%25BE%25E2%25A0%2580generateSchemaSDL">⌾⠀generateSchemaSDL</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#astMiddleware">astMiddleware</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#schemaMiddleware">schemaMiddleware</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#%25E2%258C%25BE%25E2%25A0%2580customMiddleware">⌾⠀customMiddleware</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580middleware">⬇︎⠀middleware</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580middlewareWithoutGraphiQL">⬇︎⠀middlewareWithoutGraphiQL</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLExpressMiddleware.html#%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580schema">⬇︎⠀schema</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="GQLExpressMiddleware.%25E2%258E%2586%25E2%25A0%2580constructor.html">⎆⠀constructor</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="GQLInterface.html">GQLInterface</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLInterface.html#.%25E2%258C%25BE%25E2%25A0%2580resolveType">⌾⠀resolveType</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="GQLScalar.html">GQLScalar</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLScalar.html#.parseLiteral">parseLiteral</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLScalar.html#.parseValue">parseValue</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLScalar.html#.serialize">serialize</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="IDLFileHandler.html">IDLFileHandler</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="IDLFileHandler.html#%25E2%258C%25BE%25E2%25A0%2580getFile">⌾⠀getFile</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="IDLFileHandler.html#%25E2%258C%25BE%25E2%25A0%2580getSchema">⌾⠀getSchema</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="IDLFileHandler.html#%25E2%258C%25BE%25E2%25A0%2580getSyntaxTree">⌾⠀getSyntaxTree</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="IDLFileHandler.%25E2%258E%2586%25E2%25A0%2580constructor.html">⎆⠀constructor</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="ModuleParser.html">ModuleParser</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#.%25E2%258C%25BE%25E2%25A0%2580arrayToPattern">⌾⠀arrayToPattern</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#.%25E2%258C%25BE%25E2%25A0%2580checkForPackageExtensions">⌾⠀checkForPackageExtensions</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#%25E2%258C%25BE%25E2%25A0%2580findGQLBaseClasses">⌾⠀findGQLBaseClasses</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#%25E2%258C%25BE%25E2%25A0%2580importClass">⌾⠀importClass</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#%25E2%258C%25BE%25E2%25A0%2580parse">⌾⠀parse</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#%25E2%258C%25BE%25E2%25A0%2580parseSync">⌾⠀parseSync</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#~%25E2%258C%25BE%25E2%25A0%2580walk">⌾⠀walk</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#~%25E2%258C%25BE%25E2%25A0%2580walkSync">⌾⠀walkSync</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="ModuleParser.html#~%25E2%258E%2586%25E2%25A0%2580constructor">⎆⠀constructor</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="ModuleParser.exports.ModuleParser.html">exports.ModuleParser</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="SchemaUtils.html">SchemaUtils</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SchemaUtils.html#.%25E2%258C%25BE%25E2%25A0%2580createMergedRoot">⌾⠀createMergedRoot</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SchemaUtils.html#.%25E2%258C%25BE%25E2%25A0%2580injectComments">⌾⠀injectComments</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SchemaUtils.html#.%25E2%258C%25BE%25E2%25A0%2580injectEnums">⌾⠀injectEnums</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SchemaUtils.html#.%25E2%258C%25BE%25E2%25A0%2580injectInterfaceResolvers">⌾⠀injectInterfaceResolvers</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SchemaUtils.html#.%25E2%258C%25BE%25E2%25A0%2580injectScalars">⌾⠀injectScalars</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="SyntaxTree.html">SyntaxTree</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580EmptyDocument">⌾⠀EmptyDocument</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580EmptyMutation">⌾⠀EmptyMutation</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580EmptyQuery">⌾⠀EmptyQuery</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580findDefinition">⌾⠀findDefinition</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580findField">⌾⠀findField</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580findInASTArrayByNameValue">⌾⠀findInASTArrayByNameValue</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580from">⌾⠀from</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580fromAST">⌾⠀fromAST</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258C%25BE%25E2%25A0%2580fromSchema">⌾⠀fromSchema</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#.%25E2%258E%2586%25E2%25A0%2580constructor">⎆⠀constructor</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%258C%25BE%25E2%25A0%2580appendDefinitions">⌾⠀appendDefinitions</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%258C%25BE%25E2%25A0%2580consumeDefinition">⌾⠀consumeDefinition</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%258C%25BE%25E2%25A0%2580find">⌾⠀find</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%258C%25BE%25E2%25A0%2580findEnumDefinition">⌾⠀findEnumDefinition</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%258C%25BE%25E2%25A0%2580setAST">⌾⠀setAST</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%258C%25BE%25E2%25A0%2580toString">⌾⠀toString</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%258C%25BE%25E2%25A0%2580updateAST">⌾⠀updateAST</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%25AC%2586%25EF%25B8%258E%25E2%25A0%2580ast">⬆︎⠀ast</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="SyntaxTree.html#%25E2%25AC%2587%25EF%25B8%258E%25E2%25A0%2580ast">⬇︎⠀ast</a></span></li><li class="nav-heading"><span class="nav-item-type type-class">C</span><span class="nav-item-name"><a href="utils.Deferred.html">Deferred</a></span></li><li class="nav-heading">Namespaces</li><li class="nav-heading"><span class="nav-item-type type-namespace">N</span><span class="nav-item-name"><a href="decorators.html">decorators</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#.%25E2%258C%25BE%25E2%25A0%2580extractBits">⌾⠀extractBits</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#..%25F0%259F%258F%25B7%25E2%25A0%2580AdjacentSchema">.🏷⠀AdjacentSchema</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#..%25F0%259F%258F%25B7%25E2%25A0%2580FileSchema">.🏷⠀FileSchema</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#..%25F0%259F%258F%25B7%25E2%25A0%2580Getters">.🏷⠀Getters</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#..%25F0%259F%258F%25B7%25E2%25A0%2580Properties">.🏷⠀Properties</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#..%25F0%259F%258F%25B7%25E2%25A0%2580Schema">.🏷⠀Schema</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#..%25F0%259F%258F%25B7%25E2%25A0%2580Setters">.🏷⠀Setters</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="decorators.html#~decorate">decorate</a></span></li><li class="nav-heading"><span class="nav-item-type type-namespace">N</span><span class="nav-item-name"><a href="GQLBaseEnv.html">GQLBaseEnv</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="GQLBaseEnv.html#~notDefined">notDefined</a></span></li><li class="nav-heading"><a href="global.html">Globals</a></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#applyTags">applyTags</a></span></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#AsyncFunctionExecutionError">AsyncFunctionExecutionError</a></span></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#CHECK_API_DOCS">CHECK_API_DOCS</a></span></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#CHECK_RESOLVERS">CHECK_RESOLVERS</a></span></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#CHECK_SCHEMA">CHECK_SCHEMA</a></span></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#CHECKLIST">CHECKLIST</a></span></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#FunctionExecutionError">FunctionExecutionError</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#getChecklist">getChecklist</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#hasChecklist">hasChecklist</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#newChecklist">newChecklist</a></span></li><li class="nav-item"><span class="nav-item-type type-function">F</span><span class="nav-item-name"><a href="global.html#setChecklist">setChecklist</a></span></li><li class="nav-item"><span class="nav-item-type type-member">M</span><span class="nav-item-name"><a href="global.html#types">types</a></span></li>
|
28 | </nav>
|
29 |
|
30 | <div id="main">
|
31 |
|
32 | <h1 class="page-title">SchemaUtils.js</h1>
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 | <section>
|
41 | <article>
|
42 | <pre class="prettyprint source linenums"><code>// @flow
|
43 |
|
44 | import path from 'path'
|
45 | import { SyntaxTree } from './SyntaxTree'
|
46 | import { GQLBase, META_KEY } from './GQLBase'
|
47 | import { GQLEnum } from './GQLEnum'
|
48 | import { GQLInterface } from './GQLInterface'
|
49 | import { GQLScalar } from './GQLScalar'
|
50 | import { typeOf } from 'ne-types'
|
51 | import { LatticeLogs as ll } from './utils'
|
52 | import { merge } from 'lodash'
|
53 | import EventEmitter from 'events'
|
54 | import {
|
55 | parse,
|
56 | print,
|
57 | buildSchema,
|
58 | GraphQLInterfaceType,
|
59 | GraphQLEnumType,
|
60 | GraphQLScalarType,
|
61 | GraphQLSchema
|
62 | } from 'graphql'
|
63 |
|
64 | /**
|
65 | * The SchemaUtils is used by tools such as GQLExpressMiddleware in order to
|
66 | * apply GraphQL Lattice specifics to the build schema.
|
67 | *
|
68 | * @class SchemaUtils
|
69 | */
|
70 | export class SchemaUtils extends EventEmitter {
|
71 | /**
|
72 | * Calls all the Lattice post-schema creation routines on a given Schema
|
73 | * using data from a supplied array of classes.
|
74 | *
|
75 | * @param {GraphQLSchema} schema the schema to post-process
|
76 | * @param {Array<GQLBase>} Classes the Classes from which to drive post
|
77 | * processing data from
|
78 | */
|
79 | static injectAll(schema: GraphQLSchema, Classes: Array<GQLBase>) {
|
80 | SchemaUtils.injectInterfaceResolvers(schema, Classes);
|
81 | SchemaUtils.injectEnums(schema, Classes);
|
82 | SchemaUtils.injectScalars(schema, Classes);
|
83 | SchemaUtils.injectComments(schema, Classes);
|
84 | }
|
85 |
|
86 | /**
|
87 | * Until such time as I can get the reference Facebook GraphQL AST parser to
|
88 | * read and apply descriptions or until such time as I employ the Apollo
|
89 | * AST parser, providing a `static get apiDocs()` getter is the way to get
|
90 | * your descriptions into the proper fields, post schema creation.
|
91 | *
|
92 | * This method walks the types in the registered classes and the supplied
|
93 | * schema type. It then injects the written comments such that they can
|
94 | * be exposed in graphiql and to applications or code that read the meta
|
95 | * fields of a built schema
|
96 | *
|
97 | * @memberof SchemaUtils
|
98 | * @method ⌾⠀injectComments
|
99 | * @static
|
100 | * @since 2.7.0
|
101 | *
|
102 | * @param {Object} schema a built GraphQLSchema object created via buildSchema
|
103 | * or some other alternative but compatible manner
|
104 | * @param {Function[]} Classes these are GQLBase extended classes used to
|
105 | * manipulate the schema with.
|
106 | */
|
107 | static injectComments(schema: Object, Classes: Array<GQLBase>) {
|
108 | const {
|
109 | DOC_CLASS, DOC_FIELDS, DOC_QUERIES, DOC_MUTATORS, DOC_SUBSCRIPTIONS,
|
110 | DOC_QUERY, DOC_MUTATION, DOC_SUBSCRIPTION
|
111 | } = GQLBase;
|
112 |
|
113 | for (let Class of Classes) {
|
114 | const docs = Class.apiDocs();
|
115 | const query = schema._typeMap.Query;
|
116 | const mutation = schema._typeMap.Mutation;
|
117 | const subscription = schema._typeMap.Subscription;
|
118 | let type;
|
119 |
|
120 | if ((type = schema._typeMap[Class.name])) {
|
121 | let fields = type._fields;
|
122 | let values = type._values;
|
123 |
|
124 | if (docs[DOC_CLASS]) { type.description = docs[DOC_CLASS] }
|
125 |
|
126 | for (let field of Object.keys(docs[DOC_FIELDS] || {})) {
|
127 | if (fields && field in fields) {
|
128 | fields[field].description = docs[DOC_FIELDS][field];
|
129 | }
|
130 | if (values) {
|
131 | for (let value of values) {
|
132 | if (value.name === field) {
|
133 | value.description = docs[DOC_FIELDS][field]
|
134 | }
|
135 | }
|
136 | }
|
137 | }
|
138 | }
|
139 |
|
140 | for (let [_type, _CONST, _topCONST] of [
|
141 | [query, DOC_QUERIES, DOC_QUERY],
|
142 | [mutation, DOC_MUTATORS, DOC_MUTATION],
|
143 | [subscription, DOC_SUBSCRIPTIONS, DOC_SUBSCRIPTION]
|
144 | ]) {
|
145 | if (
|
146 | _type
|
147 | && (
|
148 | (Object.keys(docs[_CONST] || {}).length)
|
149 | || (docs[_topCONST] && docs[_topCONST].length)
|
150 | )
|
151 | ) {
|
152 | let fields = _type._fields;
|
153 |
|
154 | if (docs[_topCONST]) {
|
155 | _type.description = docs[_topCONST]
|
156 | }
|
157 |
|
158 | for (let field of Object.keys(docs[_CONST])) {
|
159 | if (field in fields) {
|
160 | fields[field].description = docs[_CONST][field];
|
161 | }
|
162 | }
|
163 | }
|
164 | }
|
165 | }
|
166 | }
|
167 |
|
168 | /**
|
169 | * Somewhat like `injectComments` and other similar methods, the
|
170 | * `injectInterfaceResolvers` method walks the registered classes and
|
171 | * finds `GQLInterface` types and applies their `resolveType()`
|
172 | * implementations.
|
173 | *
|
174 | * @memberof SchemaUtils
|
175 | * @method ⌾⠀injectInterfaceResolvers
|
176 | * @static
|
177 | *
|
178 | * @param {Object} schema a built GraphQLSchema object created via buildSchema
|
179 | * or some other alternative but compatible manner
|
180 | * @param {Function[]} Classes these are GQLBase extended classes used to
|
181 | * manipulate the schema with.
|
182 | */
|
183 | static injectInterfaceResolvers(schema: Object, Classes: Array<GQLBase>) {
|
184 | for (let Class of Classes) {
|
185 | if (Class.GQL_TYPE === GraphQLInterfaceType) {
|
186 | schema._typeMap[Class.name].resolveType =
|
187 | schema._typeMap[Class.name]._typeConfig.resolveType =
|
188 | Class.resolveType;
|
189 | }
|
190 | }
|
191 | }
|
192 |
|
193 | /**
|
194 | * Somewhat like `injectComments` and other similar methods, the
|
195 | * `injectInterfaceResolvers` method walks the registered classes and
|
196 | * finds `GQLInterface` types and applies their `resolveType()`
|
197 | * implementations.
|
198 | *
|
199 | * @memberof SchemaUtils
|
200 | * @method ⌾⠀injectEnums
|
201 | * @static
|
202 | *
|
203 | * @param {Object} schema a built GraphQLSchema object created via buildSchema
|
204 | * or some other alternative but compatible manner
|
205 | * @param {Function[]} Classes these are GQLBase extended classes used to
|
206 | * manipulate the schema with.
|
207 | */
|
208 | static injectEnums(schema: Object, Classes: Array<GQLBase>) {
|
209 | for (let Class of Classes) {
|
210 | if (Class.GQL_TYPE === GraphQLEnumType) {
|
211 | const __enum = schema._typeMap[Class.name];
|
212 | const values = Class.values;
|
213 |
|
214 | for (let value of __enum._values) {
|
215 | if (value.name in values) {
|
216 | merge(value, values[value.name])
|
217 | }
|
218 | }
|
219 | }
|
220 | }
|
221 | }
|
222 |
|
223 | /**
|
224 | * GQLScalar types must define three methods to have a valid implementation.
|
225 | * They are serialize, parseValue and parseLiteral. See their docs for more
|
226 | * info on how to do so.
|
227 | *
|
228 | * This code finds each scalar and adds their implementation details to the
|
229 | * generated schema type config.
|
230 | *
|
231 | * @memberof SchemaUtils
|
232 | * @method ⌾⠀injectScalars
|
233 | * @static
|
234 | *
|
235 | * @param {Object} schema a built GraphQLSchema object created via buildSchema
|
236 | * or some other alternative but compatible manner
|
237 | * @param {Function[]} Classes these are GQLBase extended classes used to
|
238 | * manipulate the schema with.
|
239 | */
|
240 | static injectScalars(schema: Object, Classes: Array<GQLBase>) {
|
241 | for (let Class of Classes) {
|
242 | if (Class.GQL_TYPE === GraphQLScalarType) {
|
243 | // @ComputedType
|
244 | const type = schema._typeMap[Class.name];
|
245 |
|
246 | // @ComputedType
|
247 | const { serialize, parseValue, parseLiteral } = Class;
|
248 |
|
249 | if (!serialize || !parseValue || !parseLiteral) {
|
250 | // @ComputedType
|
251 | ll.error(`Scalar type ${Class.name} has invaild impl.`);
|
252 | continue;
|
253 | }
|
254 |
|
255 | merge(type._scalarConfig, {
|
256 | serialize,
|
257 | parseValue,
|
258 | parseLiteral
|
259 | });
|
260 | }
|
261 | }
|
262 | }
|
263 |
|
264 | /**
|
265 | * A function that combines the IDL schemas of all the supplied classes and
|
266 | * returns that value to the middleware getter.
|
267 | *
|
268 | * @static
|
269 | * @memberof GQLExpressMiddleware
|
270 | * @method ⌾⠀generateSchemaSDL
|
271 | *
|
272 | * @return {string} a dynamically generated GraphQL IDL schema string
|
273 | */
|
274 | static generateSchemaSDL(
|
275 | Classes: Array<GQLBase>,
|
276 | logOutput: boolean = true
|
277 | ): string {
|
278 | let schema = SyntaxTree.EmptyDocument();
|
279 | let log = (...args) => {
|
280 | if (logOutput) {
|
281 | console.log(...args);
|
282 | }
|
283 | }
|
284 |
|
285 | for (let Class of Classes) {
|
286 | let classSchema = Class.SCHEMA;
|
287 |
|
288 | if (typeOf(classSchema) === 'Symbol') {
|
289 | let handler = Class.handler;
|
290 | let filename = path.basename(Class.handler.path)
|
291 |
|
292 | classSchema = handler.getSchema();
|
293 | log(
|
294 | `\nRead schema (%s)\n%s\n%s\n`,
|
295 | filename,
|
296 | '-'.repeat(14 + filename.length),
|
297 | classSchema.replace(/^/gm, ' ')
|
298 | )
|
299 | }
|
300 |
|
301 | schema.appendDefinitions(classSchema);
|
302 | }
|
303 |
|
304 | log('\nGenerated GraphQL Schema\n----------------\n%s', schema);
|
305 |
|
306 | return schema.toString();
|
307 | }
|
308 |
|
309 | /**
|
310 | * An asynchronous function used to parse the supplied classes for each
|
311 | * ones resolvers and mutators. These are all combined into a single root
|
312 | * object passed to express-graphql.
|
313 | *
|
314 | * @static
|
315 | * @memberof SchemaUtils
|
316 | * @method ⌾⠀createMergedRoot
|
317 | *
|
318 | * @param {Array<GQLBase>} Classes the GQLBase extended class objects or
|
319 | * functions from which to merge the RESOLVERS and MUTATORS functions.
|
320 | * @param {Object} requestData for Express apss, this will be an object
|
321 | * containing { req, res, gql } where those are the Express request and
|
322 | * response object as well as the GraphQL parameters for the request.
|
323 | * @return {Promise<Object>} a Promise resolving to an Object containing all
|
324 | * the functions described in both Query and Mutation types.
|
325 | */
|
326 | static async createMergedRoot(
|
327 | Classes: Array<GQLBase>,
|
328 | requestData: Object,
|
329 | separateByType: boolean = false
|
330 | ): Promise<Object> {
|
331 | const root = {};
|
332 |
|
333 | for (let Class of Classes) {
|
334 | merge(
|
335 | root,
|
336 | // $FlowFixMe
|
337 | await Class.getMergedRoot(requestData, separateByType)
|
338 | );
|
339 | }
|
340 |
|
341 | return root;
|
342 | }
|
343 | }
|
344 |
|
345 | export default SchemaUtils
|
346 | </code></pre>
|
347 | </article>
|
348 | </section>
|
349 |
|
350 |
|
351 |
|
352 |
|
353 | </div>
|
354 |
|
355 | <br class="clear">
|
356 |
|
357 | <footer>
|
358 | Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Fri Jun 08 2018 19:28:39 GMT-0700 (PDT) using the Minami theme.
|
359 | </footer>
|
360 |
|
361 | <script>prettyPrint();</script>
|
362 | <script src="scripts/linenumber.js"></script>
|
363 | </body>
|
364 | </html>
|