You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
2.6 KiB
79 lines
2.6 KiB
'use strict'; |
|
|
|
const pragmaUtil = require('./pragma'); |
|
const variableUtil = require('./variable'); |
|
|
|
/** |
|
* Check if variable is destructured from pragma import |
|
* |
|
* @param {string} variable The variable name to check |
|
* @param {Context} context eslint context |
|
* @returns {Boolean} True if createElement is destructured from the pragma |
|
*/ |
|
module.exports = function isDestructuredFromPragmaImport(variable, context) { |
|
const pragma = pragmaUtil.getFromContext(context); |
|
const variables = variableUtil.variablesInScope(context); |
|
const variableInScope = variableUtil.getVariable(variables, variable); |
|
if (variableInScope) { |
|
const latestDef = variableUtil.getLatestVariableDefinition(variableInScope); |
|
if (latestDef) { |
|
// check if latest definition is a variable declaration: 'variable = value' |
|
if (latestDef.node.type === 'VariableDeclarator' && latestDef.node.init) { |
|
// check for: 'variable = pragma.variable' |
|
if ( |
|
latestDef.node.init.type === 'MemberExpression' |
|
&& latestDef.node.init.object.type === 'Identifier' |
|
&& latestDef.node.init.object.name === pragma |
|
) { |
|
return true; |
|
} |
|
// check for: '{variable} = pragma' |
|
if ( |
|
latestDef.node.init.type === 'Identifier' |
|
&& latestDef.node.init.name === pragma |
|
) { |
|
return true; |
|
} |
|
|
|
// "require('react')" |
|
let requireExpression = null; |
|
|
|
// get "require('react')" from: "{variable} = require('react')" |
|
if (latestDef.node.init.type === 'CallExpression') { |
|
requireExpression = latestDef.node.init; |
|
} |
|
// get "require('react')" from: "variable = require('react').variable" |
|
if ( |
|
!requireExpression |
|
&& latestDef.node.init.type === 'MemberExpression' |
|
&& latestDef.node.init.object.type === 'CallExpression' |
|
) { |
|
requireExpression = latestDef.node.init.object; |
|
} |
|
|
|
// check proper require. |
|
if ( |
|
requireExpression |
|
&& requireExpression.callee |
|
&& requireExpression.callee.name === 'require' |
|
&& requireExpression.arguments[0] |
|
&& requireExpression.arguments[0].value === pragma.toLocaleLowerCase() |
|
) { |
|
return true; |
|
} |
|
|
|
return false; |
|
} |
|
|
|
// latest definition is an import declaration: import {<variable>} from 'react' |
|
if ( |
|
latestDef.parent |
|
&& latestDef.parent.type === 'ImportDeclaration' |
|
&& latestDef.parent.source.value === pragma.toLocaleLowerCase() |
|
) { |
|
return true; |
|
} |
|
} |
|
} |
|
return false; |
|
};
|
|
|