| /** | |
|  * @typedef {{ readonly [type: string]: ReadonlyArray<string> }} VisitorKeys | |
|  */ | |
| 
 | |
| /** | |
|  * @type {VisitorKeys} | |
|  */ | |
| 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" | |
|     ], | |
|     ExportDefaultDeclaration: [ | |
|         "declaration" | |
|     ], | |
|     ExportNamedDeclaration: [ | |
|         "declaration", | |
|         "specifiers", | |
|         "source" | |
|     ], | |
|     ExportSpecifier: [ | |
|         "exported", | |
|         "local" | |
|     ], | |
|     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" | |
|     ], | |
|     ImportDeclaration: [ | |
|         "specifiers", | |
|         "source" | |
|     ], | |
|     ImportDefaultSpecifier: [ | |
|         "local" | |
|     ], | |
|     ImportExpression: [ | |
|         "source" | |
|     ], | |
|     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" | |
|     ] | |
| }; | |
| 
 | |
| // 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;
 |