"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(loc, value) { const obj = (0, _optionAssertions.assertObject)(loc, value); if (obj) { Object.keys(obj).forEach(prop => assertVisitorHandler(prop, obj[prop])); if (obj.enter || obj.exit) { throw new Error(`${(0, _optionAssertions.msg)(loc)} 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]; if (validator) { const optLoc = { type: "option", name: key, parent: rootPath }; validator(optLoc, obj[key]); } else { const invalidPluginPropertyError = new Error(`.${key} is not a valid Plugin property`); invalidPluginPropertyError.code = "BABEL_UNKNOWN_PLUGIN_PROPERTY"; throw invalidPluginPropertyError; } }); return obj; }