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>GQLExpressMiddleware.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">GQLExpressMiddleware.js</h1>
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 | <section>
|
41 | <article>
|
42 | <pre class="prettyprint source linenums"><code>// @flow
|
43 | // @module GQLExpressMiddleware
|
44 |
|
45 | import { SyntaxTree } from './SyntaxTree'
|
46 | import { GQLBase } from './GQLBase'
|
47 | import { GQLInterface } from './GQLInterface'
|
48 | import { GQLScalar } from './GQLScalar'
|
49 | import { typeOf } from 'ne-types'
|
50 | import { SchemaUtils } from './SchemaUtils'
|
51 | import _, { merge } from 'lodash'
|
52 | import { makeExecutableSchema } from 'graphql-tools'
|
53 |
|
54 | import {
|
55 | parse,
|
56 | print,
|
57 | buildSchema,
|
58 | GraphQLSchema,
|
59 | GraphQLInterfaceType,
|
60 | GraphQLEnumType,
|
61 | GraphQLScalarType
|
62 | } from 'graphql'
|
63 |
|
64 | import bodyParser from 'body-parser'
|
65 | import graphqlHTTP from 'express-graphql'
|
66 | import EventEmitter from 'events'
|
67 | import path from 'path'
|
68 |
|
69 | /**
|
70 | * A handler that exposes an express middleware function that mounts a
|
71 | * GraphQL I/O endpoint. Typical usage follows:
|
72 | *
|
73 | * ```js
|
74 | * const app = express();
|
75 | * app.use(/.../, new GQLExpressMiddleware([...classes]).middleware);
|
76 | * ```
|
77 | *
|
78 | * @class GQLExpressMiddleware
|
79 | */
|
80 | export class GQLExpressMiddleware extends EventEmitter
|
81 | {
|
82 | handlers: Array<GQLBase>;
|
83 |
|
84 | schema: string;
|
85 |
|
86 | cache: Map<any, any> = new Map()
|
87 |
|
88 | /**
|
89 | * For now, takes an Array of classes extending from GQLBase. These are
|
90 | * parsed and a combined schema of all their individual schemas is generated
|
91 | * via the use of ASTs. This is passed off to express-graphql.
|
92 | *
|
93 | * @memberof GQLExpressMiddleware
|
94 | * @method ⎆⠀constructor
|
95 | * @constructor
|
96 | *
|
97 | * @param {Array<GQLBase>} handlers an array of GQLBase extended classes
|
98 | */
|
99 | constructor(handlers: Array<GQLBase>) {
|
100 | super()
|
101 |
|
102 | this.handlers = handlers
|
103 |
|
104 | // Generate and cache the schema SDL/IDL string and ast obj (GraphQLSchema)
|
105 | this.ast
|
106 | }
|
107 |
|
108 | /**
|
109 | * The Schema String and Schema AST/GraphQLSchema JavaScript objects are
|
110 | * cached after being processed once. If there is a runtime need to rebuild
|
111 | * these objects, calling `clearCache()` will allow their next usage to
|
112 | * rebuild them dynamically.
|
113 | *
|
114 | * @method clearCache
|
115 | * @memberof GQLExpressMiddleware
|
116 | *
|
117 | * @return {GQLExpressMiddleware} returns this so that it can be inlined; ala
|
118 | * `gqlExpressMiddleware.clearCache().ast`, for example
|
119 | */
|
120 | clearCache(): GQLExpressMiddleware {
|
121 | this.cache.clear()
|
122 | return this
|
123 | }
|
124 |
|
125 | /**
|
126 | * The schema property returns the textual Schema as it is generated based
|
127 | * on the various Lattice types, interfaces and enums defined in your
|
128 | * project. The ast property returns the JavaScript AST represenatation of
|
129 | * that schema with all injected modificiations detailed in your classes.
|
130 | */
|
131 | get ast(): GraphQLSchema {
|
132 | let cached: ?GraphQLSchema = this.cache.get('ast')
|
133 |
|
134 | if (cached) {
|
135 | return cached
|
136 | }
|
137 |
|
138 | let ast: GraphQLSchema = buildSchema(this.schema)
|
139 |
|
140 | SchemaUtils.injectAll(ast, this.handlers);
|
141 |
|
142 | this.cache.set('ast', ast)
|
143 |
|
144 | return ast;
|
145 | }
|
146 |
|
147 | /**
|
148 | * Generates the textual schema based on the registered `GQLBase` handlers
|
149 | * this instance represents.
|
150 | *
|
151 | * @method GQLExpressMiddleware#⬇︎⠀schema
|
152 | * @since 2.7.0
|
153 | *
|
154 | * @return {string} a generated schema string based on the handlers that
|
155 | * are registered with this `GQLExpressMiddleware` instance.
|
156 | */
|
157 | get schema(): string {
|
158 | let cached = this.cache.get('schema')
|
159 | let schema
|
160 |
|
161 | if (cached) return cached
|
162 |
|
163 | schema = SchemaUtils.generateSchemaSDL(this.handlers);
|
164 | this.cache.set('schema', schema)
|
165 |
|
166 | return schema
|
167 | }
|
168 |
|
169 | async rootValue(
|
170 | requestData: Object,
|
171 | separateByType: boolean = false
|
172 | ): Object {
|
173 | let root = await SchemaUtils.createMergedRoot(
|
174 | this.handlers, requestData, separateByType
|
175 | )
|
176 |
|
177 | return root;
|
178 | }
|
179 |
|
180 | /**
|
181 | * Using the express-graphql module, it returns an Express 4.x middleware
|
182 | * function.
|
183 | *
|
184 | * @instance
|
185 | * @memberof GQLExpressMiddleware
|
186 | * @method ⬇︎⠀middleware
|
187 | *
|
188 | * @return {Function} a function that expects request, response and next
|
189 | * parameters as all Express middleware functions.
|
190 | */
|
191 | get middleware(): Function {
|
192 | return this.customMiddleware();
|
193 | }
|
194 |
|
195 | /**
|
196 | * Using the express-graphql module, it returns an Express 4.x middleware
|
197 | * function. This version however, has graphiql disabled. Otherwise it is
|
198 | * identical to the `middleware` property
|
199 | *
|
200 | * @instance
|
201 | * @memberof GQLExpressMiddleware
|
202 | * @method ⬇︎⠀middlewareWithoutGraphiQL
|
203 | *
|
204 | * @return {Function} a function that expects request, response and next
|
205 | * parameters as all Express middleware functions.
|
206 | */
|
207 | get middlewareWithoutGraphiQL(): Function {
|
208 | return this.customMiddleware({graphiql: false});
|
209 | }
|
210 |
|
211 | /**
|
212 | * In order to ensure that Lattice functions receive the request data,
|
213 | * it is important to use the options function feature of both
|
214 | * `express-graphql` and `apollo-server-express`. This function will create
|
215 | * an options function that reflects that schema and Lattice types defined
|
216 | * in your project.
|
217 | *
|
218 | * Should you need to tailor the response before it is sent out, you may
|
219 | * supply a function as a second parameter that takes two parameters and
|
220 | * returns an options object. The patchFn callback signature looks like this
|
221 | *
|
222 | * ```patchFn(options, {req, res, next|gql})```
|
223 | *
|
224 | * When using the reference implementation, additional graphql request info
|
225 | * can be obtained in lieu of the `next()` function so typically found in
|
226 | * Express middleware. Apollo Server simply provides the next function in
|
227 | * this location.
|
228 | *
|
229 | * @param {Object} options any options, to either engine, that make the most
|
230 | * sense
|
231 | * @param {Function} patchFn see above
|
232 | */
|
233 | generateOptions(
|
234 | options: Object = { graphiql: true },
|
235 | patchFn: ?Function = null
|
236 | ): Function {
|
237 | const optsFn = async (req: mixed, res: mixed, gql: mixed) => {
|
238 | let schema = this.ast;
|
239 | let opts = {
|
240 | schema,
|
241 | rootValue: await this.rootValue({req, res, gql}),
|
242 | formatError: error => ({
|
243 | message: error.message,
|
244 | locations: error.locations,
|
245 | stack: error.stack,
|
246 | path: error.path
|
247 | })
|
248 | }
|
249 |
|
250 | merge(opts, options);
|
251 | if (patchFn && typeof patchFn === 'function') {
|
252 | merge(
|
253 | opts,
|
254 | (patchFn.bind(this)(opts, {req, res, gql})) || opts
|
255 | );
|
256 | }
|
257 |
|
258 | return opts;
|
259 | }
|
260 |
|
261 | return optsFn
|
262 | }
|
263 |
|
264 | /**
|
265 | * In order to ensure that Lattice functions receive the request data,
|
266 | * it is important to use the options function feature of both
|
267 | * `express-graphql` and `apollo-server-express`. This function will create
|
268 | * an options function that reflects that schema and Lattice types defined
|
269 | * in your project.
|
270 | *
|
271 | * Should you need to tailor the response before it is sent out, you may
|
272 | * supply a function as a second parameter that takes two parameters and
|
273 | * returns an options object. The patchFn callback signature looks like this
|
274 | *
|
275 | * ```patchFn(options, {req, res, next|gql})```
|
276 | *
|
277 | * When using the reference implementation, additional graphql request info
|
278 | * can be obtained in lieu of the `next()` function so typically found in
|
279 | * Express middleware. Apollo Server simply provides the next function in
|
280 | * this location.
|
281 | *
|
282 | * @param {Object} options any options, to either engine, that make the most
|
283 | * sense
|
284 | * @param {Function} patchFn see above
|
285 | */
|
286 | generateApolloOptions(
|
287 | options: Object = {
|
288 | formatError: error => ({
|
289 | message: error.message,
|
290 | locations: error.locations,
|
291 | stack: error.stack,
|
292 | path: error.path
|
293 | }),
|
294 | debug: true
|
295 | },
|
296 | patchFn: ?Function = null
|
297 | ): Function {
|
298 | const optsFn = async (req: mixed, res: mixed) => {
|
299 | let opts = {
|
300 | schema: this.ast,
|
301 | resolvers: await this.rootValue({req, res}, true)
|
302 | }
|
303 |
|
304 | opts.schema = makeExecutableSchema({
|
305 | typeDefs: [this.schema],
|
306 | resolvers: opts.resolvers
|
307 | })
|
308 |
|
309 | SchemaUtils.injectAll(opts.schema, this.handlers);
|
310 |
|
311 | merge(opts, options);
|
312 | if (patchFn && typeof patchFn === 'function') {
|
313 | merge(
|
314 | opts,
|
315 | (patchFn.bind(this)(opts, {req, res})) || opts
|
316 | );
|
317 | }
|
318 |
|
319 | return opts;
|
320 | }
|
321 |
|
322 | return optsFn
|
323 | }
|
324 |
|
325 | apolloMiddleware(
|
326 | apolloFn: Function,
|
327 | apolloOpts: Object = {},
|
328 | patchFn: ?Function = null
|
329 | ): Array<Function> {
|
330 | let opts = this.generateApolloOptions(apolloOpts, patchFn)
|
331 |
|
332 | return [
|
333 | bodyParser.json(),
|
334 | bodyParser.text({ type: 'application/graphql' }),
|
335 | (req, res, next) => {
|
336 | if (req.is('application/graphql')) {
|
337 | req.body = { query: req.body };
|
338 | }
|
339 | next();
|
340 | },
|
341 | apolloFn(opts)
|
342 | ]
|
343 | }
|
344 |
|
345 | /**
|
346 | * If your needs require you to specify different values to `graphqlHTTP`,
|
347 | * part of the `express-graphql` package, you can use the `customMiddleware`
|
348 | * function to do so.
|
349 | *
|
350 | * The first parameter is an object that should contain valid `graphqlHTTP`
|
351 | * options. See https://github.com/graphql/express-graphql#options for more
|
352 | * details. Validation is NOT performed.
|
353 | *
|
354 | * The second parameter is a function that will be called after any options
|
355 | * have been applied from the first parameter and the rest of the middleware
|
356 | * has been performed. This, if not modified, will be the final options
|
357 | * passed into `graphqlHTTP`. In your callback, it is expected that the
|
358 | * supplied object is to be modified and THEN RETURNED. Whatever is returned
|
359 | * will be used or passed on. If nothing is returned, the options supplied
|
360 | * to the function will be used instead.
|
361 | *
|
362 | * @method ⌾⠀customMiddleware
|
363 | * @memberof GQLExpressMiddleware
|
364 | * @instance
|
365 | *
|
366 | * @param {Object} [graphqlHttpOptions={graphiql: true}] standard set of
|
367 | * `express-graphql` options. See above.
|
368 | * @param {Function} patchFn see above
|
369 |
|
370 | * @return {Function} a middleware function compatible with Express
|
371 | */
|
372 | customMiddleware(
|
373 | graphqlHttpOptions: Object = {graphiql: true},
|
374 | patchFn?: Function
|
375 | ): Function {
|
376 | const optsFn = this.generateOptions(graphqlHttpOptions, patchFn)
|
377 | return graphqlHTTP(optsFn)
|
378 | }
|
379 |
|
380 | /**
|
381 | * An optional express middleware function that can be mounted to return
|
382 | * a copy of the generated schema string being used by GQLExpressMiddleware.
|
383 | *
|
384 | * @memberof GQLExpressMiddleware
|
385 | * @method schemaMiddleware
|
386 | * @instance
|
387 | *
|
388 | * @type {Function}
|
389 | */
|
390 | get schemaMiddleware(): Function {
|
391 | return (req: Object, res: Object, next: ?Function) => {
|
392 | res.status(200).send(this.schema);
|
393 | }
|
394 | }
|
395 |
|
396 | /**
|
397 | * An optional express middleware function that can be mounted to return
|
398 | * the JSON AST representation of the schema string being used by
|
399 | * GQLExpressMiddleware.
|
400 | *
|
401 | * @memberof GQLExpressMiddleware
|
402 | * @method astMiddleware
|
403 | * @instance
|
404 | *
|
405 | * @type {Function}
|
406 | */
|
407 | get astMiddleware(): Function {
|
408 | return (req: Object, res: Object, next: ?Function) => {
|
409 | res.status(200).send('Temporarily disabled in this version')
|
410 |
|
411 | // let cachedOutput = this.cache.get('astMiddlewareOutput')
|
412 | // if (cachedOutput) {
|
413 | // res
|
414 | // .status(302)
|
415 | // .set('Content-Type', 'application/json')
|
416 | // .send(cachedOutput)
|
417 | // }
|
418 | // else {
|
419 | // this.rootValue({req, res, next}, true)
|
420 | // .then(resolvers => {
|
421 | // let schema: GraphQLSchema = buildSchema(this.schema)
|
422 |
|
423 | // SchemaUtils.injectInterfaceResolvers(schema, this.handlers);
|
424 | // SchemaUtils.injectEnums(schema, this.handlers);
|
425 | // SchemaUtils.injectScalars(schema, this.handlers);
|
426 | // SchemaUtils.injectComments(schema, this.handlers);
|
427 |
|
428 | // function killToJSON(obj: any, path = 'obj.') {
|
429 | // for (let key in obj) {
|
430 | // try {
|
431 | // if (key == 'prev' || key == 'next' || key == 'ofType') continue;
|
432 |
|
433 | // if (key == 'toJSON') {
|
434 | // let success = delete obj.toJSON
|
435 | // //console.log(`Killing ${path}toJSON...${success ? 'success' : 'failure'}`)
|
436 | // continue
|
437 | // }
|
438 |
|
439 | // if (key == 'inspect') {
|
440 | // let success = delete obj.inspect
|
441 | // //console.log(`Killing ${path}inspect...${success ? 'success' : 'failure'}`)
|
442 | // continue
|
443 | // }
|
444 |
|
445 | // if (key == 'toString') {
|
446 | // obj.toString = Object.prototype.toString
|
447 | // //console.log(`Replacing ${path}toString with default`)
|
448 | // continue
|
449 | // }
|
450 |
|
451 | // if (typeof obj[key] == 'function') {
|
452 | // obj[key] = `[Function ${obj[key].name}]`
|
453 | // continue
|
454 | // }
|
455 |
|
456 | // if (typeof obj[key] == 'object') {
|
457 | // obj[key] = killToJSON(obj[key], `${path}${key}.`)
|
458 | // continue
|
459 | // }
|
460 | // }
|
461 | // catch (error) {
|
462 | // continue
|
463 | // }
|
464 | // }
|
465 |
|
466 | // return obj
|
467 | // }
|
468 |
|
469 | // // $FlowFixMe
|
470 | // schema = killToJSON(schema)
|
471 |
|
472 | // // Still do not know why/how they are preventing JSONifying the
|
473 | // // _typeMap keys. So aggravting
|
474 | // for (let typeKey of Object.keys(schema._typeMap)) {
|
475 | // let object = {}
|
476 |
|
477 | // // $FlowFixMe
|
478 | // for (let valKey of Object.keys(schema._typeMap[typeKey])) {
|
479 | // // $FlowFixMe
|
480 | // object[valKey] = schema._typeMap[typeKey][valKey]
|
481 | // }
|
482 |
|
483 | // // $FlowFixMe
|
484 | // schema._typeMap[typeKey] = object
|
485 | // }
|
486 |
|
487 | // let output = JSON.stringify(schema)
|
488 | // this.cache.delete('ast')
|
489 | // this.cache.set('astMiddlewareOutput', output)
|
490 |
|
491 | // res
|
492 | // .status(200)
|
493 | // .set('Content-Type', 'application/json')
|
494 | // .send(output)
|
495 | // })
|
496 | // .catch(error => {
|
497 | // console.error(error)
|
498 |
|
499 | // res
|
500 | // .status(500)
|
501 | // .json(error)
|
502 | // })
|
503 | // }
|
504 | }
|
505 | }
|
506 | }
|
507 |
|
508 | export default GQLExpressMiddleware;
|
509 | </code></pre>
|
510 | </article>
|
511 | </section>
|
512 |
|
513 |
|
514 |
|
515 |
|
516 | </div>
|
517 |
|
518 | <br class="clear">
|
519 |
|
520 | <footer>
|
521 | 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.
|
522 | </footer>
|
523 |
|
524 | <script>prettyPrint();</script>
|
525 | <script src="scripts/linenumber.js"></script>
|
526 | </body>
|
527 | </html>
|