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>decorators/ModelProperties.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">decorators/ModelProperties.js</h1>
|
33 |
|
34 |
|
35 |
|
36 |
|
37 |
|
38 |
|
39 |
|
40 | <section>
|
41 | <article>
|
42 | <pre class="prettyprint source linenums"><code>/** @namespace decorators */
|
43 |
|
44 | import {
|
45 | GQLBase, MODEL_KEY, META_KEY, GETTERS, SETTERS, PROPS, AUTO_PROPS
|
46 | } from '../GQLBase'
|
47 | import { isArray, extendsFrom } from 'ne-types'
|
48 | import { inspect } from 'util'
|
49 | import { GraphQLEnumType, parse } from 'graphql'
|
50 | import { SyntaxTree } from '../SyntaxTree'
|
51 |
|
52 | /**
|
53 | * For each of the decorators, Getters, Setters, and Properties, we take a
|
54 | * list of property names used to create the appropriate accessor types. In
|
55 | * some cases, however, the instance of GQLBase's data model may have a
|
56 | * different name. Finally if the return type for the getter should be wrapped
|
57 | * in a another GQLBase class type, we will need a way to specify those things
|
58 | * too.
|
59 | *
|
60 | * The `extractBits()` takes a single argument value from the decorator as it
|
61 | * parses them and converts it into an object, properly sorted, into values that
|
62 | * allow the above described behavior.
|
63 | *
|
64 | * Examples:
|
65 | *
|
66 | * ```
|
67 | * // Create a class with a name and age property that map directly to the
|
68 | * // underlying data model
|
69 | * @Getters('name', 'age')
|
70 | * class MyType extends GQLBase {...}
|
71 | *
|
72 | * // Create a class with a name property that maps to a different property
|
73 | * // name in the underlying data model
|
74 | * @Getters(['name', '_fake_name'])
|
75 | * class MyMockType extends GQLBase {...}
|
76 | *
|
77 | * // Create a class with an employee property that returns an Employee
|
78 | * @Getters(['employee', Employee])
|
79 | * class MyRoleType extends GQLBase {...}
|
80 | *
|
81 | * // Finally create a class with an employe property that returns an Employee
|
82 | * // with data under a different name in the underlying data model.
|
83 | * @Getters(['employee', '_worker', Employee])
|
84 | * class MyMockRoleType extends GQLBase {...}
|
85 | * ```
|
86 | *
|
87 | * @memberof decorators
|
88 | * @method ā¾ā extractBits
|
89 | * @since 2.5
|
90 | *
|
91 | * @param {String|Array<String|Function>} property name of a property, or list
|
92 | * of property names and a Class.
|
93 | * @return {Object} an object with the following format ```
|
94 | * {
|
95 | * fieldName: name of root instance property to create
|
96 | * modelName: name of its associated internal model property
|
97 | * typeClass: an optional class to wrap around the results in a getter
|
98 | * }
|
99 | * ```
|
100 | */
|
101 | function extractBits(property) {
|
102 | let array = isArray(property) ? property : [property, property, null]
|
103 | let reply;
|
104 |
|
105 | if (!property) {
|
106 | let error = new Error(
|
107 | 'Invalid property. Given\n %o',
|
108 | inspect(property, {depth: 2})
|
109 | );
|
110 |
|
111 | return {
|
112 | fieldName: 'anErrorOccurred',
|
113 | modelName: 'anErrorOccurred',
|
114 | typeClass: null,
|
115 | getterMaker: function() { return () => error },
|
116 | setterMaker: function() { return (v) => undefined }
|
117 | }
|
118 | }
|
119 |
|
120 | //
|
121 | if (array.length === 3) {
|
122 | reply = {
|
123 | fieldName: array[0],
|
124 | modelName: array[1],
|
125 | typeClass: typeof array[2] === 'function' && array[2] || null
|
126 | }
|
127 | }
|
128 |
|
129 | //
|
130 | else if (array.length === 2) {
|
131 | reply = {
|
132 | fieldName: array[0],
|
133 | modelName: typeof array[1] === 'string'
|
134 | ? array[1]
|
135 | : array[0],
|
136 | typeClass: typeof array[1] === 'function' && array[1] || null
|
137 | }
|
138 | }
|
139 |
|
140 | //
|
141 | else {
|
142 | reply = {
|
143 | fieldName: array[0],
|
144 | modelName: array[0],
|
145 | typeClass: array[0]
|
146 | }
|
147 | }
|
148 |
|
149 | reply.getterMaker = function() {
|
150 | let { modelName, fieldName, typeClass } = reply;
|
151 |
|
152 | return function() {
|
153 | const thisClass = this.constructor
|
154 | const model = this[MODEL_KEY] || null
|
155 | let val
|
156 |
|
157 | if (!extendsFrom(thisClass, GQLBase)) {
|
158 | console.error(`${thisClass.name} is not derived from GQLBase`);
|
159 | return undefined
|
160 | }
|
161 |
|
162 | if (!thisClass.SCHEMA) {
|
163 | throw new Error(`
|
164 | All GQLBase extended classes should have a defined SCHEMA. Please
|
165 | manually define a static get SCHEMA() in your class or use the
|
166 | @Schema() decorator to do so.
|
167 | `)
|
168 | }
|
169 |
|
170 | if (typeClass) {
|
171 | // If the value of the model is already the type of class we expect
|
172 | // we do not need to do any processing and we can just grab it and
|
173 | // go.
|
174 | if (model[modelName] && extendsFrom(model[modelName], typeClass)) {
|
175 | val = model[modelName]
|
176 | }
|
177 |
|
178 | // Otherwise we need to return an instance of the determined typeClass
|
179 | // and pass that back instead; as requested.
|
180 | else {
|
181 | const results = SyntaxTree.findField(
|
182 | parse(this.constructor.SCHEMA),
|
183 | this.constructor.name,
|
184 | modelName
|
185 | )
|
186 | const { meta } = results || { meta: null };
|
187 |
|
188 | let args = [model[modelName], this.requestData];
|
189 |
|
190 | if (meta && !meta.nullable && !model) {
|
191 | throw new Error(`
|
192 | Using @Getters or @Properties decorators with a null or
|
193 | undefined model when the schema states that this field
|
194 | cannot be null.
|
195 |
|
196 | Type : ${typeClass.name}
|
197 | Field (AST data)
|
198 | name : ${meta.name}
|
199 | type : ${meta.type}
|
200 | nullable: ${meta.nullable}
|
201 | [getter] : ${fieldName}
|
202 | [maps to] : ${modelName}
|
203 | [model ] : ${model}
|
204 | `)
|
205 | }
|
206 |
|
207 | // If the following is true, it means that despite allowing nulls
|
208 | // for this field in the schema, we do have a valid model and should
|
209 | // proceed.
|
210 | if (model) {
|
211 | if (extractBits.DIRECT_TYPES.includes(typeClass.name)) {
|
212 | val = typeClass(...args)
|
213 | }
|
214 | else {
|
215 | val = new typeClass(...args)
|
216 | }
|
217 |
|
218 | if (typeClass.GQL_TYPE === GraphQLEnumType) { return val.value; }
|
219 | }
|
220 | }
|
221 | }
|
222 | else {
|
223 | val = model[modelName];
|
224 | }
|
225 |
|
226 | if (val === 'undefined' || val === undefined) {
|
227 | val = null;
|
228 | }
|
229 |
|
230 | return val;
|
231 | }
|
232 | }
|
233 |
|
234 | reply.setterMaker = function() {
|
235 | let { modelName } = reply;
|
236 | return function (value) {
|
237 | this[MODEL_KEY][modelName] = value;
|
238 | }
|
239 | }
|
240 |
|
241 | return reply;
|
242 | }
|
243 |
|
244 | /**
|
245 | * An array of proper class names that are used to test for cases where the
|
246 | * proper usage of instantiating an instance should preclude the use of `new`
|
247 | *
|
248 | * @memberof decorators
|
249 | * @type {Array<String>}
|
250 | */
|
251 | extractBits.DIRECT_TYPES = [
|
252 | String.name
|
253 | ];
|
254 |
|
255 | /**
|
256 | * A small suite of functions a getter that allows easy manipulation of the
|
257 | * the DIRECT_TYPES workaround needed for some types of complex class
|
258 | * wrapping allowed by the @Getters and @Properties decorators. Namely the
|
259 | * ability to do something like @Getters('name', String) which would wrap the
|
260 | * contents of whatever is in the objects model in a String call.
|
261 | *
|
262 | * Direct types are those that need to be called without `new` in order for the
|
263 | * desired behavior to present itself.
|
264 | *
|
265 | * @memberof decorators
|
266 | * @type {Object}
|
267 | * @since 2.7.0
|
268 | */
|
269 | export const DirectTypeManager = {
|
270 | /**
|
271 | * A getter that retrieves the array of direct types
|
272 | *
|
273 | * @method DirectTypeManager#types
|
274 | * @member {Array<String>} types
|
275 | *
|
276 | * @return {Array<String>} an array of class name strings.
|
277 | */
|
278 | get types(): Array<String> {
|
279 | return extractBits.DIRECT_TYPES
|
280 | },
|
281 |
|
282 | /**
|
283 | * Appends the supplied class name to the list of registered direct types. If
|
284 | * a class or function is passed, rather than a String,
|
285 | *
|
286 | * @method DirectTypeManager#types
|
287 | *
|
288 | * @param {Function|string|RegExp} className the name of the class to append.
|
289 | * Typically it is best to pass the name property of the class in question
|
290 | * such as `RegExp.name` or `MyClass.name`.
|
291 | */
|
292 | add(className: string | RegExp | Function): void {
|
293 | if (typeof className === 'function') {
|
294 | className = className.name
|
295 | }
|
296 |
|
297 | extractBits.DIRECT_TYPES.push(className);
|
298 | },
|
299 |
|
300 | /**
|
301 | * Foricbly empties the contents of the extractBits.DIRECT_TYPES array. This
|
302 | * is not recommended as it can have unintended consequences. It is
|
303 | * recommended to use `reset` instead
|
304 | *
|
305 | * @method DirectTypeManager#clear
|
306 | *
|
307 | * @return {Array<string>} an array of class name Strings that were removed
|
308 | * when cleared.
|
309 | */
|
310 | clear(): Array<string> {
|
311 | return extractBits.DIRECT_TYPES.splice(0, extractBits.DIRECT_TYPES.length)
|
312 | },
|
313 |
|
314 | /**
|
315 | * The recommended way to reset the DIRECT_TYPES list. This removes all
|
316 | * changed values, returns the removed bits, and adds back in the defaults.
|
317 | *
|
318 | * @method DirectTypeManager#reset
|
319 | *
|
320 | * @return {Array<string>} an array of class name Strings that were removed
|
321 | * during the reset process.
|
322 | */
|
323 | reset(): Array<string> {
|
324 | return extractBits.DIRECT_TYPES.splice(
|
325 | 0,
|
326 | extractBits.DIRECT_TYPES.length,
|
327 | String.name
|
328 | )
|
329 | }
|
330 | }
|
331 |
|
332 | /**
|
333 | * This decorator allows you to add a Class method to the DirectTypeManager
|
334 | * as a function that should not be invoked with the `new` keyword. For all
|
335 | * intents and purposes the function should be declared `static`.
|
336 | *
|
337 | * @method DirectTypeAdd
|
338 | * @param {Function} target [description]
|
339 | * @constructor
|
340 | */
|
341 | export function DirectTypeAdd(target) {
|
342 | DirectTypeManager.add(target);
|
343 | return target;
|
344 | }
|
345 |
|
346 | /**
|
347 | * When applying multiple property getters and setters, knowing some info
|
348 | * about what was applied elsewhere can be important. "Tags" can be applied
|
349 | * that store the fieldName and descriptor applied via one of these decorators.
|
350 | *
|
351 | * Multiple "tags" are supported to allow for detecting the difference between
|
352 | * decorators applied by the developer using lattice and something auto
|
353 | * generated such as auto-props.
|
354 | *
|
355 | * @param {GQLBase} Class an instance of GQLBase to apply the tags tp
|
356 | * @param {Array<string|Symbol>} addTags an array of Symbols or strings to be
|
357 | * wrapped in Symbols that will be used as tag keys
|
358 | * @param {string} fieldName the name of the field being decorated
|
359 | * @param {Object} descriptor the JavaScript descriptor object to associate
|
360 | * with this tagged field.
|
361 | */
|
362 | export function applyTags(
|
363 | Class:GQLBase,
|
364 | addTags: Array<string|Symbol>,
|
365 | fieldName: string,
|
366 | descriptor: Object
|
367 | ) {
|
368 | let tags = (Array.isArray(addTags) && addTags || [])
|
369 | .map(tag => typeof tag === 'string' && Symbol.for(tag) || tag)
|
370 | .filter(tag => typeof tag === 'symbol')
|
371 |
|
372 | tags.forEach(tag => {
|
373 | Class[META_KEY][tag] = Class[META_KEY][tag] || {}
|
374 | Class[META_KEY][tag][fieldName] = descriptor
|
375 | })
|
376 | }
|
377 |
|
378 | /**
|
379 | * When working with `GQLBase` instances that expose properties
|
380 | * that have a 1:1 mapping to their own model property of the
|
381 | * same name, adding the getters manually can be annoying. This
|
382 | * takes an indeterminate amount of strings representing the
|
383 | * properties for which getters should be injected.
|
384 | *
|
385 | * @function š·ā Getters
|
386 | * @memberof! decorators
|
387 | *
|
388 | * @param {Array<String|Array<String>>} propertyNames if the model has 'name'
|
389 | * and 'age' as properties, then passing those two strings will result
|
390 | * in getters that surface those properties as GraphQL fields.
|
391 | * @return {Function} a class decorator method.s
|
392 | */
|
393 | export function Getters(
|
394 | ...propertyNames: Array<String|Array<String|Function>>
|
395 | ): Function {
|
396 | return function(target: mixed, addTags: Array<string|Symbol> = []): mixed {
|
397 | for (let property of propertyNames) {
|
398 | let { fieldName, getterMaker } = extractBits(property);
|
399 | let desc = Object.getOwnPropertyDescriptor(target.prototype, fieldName)
|
400 | let hasImpl = desc && (desc.get || typeof desc.value === 'function')
|
401 | let tags = [GETTERS].concat(Array.isArray(addTags) && addTags || [])
|
402 |
|
403 | if (!hasImpl) {
|
404 | let descriptor = {
|
405 | get: getterMaker()
|
406 | }
|
407 |
|
408 | applyTags(target, tags, fieldName, descriptor)
|
409 | Object.defineProperty(target.prototype, fieldName, descriptor);
|
410 | }
|
411 | else {
|
412 | console.warn(
|
413 | `Skipping getter for ${target.name}.${fieldName}; already exists`
|
414 | )
|
415 | }
|
416 | }
|
417 |
|
418 | return target;
|
419 | }
|
420 | }
|
421 |
|
422 | /**
|
423 | * When working with `GQLBase` instances that expose properties
|
424 | * that have a 1:1 mapping to their own model property of the
|
425 | * same name, adding the setters manually can be annoying. This
|
426 | * takes an indeterminate amount of strings representing the
|
427 | * properties for which setters should be injected.
|
428 | *
|
429 | * @function š·ā Setters
|
430 | * @memberof! decorators
|
431 | * @since 2.1.0
|
432 | *
|
433 | * @param {Array<String|Array<String>>} propertyNames if the model has
|
434 | * 'name' and 'age' as properties, then passing those two strings will
|
435 | * result in setters that surface those properties as GraphQL fields.
|
436 | * @return {Function} a class decorator method
|
437 | */
|
438 | export function Setters(
|
439 | ...propertyNames: Array<String|Array<String|Function>>
|
440 | ): Function {
|
441 | return function(target: mixed, addTags: Array<String|Symbol> = []): mixed {
|
442 | for (let property of propertyNames) {
|
443 | let { fieldName, setterMaker } = extractBits(property);
|
444 | let desc = Object.getOwnPropertyDescriptor(target.prototype, fieldName)
|
445 | let hasImpl = desc && (desc.get || typeof desc.value === 'function')
|
446 | let tags = [SETTERS].concat(Array.isArray(addTags) && addTags || [])
|
447 |
|
448 | if (!hasImpl) {
|
449 | let descriptor = {
|
450 | set: setterMaker()
|
451 | }
|
452 |
|
453 | applyTags(target, tags, fieldName, descriptor)
|
454 | Object.defineProperty(target.prototype, fieldName, descriptor);
|
455 | }
|
456 | else {
|
457 | console.warn(
|
458 | `Skipping setter for ${target.name}.${fieldName}; already exists`
|
459 | )
|
460 | }
|
461 | }
|
462 |
|
463 | return target;
|
464 | }
|
465 | }
|
466 |
|
467 | /**
|
468 | * When working with `GQLBase` instances that expose properties
|
469 | * that have a 1:1 mapping to their own model property of the
|
470 | * same name, adding the getters manually can be annoying. This
|
471 | * takes an indeterminate amount of strings representing the
|
472 | * properties for which getters should be injected.
|
473 | *
|
474 | * This method creates both getters and setters
|
475 | *
|
476 | * @function š·ā Properties
|
477 | * @memberof! decorators
|
478 | * @since 2.1.0
|
479 | *
|
480 | * @param {Array<String|Array<String>>} propertyNames if the model has 'name'
|
481 | * and 'age' as properties, then passing those two strings will result
|
482 | * in getters and setters that surface those properties as GraphQL fields.
|
483 | * @return {Function} a class decorator method
|
484 | */
|
485 | export function Properties(
|
486 | ...propertyNames: Array<String|Array<String|Function>>
|
487 | ): Function {
|
488 | return function(target: mixed, addTags: Array<String|Symbol> = []): mixed {
|
489 | for (let property of propertyNames) {
|
490 | let {fieldName, getterMaker, setterMaker } = extractBits(property);
|
491 | let desc = Object.getOwnPropertyDescriptor(target.prototype, fieldName)
|
492 | let hasImpl = desc && (desc.get || typeof desc.value === 'function')
|
493 | let tags = [PROPS].concat(Array.isArray(addTags) && addTags || [])
|
494 |
|
495 | if (!hasImpl) {
|
496 | let descriptor = {
|
497 | set: setterMaker(),
|
498 | get: getterMaker()
|
499 | }
|
500 |
|
501 | applyTags(target, tags, fieldName, descriptor)
|
502 | Object.defineProperty(target.prototype, fieldName, descriptor);
|
503 | }
|
504 | else {
|
505 | console.warn(
|
506 | `Skipping properties for ${target.name}.${fieldName}; already exists`
|
507 | )
|
508 | }
|
509 | }
|
510 |
|
511 | return target;
|
512 | }
|
513 | }
|
514 |
|
515 | export default Properties;
|
516 | </code></pre>
|
517 | </article>
|
518 | </section>
|
519 |
|
520 |
|
521 |
|
522 |
|
523 | </div>
|
524 |
|
525 | <br class="clear">
|
526 |
|
527 | <footer>
|
528 | 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.
|
529 | </footer>
|
530 |
|
531 | <script>prettyPrint();</script>
|
532 | <script src="scripts/linenumber.js"></script>
|
533 | </body>
|
534 | </html>
|