“use strict”;

Object.defineProperty(exports, “__esModule”, {

value: true

}); exports.validatePluginObject = validatePluginObject;

var _optionAssertions = require(“./option-assertions”);

const VALIDATORS = {

name: _optionAssertions.assertString,
manipulateOptions: _optionAssertions.assertFunction,
pre: _optionAssertions.assertFunction,
post: _optionAssertions.assertFunction,
inherits: _optionAssertions.assertFunction,
visitor: assertVisitorMap,
parserOverride: _optionAssertions.assertFunction,
generatorOverride: _optionAssertions.assertFunction

};

function assertVisitorMap(key, value) {

const obj = (0, _optionAssertions.assertObject)(key, value);

if (obj) {
  Object.keys(obj).forEach(prop => assertVisitorHandler(prop, obj[prop]));

  if (obj.enter || obj.exit) {
    throw new Error(`.${key} cannot contain catch-all "enter" or "exit" handlers. Please target individual nodes.`);
  }
}

return obj;

}

function assertVisitorHandler(key, value) {

if (value && typeof value === "object") {
  Object.keys(value).forEach(handler => {
    if (handler !== "enter" && handler !== "exit") {
      throw new Error(`.visitor["${key}"] may only have .enter and/or .exit handlers.`);
    }
  });
} else if (typeof value !== "function") {
  throw new Error(`.visitor["${key}"] must be a function`);
}

return value;

}

function validatePluginObject(obj) {

const rootPath = {
  type: "root",
  source: "plugin"
};
Object.keys(obj).forEach(key => {
  const validator = VALIDATORS[key];
  const optLoc = {
    type: "option",
    name: key,
    parent: rootPath
  };
  if (validator) validator(optLoc, obj[key]);else throw new Error(`.${key} is not a valid Plugin property`);
});
return obj;

}