Skip to content

Commit c1f27c4

Browse files
authored
fix: false positive for customElement="..." in svelte/valid-compile (#517)
1 parent 1ecdfee commit c1f27c4

File tree

6 files changed

+51
-2
lines changed

6 files changed

+51
-2
lines changed

.changeset/nasty-garlics-divide.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"eslint-plugin-svelte": patch
3+
---
4+
5+
fix: false positive for `customElement="..."` in `svelte/valid-compile`

package.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
"postcss-load-config": "^3.1.4",
7777
"postcss-safe-parser": "^6.0.0",
7878
"postcss-selector-parser": "^6.0.11",
79+
"semver": "^7.5.3",
7980
"svelte-eslint-parser": "^0.31.0"
8081
},
8182
"devDependencies": {
@@ -110,6 +111,7 @@
110111
"@types/node": "^18.11.0",
111112
"@types/postcss-safe-parser": "^5.0.1",
112113
"@types/prismjs": "^1.26.0",
114+
"@types/semver": "^7.5.0",
113115
"@types/stylus": "^0.48.38",
114116
"@typescript-eslint/eslint-plugin": "^5.59.5",
115117
"@typescript-eslint/parser": "^5.59.5",
@@ -158,7 +160,6 @@
158160
"prismjs": "^1.25.0",
159161
"rimraf": "^5.0.0",
160162
"sass": "^1.51.0",
161-
"semver": "^7.3.5",
162163
"simple-git-hooks": "^2.8.0",
163164
"source-map-js": "^1.0.2",
164165
"stylelint": "^15.0.0",

src/shared/svelte-compile-warns/index.ts

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { extractLeadingComments } from "./extract-leading-comments"
2121
import { getLangValue } from "../../utils/ast-utils"
2222
import path from "path"
2323
import fs from "fs"
24+
import semver from "semver"
2425

2526
type WarningTargetNode =
2627
| (AST.SvelteProgram & ASTNodeWithParent)
@@ -446,6 +447,9 @@ function getWarningsFromCode(code: string): {
446447
try {
447448
const result = compiler.compile(code, {
448449
generate: false,
450+
...(semver.satisfies(compiler.VERSION, ">=4.0.0-0")
451+
? { customElement: true }
452+
: {}),
449453
})
450454

451455
return { warnings: result.warnings as Warning[], kind: "warn" }
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<svelte:options customElement="my-component" />
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
{
2+
"svelte": ">=4.0.0-0"
3+
}

tests/utils/utils.ts

+36-1
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import * as typescriptESLintParser from "@typescript-eslint/parser"
88
import plugin = require("../../src/index")
99
import { applyFixes } from "./source-code-fixer"
1010
import { parse as parseYaml, stringify as stringifyYaml } from "yaml"
11+
import semver from "semver"
1112

1213
/**
1314
* Prevents leading spaces in a multiline template literal from appearing in the resulting string
@@ -86,7 +87,27 @@ export function loadTestCases(
8687
const validFixtureRoot = path.resolve(rootDir, `./valid/`)
8788
const invalidFixtureRoot = path.resolve(rootDir, `./invalid/`)
8889

89-
const filter = options?.filter ?? (() => true)
90+
const fileNameFilter = options?.filter ?? (() => true)
91+
92+
function filter(inputFile: string) {
93+
if (!fileNameFilter(inputFile)) {
94+
return false
95+
}
96+
const requirements = getRequirements(inputFile)
97+
if (
98+
Object.entries(requirements).some(([pkgName, pkgVersion]) => {
99+
const pkg =
100+
pkgName === "node"
101+
? { version: process.version }
102+
: // eslint-disable-next-line @typescript-eslint/no-require-imports -- test
103+
require(`${pkgName}/package.json`)
104+
return !semver.satisfies(pkg.version, pkgVersion)
105+
})
106+
) {
107+
return false
108+
}
109+
return true
110+
}
90111

91112
const valid = listupInput(validFixtureRoot)
92113
.filter(filter)
@@ -293,3 +314,17 @@ function getConfig(ruleName: string, inputFile: string) {
293314
{ code, filename: inputFile },
294315
)
295316
}
317+
318+
function getRequirements(inputFile: string): Record<string, string> {
319+
let requirementsFile: string = inputFile.replace(
320+
/input\.[a-z]+$/u,
321+
"requirements.json",
322+
)
323+
if (!fs.existsSync(requirementsFile)) {
324+
requirementsFile = path.join(path.dirname(inputFile), "_requirements.json")
325+
}
326+
if (fs.existsSync(requirementsFile)) {
327+
return JSON.parse(fs.readFileSync(requirementsFile, "utf8"))
328+
}
329+
return {}
330+
}

0 commit comments

Comments
 (0)