diff --git a/package.json b/package.json index e813f35a..b811d6f1 100644 --- a/package.json +++ b/package.json @@ -54,6 +54,7 @@ "@types/eslint-visitor-keys": "^1.0.0", "@types/mocha": "^9.0.0", "@types/node": "^16.0.0", + "@types/semver": "^7.3.9", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "code-red": "^0.2.3", @@ -75,6 +76,7 @@ "nyc": "^15.1.0", "prettier": "^2.0.5", "prettier-plugin-svelte": "^2.5.0", + "semver": "^7.3.5", "string-replace-loader": "^3.0.3", "svelte": "^3.44.1", "ts-node": "^10.4.0", diff --git a/tests/src/parser/parser.ts b/tests/src/parser/parser.ts index b335e36b..4210119d 100644 --- a/tests/src/parser/parser.ts +++ b/tests/src/parser/parser.ts @@ -1,5 +1,7 @@ +/* global require -- node */ import assert from "assert" import fs from "fs" +import semver from "semver" import { traverseNodes } from "../../../src/traverse" import { parseForESLint } from "../../../src" @@ -24,6 +26,7 @@ describe("Check for AST.", () => { inputFileName, outputFileName, scopeFileName, + requirements, } of listupFixtures()) { describe(inputFileName, () => { let result: any @@ -34,11 +37,26 @@ describe("Check for AST.", () => { const output = fs.readFileSync(outputFileName, "utf8") assert.strictEqual(astJson, output) }) - it("most to generate the expected scope.", () => { - const json = scopeToJSON(result.scopeManager) - const output = fs.readFileSync(scopeFileName, "utf8") - assert.strictEqual(json, output) - }) + if (canTest(requirements, "scope")) + it("most to generate the expected scope.", () => { + let json: any = scopeToJSON(result.scopeManager) + let output: any = fs.readFileSync(scopeFileName, "utf8") + + if ( + result.services?.program // use ts parser + ) { + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires -- ignore + const pkg = require("@typescript-eslint/parser/package.json") + if (!semver.satisfies(pkg.version, "^5.6.0")) { + // adjust global scope + json = JSON.parse(json) + output = JSON.parse(output) + json.variables = output.variables + } + } + + assert.deepStrictEqual(json, output) + }) it("location must be correct.", () => { // check tokens @@ -58,6 +76,25 @@ describe("Check for AST.", () => { } }) +function canTest( + requirements: { scope?: Record }, + key: "scope", +) { + const obj = requirements[key] + if (obj) { + if ( + Object.entries(obj).some(([pkgName, pkgVersion]) => { + // eslint-disable-next-line @typescript-eslint/no-require-imports, @typescript-eslint/no-var-requires -- ignore + const pkg = require(`${pkgName}/package.json`) + return !semver.satisfies(pkg.version, pkgVersion) + }) + ) { + return false + } + } + return true +} + function checkTokens(ast: SvelteProgram, input: string) { const allTokens = [...ast.tokens, ...ast.comments].sort( (a, b) => a.range[0] - b.range[0], diff --git a/tests/src/parser/test-utils.ts b/tests/src/parser/test-utils.ts index 1ba58208..900cd3d1 100644 --- a/tests/src/parser/test-utils.ts +++ b/tests/src/parser/test-utils.ts @@ -22,6 +22,9 @@ export function* listupFixtures(): IterableIterator<{ outputFileName: string scopeFileName: string typeFileName: string | null + requirements: { + scope?: Record + } getRuleOutputFileName: (ruleName: string) => string }> { yield* listupFixturesImpl(AST_FIXTURE_ROOT) @@ -33,6 +36,9 @@ function* listupFixturesImpl(dir: string): IterableIterator<{ outputFileName: string scopeFileName: string typeFileName: string | null + requirements: { + scope?: Record + } getRuleOutputFileName: (ruleName: string) => string }> { for (const filename of fs.readdirSync(dir)) { @@ -50,6 +56,10 @@ function* listupFixturesImpl(dir: string): IterableIterator<{ /input\.svelte$/u, "type-output.svelte", ) + const requirementsFileName = inputFileName.replace( + /input\.svelte$/u, + "requirements.json", + ) const input = fs.readFileSync(inputFileName, "utf8") yield { @@ -58,6 +68,9 @@ function* listupFixturesImpl(dir: string): IterableIterator<{ outputFileName, scopeFileName, typeFileName: fs.existsSync(typeFileName) ? typeFileName : null, + requirements: fs.existsSync(requirementsFileName) + ? JSON.parse(fs.readFileSync(requirementsFileName, "utf-8")) + : {}, getRuleOutputFileName: (ruleName) => { return inputFileName.replace( /input\.svelte$/u,