const KEYS = {
  ArrayExpression: [
    "elements"
  ],
  ArrayPattern: [
    "elements"
  ],
  ArrowFunctionExpression: [
    "params",
    "body"
  ],
  AssignmentExpression: [
    "left",
    "right"
  ],
  AssignmentPattern: [
    "left",
    "right"
  ],
  AwaitExpression: [
    "argument"
  ],
  BinaryExpression: [
    "left",
    "right"
  ],
  BlockStatement: [
    "body"
  ],
  BreakStatement: [
    "label"
  ],
  CallExpression: [
    "callee",
    "arguments"
  ],
  CatchClause: [
    "param",
    "body"
  ],
  ChainExpression: [
    "expression"
  ],
  ClassBody: [
    "body"
  ],
  ClassDeclaration: [
    "id",
    "superClass",
    "body"
  ],
  ClassExpression: [
    "id",
    "superClass",
    "body"
  ],
  ConditionalExpression: [
    "test",
    "consequent",
    "alternate"
  ],
  ContinueStatement: [
    "label"
  ],
  DebuggerStatement: [],
  DoWhileStatement: [
    "body",
    "test"
  ],
  EmptyStatement: [],
  ExperimentalRestProperty: [
    "argument"
  ],
  ExperimentalSpreadProperty: [
    "argument"
  ],
  ExportAllDeclaration: [
    "exported",
    "source",
    "attributes"
  ],
  ExportDefaultDeclaration: [
    "declaration"
  ],
  ExportNamedDeclaration: [
    "declaration",
    "specifiers",
    "source",
    "attributes"
  ],
  ExportSpecifier: [
    "local",
    "exported"
  ],
  ExpressionStatement: [
    "expression"
  ],
  ForInStatement: [
    "left",
    "right",
    "body"
  ],
  ForOfStatement: [
    "left",
    "right",
    "body"
  ],
  ForStatement: [
    "init",
    "test",
    "update",
    "body"
  ],
  FunctionDeclaration: [
    "id",
    "params",
    "body"
  ],
  FunctionExpression: [
    "id",
    "params",
    "body"
  ],
  Identifier: [],
  IfStatement: [
    "test",
    "consequent",
    "alternate"
  ],
  ImportAttribute: [
    "key",
    "value"
  ],
  ImportDeclaration: [
    "specifiers",
    "source",
    "attributes"
  ],
  ImportDefaultSpecifier: [
    "local"
  ],
  ImportExpression: [
    "source",
    "options"
  ],
  ImportNamespaceSpecifier: [
    "local"
  ],
  ImportSpecifier: [
    "imported",
    "local"
  ],
  JSXAttribute: [
    "name",
    "value"
  ],
  JSXClosingElement: [
    "name"
  ],
  JSXClosingFragment: [],
  JSXElement: [
    "openingElement",
    "children",
    "closingElement"
  ],
  JSXEmptyExpression: [],
  JSXExpressionContainer: [
    "expression"
  ],
  JSXFragment: [
    "openingFragment",
    "children",
    "closingFragment"
  ],
  JSXIdentifier: [],
  JSXMemberExpression: [
    "object",
    "property"
  ],
  JSXNamespacedName: [
    "namespace",
    "name"
  ],
  JSXOpeningElement: [
    "name",
    "attributes"
  ],
  JSXOpeningFragment: [],
  JSXSpreadAttribute: [
    "argument"
  ],
  JSXSpreadChild: [
    "expression"
  ],
  JSXText: [],
  LabeledStatement: [
    "label",
    "body"
  ],
  Literal: [],
  LogicalExpression: [
    "left",
    "right"
  ],
  MemberExpression: [
    "object",
    "property"
  ],
  MetaProperty: [
    "meta",
    "property"
  ],
  MethodDefinition: [
    "key",
    "value"
  ],
  NewExpression: [
    "callee",
    "arguments"
  ],
  ObjectExpression: [
    "properties"
  ],
  ObjectPattern: [
    "properties"
  ],
  PrivateIdentifier: [],
  Program: [
    "body"
  ],
  Property: [
    "key",
    "value"
  ],
  PropertyDefinition: [
    "key",
    "value"
  ],
  RestElement: [
    "argument"
  ],
  ReturnStatement: [
    "argument"
  ],
  SequenceExpression: [
    "expressions"
  ],
  SpreadElement: [
    "argument"
  ],
  StaticBlock: [
    "body"
  ],
  Super: [],
  SwitchCase: [
    "test",
    "consequent"
  ],
  SwitchStatement: [
    "discriminant",
    "cases"
  ],
  TaggedTemplateExpression: [
    "tag",
    "quasi"
  ],
  TemplateElement: [],
  TemplateLiteral: [
    "quasis",
    "expressions"
  ],
  ThisExpression: [],
  ThrowStatement: [
    "argument"
  ],
  TryStatement: [
    "block",
    "handler",
    "finalizer"
  ],
  UnaryExpression: [
    "argument"
  ],
  UpdateExpression: [
    "argument"
  ],
  VariableDeclaration: [
    "declarations"
  ],
  VariableDeclarator: [
    "id",
    "init"
  ],
  WhileStatement: [
    "test",
    "body"
  ],
  WithStatement: [
    "object",
    "body"
  ],
  YieldExpression: [
    "argument"
  ]
};
const NODE_TYPES = Object.keys(KEYS);
for (const type of NODE_TYPES) {
  Object.freeze(KEYS[type]);
}
Object.freeze(KEYS);
const KEY_BLACKLIST = new Set([
  "parent",
  "leadingComments",
  "trailingComments"
]);
function filterKey(key) {
  return !KEY_BLACKLIST.has(key) && key[0] !== "_";
}
function getKeys(node) {
  return Object.keys(node).filter(filterKey);
}
function unionWith(additionalKeys) {
  const retv = Object.assign({}, KEYS);
  for (const type of Object.keys(additionalKeys)) {
    if (Object.hasOwn(retv, type)) {
      const keys = new Set(additionalKeys[type]);
      for (const key of retv[type]) {
        keys.add(key);
      }
      retv[type] = Object.freeze(Array.from(keys));
    } else {
      retv[type] = Object.freeze(Array.from(additionalKeys[type]));
    }
  }
  return Object.freeze(retv);
}
var KEYS_1 = KEYS;
var getKeys_1 = getKeys;
var unionWith_1 = unionWith;
var eslintVisitorKeys = {
  KEYS: KEYS_1,
  getKeys: getKeys_1,
  unionWith: unionWith_1
};
export default eslintVisitorKeys;
export {KEYS_1 as KEYS, eslintVisitorKeys as __moduleExports, getKeys_1 as getKeys, unionWith_1 as unionWith};
