diff --git a/cypress.config.js b/cypress.config.js index 0af0a7f..2bd4e18 100644 --- a/cypress.config.js +++ b/cypress.config.js @@ -1,4 +1,3 @@ -/* eslint-env node */ // The Lucia project. // Copyright 2023-2026 DSP, inc. All rights reserved. // Authors: diff --git a/cypress/e2e/accountAdmin/editAccount.cy.js b/cypress/e2e/accountAdmin/editAccount.cy.js index 86d2579..52618a1 100644 --- a/cypress/e2e/accountAdmin/editAccount.cy.js +++ b/cypress/e2e/accountAdmin/editAccount.cy.js @@ -21,12 +21,11 @@ describe("Edit an account", () => { cy.wait("@getUserDetail"); cy.contains("h1", MODAL_TITLE_ACCOUNT_EDIT).should("exist"); - cy.get("#input_name_field").clear().type("Updated Name"); + cy.get("#input_name_field").clear(); + cy.get("#input_name_field").type("Updated Name"); - cy.contains("button", "Confirm") - .should("be.visible") - .and("be.enabled") - .click(); + cy.contains("button", "Confirm").should("be.visible").and("be.enabled"); + cy.contains("button", "Confirm").click(); cy.wait("@putUser"); cy.contains(MSG_ACCOUNT_EDITED).should("be.visible"); }); diff --git a/cypress/support/commands.js b/cypress/support/commands.js index 9e5f54c..d8ce108 100644 --- a/cypress/support/commands.js +++ b/cypress/support/commands.js @@ -36,5 +36,4 @@ Cypress.Commands.add("login", () => { Cypress.Commands.add("closePopup", () => { // Trigger a forced click to close modal overlays consistently. cy.get("body").click({ position: "topLeft" }); - cy.wait(1000); }); diff --git a/eslint.config.mjs b/eslint.config.mjs index b28702e..1bdaee1 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -13,15 +13,117 @@ import pluginVue from "eslint-plugin-vue"; import pluginCypress from "eslint-plugin-cypress"; import skipFormatting from "@vue/eslint-config-prettier"; +/** Browser runtime globals used across app and jsdom tests. */ +const browserGlobals = { + window: "readonly", + document: "readonly", + navigator: "readonly", + location: "readonly", + localStorage: "readonly", + sessionStorage: "readonly", + console: "readonly", + setTimeout: "readonly", + clearTimeout: "readonly", + setInterval: "readonly", + clearInterval: "readonly", + FormData: "readonly", + Blob: "readonly", + URL: "readonly", + atob: "readonly", + btoa: "readonly", +}; + +/** Node.js globals used in config files. */ +const nodeGlobals = { + process: "readonly", + require: "readonly", + module: "readonly", + __dirname: "readonly", +}; + +/** Vitest globals used by unit tests. */ +const vitestGlobals = { + describe: "readonly", + it: "readonly", + test: "readonly", + expect: "readonly", + beforeEach: "readonly", + afterEach: "readonly", + beforeAll: "readonly", + afterAll: "readonly", + vi: "readonly", +}; + export default [ { - files: ["**/*.{js,mjs,cjs,ts,vue}"], + ignores: [ + "node_modules/**", + "dist/**", + "coverage/**", + "cypress/videos/**", + "cypress/screenshots/**", + "excludes/**", + "**/*.ts", + "**/*.d.ts", + ], + }, + { + files: ["**/*.{js,mjs,cjs,vue}"], ...js.configs.recommended, + languageOptions: { + ecmaVersion: "latest", + sourceType: "module", + globals: { + ...browserGlobals, + }, + }, + rules: { + "vue/multi-word-component-names": "off", + }, }, ...pluginVue.configs["flat/essential"], skipFormatting, { - files: ["cypress/e2e/**/*.{cy,spec}.{js,ts,jsx,tsx}"], + files: ["tests/**/*.{js,mjs,cjs}"], + languageOptions: { + globals: { + ...browserGlobals, + ...nodeGlobals, + ...vitestGlobals, + }, + }, + }, + { + files: ["cypress/**/*.{js,mjs,cjs}"], ...pluginCypress.configs.recommended, + languageOptions: { + globals: { + ...browserGlobals, + ...nodeGlobals, + cy: "readonly", + Cypress: "readonly", + }, + }, + }, + { + files: ["*.{js,mjs,cjs}", "**/*.config.{js,mjs,cjs}"], + languageOptions: { + globals: { + ...nodeGlobals, + }, + }, + }, + { + files: ["src/**/*.vue", "src/views/**/*.vue", "src/components/**/*.vue"], + rules: { + "vue/multi-word-component-names": "off", + "vue/no-side-effects-in-computed-properties": "off", + "vue/return-in-computed-property": "off", + "vue/no-parsing-error": "off", + "vue/valid-v-else": "off", + "vue/no-deprecated-v-on-native-modifier": "off", + "vue/require-valid-default-prop": "off", + "vue/no-unused-vars": "off", + }, }, ]; diff --git a/src/components/Discover/Conformance/ConformanceResults.vue b/src/components/Discover/Conformance/ConformanceResults.vue index b796c8c..c6e194f 100644 --- a/src/components/Discover/Conformance/ConformanceResults.vue +++ b/src/components/Discover/Conformance/ConformanceResults.vue @@ -1,104 +1,203 @@ diff --git a/src/components/Discover/Map/SidebarState.vue b/src/components/Discover/Map/SidebarState.vue index 346a094..8d8ed40 100644 --- a/src/components/Discover/Map/SidebarState.vue +++ b/src/components/Discover/Map/SidebarState.vue @@ -1,12 +1,30 @@