@nyteshade/lattice-legacy
Version:
OO Underpinnings for ease of GraphQL Implementation
590 lines (508 loc) • 40.8 kB
HTML
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<title>ModuleParser.js - Documentation</title>
<script src="scripts/prettify/prettify.js"></script>
<script src="scripts/prettify/lang-css.js"></script>
<!--[if lt IE 9]>
<script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<link type="text/css" rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
<link type="text/css" rel="stylesheet" href="styles/prettify-tomorrow.css">
<link type="text/css" rel="stylesheet" href="styles/jsdoc-default.css">
</head>
<body>
<input type="checkbox" id="nav-trigger" class="nav-trigger" />
<label for="nav-trigger" class="navicon-button x">
<div class="navicon"></div>
</label>
<label for="nav-trigger" class="overlay"></label>
<nav>
<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>
</nav>
<div id="main">
<h1 class="page-title">ModuleParser.js</h1>
<section>
<article>
<pre class="prettyprint source linenums"><code>// @flow
import fs, { readdirSync, statSync } from 'fs'
import path from 'path'
import * as types from 'ne-types'
import { GQLBase } from './GQLBase'
import { GQLJSON } from './types/GQLJSON'
import { merge } from 'lodash'
import {
promisify,
Deferred,
getLatticePrefs,
LatticeLogs as ll
} from './utils'
// Promisify some bits
const readdirAsync = promisify(fs.readdir)
const statAsync = promisify(fs.stat)
// Fetch some type checking bits from 'types'
const {
typeOf,
isString,
isOfType,
isPrimitive,
isArray,
isObject,
extendsFrom
} = types;
/**
* The ModuleParser is a utility class designed to loop through and iterate
* on a directory and pull out of each .js file found, any classes or exports
* that extend from GQLBase or a child of GQLBase.
*
* @class ModuleParser
* @since 2.7.0
*/
export class ModuleParser {
/**
* An internal array of `GQLBase` extended classes found during either a
* `parse()` or `parseSync()` call.
*
* @memberof ModuleParser
* @type {Array<GQLBase>}
*/
classes: Array<GQLBase>;
/**
* An array of strings holding loose GraphQL schema documents.
*
* @memberof ModuleParser
* @type {Array<string>}
*/
looseGraphQL: Array<string> = [];
/**
* A map of skipped items on the last pass and the associated error that
* accompanies it.
*/
skipped: Map<string, Error>;
/**
* A string denoting the directory on disk where `ModuleParser` should be
* searching for its classes.
*
* @memberof ModuleParser
* @type {string}
*/
directory: string;
/**
* A boolean value denoting whether or not the `ModuleParser` instance is
* valid; i.e. the directory it points to actually exists and is a directory
*
* @type {boolean}
*/
valid: boolean;
/**
* An object, optionally added during construction, that specifies some
* configuration about the ModuleParser and how it should do its job.
*
* Initially, the
*
* @type {Object}
*/
options: Object = {};
/**
* The constructor
*
* @constructor
* @method ⎆⠀constructor
* @memberof ModuleParser
* @inner
*
* @param {string} directory a string path to a directory containing the
* various GQLBase extended classes that should be gathered.
*/
constructor(directory: string, options: Object = {addLatticeTypes: true}) {
this.directory = path.resolve(directory);
this.classes = [];
this.skipped = new Map();
merge(this.options, options);
try {
this.valid = fs.statSync(directory).isDirectory();
}
catch (error) {
this.valid = false;
}
}
/**
* Given a file path, this method will attempt to import/require the
* file in question and return the object it exported; whatever that
* may be.
*
* @method ModuleParser#⌾⠀importClass
* @since 2.7.0
*
* @param {string} filePath a path to pass to `require()`
*
* @return {Object} the object, or undefined, that was returned when
* it was `require()`'ed.
*/
importClass(filePath: string): Object {
let moduleContents: Object = {};
let yellow: string = '\x1b[33m'
let clear: string = '\x1b[0m'
try {
moduleContents = require(filePath)
}
catch(ignore) {
if (/\.graphql/i.test(path.extname(filePath))) {
ll.log(`Ingesting .graphql file ${filePath}`)
let buffer = fs.readFileSync(filePath)
this.looseGraphQL.push(fs.readFileSync(filePath).toString())
}
else {
ll.log(`${yellow}Skipping${clear} ${filePath}`)
ll.trace(ignore)
this.skipped.set(filePath, ignore)
}
}
return moduleContents;
}
/**
* Given an object, typically the result of a `require()` or `import`
* command, iterate over its contents and find any `GQLBase` derived
* exports. Continually, and recursively, build this list of classes out
* so that we can add them to a `GQLExpressMiddleware`.
*
* @method ModuleParser#⌾⠀findGQLBaseClasses
* @since 2.7.0
*
* @param {Object} contents the object to parse for properties extending
* from `GQLBase`
* @param {Array<GQLBase>} gqlDefinitions the results, allowed as a second
* parameter during recursion as a means to save state between calls
* @return {Set<mixed>} a unique set of values that are currently being
* iterated over. Passed in as a third parameter to save state between calls
* during recursion.
*/
findGQLBaseClasses(
contents: Object,
gqlDefinitions?: Array<GQLBase> = [],
stack?: Set<GQLBase> = new Set()
): Array<GQLBase> {
// In order to prevent infinite object recursion, we should add the
// object being iterated over to our Set. At each new recursive level
// add the item being iterated over to the set and only recurse into
// if the item does not already exist in the stack itself.
stack.add(contents)
for (let key in contents) {
let value = contents[key];
if (isPrimitive(value)) { continue }
if (extendsFrom(value, GQLBase)) {
gqlDefinitions.push(value)
}
if ((isObject(value) || isArray(value)) && !stack.has(value)) {
gqlDefinitions = this.findGQLBaseClasses(value, gqlDefinitions, stack);
}
}
// We remove the current iterable from our set as we leave this current
// recursive iteration.
stack.delete(contents)
return gqlDefinitions
}
/**
* This method takes a instance of ModuleParser, initialized with a directory,
* and walks its contents, importing files as they are found, and sorting
* any exports that extend from GQLBase into an array of such classes
* in a resolved promise.
*
* @method ModuleParser#⌾⠀parse
* @async
* @since 2.7.0
*
* @return {Promise<Array<GQLBase>>} an array GQLBase classes, or an empty
* array if none could be identified.
*/
async parse(): Promise<Array<GQLBase>> {
let modules
let files
let set = new Set();
let opts = getLatticePrefs()
if (!this.valid) {
throw new Error(`
ModuleParser instance is invalid for use with ${this.directory}.
The path is either a non-existent path or it does not represent a
directory.
`)
}
this.skipped.clear()
// @ComputedType
files = await this.constructor.walk(this.directory)
modules = files.map(file => this.importClass(file))
// @ComputedType
(modules
.map(mod => this.findGQLBaseClasses(mod))
.reduce((last, cur) => (last || []).concat(cur || []), [])
.forEach(Class => set.add(Class)))
// Convert the set back into an array
this.classes = Array.from(set);
// We can ignore equality since we came from a set; @ComputedType
this.classes.sort((l,r) => l.name < r.name ? -1 : 1)
// Add in any GraphQL Lattice types requested
if (this.options.addLatticeTypes) {
this.classes.push(GQLJSON)
}
// Stop flow and throw an error if some files failed to load and settings
// declare we should do so. After Lattice 3.x we should expect this to be
// the new default
if (opts.ModuleParser.failOnError && this.skipped.size) {
this.printSkipped()
throw new Error('Some files skipped due to errors')
}
return this.classes;
}
/**
* This method takes a instance of ModuleParser, initialized with a directory,
* and walks its contents, importing files as they are found, and sorting
* any exports that extend from GQLBase into an array of such classes
*
* @method ModuleParser#⌾⠀parseSync
* @async
* @since 2.7.0
*
* @return {Array<GQLBase>} an array GQLBase classes, or an empty
* array if none could be identified.
*/
parseSync(): Array<GQLBase> {
let modules: Array<Object>;
let files: Array<string>;
let set = new Set();
let opts = getLatticePrefs()
if (!this.valid) {
throw new Error(`
ModuleParser instance is invalid for use with ${this.directory}.
The path is either a non-existent path or it does not represent a
directory.
`)
}
this.skipped.clear()
files = this.constructor.walkSync(this.directory)
modules = files.map(file => {
return this.importClass(file)
})
modules
.map(mod => this.findGQLBaseClasses(mod))
.reduce((last, cur) => (last || []).concat(cur || []), [])
.forEach(Class => set.add(Class))
// Convert the set back into an array
this.classes = Array.from(set);
// We can ignore equality since we came from a set; @ComputedType
this.classes.sort((l,r) => l.name < r.name ? -1 : 1)
// Add in any GraphQL Lattice types requested
if (this.options.addLatticeTypes) {
this.classes.push(GQLJSON)
}
// Stop flow and throw an error if some files failed to load and settings
// declare we should do so. After Lattice 3.x we should expect this to be
// the new default
if (opts.ModuleParser.failOnError && this.skipped.size) {
this.printSkipped()
throw new Error('Some files skipped due to errors')
}
return this.classes;
}
/**
* Prints the list of skipped files, their stack traces, and the errors
* denoting the reasons the files were skipped.
*/
printSkipped() {
if (this.skipped.size) {
ll.outWrite('\x1b[1;91m')
ll.outWrite('Skipped\x1b[0;31m the following files\n')
for (let [key, value] of this.skipped) {
ll.log(`${path.basename(key)}: ${value.message}`)
if (value.stack)
ll.log(value.stack.replace(/(^)/m, '$1 '))
}
ll.outWrite('\x1b[0m')
}
else {
ll.log('\x1b[1;32mNo files skipped\x1b[0m')
}
}
/**
* Returns the `constructor` name. If invoked as the context, or `this`,
* object of the `toString` method of `Object`'s `prototype`, the resulting
* value will be `[object MyClass]`, given an instance of `MyClass`
*
* @method ⌾⠀[Symbol.toStringTag]
* @memberof ModuleParser
*
* @return {string} the name of the class this is an instance of
* @ComputedType
*/
get [Symbol.toStringTag]() { return this.constructor.name }
/**
* Applies the same logic as {@link #[Symbol.toStringTag]} but on a static
* scale. So, if you perform `Object.prototype.toString.call(MyClass)`
* the result would be `[object MyClass]`.
*
* @method ⌾⠀[Symbol.toStringTag]
* @memberof ModuleParser
* @static
*
* @return {string} the name of this class
* @ComputedType
*/
static get [Symbol.toStringTag]() { return this.name }
/**
* Recursively walks a directory and returns an array of asbolute file paths
* to the files under the specified directory.
*
* @method ModuleParser~⌾⠀walk
* @async
* @since 2.7.0
*
* @param {string} dir string path to the top level directory to parse
* @param {Array<string>} filelist an array of existing absolute file paths,
* or if not parameter is supplied a default empty array will be used.
* @return {Promise<Array<string>>} an array of existing absolute file paths
* found under the supplied `dir` directory.
*/
static async walk(
dir: string,
filelist: Array<string> = [],
extensions: Array<string> = ['.js', '.jsx', '.ts', '.tsx']
): Promise<Array<string>> {
let files = await readdirAsync(dir);
let exts = ModuleParser.checkForPackageExtensions() || extensions
let pattern = ModuleParser.arrayToPattern(exts)
let stats
files = files.map(file => path.resolve(path.join(dir, file)))
for (let file of files) {
stats = await statAsync(file)
if (stats.isDirectory()) {
filelist = await this.walk(file, filelist)
}
else {
if (pattern.test(path.extname(file)))
filelist = filelist.concat(file);
}
}
return filelist;
}
/**
* Recursively walks a directory and returns an array of asbolute file paths
* to the files under the specified directory. This version does this in a
* synchronous fashion.
*
* @method ModuleParser~⌾⠀walkSync
* @async
* @since 2.7.0
*
* @param {string} dir string path to the top level directory to parse
* @param {Array<string>} filelist an array of existing absolute file paths,
* or if not parameter is supplied a default empty array will be used.
* @return {Array<string>} an array of existing absolute file paths found
* under the supplied `dir` directory.
*/
static walkSync(
dir: string,
filelist: Array<string> = [],
extensions: Array<string> = ['.js', '.jsx', '.ts', '.tsx']
): Array<string> {
let files = readdirSync(dir)
let exts = ModuleParser.checkForPackageExtensions() || extensions
let pattern = ModuleParser.arrayToPattern(exts)
let stats
files = files.map(file => path.resolve(path.join(dir, file)))
for (let file of files) {
stats = statSync(file)
if (stats.isDirectory()) {
filelist = this.walkSync(file, filelist)
}
else {
if (pattern.test(path.extname(file)))
filelist = filelist.concat(file);
}
}
return filelist;
}
/**
* The ModuleParser should only parse files that match the default or
* supplied file extensions. The default list contains .js, .jsx, .ts
* and .tsx; so JavaScript or TypeScript files and their JSX React
* counterparts
*
* Since the list is customizable for a usage, however, it makes sense
* to have a function that will match what is supplied rather than
* creating a constant expression to use instead.
*
* @static
* @memberof ModuleParser
* @function ⌾⠀arrayToPattern
* @since 2.13.0
*
* @param {Array<string>} extensions an array of extensions to
* convert to a regular expression that would pass for each
* @param {string} flags the value passed to a new RegExp denoting the
* flags used in the pattern; defaults to 'i' for case insensitivity
* @return {RegExp} a regular expression object matching the contents
* of the array of extensions or the default extensions and that will
* also match those values in a case insensitive manner
*/
static arrayToPattern(
extensions: Array<string> = ['.js', '.jsx', '.ts', '.tsx'],
flags: string = 'i'
) {
return new RegExp(
extensions
.join('|')
.replace(/\./g, '\\.')
.replace(/([\|$])/g, '\\b$1'),
flags
)
}
/**
* Using the module `read-pkg-up`, finds the nearest package.json file
* and checks to see if it has a `.lattice.moduleParser.extensions'
* preference. If so, if the value is an array, that value is used,
* otherwise the value is wrapped in an array. If the optional parameter
* `toString` is `true` then `.toString()` will be invoked on any non
* Array values found; this behavior is the default
*
* @static
* @memberof ModuleParser
* @method ⌾⠀checkForPackageExtensions
* @since 2.13.0
*
* @param {boolean} toString true if any non-array values should have
* their `.toString()` method invoked before being wrapped in an Array;
* defaults to true
* @return {?Array<string>} null if no value is set for the property
* `lattice.ModuleParser.extensions` in `package.json` or the value
* of the setting if it is an array. Finally if the value is set but is
* not an array, the specified value wrapped in an array is returned
*/
static checkForPackageExtensions(toString: boolean = true): ?Array<string> {
let pkg = getLatticePrefs()
let extensions = null
if (pkg.ModuleParser && pkg.ModuleParser.extensions) {
let packageExts = pkg.ModuleParser.extensions
if (Array.isArray(packageExts)) {
extensions = packageExts
}
else {
extensions = [toString ? packageExts.toString() : packageExts]
}
}
return extensions
}
}
export default ModuleParser;
</code></pre>
</article>
</section>
</div>
<br class="clear">
<footer>
Generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.5.5</a> on Sat Feb 17 2018 00:27:31 GMT-0800 (PST) using the Minami theme.
</footer>
<script>prettyPrint();</script>
<script src="scripts/linenumber.js"></script>
</body>
</html>