diff --git a/apps/demo/eslint.config.js b/apps/demo/eslint.config.js index 4d8dbcc4c..bfee11494 100644 --- a/apps/demo/eslint.config.js +++ b/apps/demo/eslint.config.js @@ -2,4 +2,9 @@ import vueConfig from "@prefabs.tech/eslint-config/vue.js"; export default [ ...vueConfig, + { + rules: { + "unicorn/filename-case": "off" + } + } ]; diff --git a/apps/demo/package.json b/apps/demo/package.json index 144763ec3..0b359edc8 100644 --- a/apps/demo/package.json +++ b/apps/demo/package.json @@ -36,9 +36,9 @@ "vue3-toastify": "0.2.9" }, "devDependencies": { - "@prefabs.tech/eslint-config": "0.7.0", - "@prefabs.tech/stylelint-config": "0.7.0", - "@prefabs.tech/tsconfig": "0.7.0", + "@prefabs.tech/eslint-config": "0.8.7", + "@prefabs.tech/stylelint-config": "0.8.7", + "@prefabs.tech/tsconfig": "0.8.7", "@types/jsdom": "21.1.7", "@types/node": "25.6.0", "@vee-validate/i18n": "4.15.1", @@ -49,7 +49,7 @@ "@vitest/coverage-istanbul": "4.1.5", "@vue/test-utils": "2.4.10", "@vue/tsconfig": "0.9.1", - "eslint": "9.39.4", + "eslint": "10.6.0", "jsdom": "27.4.0", "npm-run-all": "4.1.5", "prettier": "3.8.3", diff --git a/apps/demo/src/views/Table/TableFilters.vue b/apps/demo/src/views/Table/TableFilters.vue index 1a9b48b61..d75b717e3 100644 --- a/apps/demo/src/views/Table/TableFilters.vue +++ b/apps/demo/src/views/Table/TableFilters.vue @@ -623,11 +623,7 @@ const customEqualStringFilter: FilterFunction = ( columnId, value: string, ) => { - if (value.includes(row.getValue(columnId) as string)) { - return true; - } - - return false; + return Boolean(value.includes(row.getValue(columnId) as string)); }; const inDateRangeFilter: FilterFunction = ( diff --git a/packages/vue-config/eslint.config.js b/packages/vue-config/eslint.config.js index fd456cf68..a6906e16c 100644 --- a/packages/vue-config/eslint.config.js +++ b/packages/vue-config/eslint.config.js @@ -2,6 +2,12 @@ import vueConfig from "@prefabs.tech/eslint-config/vue.js"; export default [ ...vueConfig, + { + files: ["**/__test__/**"], + rules: { + "unicorn/filename-case": "off", + }, + }, { files: ["**/__test__/**/*.ts"], rules: { diff --git a/packages/vue-config/package.json b/packages/vue-config/package.json index 4883f79d3..0419ced2c 100644 --- a/packages/vue-config/package.json +++ b/packages/vue-config/package.json @@ -37,14 +37,14 @@ "@sentry/vue": "10.51.0" }, "devDependencies": { - "@prefabs.tech/eslint-config": "0.7.0", - "@prefabs.tech/stylelint-config": "0.7.0", - "@prefabs.tech/tsconfig": "0.7.0", + "@prefabs.tech/eslint-config": "0.8.7", + "@prefabs.tech/stylelint-config": "0.8.7", + "@prefabs.tech/tsconfig": "0.8.7", "@types/node": "25.6.0", "@vitejs/plugin-vue": "6.0.6", "@vitejs/plugin-vue-jsx": "5.1.5", "@vitest/coverage-istanbul": "4.1.5", - "eslint": "9.39.4", + "eslint": "10.6.0", "prettier": "3.8.3", "stylelint": "17.10.0", "stylelint-config-recommended-vue": "1.6.1", diff --git a/packages/vue-config/src/index.ts b/packages/vue-config/src/index.ts index c445cd1bf..2e089379d 100644 --- a/packages/vue-config/src/index.ts +++ b/packages/vue-config/src/index.ts @@ -7,7 +7,7 @@ import type { AppConfig, AppFeatures } from "./types"; import parse from "./parse"; import sentry from "./sentry"; -const feature = (name: keyof AppFeatures): boolean => { +const hasFeature = (name: keyof AppFeatures): boolean => { const config = useConfig(); if (!config || !config?.features) { @@ -23,7 +23,7 @@ const plugin: Plugin = { app.provide(configKey, options.config); const featureKey = Symbol.for("dzangolab.vue-config.feature"); - app.provide(featureKey, feature); + app.provide(featureKey, hasFeature); }, }; @@ -33,7 +33,7 @@ const useConfig = (): AppConfig => { ) as AppConfig; }; -const useFeature = (): typeof feature | undefined => { +const useFeature = (): typeof hasFeature | undefined => { return inject(Symbol.for("dzangolab.vue-config.feature")); }; diff --git a/packages/vue-config/src/sentry.ts b/packages/vue-config/src/sentry.ts index 24bfa0151..9d6be8fdc 100644 --- a/packages/vue-config/src/sentry.ts +++ b/packages/vue-config/src/sentry.ts @@ -10,7 +10,7 @@ const plugin: Plugin = { const { config } = options; const sentryOptions = config.sentry; - if (sentryOptions?.enabled && sentryOptions?.dsn) { + if (sentryOptions?.enabled && sentryOptions.dsn) { Sentry.init({ ...sentryOptions, app, diff --git a/packages/vue-config/vite.config.ts b/packages/vue-config/vite.config.ts index 7f6ad6d17..4aa3d9588 100644 --- a/packages/vue-config/vite.config.ts +++ b/packages/vue-config/vite.config.ts @@ -1,4 +1,4 @@ -import { dirname, resolve } from "node:path"; +import path from "node:path"; import { fileURLToPath } from "node:url"; import { defineConfig, loadEnv } from "vite"; @@ -9,7 +9,10 @@ export default defineConfig(({ mode }) => { return { build: { lib: { - entry: resolve(dirname(fileURLToPath(import.meta.url)), "src/index.ts"), + entry: path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "src/index.ts", + ), fileName: (format) => `PrefabsTechVue3Config.${format}.js`, name: "PrefabsTechVue3Config", }, diff --git a/packages/vue-form/eslint.config.js b/packages/vue-form/eslint.config.js index fd456cf68..b432cad65 100644 --- a/packages/vue-form/eslint.config.js +++ b/packages/vue-form/eslint.config.js @@ -2,10 +2,22 @@ import vueConfig from "@prefabs.tech/eslint-config/vue.js"; export default [ ...vueConfig, + { + files: ["**/__test__/**"], + rules: { + "unicorn/filename-case": "off", + }, + }, { files: ["**/__test__/**/*.ts"], rules: { "vue/one-component-per-file": "off", + "unicorn/no-unused-array-method-return": "off", }, }, + { + rules: { + "unicorn/prefer-spread": "off", // Node 20 compat (toArray() unsupported) + } + } ]; diff --git a/packages/vue-form/package.json b/packages/vue-form/package.json index 1b41272a9..d7a73253d 100644 --- a/packages/vue-form/package.json +++ b/packages/vue-form/package.json @@ -39,9 +39,9 @@ }, "devDependencies": { "@dzangolab/flag-icon-css": "3.4.5", - "@prefabs.tech/eslint-config": "0.7.0", - "@prefabs.tech/stylelint-config": "0.7.0", - "@prefabs.tech/tsconfig": "0.7.0", + "@prefabs.tech/eslint-config": "0.8.7", + "@prefabs.tech/stylelint-config": "0.8.7", + "@prefabs.tech/tsconfig": "0.8.7", "@prefabs.tech/vue3-ui": "0.32.0", "@types/node": "25.6.0", "@types/validator": "13.15.10", @@ -54,7 +54,7 @@ "@vue/test-utils": "2.4.10", "@vuepic/vue-datepicker": "12.1.0", "@vueuse/core": "14.3.0", - "eslint": "9.39.4", + "eslint": "10.6.0", "prettier": "3.8.3", "stylelint": "17.10.0", "stylelint-config-recommended-vue": "1.6.1", diff --git a/packages/vue-form/src/components/DatePicker.vue b/packages/vue-form/src/components/DatePicker.vue index edab2e49f..6ca931fc0 100644 --- a/packages/vue-form/src/components/DatePicker.vue +++ b/packages/vue-form/src/components/DatePicker.vue @@ -148,13 +148,13 @@ const onUpdate = ( onMounted(() => { if (props.teleport) { - window.addEventListener("scroll", closeOnScroll, true); + window.addEventListener("scroll", closeOnScroll, { capture: true }); } }); onBeforeUnmount(() => { if (props.teleport) { - window.removeEventListener("scroll", closeOnScroll, true); + window.removeEventListener("scroll", closeOnScroll, { capture: true }); } }); diff --git a/packages/vue-form/src/components/EditableContent.vue b/packages/vue-form/src/components/EditableContent.vue index 13b8ce62c..b87bc1106 100644 --- a/packages/vue-form/src/components/EditableContent.vue +++ b/packages/vue-form/src/components/EditableContent.vue @@ -85,16 +85,18 @@ const getTextarea = (): HTMLTextAreaElement | null => { }; const onEditContent = () => { - if (props.allowEdit) { - editContent.value = true; + if (!props.allowEdit) { + return; + } - nextTick(() => { - const textarea = getTextarea(); + editContent.value = true; - textarea?.focus(); - resizeContent(); - }); - } + nextTick(() => { + const textarea = getTextarea(); + + textarea?.focus(); + resizeContent(); + }); }; const onInput = (value: string) => { diff --git a/packages/vue-form/src/components/FormActions.vue b/packages/vue-form/src/components/FormActions.vue index fb3ed7b6f..c70935d5b 100644 --- a/packages/vue-form/src/components/FormActions.vue +++ b/packages/vue-form/src/components/FormActions.vue @@ -97,19 +97,21 @@ const parsedActions = computed(() => { } for (const defaultAction of defaultActions.value) { - if (mappedActions.get(defaultAction.id || defaultAction.label || "")) { - const previousAction = mappedActions.get( - defaultAction.id || defaultAction.label || "", - ); - - mappedActions.set(defaultAction.id || defaultAction.label || "", { - ...defaultAction, - ...previousAction, - }); + if (!mappedActions.get(defaultAction.id || defaultAction.label || "")) { + continue; } + + const previousAction = mappedActions.get( + defaultAction.id || defaultAction.label || "", + ); + + mappedActions.set(defaultAction.id || defaultAction.label || "", { + ...defaultAction, + ...previousAction, + }); } - return [...mappedActions.values()]; + return Array.from(mappedActions.values()); }); const onActionClick = (action: Record) => { diff --git a/packages/vue-form/src/components/Select.vue b/packages/vue-form/src/components/Select.vue index 82689a3ea..28425af4e 100644 --- a/packages/vue-form/src/components/Select.vue +++ b/packages/vue-form/src/components/Select.vue @@ -530,9 +530,9 @@ const onArrowDown = (event: KeyboardEvent) => { const onArrowUp = (event: KeyboardEvent) => { event.preventDefault(); - const reversedIndex = sortedOptions.value - .toReversed() - .findIndex((option) => !option.disabled); + const reversedIndex = sortedOptions.value.findLastIndex( + (option) => !option.disabled, + ); const total = sortedOptions.value.length; const lastActiveIndex = total - 1 - reversedIndex; @@ -630,11 +630,10 @@ const onSelectGroup = (groupLabel: string) => { (option) => option.groupLabel !== groupLabel, ); } else { - const newSelections = groupOptions.filter( - (option) => - !selectedOptions.value.some( - (selectedOption) => selectedOption.value === option.value, - ), + const newSelections = groupOptions.filter((option) => + selectedOptions.value.every( + (selectedOption) => selectedOption.value !== option.value, + ), ); selectedOptions.value = [...selectedOptions.value, ...newSelections]; @@ -799,7 +798,7 @@ const updateDropdownPosition = () => { onMounted(() => { prepareComponent(); - window.addEventListener("scroll", updateDropdownPosition, true); + window.addEventListener("scroll", updateDropdownPosition, { capture: true }); window.addEventListener("resize", updateDropdownPosition); }); diff --git a/packages/vue-form/src/components/SelectInput.vue b/packages/vue-form/src/components/SelectInput.vue index 44cd4b0c6..9071e0a1c 100644 --- a/packages/vue-form/src/components/SelectInput.vue +++ b/packages/vue-form/src/components/SelectInput.vue @@ -176,7 +176,8 @@ const activeOptions = computed(() => const fieldSchema = computed(() => { if (Object.keys(props.schema).length > 0) { return toTypedSchema(props.schema); - } else if ((props.maxSelection || props.minSelection) && props.multiple) { + } + if ((props.maxSelection || props.minSelection) && props.multiple) { const currentLength = activeOptions.value.length; const max = props.maxSelection ?? 0; const min = props.minSelection ?? 0; diff --git a/packages/vue-form/src/components/__test__/component/DatePicker.test.ts b/packages/vue-form/src/components/__test__/component/DatePicker.test.ts index ef4200983..fb4142955 100644 --- a/packages/vue-form/src/components/__test__/component/DatePicker.test.ts +++ b/packages/vue-form/src/components/__test__/component/DatePicker.test.ts @@ -26,7 +26,7 @@ describe("DatePicker", () => { expect(addEventListenerSpy).toHaveBeenCalledWith( "scroll", expect.any(Function), - true, + { capture: true }, ); addEventListenerSpy.mockRestore(); @@ -46,7 +46,7 @@ describe("DatePicker", () => { expect(removeEventListenerSpy).toHaveBeenCalledWith( "scroll", expect.any(Function), - true, + { capture: true }, ); removeEventListenerSpy.mockRestore(); diff --git a/packages/vue-form/src/components/__test__/component/Select.test.ts b/packages/vue-form/src/components/__test__/component/Select.test.ts index 1314a0a0c..68085acf1 100644 --- a/packages/vue-form/src/components/__test__/component/Select.test.ts +++ b/packages/vue-form/src/components/__test__/component/Select.test.ts @@ -8,7 +8,7 @@ beforeEach(() => { }); afterEach(() => { - document.body.innerHTML = ""; + document.body.replaceChildren(); }); describe("Select", () => { diff --git a/packages/vue-form/vite.config.ts b/packages/vue-form/vite.config.ts index b6eb58aa6..9503297df 100644 --- a/packages/vue-form/vite.config.ts +++ b/packages/vue-form/vite.config.ts @@ -1,5 +1,5 @@ import vue from "@vitejs/plugin-vue"; -import { dirname, resolve } from "node:path"; +import path from "node:path"; import { fileURLToPath } from "node:url"; import { defineConfig, loadEnv } from "vite"; @@ -13,7 +13,10 @@ export default defineConfig(({ mode }) => { build: { cssCodeSplit: true, lib: { - entry: resolve(dirname(fileURLToPath(import.meta.url)), "src/index.ts"), + entry: path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "src/index.ts", + ), fileName: (format) => `PrefabsTechVue3Form.${format}.js`, name: "PrefabsTechVue3Form", }, diff --git a/packages/vue-i18n/eslint.config.js b/packages/vue-i18n/eslint.config.js index fd456cf68..a6906e16c 100644 --- a/packages/vue-i18n/eslint.config.js +++ b/packages/vue-i18n/eslint.config.js @@ -2,6 +2,12 @@ import vueConfig from "@prefabs.tech/eslint-config/vue.js"; export default [ ...vueConfig, + { + files: ["**/__test__/**"], + rules: { + "unicorn/filename-case": "off", + }, + }, { files: ["**/__test__/**/*.ts"], rules: { diff --git a/packages/vue-i18n/package.json b/packages/vue-i18n/package.json index 9d05703ea..40e1808a4 100644 --- a/packages/vue-i18n/package.json +++ b/packages/vue-i18n/package.json @@ -36,9 +36,9 @@ "vue-i18n": "9.1.10" }, "devDependencies": { - "@prefabs.tech/eslint-config": "0.7.0", - "@prefabs.tech/stylelint-config": "0.7.0", - "@prefabs.tech/tsconfig": "0.7.0", + "@prefabs.tech/eslint-config": "0.8.7", + "@prefabs.tech/stylelint-config": "0.8.7", + "@prefabs.tech/tsconfig": "0.8.7", "@prefabs.tech/vue3-config": "0.32.0", "@types/node": "25.6.0", "@vitejs/plugin-vue": "6.0.6", @@ -46,7 +46,7 @@ "@vitest/coverage-istanbul": "4.1.5", "@vue/test-utils": "2.4.10", "@vueuse/core": "14.3.0", - "eslint": "9.39.4", + "eslint": "10.6.0", "prettier": "3.8.3", "jsdom": "27.4.0", "pinia": "3.0.4", diff --git a/packages/vue-i18n/vite.config.ts b/packages/vue-i18n/vite.config.ts index f81349130..fcd85087e 100644 --- a/packages/vue-i18n/vite.config.ts +++ b/packages/vue-i18n/vite.config.ts @@ -1,5 +1,5 @@ import vue from "@vitejs/plugin-vue"; -import { dirname, resolve } from "node:path"; +import path from "node:path"; import { fileURLToPath } from "node:url"; import { defineConfig, loadEnv } from "vite"; @@ -10,7 +10,10 @@ export default defineConfig(({ mode }) => { return { build: { lib: { - entry: resolve(dirname(fileURLToPath(import.meta.url)), "src/index.ts"), + entry: path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "src/index.ts", + ), fileName: (format) => `PrefabsTechVue3I18n.${format}.js`, name: "PrefabsTechVue3I18n", }, diff --git a/packages/vue-layout/eslint.config.js b/packages/vue-layout/eslint.config.js index fd456cf68..0ef7eed8f 100644 --- a/packages/vue-layout/eslint.config.js +++ b/packages/vue-layout/eslint.config.js @@ -8,4 +8,10 @@ export default [ "vue/one-component-per-file": "off", }, }, + { + files: ["**/__test__/**"], + rules: { + "unicorn/filename-case": "off", + }, + }, ]; diff --git a/packages/vue-layout/package.json b/packages/vue-layout/package.json index f21843a95..6806347f9 100644 --- a/packages/vue-layout/package.json +++ b/packages/vue-layout/package.json @@ -33,9 +33,9 @@ "typecheck": "vue-tsc --noEmit -p tsconfig.vitest.json --composite false" }, "devDependencies": { - "@prefabs.tech/eslint-config": "0.7.0", - "@prefabs.tech/stylelint-config": "0.7.0", - "@prefabs.tech/tsconfig": "0.7.0", + "@prefabs.tech/eslint-config": "0.8.7", + "@prefabs.tech/stylelint-config": "0.8.7", + "@prefabs.tech/tsconfig": "0.8.7", "@prefabs.tech/vue3-config": "0.32.0", "@prefabs.tech/vue3-i18n": "0.32.0", "@prefabs.tech/vue3-ui": "0.32.0", @@ -46,7 +46,7 @@ "@vitest/coverage-istanbul": "4.1.5", "@vue/test-utils": "2.4.10", "@vueuse/core": "14.3.0", - "eslint": "9.39.4", + "eslint": "10.6.0", "prettier": "3.8.3", "stylelint": "17.10.0", "stylelint-config-recommended-vue": "1.6.1", diff --git a/packages/vue-layout/src/components/NavMenu.vue b/packages/vue-layout/src/components/NavMenu.vue index 369b14fef..87674777b 100644 --- a/packages/vue-layout/src/components/NavMenu.vue +++ b/packages/vue-layout/src/components/NavMenu.vue @@ -1,8 +1,8 @@