{
  "file": "lib/generate-fountainhead-data.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><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><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> <span class=\"token punctuation\">{</span> readFileSync<span class=\"token punctuation\">,</span> writeFileSync <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fs'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> join<span class=\"token punctuation\">,</span> resolve <span class=\"token punctuation\">}</span> <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\n<span class=\"token keyword\">const</span> generateClasses <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./data-types/generate-classes'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> generateModules <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./data-types/generate-modules'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> generateSrcFile <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./data-types/generate-src-file'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> generateGuide <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./data-types/generate-guide'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">const</span> logger <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./logger'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">const</span> readDirRecursive <span class=\"token operator\">=</span> <span class=\"token function\">require</span><span class=\"token punctuation\">(</span><span class=\"token string\">'./utils/read-dir-recursive'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token keyword\">function</span> <span class=\"token function\">safeReadFile</span><span class=\"token punctuation\">(</span>filePath<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> <span class=\"token function\">readFileSync</span><span class=\"token punctuation\">(</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>filePath<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> encoding<span class=\"token punctuation\">:</span> <span class=\"token string\">'utf8'</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><span class=\"token class-name\">err</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">return</span> console<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token string\">`Failed to read file: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>filePath<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">,</span> err<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span>\n<span class=\"token punctuation\">}</span>\n\n<span class=\"token comment\" spellcheck=\"true\">/**\n * This module handles coordinating parsing/reading/saving all of the individual\n * Fountainhead data files after the configs have been validated and the raw\n * YUIDoc data has been generated.\n *\n * Module should:\n * - create and populate `docsMeta` that will be saved as `meta.json`\n * - generate decorated modules files\n * - generate decorated class files\n * - generate decorated src file files\n *\n * NOTE: When switching doc generation from an executable to a function call\n * all file operations had to be changed to a synchronous operation b/c the ember\n * command finishes before the async file operations are complete and the contents\n * are not written to file. This can be switched back to an async method by\n * assembling and returning a promise.all for all async file calls\n *\n * @class generateFountainheadData\n * @constructor\n * @uses DataTypes.GenerateModules\n * @uses DataTypes.GenerateClasses\n * @uses DataTypes.GenerateSrcFile\n * @param {Object} config     Project configuration file\n * @param {Object} yuidocJSON Raw yuidoc generated documentation JSON\n * @return {undefined}\n */</span>\nmodule<span class=\"token punctuation\">.</span>exports <span class=\"token operator\">=</span> <span class=\"token keyword\">function</span> <span class=\"token function\">generateFountainheadData</span><span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">,</span> yuidocJSON<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n  <span class=\"token keyword\">const</span> output <span class=\"token operator\">=</span> config<span class=\"token punctuation\">.</span>output<span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Call to handle saving data to a file. Requires a file path and data to save.\n   * If data is not a string, it will be stringified\n   * @method saveObjectToJSON\n   * @param {string}        filePath Path to save file at\n   * @param {Object|string} data     Data to save in file\n   * @return {boolean} True for successful operation, false for failures\n   */</span>\n  <span class=\"token keyword\">function</span> <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>filePath<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      data <span class=\"token operator\">=</span> JSON<span class=\"token punctuation\">.</span><span class=\"token function\">stringify</span><span class=\"token punctuation\">(</span>data<span class=\"token punctuation\">,</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span> <span class=\"token number\">2</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token function\">writeFileSync</span><span class=\"token punctuation\">(</span>filePath<span class=\"token punctuation\">,</span> data<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> encoding<span class=\"token punctuation\">:</span> <span class=\"token string\">'utf8'</span> <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</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      console<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token string\">'Unable to save class JSON'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span> <span class=\"token boolean\">false</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// NOTE: ASYNC REQUIRES PROMISIFYING ALL OPERATIONS</span>\n    <span class=\"token comment\" spellcheck=\"true\">// fs.writeFile(filePath, data, err => {</span>\n    <span class=\"token comment\" spellcheck=\"true\">//   if (err) { console.warn(`Unable to save ${filePath}`); }</span>\n    <span class=\"token comment\" spellcheck=\"true\">// });</span>\n  <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Create meta object for docs that gets saved as `meta.json`</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * The `docsMeta` object is the guide for the documentation data. It contains\n   * descriptions of the project as well as arrays of module and class routing\n   * information\n   * @property docsMeta\n   * @type {Object}\n   */</span>\n  <span class=\"token keyword\">let</span> docsMeta <span class=\"token operator\">=</span> <span class=\"token punctuation\">{</span>\n    parser<span class=\"token punctuation\">:</span> <span class=\"token string\">'YUIDoc'</span><span class=\"token punctuation\">,</span> <span class=\"token comment\" spellcheck=\"true\">// We may support JSDoc someday</span>\n    name<span class=\"token punctuation\">:</span> config<span class=\"token punctuation\">.</span>name<span class=\"token punctuation\">,</span>\n    description<span class=\"token punctuation\">:</span> config<span class=\"token punctuation\">.</span>description<span class=\"token punctuation\">,</span>\n    version<span class=\"token punctuation\">:</span> config<span class=\"token punctuation\">.</span>version<span class=\"token punctuation\">,</span>\n    repository<span class=\"token punctuation\">:</span> config<span class=\"token punctuation\">.</span>repository<span class=\"token punctuation\">,</span>\n    logo<span class=\"token punctuation\">:</span> config<span class=\"token punctuation\">.</span>logo<span class=\"token punctuation\">,</span>\n    guides<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\" spellcheck=\"true\">// hashRouting sets Fountainhead to use query params for auto scroll targets.</span>\n  <span class=\"token comment\" spellcheck=\"true\">// We default to fragment ids and only override this if the consuming app is using</span>\n  <span class=\"token comment\" spellcheck=\"true\">// hash location routing.</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>config<span class=\"token punctuation\">.</span>hashRouting<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> docsMeta<span class=\"token punctuation\">.</span>hashRouting <span class=\"token operator\">=</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Save raw data, Ember command exits before YUIDoc module finishes file writing</span>\n  <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'yuidoc-data.json'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    yuidocJSON\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Parse Modules</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n  <span class=\"token keyword\">const</span> modulesData <span class=\"token operator\">=</span> <span class=\"token function\">generateModules</span><span class=\"token punctuation\">(</span>yuidocJSON<span class=\"token punctuation\">.</span>modules<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Update addon meta</span>\n  docsMeta<span class=\"token punctuation\">.</span>modules <span class=\"token operator\">=</span> modulesData<span class=\"token punctuation\">.</span>modulesMeta<span class=\"token punctuation\">;</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Save each module</span>\n  modulesData<span class=\"token punctuation\">.</span>modulesDatas<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>moduleData <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n      <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'modules'</span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>moduleData<span class=\"token punctuation\">.</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.json`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      moduleData\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><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\">// Parse Classes and Class Items</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n  <span class=\"token keyword\">const</span> classesData <span class=\"token operator\">=</span> <span class=\"token function\">generateClasses</span><span class=\"token punctuation\">(</span>yuidocJSON<span class=\"token punctuation\">.</span>classes<span class=\"token punctuation\">,</span> yuidocJSON<span class=\"token punctuation\">.</span>classitems<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Update addon meta</span>\n  docsMeta<span class=\"token punctuation\">.</span>classes <span class=\"token operator\">=</span> classesData<span class=\"token punctuation\">.</span>classesMeta<span class=\"token punctuation\">;</span>\n  <span class=\"token comment\" spellcheck=\"true\">// Save each class &amp;&amp; save class' source file</span>\n  classesData<span class=\"token punctuation\">.</span>classesDatas<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>classData <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">let</span> fileContents<span class=\"token punctuation\">;</span>\n\n    <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n      <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'classes'</span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>classData<span class=\"token punctuation\">.</span>name<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.json`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      classData\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// If a class doesn't have a file somehow don't attempt to read the src</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>classData<span class=\"token punctuation\">.</span>file<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n      fileContents <span class=\"token operator\">=</span> <span class=\"token function\">readFileSync</span><span class=\"token punctuation\">(</span><span class=\"token function\">resolve</span><span class=\"token punctuation\">(</span>classData<span class=\"token punctuation\">.</span>file<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span> encoding<span class=\"token punctuation\">:</span> <span class=\"token string\">'utf8'</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      console<span class=\"token punctuation\">.</span><span class=\"token function\">warn</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token string\">`Failed to read file: </span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>classData<span class=\"token punctuation\">.</span>file<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">,</span> ex<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n      <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'files'</span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>classData<span class=\"token punctuation\">.</span>srcFileId<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.json`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      <span class=\"token punctuation\">{</span> file<span class=\"token punctuation\">:</span> classData<span class=\"token punctuation\">.</span>file<span class=\"token punctuation\">,</span> content<span class=\"token punctuation\">:</span> <span class=\"token function\">generateSrcFile</span><span class=\"token punctuation\">(</span>fileContents<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">}</span>\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// NOTE: ASYNC REQUIRES PROMISIFYING ALL OPERATIONS</span>\n    <span class=\"token comment\" spellcheck=\"true\">// Read file contents and apply syntax highlighting</span>\n    <span class=\"token comment\" spellcheck=\"true\">// fs.readFile(resolve(classData.file), { encoding: 'utf8' }, (err, fileContents) => {</span>\n    <span class=\"token comment\" spellcheck=\"true\">//   if (err) { return console.warn(`Unable to save file: ${classData.file}`); }</span>\n    <span class=\"token comment\" spellcheck=\"true\">//</span>\n    <span class=\"token comment\" spellcheck=\"true\">//   saveObjectToJSON(</span>\n    <span class=\"token comment\" spellcheck=\"true\">//     join(output.path, 'files', `${classData.srcFileId}.json`),</span>\n    <span class=\"token comment\" spellcheck=\"true\">//     { file: classData.file, content: generateSrcFile(fileContents) }</span>\n    <span class=\"token comment\" spellcheck=\"true\">//   );</span>\n    <span class=\"token comment\" spellcheck=\"true\">// });</span>\n  <span class=\"token punctuation\">}</span><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\">// Parse Guides</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n  <span class=\"token comment\" spellcheck=\"true\">// 1. Check for guides in /guides and include in set first</span>\n  <span class=\"token keyword\">let</span> guidesFiles <span class=\"token operator\">=</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">;</span> <span class=\"token comment\" spellcheck=\"true\">// Final guide set -> order added matches nav display order</span>\n  <span class=\"token keyword\">try</span> <span class=\"token punctuation\">{</span>\n    guidesFiles <span class=\"token operator\">=</span> guidesFiles<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token function\">readDirRecursive</span><span class=\"token punctuation\">(</span><span class=\"token string\">'guides'</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><span class=\"token class-name\">err</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> err<span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// 2. For each configured guide in `fountainhead.js` check if guide is a `.md` file</span>\n  <span class=\"token comment\" spellcheck=\"true\">// and add to base if it isn't already there, else ASSume it's a dir and call</span>\n  <span class=\"token comment\" spellcheck=\"true\">// recursive read to add all guides in it to set</span>\n  config<span class=\"token punctuation\">.</span>guides<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>guideConfig <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>guideConfig<span class=\"token punctuation\">.</span><span class=\"token function\">match</span><span class=\"token punctuation\">(</span><span class=\"token regex\">/\\.md$/</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>guidesFiles<span class=\"token punctuation\">.</span><span class=\"token function\">indexOf</span><span class=\"token punctuation\">(</span>guideConfig<span class=\"token punctuation\">)</span> <span class=\"token operator\">===</span> <span class=\"token operator\">-</span><span class=\"token number\">1</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        guidesFiles<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>guideConfig<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\">else</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\" spellcheck=\"true\">// Directory, concat all files</span>\n      guidesFiles <span class=\"token operator\">=</span> guidesFiles<span class=\"token punctuation\">.</span><span class=\"token function\">concat</span><span class=\"token punctuation\">(</span><span class=\"token function\">readDirRecursive</span><span class=\"token punctuation\">(</span>guideConfig<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 punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// 3. For each guide in set, handle reading/formatting/saving file/group</span>\n  guidesFiles<span class=\"token punctuation\">.</span><span class=\"token function\">forEach</span><span class=\"token punctuation\">(</span>guideConfig <span class=\"token operator\">=</span><span class=\"token operator\">></span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\" spellcheck=\"true\">// If `guideConfig` is an object literal it is data for a guide group. Add to</span>\n    <span class=\"token comment\" spellcheck=\"true\">// meta and EXIT</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token keyword\">typeof</span> guideConfig <span class=\"token operator\">===</span> <span class=\"token string\">'object'</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      docsMeta<span class=\"token punctuation\">.</span>guides<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>Object<span class=\"token punctuation\">.</span><span class=\"token function\">assign</span><span class=\"token punctuation\">(</span>guideConfig<span class=\"token punctuation\">,</span> <span class=\"token punctuation\">{</span>\n        linkText<span class=\"token punctuation\">:</span> guideConfig<span class=\"token punctuation\">.</span>linkText <span class=\"token operator\">||</span> guideConfig<span class=\"token punctuation\">.</span>id<span class=\"token punctuation\">,</span>\n        guideGroup<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n        type<span class=\"token punctuation\">:</span> <span class=\"token string\">'guides'</span><span class=\"token punctuation\">,</span>\n        guides<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token punctuation\">]</span>\n      <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// Handles reading frontmatter, parsing guide body, assigning defaults</span>\n    <span class=\"token keyword\">let</span> guide <span class=\"token operator\">=</span> <span class=\"token function\">generateGuide</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      filePath<span class=\"token punctuation\">:</span> guideConfig<span class=\"token punctuation\">,</span>\n      fileSrc<span class=\"token punctuation\">:</span> <span class=\"token function\">safeReadFile</span><span class=\"token punctuation\">(</span>guideConfig<span class=\"token punctuation\">)</span>\n    <span class=\"token punctuation\">}</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// For each formatted guide, handle private vs protected vs group vs guide</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>guide<span class=\"token punctuation\">.</span>attributes<span class=\"token punctuation\">.</span><span class=\"token keyword\">private</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\" spellcheck=\"true\">// Private access guides should not be saved or included in meta</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>guide<span class=\"token punctuation\">.</span>attributes<span class=\"token punctuation\">.</span><span class=\"token keyword\">protected</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\" spellcheck=\"true\">// Protected guides should be saved in /docs, but not included in meta</span>\n      <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n        <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'guides'</span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>guide<span class=\"token punctuation\">.</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.json`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n        guide\n      <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token keyword\">return</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>guide<span class=\"token punctuation\">.</span>attributes<span class=\"token punctuation\">.</span>group<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token comment\" spellcheck=\"true\">// If the formatted guide is group, it needs to be added to that group's</span>\n      <span class=\"token comment\" spellcheck=\"true\">// nested guides array. Find group and add</span>\n      <span class=\"token keyword\">let</span> guideGroup <span class=\"token operator\">=</span> docsMeta<span class=\"token punctuation\">.</span>guides<span class=\"token punctuation\">.</span><span class=\"token function\">filter</span><span class=\"token punctuation\">(</span>g <span class=\"token operator\">=</span><span class=\"token operator\">></span> g<span class=\"token punctuation\">.</span>id <span class=\"token operator\">===</span> guide<span class=\"token punctuation\">.</span>attributes<span class=\"token punctuation\">.</span>group<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>guideGroup<span class=\"token punctuation\">.</span>length<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        guideGroup<span class=\"token punctuation\">[</span><span class=\"token number\">0</span><span class=\"token punctuation\">]</span><span class=\"token punctuation\">.</span>guides<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>guide<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\" spellcheck=\"true\">// If a group doesn't exist yet create one on the fly</span>\n        docsMeta<span class=\"token punctuation\">.</span>guides<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n          id<span class=\"token punctuation\">:</span> guide<span class=\"token punctuation\">.</span>attributes<span class=\"token punctuation\">.</span>group<span class=\"token punctuation\">,</span>\n          linkText<span class=\"token punctuation\">:</span> guide<span class=\"token punctuation\">.</span>attributes<span class=\"token punctuation\">.</span>group<span class=\"token punctuation\">,</span>\n          guideGroup<span class=\"token punctuation\">:</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">,</span>\n          type<span class=\"token punctuation\">:</span> <span class=\"token string\">'guides'</span><span class=\"token punctuation\">,</span>\n          guides<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span>guide<span class=\"token punctuation\">]</span>\n        <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\">else</span> <span class=\"token punctuation\">{</span>\n      docsMeta<span class=\"token punctuation\">.</span>guides<span class=\"token punctuation\">.</span><span class=\"token function\">push</span><span class=\"token punctuation\">(</span>guide<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// All guides are saved to flat /output/guides/ directory for consistent API paths</span>\n    <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n      <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'guides'</span><span class=\"token punctuation\">,</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>guide<span class=\"token punctuation\">.</span>id<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">.json`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n      guide\n    <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token punctuation\">}</span><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\">// Save Fountainhead Master and Meta Data Files</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">/*\n   * SHABANGLE!!! Documentation files have been generated and saved. Finish\n   * generating fountainhead data by saving master data file and documentation\n   * meta file\n   */</span>\n  <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> output<span class=\"token punctuation\">.</span>filename<span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    yuidocJSON\n  <span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n  <span class=\"token function\">saveObjectToJSON</span><span class=\"token punctuation\">(</span>\n    <span class=\"token function\">join</span><span class=\"token punctuation\">(</span>output<span class=\"token punctuation\">.</span>path<span class=\"token punctuation\">,</span> <span class=\"token string\">'meta.json'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n    docsMeta\n  <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\">// Error Logging</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ========================================================</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">/*\n   * If quiet is falsey, pass the generated yuidoc warnings to our logger with\n   * the list of white listed tags. This lets us support logging warnings\n   * without warning about supported tags like `@passed`\n   */</span>\n  <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span>config<span class=\"token punctuation\">.</span>quiet<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token function\">logger</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n      warnings<span class=\"token punctuation\">:</span> yuidocJSON<span class=\"token punctuation\">.</span>warnings<span class=\"token punctuation\">,</span>\n      whiteListTags<span class=\"token punctuation\">:</span> config<span class=\"token punctuation\">.</span>whiteListTags\n    <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 punctuation\">;</span>\n</code></pre>"
}