All files / src/plugins/optionsValidation optionsValidation.ts

100% Statements 13/13
100% Branches 0/0
100% Functions 1/1
100% Lines 13/13

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                                2x 2x 2x 2x         2x   2x   2x   2x   2x                                                                           2x   2x       2x 2x        
import { OSPlugin } from 'plugins';
import {
  OSOptions,
  ResizeBehavior,
  OverflowBehavior,
  VisibilityBehavior,
  AutoHideBehavior,
} from 'options';
import {
  validateOptions,
  OptionsTemplate,
  OptionsTemplateValue,
  optionsTemplateTypes as oTypes,
} from 'plugins/optionsValidation/validation';
import { PartialOptions } from 'typings';
 
const numberAllowedValues: OptionsTemplateValue<number> = oTypes.number;
const booleanAllowedValues: OptionsTemplateValue<boolean> = oTypes.boolean;
const arrayNullValues: OptionsTemplateValue<Array<unknown> | null> = [oTypes.array, oTypes.null];
const stringArrayNullAllowedValues: OptionsTemplateValue<string | ReadonlyArray<string> | null> = [
  oTypes.string,
  oTypes.array,
  oTypes.null,
];
const resizeAllowedValues: OptionsTemplateValue<ResizeBehavior> = 'none both horizontal vertical';
const overflowAllowedValues: OptionsTemplateValue<OverflowBehavior> =
  'hidden scroll visible visible-hidden';
const scrollbarsVisibilityAllowedValues: OptionsTemplateValue<VisibilityBehavior> =
  'visible hidden auto';
const scrollbarsAutoHideAllowedValues: OptionsTemplateValue<AutoHideBehavior> =
  'never scroll leavemove';
 
const optionsTemplate: OptionsTemplate<OSOptions> = {
  resize: resizeAllowedValues, // none || both  || horizontal || vertical || n || b ||
  paddingAbsolute: booleanAllowedValues, // true || false
  updating: {
    elementEvents: arrayNullValues, // array of tuples || null
    attributes: arrayNullValues,
    debounce: [oTypes.number, oTypes.array, oTypes.null], // number || number array || null
  },
  overflow: {
    x: overflowAllowedValues, // visible-hidden  || visible-scroll || hidden || scrol
    y: overflowAllowedValues, // visible-hidden  || visible-scroll || hidden || scrol
  },
  scrollbars: {
    visibility: scrollbarsVisibilityAllowedValues, // visible || hidden || auto || v ||
    autoHide: scrollbarsAutoHideAllowedValues, // never || scroll || leave || move ||
    autoHideDelay: numberAllowedValues, // number
    dragScroll: booleanAllowedValues, // true || false
    clickScroll: booleanAllowedValues, // true || false
    touch: booleanAllowedValues, // true || false
  },
  textarea: {
    dynWidth: booleanAllowedValues, // true || false
    dynHeight: booleanAllowedValues, // true || false
    inheritedAttrs: stringArrayNullAllowedValues, // string || array || nul
  },
  nativeScrollbarsOverlaid: {
    show: booleanAllowedValues, // true || false
    initialize: booleanAllowedValues, // true || false
  },
  callbacks: {
    onUpdated: [oTypes.function, oTypes.null],
  },
};
 
export type OptionsValidationPluginInstance = {
  _: (options: PartialOptions<OSOptions>, doWriteErrors?: boolean) => PartialOptions<OSOptions>;
};
 
export const optionsValidationPluginName = '__osOptionsValidationPlugin';
 
export const optionsValidationPlugin: OSPlugin<OptionsValidationPluginInstance> = [
  optionsValidationPluginName,
  {
    _: (options: PartialOptions<OSOptions>, doWriteErrors?: boolean) => {
      const [validated, foreign] = validateOptions(optionsTemplate, options, doWriteErrors);
      return { ...foreign, ...validated };
    },
  },
];