eslint-plugin-sitegenesis
Version:
ESLint rules for Salesforce Commerce Cloud SiteGenesis
56 lines (54 loc) • 2.3 kB
JavaScript
;
module.exports = {
meta: {
docs: {
description: 'Prohibites global use of require unless every function is using it.',
category: 'Performance',
recommended: true
},
schema: []
},
create: context => {
let routeCount = 0;
const requires = {};
return {
'FunctionExpression, FunctionDeclaration': node => {
routeCount++;
context.getScope().through.filter(item => item.from.type === 'function').forEach(item => {
if (requires[item.identifier.name]) {
requires[item.identifier.name].useCount++;
}
});
},
'Program': node => {
const globalScope = (context.parserOptions.ecmaFeatures && context.parserOptions.ecmaFeatures.globalReturn) ||
node.sourceType === "module"
? context.getScope().childScopes[0]
: context.getScope();
globalScope.variables.filter(item => item.writeable === undefined && item.name !== 'arguments').forEach(item => {
const isRequire = item.defs[0].node.init &&
item.defs[0].node.init.callee &&
item.defs[0].node.init.callee.name === 'require';
const usedGlobally = globalScope.references.some(ref =>
!ref.init &&
ref.identifier.name === item.name);
if (isRequire) {
requires[item.name] = {
value: item,
useCount: 0,
usedGlobally
};
}
});
},
'Program:exit': node => {
Object.keys(requires).forEach((key) => {
const value = requires[key];
if (value && value.useCount < routeCount && !value.usedGlobally) {
context.report({ node: value.value.identifiers[0], message: '"{{a}}" should be declared inside route', data: { a: key } });
}
});
}
}
}
}