'use strict';
							 | 
						|
								
							 | 
						|
								Object.defineProperty(exports, '__esModule', { value: true });
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * @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);
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * @author Toru Nagashima <https://github.com/mysticatea>
							 | 
						|
								 * See LICENSE file in root directory for full license.
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * @typedef {import('./visitor-keys.js').VisitorKeys} VisitorKeys
							 | 
						|
								 */
							 | 
						|
								
							 | 
						|
								// List to ignore keys.
							 | 
						|
								const KEY_BLACKLIST = new Set([
							 | 
						|
								    "parent",
							 | 
						|
								    "leadingComments",
							 | 
						|
								    "trailingComments"
							 | 
						|
								]);
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Check whether a given key should be used or not.
							 | 
						|
								 * @param {string} key The key to check.
							 | 
						|
								 * @returns {boolean} `true` if the key should be used.
							 | 
						|
								 */
							 | 
						|
								function filterKey(key) {
							 | 
						|
								    return !KEY_BLACKLIST.has(key) && key[0] !== "_";
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								/**
							 | 
						|
								 * Get visitor keys of a given node.
							 | 
						|
								 * @param {object} node The AST node to get keys.
							 | 
						|
								 * @returns {readonly string[]} Visitor keys of the node.
							 | 
						|
								 */
							 | 
						|
								function getKeys(node) {
							 | 
						|
								    return Object.keys(node).filter(filterKey);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								// Disable valid-jsdoc rule because it reports syntax error on the type of @returns.
							 | 
						|
								// eslint-disable-next-line valid-jsdoc
							 | 
						|
								/**
							 | 
						|
								 * Make the union set with `KEYS` and given keys.
							 | 
						|
								 * @param {VisitorKeys} additionalKeys The additional keys.
							 | 
						|
								 * @returns {VisitorKeys} The union set.
							 | 
						|
								 */
							 | 
						|
								function unionWith(additionalKeys) {
							 | 
						|
								    const retv = /** @type {{
							 | 
						|
								        [type: string]: ReadonlyArray<string>
							 | 
						|
								    }} */ (Object.assign({}, KEYS));
							 | 
						|
								
							 | 
						|
								    for (const type of Object.keys(additionalKeys)) {
							 | 
						|
								        if (Object.prototype.hasOwnProperty.call(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);
							 | 
						|
								}
							 | 
						|
								
							 | 
						|
								exports.KEYS = KEYS;
							 | 
						|
								exports.getKeys = getKeys;
							 | 
						|
								exports.unionWith = unionWith;
							 |