eslint-plugin-react-pug
Version:
Add supporting of pugjs with react
73 lines (59 loc) • 2.23 kB
JavaScript
/**
* @fileoverview Disallow undeclared variables in Pug
* @author Eugene Zhlobo
*/
const { isReactPugReference, buildLocation, docsUrl } = require('../util/eslint')
const getTemplate = require('../util/getTemplate')
const getVariables = require('../util/getVariables')
//------------------------------------------------------------------------------
// Rule Definition
//------------------------------------------------------------------------------
module.exports = {
meta: {
docs: {
description: 'Disallow undeclared variables in Pug',
category: 'Possible Errors',
recommended: true,
url: docsUrl('no-undef'),
},
schema: [],
},
create: function (context) {
function getDefinedVariables() {
let scope = context.getScope()
let scopeVariables = scope.variables
while (scope.type !== 'global') {
scope = scope.upper
scopeVariables = scope.variables.concat(scopeVariables)
}
return scopeVariables.map(variable => variable.name)
}
return {
TaggedTemplateExpression: function (node) {
if (isReactPugReference(node)) {
const template = getTemplate(node)
const usedVariables = getVariables(template)
const definedVariables = getDefinedVariables()
const isVariableDefined = variable => !definedVariables.includes(variable.value)
const notDefinedVariables = usedVariables.filter(isVariableDefined)
notDefinedVariables.forEach((variable) => {
const delta = variable.loc.start.line === 1
// When template starts plus backtick
? node.quasi.quasis[0].loc.start.column
: -1
const columnStart = variable.loc.start.column + delta
const columnEnd = variable.loc.end.column + delta
context.report({
node,
loc: buildLocation(
[(node.loc.start.line + variable.loc.start.line) - 1, columnStart + 1],
[(node.loc.start.line + variable.loc.end.line) - 1, columnEnd + 1],
),
message: `'${variable.value}' is not defined.`,
})
})
}
},
}
},
}