|                                                                                                                                                                                                                                                                                                                           |  | /** * @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;
 |