{
  "file": "addon/components/cross-link.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 class=\"token keyword\">import</span> Component <span class=\"token keyword\">from</span> <span class=\"token string\">'ember-component'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> inject <span class=\"token keyword\">from</span> <span class=\"token string\">'ember-service/inject'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> getOwner <span class=\"token keyword\">from</span> <span class=\"token string\">'ember-owner/get'</span><span class=\"token punctuation\">;</span>\n<span class=\"token keyword\">import</span> hbs <span class=\"token keyword\">from</span> <span class=\"token string\">'htmlbars-inline-precompile'</span><span class=\"token punctuation\">;</span>\n\n<span class=\"token comment\" spellcheck=\"true\">/**\n * The `{{cross-link}}` component lets you easily reference other classes,\n * modules, properties and methods in your documentation. It handles creating the\n * appropriate link depending on application routing type and presence of a\n * class property. The cross link component is also available using the shorthand\n * syntax: `{{c-l}}`.\n *\n * {{#fountainhead-alert brand='info' dismiss=false}}\n *   {{fountainhead-svg svgId='info'}} The cross link component is also available as\n *   `{{c-l}}` for terseness.\n * {{/fountainhead-alert}}\n *\n * #### Same Class Cross Linking\n * ```glimmer\n * Quickly link to a property in the same class using positional params:\n * Take a look at the {{c-l 'init'}} method to see how the {{c-l '_route'}} property\n * is set.\n * ```\n *\n * #### Other Class Cross Linking\n * ```glimmer\n * Link to any other class, module, property, or method by passing a `class` or\n * `module` property:\n * Take a look at the {{c-l 'setFragmentId' class='Fountainhead'}} method to see\n * how the URL hash is set.\n * ```\n *\n * #### Block Form\n * When used as an inline component, the rendered link-to's text will be the\n * ID of the module or class along with any passed query params. If you want\n * different link text you can use the component in block form.\n *\n * Property | Description\n * --- | ---\n * `class` | Documentation class to link to\n * `module` | Documentation module to link to\n * `item` | Specific documentation item to link to, appended as a query param\n *\n * {{! --------------------------------------------------------------------- }}\n * {{! TEST CASES: B/c Ember Integration Tests + link-to === 💣              }}\n * {{! Uncomment cases below and check in browser                            }}\n * {{! --------------------------------------------------------------------- }}\n * {{! Postional Params }}\n * {{! ## Testing }}\n * {{!-- {{c-l 'init'}}&lt;br> --}}\n * {{!-- {{#c-l 'init'}}BLOCK TEXT{{/c-l}}&lt;br> --}}\n * {{! Passed Item }}\n * {{!-- {{c-l item='init'}}&lt;br> --}}\n * {{!-- {{#c-l item='init'}}BLOCK TEXT{{/c-l}}&lt;br> --}}\n * {{! Passed Module }}\n * {{!-- {{c-l module='Addon'}}&lt;br> --}}\n * {{!-- {{#c-l module='Addon'}}ADDON MODULE{{/c-l}}&lt;br> --}}\n * {{! Passed Class }}\n * {{!-- {{c-l class='CrossLink' item='init'}} &lt;br> --}}\n * {{!-- {{#c-l class='CrossLink' item='init'}}BLOCK TEXT{{/c-l}}&lt;br> --}}\n * {{!-- {{c-l class='Fountainhead'}}&lt;br> --}}\n * {{!-- {{c-l class='Fountainhead' item='meta'}}&lt;br> --}}\n * {{!-- {{#c-l class='Fountainhead' item='meta'}}BLOCK TEXT{{/c-l}}&lt;br> --}}\n *\n * @class CrossLink\n * @public\n * @constructor\n * @extends Ember.Component\n */</span>\n<span class=\"token keyword\">const</span> CrossLink <span class=\"token operator\">=</span> Component<span class=\"token punctuation\">.</span><span class=\"token function\">extend</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  fountainhead<span class=\"token punctuation\">:</span> <span class=\"token function\">inject</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Passed Properties</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Documentation Class to crosslink to.\n   * @property class\n   * @type {?string}\n   * @passed\n   */</span>\n  <span class=\"token keyword\">class</span><span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Optionally specify an item (property/method) to cross link to on a class.\n   * @property item\n   * @type {?string}\n   * @passed\n   */</span>\n  item<span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Documentation module to crosslink to.\n   * @property module\n   * @type {?string}\n   * @passed\n   */</span>\n  module<span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Properties</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Computed route passed to rendered `link-to` defined in {{c-l 'init'}}\n   * @property _route\n   * @type {?string}\n   * @private\n   */</span>\n  _route<span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Computed model ID passed to rendered `link-to` defined in {{c-l 'init'}}\n   * @property _modelID\n   * @type {?string}\n   * @private\n   */</span>\n  _modelID<span class=\"token punctuation\">:</span> <span class=\"token keyword\">null</span><span class=\"token punctuation\">,</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * @property tagName\n   * @type {string}\n   * @default ''\n   */</span>\n  tagName<span class=\"token punctuation\">:</span> <span class=\"token string\">''</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Hooks</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  <span class=\"token comment\" spellcheck=\"true\">/**\n   * Handle setting a route and model for the template when appropriate + set text\n   * for cross link for when component is used in inline form.\n   * @method init\n   */</span>\n  <span class=\"token function\">init</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">_super</span><span class=\"token punctuation\">(</span><span class=\"token operator\">...</span>arguments<span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">let</span> text<span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> <span class=\"token punctuation\">{</span> item<span class=\"token punctuation\">,</span> module<span class=\"token punctuation\">,</span> <span class=\"token keyword\">class</span><span class=\"token punctuation\">:</span> _class <span class=\"token punctuation\">}</span> <span class=\"token operator\">=</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">getProperties</span><span class=\"token punctuation\">(</span><span class=\"token string\">'item'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'module'</span><span class=\"token punctuation\">,</span> <span class=\"token string\">'class'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token keyword\">const</span> currentRoute <span class=\"token operator\">=</span> <span class=\"token function\">getOwner</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">lookup</span><span class=\"token punctuation\">(</span><span class=\"token string\">'router:main'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'currentRouteName'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n    <span class=\"token keyword\">const</span> currentModel <span class=\"token operator\">=</span> <span class=\"token function\">getOwner</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">lookup</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token string\">`route:</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>currentRoute<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'currentModel.name'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n    <span class=\"token comment\" spellcheck=\"true\">// Set a single route and model to reference when a module or class is passed</span>\n    <span class=\"token comment\" spellcheck=\"true\">// in to pass to linking components in template.</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>module <span class=\"token operator\">||</span> _class<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span><span class=\"token operator\">!</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'fountainhead.meta.hashRouting'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span>\n          <span class=\"token operator\">&amp;&amp;</span> <span class=\"token punctuation\">(</span>module <span class=\"token operator\">===</span> currentModel <span class=\"token operator\">||</span> _class <span class=\"token operator\">===</span> currentModel<span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token comment\" spellcheck=\"true\">// In this case the consumer is using History location, and cross linking to</span>\n        <span class=\"token comment\" spellcheck=\"true\">// a property on the same page. In this case, we need to NOT use a link-to</span>\n        <span class=\"token comment\" spellcheck=\"true\">// and instead use a &lt;a> with a fragment href. The link-to recognizes that</span>\n        <span class=\"token comment\" spellcheck=\"true\">// the route + model are the same and does not recognize the hash, so it</span>\n        <span class=\"token comment\" spellcheck=\"true\">// does nothing on click. Using an &lt;a> with a href fragment fires a hash</span>\n        <span class=\"token comment\" spellcheck=\"true\">// change and the new fragmentId is passed down from Fountainhead service 👍</span>\n      <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n        <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token function\">setProperties</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n          _route<span class=\"token punctuation\">:</span> <span class=\"token template-string\"><span class=\"token string\">`api.</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>module <span class=\"token operator\">?</span> <span class=\"token string\">'modules'</span> <span class=\"token punctuation\">:</span> <span class=\"token string\">'classes'</span><span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">,</span>\n          _model<span class=\"token punctuation\">:</span> module <span class=\"token operator\">||</span> _class\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>\n\n    <span class=\"token comment\" spellcheck=\"true\">// Handle creating text for when cross-link is used in inline form</span>\n    <span class=\"token keyword\">if</span> <span class=\"token punctuation\">(</span>module <span class=\"token operator\">||</span> _class<span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span>\n      text <span class=\"token operator\">=</span> <span class=\"token template-string\"><span class=\"token string\">`</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>module <span class=\"token operator\">||</span> _class<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">${item ? `</span></span><span class=\"token punctuation\">:</span>$<span class=\"token punctuation\">{</span>item<span class=\"token punctuation\">}</span><span class=\"token template-string\"><span class=\"token string\">`:''}`</span></span><span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span> <span class=\"token keyword\">else</span> <span class=\"token punctuation\">{</span>\n      text <span class=\"token operator\">=</span> item<span class=\"token punctuation\">;</span>\n    <span class=\"token punctuation\">}</span>\n\n    <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'text'</span><span class=\"token punctuation\">,</span> text<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\">// Actions</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  actions<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">{</span>\n    <span class=\"token comment\" spellcheck=\"true\">/**\n     * Ember strips out hash fragments from link-tos, which means that when consumers\n     * with History location click a cross-link pointing to a different route, Ember\n     * will strip the hash.\n     *\n     * 'Fix' this by setting `crossLinkFragmentOverride` on the route. When the\n     * route `didTransition` fires, it will see the override and update the history +\n     * scroll to the cross link target.\n     * @method setFragmentOverride\n     */</span>\n    <span class=\"token function\">setFragmentOverride</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><span class=\"token operator\">!</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'item'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span> <span class=\"token punctuation\">{</span> <span class=\"token keyword\">return</span> <span class=\"token boolean\">true</span><span class=\"token punctuation\">;</span> <span class=\"token punctuation\">}</span>\n\n      <span class=\"token keyword\">const</span> currentRouteName <span class=\"token operator\">=</span> <span class=\"token function\">getOwner</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token function\">lookup</span><span class=\"token punctuation\">(</span><span class=\"token string\">'router:main'</span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'currentRouteName'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span>\n\n      <span class=\"token function\">getOwner</span><span class=\"token punctuation\">(</span><span class=\"token keyword\">this</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">.</span><span class=\"token function\">lookup</span><span class=\"token punctuation\">(</span><span class=\"token template-string\"><span class=\"token string\">`route:</span><span class=\"token interpolation\"><span class=\"token interpolation-punctuation punctuation\">${</span>currentRouteName<span class=\"token interpolation-punctuation punctuation\">}</span></span><span class=\"token string\">`</span></span><span class=\"token punctuation\">)</span>\n        <span class=\"token punctuation\">.</span><span class=\"token keyword\">set</span><span class=\"token punctuation\">(</span><span class=\"token string\">'crossLinkFragmentOverride'</span><span class=\"token punctuation\">,</span> <span class=\"token keyword\">this</span><span class=\"token punctuation\">.</span><span class=\"token keyword\">get</span><span class=\"token punctuation\">(</span><span class=\"token string\">'item'</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">)</span><span class=\"token punctuation\">;</span> <span class=\"token comment\" spellcheck=\"true\">// empty for no item</span>\n    <span class=\"token punctuation\">}</span>\n  <span class=\"token punctuation\">}</span><span class=\"token punctuation\">,</span>\n\n  <span class=\"token comment\" spellcheck=\"true\">// Layout</span>\n  <span class=\"token comment\" spellcheck=\"true\">// ---------------------------------------------------------------------------</span>\n  layout<span class=\"token punctuation\">:</span> hbs<span class=\"token template-string\"><span class=\"token string\">`\n    {{#if _route}}\n      {{#if fountainhead.meta.hashRouting}}\n        {{#link-to _route _model (query-params id=item)}}\n          {{#if hasBlock}}{{yield}}{{else}}{{text}}{{/if}}\n        {{/link-to}}\n      {{else}}\n        {{#fh-href _route _model fragmentId=item click=(action 'setFragmentOverride')}}\n          {{#if hasBlock}}{{yield}}{{else}}{{text}}{{/if}}\n        {{/fh-href}}\n      {{/if}}\n    {{else}}\n      {{#if fountainhead.meta.hashRouting}}\n        {{#link-to (query-params id=item)}}\n          {{#if hasBlock}}{{yield}}{{else}}{{text}}{{/if}}\n        {{/link-to}}\n      {{else}}\n        &lt;a href={{concat '#' item}}>\n          {{#if hasBlock}}{{yield}}{{else}}{{text}}{{/if}}\n        &lt;/a>\n      {{/if}}\n    {{/if}}\n  `</span></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\">// SOME SWEET MAGIC TO ALLOW US TO USE POSITIONAL PARAMS WITH COMPONENT</span>\nCrossLink<span class=\"token punctuation\">.</span><span class=\"token function\">reopenClass</span><span class=\"token punctuation\">(</span><span class=\"token punctuation\">{</span>\n  positionalParams<span class=\"token punctuation\">:</span> <span class=\"token punctuation\">[</span><span class=\"token string\">'item'</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 keyword\">export</span> <span class=\"token keyword\">default</span> CrossLink<span class=\"token punctuation\">;</span>\n</code></pre>"
}