All files / src/lib core.ts

81.82% Statements 36/44
52.38% Branches 11/21
71.43% Functions 10/14
85.37% Lines 35/41
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 993x 3x   3x 3x   3x   1x       5x           3x 2x                   3x 1x 1x         3x                 3x                 3x 1x       1x   1x 1x 1x 1x   1x 1x 1x 1x 1x 1x 1x         1x 1x         1x                 1x 1x 1x 1x      
import {Module} from "./module";
import {EVENT, RESOURCE_LOADING_TYPE} from "./enums";
import {IPageLibAsset, IPageLibConfiguration} from "./types";
import {on} from "./decorators";
import {AssetHelper} from "./assetHelper";
 
export class Core extends Module {
  static get _pageConfiguration() {
    return this.__pageConfiguration;
  }
 
  static set _pageConfiguration(value) {
    this.__pageConfiguration = value;
  }
 
  private static __pageConfiguration: IPageLibConfiguration;
 
  @on(EVENT.ON_CONFIG)
  static config(pageConfiguration: string) {
    Core.__pageConfiguration = JSON.parse(pageConfiguration) as IPageLibConfiguration;
  }
 
  /**
   * Renders fragment
   * @param {string} fragmentName
   * @param {string} containerSelector
   * @param {string} replacementContentSelector
   */
  @on(EVENT.ON_FRAGMENT_RENDERED)
  static load(fragmentName: string, containerSelector?: string, replacementContentSelector?: string) {
    Eif (containerSelector && replacementContentSelector) {
      Core.__replace(containerSelector, replacementContentSelector);
    }
  }
 
  @on(EVENT.ON_FRAGMENT_RENDERED)
  static loadAssetsOnFragment(fragmentName: string) {
    const onFragmentRenderAssets = Core.__pageConfiguration.assets.filter(asset => asset.fragment === fragmentName && asset.loadMethod === RESOURCE_LOADING_TYPE.ON_FRAGMENT_RENDER && !asset.preLoaded);
 
    const scripts = Core.createLoadQueue(onFragmentRenderAssets);
 
    AssetHelper.loadJsSeries(scripts);
  }
 
  @on(EVENT.ON_PAGE_LOAD)
  static pageLoaded() {
    const onFragmentRenderAssets = Core.__pageConfiguration.assets.filter(asset => asset.loadMethod === RESOURCE_LOADING_TYPE.ON_PAGE_RENDER && !asset.preLoaded);
 
    const scripts = Core.createLoadQueue(onFragmentRenderAssets);
 
    AssetHelper.loadJsSeries(scripts);
  }
 
  @on(EVENT.ON_VARIABLES)
  static onVariables(fragmentName: string, configKey: string, configData: object) {
    window[configKey] = configData;
  }
 
  static createLoadQueue(assets: IPageLibAsset[]) {
    let loadList: any = [];
 
    assets.forEach(asset => {
      Eif (!asset.preLoaded) {
        asset.preLoaded = true;
        asset.defer = true;
 
        asset.dependent && asset.dependent.forEach((dependencyName) => {
          const dependency = Core.__pageConfiguration.dependencies.filter(dependency => dependency.name === dependencyName);
          const dependencyContent = dependency[0];
          Eif (dependencyContent && !dependencyContent.preLoaded) {
            Eif (loadList.indexOf(dependencyContent) === -1) {
              loadList.push(dependencyContent);
              dependencyContent.preLoaded = true;
            }
          }
        });
 
        Eif (loadList.indexOf(asset) === -1) {
          loadList.push(asset);
        }
      }
    });
 
    return loadList;
  }
 
  /**
   * Replaces container inner with given content.
   * @param {string} containerSelector
   * @param {string} replacementContentSelector
   */
  private static __replace(containerSelector: string, replacementContentSelector: string) {
    const z = window.document.querySelector(replacementContentSelector) as any;
    const r = z.innerHTML;
    z.parentNode.removeChild(z);
    window.document.querySelector(containerSelector)!.innerHTML = r;
  }
}