{
  "file": "lib/index.js",
  "content": "<pre class=\"language-javascript line-numbers\"><code class=\"language-javascript}\"><span aria-hidden=\"true\" role=\"presentation\" class=\"line-numbers-rows\"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></span><span class=\"token string\">'use strict'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> path <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'path'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> Y <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'yuidocjs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> decorateConfig <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./decorate-config'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> createDirs <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./create-dirs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> generateFountainheadData <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./generate-fountainhead-data'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\" spellcheck=\"true\">/**\n * Fountainhead documentation data generation lib entry. Configuration is set\n * through `fountainhead.js` file. (TODO: Add default configs to decorate-config)\n * class and link.\n *\n * The entry handles:\n * 1. Safe require of `package.json` &amp;&amp; `fountainhead.js` files for configs\n * 2. Decoration &amp;&amp; validation of project configs\n * 3. Generation of raw YUIDoc JSON through YUIDoc module directly\n * 4. Decoration of raw data in `generate-fountainhead-data` module.\n *\n * The primary module is the `generate-fountainhead-data` which handles all of\n * the decoration and file creation required for Fountainhead.\n * @class Index\n * @constructor\n * @uses decorateConfig\n * @uses createDirs\n * @uses generateFountainheadData\n * @param {object} config Fountainhead configuration\n * @param {string} config.env Execution environment\n */</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> config <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> env <span class=\"token operator\">=</span> config<span class=\"token punctuation\">.</span>env <span class=\"token operator\">||</span> <span class=\"token string\">'development'</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Pre Docs Generation Validation</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Optional configs pulled from `fountainhead.js`\n   * @property fountainheadConfig\n   * @type {Object}\n   */</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Package JSON for project. Used to populate project description if not\n   * defined in `fountainhead.js` config.\n   * @property packageJSON\n   * @type {Object}\n   */</span>\n\n  <span class=\"token keyword\">let</span> fountainheadConfig<span class=\"token punctuation\">,</span> packageJSON<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// You never know.</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    fountainheadConfig <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fountainhead.js'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token comment\" spellcheck=\"true\">// Configuration can export an object or a function, function expects env parameter</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> fountainheadConfig <span class=\"token operator\">===</span> <span class=\"token string\">'function'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      fountainheadConfig <span class=\"token operator\">=</span> <span class=\"token function\">fountainheadConfig</span><span class=\"token punctuation\">(</span>env<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// Validate config export was either a function or object</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> fountainheadConfig <span class=\"token operator\">!==</span> <span class=\"token string\">'object'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      console<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Warning: Fountainhead configuration must export an object or function.'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      fountainheadConfig <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span><span class=\"token punctuation\">(</span>ex<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    fountainheadConfig <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    packageJSON <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span>path<span class=\"token punctuation\">.</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span><span class=\"token string\">'package.json'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span> <span class=\"token keyword\">catch</span><span class=\"token punctuation\">(</span>ex<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    packageJSON <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span><span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Validate config output</span>\n  fountainheadConfig <span class=\"token operator\">=</span> <span class=\"token function\">decorateConfig</span><span class=\"token punctuation\">(</span>fountainheadConfig<span class=\"token punctuation\">,</span> packageJSON<span class=\"token punctuation\">,</span> config<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Exec Docs Generation</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Raw YUIDoc JSON data generated using constructor exported by `yuidocjs`.\n   * Call new with options from config to pass configs to YUIDoc and call `run`\n   * to generate JSON\n   * @property yuidocJSON\n   * @type {Object}\n   */</span>\n  <span class=\"token keyword\">const</span> yuidocJSON <span class=\"token operator\">=</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">new</span> <span class=\"token class-name\">Y<span class=\"token punctuation\">.</span>YUIDoc</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n    paths<span class=\"token punctuation\">:</span> fountainheadConfig<span class=\"token punctuation\">.</span>entry<span class=\"token punctuation\">,</span>\n    outdir<span class=\"token punctuation\">:</span> fountainheadConfig<span class=\"token punctuation\">.</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span>\n    quiet<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span> <span class=\"token comment\" spellcheck=\"true\">// Always suppress YUIDoc logging so we can handle error logging</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">run</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">/*\n   * When YUIDoc executes it will ensure that an empty direcotry is created at\n   * the output destination. Before we can generate the Fountainhead data, we\n   * need to create the directories the data will be saved in.\n   */</span>\n  <span class=\"token function\">createDirs</span><span class=\"token punctuation\">(</span>fountainheadConfig<span class=\"token punctuation\">.</span>output<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">/*\n   * Generate fountainhead json data using project configuration and yuidoc\n   * generated raw data\n   */</span>\n  <span class=\"token keyword\">return</span> <span class=\"token function\">generateFountainheadData</span><span class=\"token punctuation\">(</span>fountainheadConfig<span class=\"token punctuation\">,</span> yuidocJSON<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n</code></pre>"
}