123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- 'use strict'
- const Module = require('module')
- const path = require('path')
- const utils = require('../utils')
- const AST = require('vue-eslint-parser').AST
- const ecmaVersion = 2020
- module.exports = {
- meta: {
- type: 'problem',
- docs: {
- description:
- 'prevent variables defined in `<script setup>` to be marked as undefined',
- categories: undefined,
- url: 'https://eslint.vuejs.org/rules/experimental-script-setup-vars.html'
- },
- deprecated: true,
- schema: []
- },
-
- create(context) {
- const documentFragment =
- context.parserServices.getDocumentFragment &&
- context.parserServices.getDocumentFragment()
- if (!documentFragment) {
- return {}
- }
- const sourceCode = context.getSourceCode()
- const scriptElement = documentFragment.children
- .filter(utils.isVElement)
- .find(
- (element) =>
- element.name === 'script' &&
- element.range[0] <= sourceCode.ast.range[0] &&
- sourceCode.ast.range[1] <= element.range[1]
- )
- if (!scriptElement) {
- return {}
- }
- const setupAttr = utils.getAttribute(scriptElement, 'setup')
- if (!setupAttr || !setupAttr.value) {
- return {}
- }
- const value = setupAttr.value.value
- let eslintScope
- try {
- eslintScope = getESLintModule('eslint-scope', () =>
-
- require('eslint-scope')
- )
- } catch (_e) {
- context.report({
- node: setupAttr,
- message: 'Can not be resolved eslint-scope.'
- })
- return {}
- }
- let espree
- try {
- espree = getESLintModule('espree', () =>
-
- require('espree')
- )
- } catch (_e) {
- context.report({
- node: setupAttr,
- message: 'Can not be resolved espree.'
- })
- return {}
- }
- const globalScope = sourceCode.scopeManager.scopes[0]
-
- let vars
- try {
- vars = parseSetup(value, espree, eslintScope)
- } catch (_e) {
- context.report({
- node: setupAttr.value,
- message: 'Parsing error.'
- })
- return {}
- }
-
- for (const id of vars) {
- const tempVariable = globalScope.set.get(id)
-
- let variable
- if (!tempVariable) {
- variable = new eslintScope.Variable(id, globalScope)
- globalScope.variables.push(variable)
- globalScope.set.set(id, variable)
- } else {
- variable = tempVariable
- }
- variable.eslintImplicitGlobalSetting = 'readonly'
- variable.eslintExplicitGlobal = undefined
- variable.eslintExplicitGlobalComments = undefined
- variable.writeable = false
- }
-
- globalScope.through = globalScope.through.filter((reference) => {
- const name = reference.identifier.name
- const variable = globalScope.set.get(name)
- if (variable) {
-
- reference.resolved = variable
- variable.references.push(reference)
- return false
- }
- return true
- })
- return {}
- }
- }
- function parseSetup(code, espree, eslintScope) {
-
- const ast = espree.parse(`(${code})=>{}`, { ecmaVersion })
- const result = eslintScope.analyze(ast, {
- ignoreEval: true,
- nodejsScope: false,
- ecmaVersion,
- sourceType: 'script',
- fallback: AST.getFallbackKeys
- })
- const variables = (
- result.globalScope.childScopes[0].variables
- )
- return variables.map((v) => v.name)
- }
- const createRequire =
-
- Module.createRequire ||
-
- Module.createRequireFromPath ||
-
-
- function (filename) {
- const mod = new Module(filename)
- mod.filename = filename
-
- mod.paths = Module._nodeModulePaths(path.dirname(filename))
-
- mod._compile('module.exports = require;', filename)
- return mod.exports
- }
- const modulesCache = {}
- function isLinterPath(p) {
- return (
-
- p.includes(`eslint${path.sep}lib${path.sep}linter${path.sep}linter.js`) ||
-
- p.includes(`eslint${path.sep}lib${path.sep}linter.js`)
- )
- }
- function getESLintModule(name, fallback) {
- if (!modulesCache[name]) {
-
- const linterPath = Object.keys(require.cache).find(isLinterPath)
- if (linterPath) {
- try {
- modulesCache[name] = createRequire(linterPath)(name)
- } catch (_e) {
-
- }
- }
- if (!modulesCache[name]) {
- modulesCache[name] = fallback()
- }
- }
- return modulesCache[name]
- }
|