Package Exports
- eslint-ast-utils
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (eslint-ast-utils) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
eslint-ast-utils 
Utility library to manipulate ASTs for ESLint projects
Install
$ npm install --save eslint-ast-utilsUsage
const astUtils = require('eslint-ast-utils');API
astUtils.isStaticRequire(node)
Checks whether node is a call to CommonJS's require function.
Returns true if and only if:
nodeis aCallExpressionnode's callee is anIdentifiernamedrequirenodehas exactly 1Literalargument whose value is astring
Example:
require('lodash');
// => true
require(foo);
// => false
foo('lodash');
// => falseUsage example:
function create(context) {
return {
CallExpression(node) {
if (astUtils.isStaticRequire(node)) {
context.report({
node: node,
message: 'Use import syntax rather than `require`'
});
}
}
};
}astUtils.getRequireSource(node)
Gets the source of a require() call. If node is not a require call (in the definition of isStaticRequire), it will return undefined.
Example:
require('lodash');
// => 'lodash'
require('./foo');
// => './foo'Usage example:
function create(context) {
return {
CallExpression(node) {
if (astUtils.isStaticRequire(node) && astUtils.getRequireSource(node) === 'underscore') {
context.report({
node: node,
message: 'Use `lodash` instead of `underscore`'
});
}
}
};
}astUtils.containsIdentifier(name, node)
Checks if there is a reference to a variable named name inside of node.
Returns true if and only if:
- There is an
Identifiernamednameinside ofnode - That
Identifieris a variable (i.e. not a static property name for instance) - That
Identifierdoes not reference a different variable namednameintroduced in a sub-scope ofnode.
Example:
foo(a);
// containsIdentifier('a', node) // => true
// containsIdentifier('b', node) // => true
function foo(fn) {
return function(a) {
return fn(a);
};
}
// containsIdentifier('a', node) // => falseUsage example:
function create(context) {
return {
FunctionDeclaration(node) {
node.params.forEach(param => {
if (param.type === 'Identifier' && !astUtils.containsIdentifier(param.name, node.body)) {
context.report({
node: node,
message: `${name} is never used`
});
}
});
}
};
}astUtils.someContainIdentifier(name, nodes)
Checks if there is a reference to a variable named name inside any node of the nodes array. Will return false if nodes is not an array.
This is a shorthand version of containsIdentifier that works for arrays. The following are equivalent:
[node1, node2, node3].some(node => astUtils.containsIdentifier('a', node));
// equivalent to
astUtils.someContainIdentifier('a', [node1, node2, node3]);astUtils.getPropertyName(node)
Get the name of a MemberExpression's property. Returns:
- a
stringif the property is accessed through dot notation. - a
stringif the property is accessed through brackets and is a string. - a
numberif the property is accessed through brackets and is a number. undefinedifnodeis not aMemberExpressionundefinedif the property name is a hard to compute expression.
Example:
foo.bar
// => 'bar'
foo['bar']
// => 'bar'
foo[bar]
// => undefined
foo[0]
// => 0 # Number
foo[null]
// => null
foo[undefined]
// => undefinedUsage example:
function create(context) {
return {
MemberExpression(node) {
if (astUtils.getPropertyName(node).startsWith('_')) {
context.report({
node: node,
message: 'Don\'t access "private" fields'
});
}
}
};
}astUtils.computeStaticExpression(node)
Get the value of an expression that can be statically computed, i.e. without variables references or expressions too complex.
Returns:
undefinedif the value could not be statically computed.- An object with a
valueproperty containing the computed value.
Example:
foo
// => undefined
42
// => {value: 42}
'foo'
// => {value: 'foo'}
undefined
// => {value: undefined}
null
// => {value: null}
1 + 2 - 4 + (-1)
// => {value: -2}
true ? 1 : 2
// => {value: 1}
`foo ${'bar'}`
// => {value: 'foo bar'}Usage example:
function create(context) {
return {
TemplateLiteral(node) {
const expression = astUtils.computeStaticExpression(node);
if (expression) {
context.report({
node: node,
message: `You can replace this template literal by the regular string '${expression.value}'.`
});
}
}
};
}astUtils.isPromise(node)
Checks whether node is a Promise.
Returns true if and only if node is one of the following:
- a call of an expression's
thenorcatchproperties - a call to a property of
Promise(exceptcancel,promisify,promisifyAllandis) - a call to
new Promise
If node uses unknown properties of a value that would be considered a Promise, node itself would not be considered as a Promise.
Example:
foo.then(fn);
// => true
foo.catch(fn);
// => true
foo.then(fn).catch(fn);
// => true
foo.then(fn).isFulfilled(fn); // isFulfilled(fn) may not return a Promise
// => false
Promise.resolve(value);
// => true
Promise.reject(value);
// => true
Promise.race(promises);
// => true
Promise.all(promises);
// => true
Promise.map(promises, fn); // Bluebird method
// => true
new Promise(fn);
// => true
new Promise.resolve(value);
// => falseUsage example:
function create(context) {
function reportIfPromise(node) {
if (astUtils.isPromise(node)) {
context.report({
node: node,
message: 'Prefer using async/await'
});
}
}
return {
CallExpression: reportIfPromise,
NewExpression: reportIfPromise
};
}astUtils.isFunctionExpression(node)
Checks whether node is a function expression or an arrow function expression (not a function declaration).
If node uses unknown properties of a value that would be considered a Promise, node itself would not be considered as a Promise.
Example:
(function foo() {})
// => true
() => {}
// => true
function foo() {} // function declaration
// => falseUsage example:
function create(context) {
return {
CallExpression(node) {
if (node.callee.type === 'Identifier'
&& node.callee.name === 'test'
&& !astUtils.isFunctionExpression(node.arguments[0])
&& !astUtils.isFunctionExpression(node.arguments[1])
) {
context.report({
node: node,
message: 'You need to pass a function to test()'
});
}
}
};
}License
MIT © Jeroen Engels