All files / src overlayscrollbars.ts

62.86% Statements 22/35
37.5% Branches 6/16
42.86% Functions 3/7
62.86% Lines 22/35

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 99                                                                        1x       1x 1x 1x       1x 1x 1x     1x 1x 1x 1x   1x 1x 1x 1x   1x                           1x               1x             1x   1x   1x     1x  
import { OSTarget, OSInitializationObject, PartialOptions } from 'typings';
import { assignDeep, isEmptyObject, each, isFunction, keys, isHTMLElement } from 'support';
import { createStructureSetup, StructureSetup } from 'setups/structureSetup';
import { createScrollbarsSetup, ScrollbarsSetup } from 'setups/scrollbarsSetup';
import { createLifecycleHub } from 'lifecycles/lifecycleHub';
import { getOptionsDiff, OSOptions } from 'options';
import { getEnvironment } from 'environment';
import {
  getPlugins,
  addPlugin,
  optionsValidationPluginName,
  OSPlugin,
  OptionsValidationPluginInstance,
} from 'plugins';
import { addInstance, getInstance, removeInstance } from 'instances';
 
export interface OverlayScrollbarsStatic {
  (
    target: OSTarget | OSInitializationObject,
    options?: PartialOptions<OSOptions>,
    extensions?: any
  ): OverlayScrollbars;
 
  extend(osPlugin: OSPlugin | OSPlugin[]): void;
}
 
export interface OverlayScrollbars {
  options(): OSOptions;
  options(newOptions?: PartialOptions<OSOptions>): OSOptions;
 
  update(force?: boolean): void;
  destroy(): void;
 
  state(): any;
}
 
export const OverlayScrollbars: OverlayScrollbarsStatic = (
  target: OSTarget | OSInitializationObject,
  options?: PartialOptions<OSOptions>
): OverlayScrollbars => {
  const instanceTarget = isHTMLElement(target) ? target : target.target;
  const potentialInstance = getInstance(instanceTarget);
  Iif (potentialInstance) {
    return potentialInstance;
  }
 
  const { _getDefaultOptions } = getEnvironment();
  const plugins = getPlugins();
  const optionsValidationPlugin = plugins[
    optionsValidationPluginName
  ] as OptionsValidationPluginInstance;
  const validateOptions = (newOptions?: PartialOptions<OSOptions>) => {
    const opts = newOptions || {};
    const validate = optionsValidationPlugin && optionsValidationPlugin._;
    return validate ? validate(opts, true) : opts;
  };
  const currentOptions: OSOptions = assignDeep({}, _getDefaultOptions(), validateOptions(options));
  const structureSetup: StructureSetup = createStructureSetup(target);
  const scrollbarsSetup: ScrollbarsSetup = createScrollbarsSetup(target, structureSetup);
  const lifecycleHub = createLifecycleHub(currentOptions, structureSetup, scrollbarsSetup);
 
  const instance: OverlayScrollbars = {
    options(newOptions?: PartialOptions<OSOptions>) {
      if (newOptions) {
        const changedOptions = getOptionsDiff(currentOptions, validateOptions(newOptions));
 
        if (!isEmptyObject(changedOptions)) {
          assignDeep(currentOptions, changedOptions);
          lifecycleHub._update(changedOptions);
        }
      }
      return currentOptions;
    },
    state: () => lifecycleHub._state(),
    update(force?: boolean) {
      lifecycleHub._update({}, force);
    },
    destroy: () => {
      lifecycleHub._destroy();
      removeInstance(instanceTarget);
    },
  };
 
  each(keys(plugins), (pluginName) => {
    const pluginInstance = plugins[pluginName];
    if (isFunction(pluginInstance)) {
      pluginInstance(OverlayScrollbars, instance);
    }
  });
 
  instance.update(true);
 
  addInstance(instanceTarget, instance);
 
  return instance;
};
 
OverlayScrollbars.extend = addPlugin;