UNPKG

39.9 kBHTMLView Raw
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 <!--[if lt IE 9]>
11 <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
12 <![endif]-->
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
44import {
45 GQLBase, MODEL_KEY, META_KEY, GETTERS, SETTERS, PROPS, AUTO_PROPS
46} from '../GQLBase'
47import { isArray, extendsFrom } from 'ne-types'
48import { inspect } from 'util'
49import { GraphQLEnumType, parse } from 'graphql'
50import { 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&lt;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 */
101function 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' &amp;&amp; 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' &amp;&amp; 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] &amp;&amp; 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 &amp;&amp; !meta.nullable &amp;&amp; !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&lt;String>}
250 */
251extractBits.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 */
269export const DirectTypeManager = {
270 /**
271 * A getter that retrieves the array of direct types
272 *
273 * @method DirectTypeManager#types
274 * @member {Array&lt;String>} types
275 *
276 * @return {Array&lt;String>} an array of class name strings.
277 */
278 get types(): Array&lt;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&lt;string>} an array of class name Strings that were removed
308 * when cleared.
309 */
310 clear(): Array&lt;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&lt;string>} an array of class name Strings that were removed
321 * during the reset process.
322 */
323 reset(): Array&lt;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 */
341export 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&lt;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 */
362export function applyTags(
363 Class:GQLBase,
364 addTags: Array&lt;string|Symbol>,
365 fieldName: string,
366 descriptor: Object
367) {
368 let tags = (Array.isArray(addTags) &amp;&amp; addTags || [])
369 .map(tag => typeof tag === 'string' &amp;&amp; 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&lt;String|Array&lt;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 */
393export function Getters(
394 ...propertyNames: Array&lt;String|Array&lt;String|Function>>
395): Function {
396 return function(target: mixed, addTags: Array&lt;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 &amp;&amp; (desc.get || typeof desc.value === 'function')
401 let tags = [GETTERS].concat(Array.isArray(addTags) &amp;&amp; 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&lt;String|Array&lt;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 */
438export function Setters(
439 ...propertyNames: Array&lt;String|Array&lt;String|Function>>
440): Function {
441 return function(target: mixed, addTags: Array&lt;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 &amp;&amp; (desc.get || typeof desc.value === 'function')
446 let tags = [SETTERS].concat(Array.isArray(addTags) &amp;&amp; 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&lt;String|Array&lt;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 */
485export function Properties(
486 ...propertyNames: Array&lt;String|Array&lt;String|Function>>
487): Function {
488 return function(target: mixed, addTags: Array&lt;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 &amp;&amp; (desc.get || typeof desc.value === 'function')
493 let tags = [PROPS].concat(Array.isArray(addTags) &amp;&amp; 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
515export 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>