383 lines
6.9 KiB
JavaScript
383 lines
6.9 KiB
JavaScript
|
'use strict';
|
||
|
|
||
|
Object.defineProperty(exports, '__esModule', { value: true });
|
||
|
|
||
|
/**
|
||
|
* @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);
|
||
|
|
||
|
/**
|
||
|
* @author Toru Nagashima <https://github.com/mysticatea>
|
||
|
* See LICENSE file in root directory for full license.
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* @typedef {{ readonly [type: string]: ReadonlyArray<string> }} 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;
|
||
|
//# sourceMappingURL=eslint-visitor-keys.cjs.map
|