UNPKG

eslint-plugin-sitegenesis

Version:

ESLint rules for Salesforce Commerce Cloud SiteGenesis

56 lines (54 loc) 2.3 kB
'use strict'; 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 } }); } }); } } } }