From 4a1ed6eb18a57dfd68261ba27ad3945ed3c615cd Mon Sep 17 00:00:00 2001 From: JC Franco Date: Sat, 28 Dec 2024 15:41:29 -0800 Subject: [PATCH] chore(linting): enable `eslint-plugin-vitest` (#11160) **Related Issue:** N/A ## Summary This will replace `eslint-plugin-jest` rules that are no longer applicable after #10310. --- package-lock.json | 185 ++++++++++++++++++ package.json | 1 + packages/calcite-components/eslint.config.mjs | 7 +- .../src/components/dialog/dialog.e2e.ts | 2 +- .../input-time-picker.e2e.ts | 6 +- .../src/components/input/common/input.spec.ts | 1 - .../src/components/input/common/tests.ts | 1 - .../calcite-components/src/utils/dom.spec.ts | 4 - 8 files changed, 194 insertions(+), 13 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9eed07b7e83..c7aa6890445 100644 --- a/package-lock.json +++ b/package-lock.json @@ -78,6 +78,7 @@ "eslint-plugin-prettier": "5.2.1", "eslint-plugin-react": "7.37.3", "eslint-plugin-unicorn": "56.0.1", + "eslint-plugin-vitest": "0.5.4", "globals": "15.13.0", "globby": "14.0.2", "happy-dom": "15.11.7", @@ -14592,6 +14593,190 @@ "eslint": ">=8.56.0" } }, + "node_modules/eslint-plugin-vitest": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/eslint-plugin-vitest/-/eslint-plugin-vitest-0.5.4.tgz", + "integrity": "sha512-um+odCkccAHU53WdKAw39MY61+1x990uXjSPguUCq3VcEHdqJrOb8OTMrbYlY6f9jAKx7x98kLVlIe3RJeJqoQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/utils": "^7.7.1" + }, + "engines": { + "node": "^18.0.0 || >= 20.0.0" + }, + "peerDependencies": { + "eslint": "^8.57.0 || ^9.0.0", + "vitest": "*" + }, + "peerDependenciesMeta": { + "@typescript-eslint/eslint-plugin": { + "optional": true + }, + "vitest": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/scope-manager": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz", + "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/types": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.18.0.tgz", + "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/typescript-estree": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz", + "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==", + "dev": true, + "license": "BSD-2-Clause", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/visitor-keys": "7.18.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/utils": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.18.0.tgz", + "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@typescript-eslint/scope-manager": "7.18.0", + "@typescript-eslint/types": "7.18.0", + "@typescript-eslint/typescript-estree": "7.18.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/eslint-plugin-vitest/node_modules/@typescript-eslint/visitor-keys": { + "version": "7.18.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz", + "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@typescript-eslint/types": "7.18.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/eslint-plugin-vitest/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/eslint-plugin-vitest/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-plugin-vitest/node_modules/minimatch": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/eslint-plugin-vitest/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/eslint-scope": { "version": "8.2.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz", diff --git a/package.json b/package.json index c613237c29f..e37d105d0ad 100644 --- a/package.json +++ b/package.json @@ -96,6 +96,7 @@ "eslint-plugin-prettier": "5.2.1", "eslint-plugin-react": "7.37.3", "eslint-plugin-unicorn": "56.0.1", + "eslint-plugin-vitest": "0.5.4", "globals": "15.13.0", "globby": "14.0.2", "happy-dom": "15.11.7", diff --git a/packages/calcite-components/eslint.config.mjs b/packages/calcite-components/eslint.config.mjs index 6658f136266..bf389c8e734 100644 --- a/packages/calcite-components/eslint.config.mjs +++ b/packages/calcite-components/eslint.config.mjs @@ -13,6 +13,7 @@ import jsdocPlugin from "eslint-plugin-jsdoc"; import prettierPlugin from "eslint-plugin-prettier"; import reactPlugin from "eslint-plugin-react"; import unicornPlugin from "eslint-plugin-unicorn"; +import vitestPlugin from "eslint-plugin-vitest"; const __filename = fileURLToPath(import.meta.url); const __dirname = path.dirname(__filename); @@ -29,6 +30,7 @@ export default [ ...compat.extends("eslint:recommended", "plugin:@typescript-eslint/recommended", "prettier"), + vitestPlugin.configs.recommended, cspellPluginRecommended, jestPlugin.configs["flat/recommended"], jsdocPlugin.configs["flat/recommended"], @@ -44,6 +46,7 @@ export default [ jest: jestPlugin, prettier: prettierPlugin, unicorn: unicornPlugin, + vitest: vitestPlugin, }, languageOptions: { @@ -133,9 +136,6 @@ export default [ }, ], - "jest/expect-expect": "off", - "jest/no-export": "warn", - curly: "error", "one-var": ["error", "never"], "no-eval": "error", @@ -232,6 +232,7 @@ export default [ checkFilenames: false, }, ], + "vitest/expect-expect": "off", }, }, diff --git a/packages/calcite-components/src/components/dialog/dialog.e2e.ts b/packages/calcite-components/src/components/dialog/dialog.e2e.ts index fb2fcdfd7a3..80717c3e7d9 100644 --- a/packages/calcite-components/src/components/dialog/dialog.e2e.ts +++ b/packages/calcite-components/src/components/dialog/dialog.e2e.ts @@ -215,7 +215,7 @@ describe("calcite-dialog", () => { ]); }); - describe("accessible", async () => { + describe("accessible", () => { accessible(async () => { const page = await newE2EPage(); diff --git a/packages/calcite-components/src/components/input-time-picker/input-time-picker.e2e.ts b/packages/calcite-components/src/components/input-time-picker/input-time-picker.e2e.ts index 3d546fdff30..13ec5d243f5 100644 --- a/packages/calcite-components/src/components/input-time-picker/input-time-picker.e2e.ts +++ b/packages/calcite-components/src/components/input-time-picker/input-time-picker.e2e.ts @@ -953,18 +953,18 @@ describe("calcite-input-time-picker", () => { await page.waitForChanges(); expect(await popoverPositionContainer.isVisible()).toBe(true); - expect(await isElementFocused(page, "calcite-input-text", { shadowed: true })); + expect(await isElementFocused(page, "calcite-input-text", { shadowed: true })).toBe(true); await inputTimePicker.click(); await page.waitForChanges(); expect(await popoverPositionContainer.isVisible()).toBe(false); - expect(await isElementFocused(page, "calcite-input-text", { shadowed: true })); + expect(await isElementFocused(page, "calcite-input-text", { shadowed: true })).toBe(true); await input.click(); await page.waitForChanges(); - expect(await isElementFocused(page, "calcite-input-text", { shadowed: true })); + expect(await isElementFocused(page, "calcite-input-text", { shadowed: true })).toBe(true); }); it("toggles the time picker when using arrow down/escape key", async () => { diff --git a/packages/calcite-components/src/components/input/common/input.spec.ts b/packages/calcite-components/src/components/input/common/input.spec.ts index 558fbecb65d..7ae56c99423 100644 --- a/packages/calcite-components/src/components/input/common/input.spec.ts +++ b/packages/calcite-components/src/components/input/common/input.spec.ts @@ -1,4 +1,3 @@ -/* eslint-disable jest/no-conditional-expect -- Using conditional logic in a confined test helper to handle specific scenarios, reducing duplication, balancing test readability and maintainability. **/ import { describe, expect, it } from "vitest"; import { minMaxLengthTypes, minMaxStepTypes, patternTypes, syncHiddenFormInput } from "./input"; diff --git a/packages/calcite-components/src/components/input/common/tests.ts b/packages/calcite-components/src/components/input/common/tests.ts index 8d9de052b28..858b2b5f40e 100644 --- a/packages/calcite-components/src/components/input/common/tests.ts +++ b/packages/calcite-components/src/components/input/common/tests.ts @@ -1,4 +1,3 @@ -/* eslint-disable jest/no-conditional-expect -- Using conditional logic in a confined test helper to handle specific scenarios, reducing duplication, balancing test readability and maintainability. **/ import { LuminaJsx } from "@arcgis/lumina"; import { E2EElement, newE2EPage } from "@arcgis/lumina-compiler/puppeteerTesting"; import { expect, it } from "vitest"; diff --git a/packages/calcite-components/src/utils/dom.spec.ts b/packages/calcite-components/src/utils/dom.spec.ts index fb24310f58c..99a6dd8730e 100644 --- a/packages/calcite-components/src/utils/dom.spec.ts +++ b/packages/calcite-components/src/utils/dom.spec.ts @@ -332,12 +332,8 @@ describe("dom", () => { const element = document.createElement("div"); document.body.append(element); expect(hasVisibleContent(element)).toBe(false); - }); - it("should return false if element has no visible content", () => { - const element = document.createElement("div"); element.innerHTML = "\n\n"; - document.body.append(element); expect(hasVisibleContent(element)).toBe(false); }); });