/** * @typedef {import('./index.js').VisitorKeys} VisitorKeys */ /** * @type {VisitorKeys} */ const KEYS = { AssignmentExpression: [ "left", "right" ], AssignmentPattern: [ "left", "right" ], ArrayExpression: [ "elements" ], ArrayPattern: [ "elements" ], ArrowFunctionExpression: [ "params", "body" ], AwaitExpression: [ "argument" ], BlockStatement: [ "body" ], BinaryExpression: [ "left", "right" ], 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: [], ExportAllDeclaration: [ "exported", "source" ], ExportDefaultDeclaration: [ "declaration" ], ExportNamedDeclaration: [ "declaration", "specifiers", "source" ], ExportSpecifier: [ "exported", "local" ], ExpressionStatement: [ "expression" ], ExperimentalRestProperty: [ "argument" ], ExperimentalSpreadProperty: [ "argument" ], ForStatement: [ "init", "test", "update", "body" ], ForInStatement: [ "left", "right", "body" ], ForOfStatement: [ "left", "right", "body" ], FunctionDeclaration: [ "id", "params", "body" ], FunctionExpression: [ "id", "params", "body" ], Identifier: [], IfStatement: [ "test", "consequent", "alternate" ], ImportDeclaration: [ "specifiers", "source" ], ImportDefaultSpecifier: [ "local" ], ImportExpression: [ "source" ], ImportNamespaceSpecifier: [ "local" ], ImportSpecifier: [ "imported", "local" ], JSXAttribute: [ "name", "value" ], JSXClosingElement: [ "name" ], JSXElement: [ "openingElement", "children", "closingElement" ], JSXEmptyExpression: [], JSXExpressionContainer: [ "expression" ], JSXIdentifier: [], JSXMemberExpression: [ "object", "property" ], JSXNamespacedName: [ "namespace", "name" ], JSXOpeningElement: [ "name", "attributes" ], JSXSpreadAttribute: [ "argument" ], JSXText: [], JSXFragment: [ "openingFragment", "children", "closingFragment" ], JSXClosingFragment: [], JSXOpeningFragment: [], Literal: [], LabeledStatement: [ "label", "body" ], 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: [], SwitchStatement: [ "discriminant", "cases" ], SwitchCase: [ "test", "consequent" ], 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" ] }; // Types. const NODE_TYPES = Object.keys(KEYS); // Freeze the keys. for (const type of NODE_TYPES) { Object.freeze(KEYS[type]); } Object.freeze(KEYS); export default KEYS;