diff --git a/.github/workflows/frontend_lint.yml b/.github/workflows/frontend_lint.yml index 933218c..219006c 100644 --- a/.github/workflows/frontend_lint.yml +++ b/.github/workflows/frontend_lint.yml @@ -24,9 +24,9 @@ jobs: with: fetch-depth: 1 - - uses: pnpm/action-setup@v2.2.4 + - uses: pnpm/action-setup@v5.0.0 with: - version: 8.14.0 + version: 10.24.0 working-directory: ./frontend - name: Install dependencies diff --git a/frontend/.eslintrc.cjs b/frontend/.eslintrc.cjs deleted file mode 100644 index 3aeb85a..0000000 --- a/frontend/.eslintrc.cjs +++ /dev/null @@ -1,36 +0,0 @@ -// SPDX-FileCopyrightText: 2023 Marlon W (Mawoka) -// -// SPDX-License-Identifier: MPL-2.0 - -module.exports = { - root: true, - parser: '@typescript-eslint/parser', - extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], - plugins: ['svelte3', '@typescript-eslint'], - ignorePatterns: ['*.cjs'], - overrides: [ - { files: ['*.svelte'], processor: 'svelte3/svelte3' }, - { - files: ['*.*'], - rules: { - 'a11y-click-events-have-key-events': 'off' - } - } - ], - rules: { - 'no-unused-vars': ['error', { argsIgnorePattern: '^_' }], - '@typescript-eslint/no-unused-vars': ['error', { argsIgnorePattern: '^_' }] - }, - settings: { - 'svelte3/typescript': () => require('typescript') - }, - parserOptions: { - sourceType: 'module', - ecmaVersion: 2020 - }, - env: { - browser: true, - es2017: true, - node: true - } -}; diff --git a/frontend/.prettierignore b/frontend/.prettierignore new file mode 100644 index 0000000..f05da1a --- /dev/null +++ b/frontend/.prettierignore @@ -0,0 +1,8 @@ +# SPDX-FileCopyrightText: 2023 Marlon W (Mawoka) +# +# SPDX-License-Identifier: MPL-2.0 + +.gitignore +src/lib/i18n/locales/*.json +pnpm-lock.yaml +src/app.html diff --git a/frontend/eslint.config.cjs b/frontend/eslint.config.cjs new file mode 100644 index 0000000..bdef373 --- /dev/null +++ b/frontend/eslint.config.cjs @@ -0,0 +1,88 @@ +// SPDX-FileCopyrightText: 2023 Marlon W (Mawoka) +// +// SPDX-License-Identifier: MPL-2.0 + +const { defineConfig, globalIgnores } = require('eslint/config'); + +const tsParser = require('@typescript-eslint/parser'); +const typescriptEslint = require('@typescript-eslint/eslint-plugin'); +const globals = require('globals'); +const js = require('@eslint/js'); +const svelte = require('eslint-plugin-svelte'); + +module.exports = defineConfig([ + js.configs.recommended, + svelte.configs.recommended, + globalIgnores(['**/*.cjs', 'src/app.html']), + { + languageOptions: { + sourceType: 'module', + ecmaVersion: 2020, + + globals: { + ...globals.browser, + ...globals.node + } + } + }, + { + files: ['**/*.{ts,js}'], + languageOptions: { + parser: tsParser + }, + + plugins: { + '@typescript-eslint': typescriptEslint + }, + + rules: { + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_.*' + } + ], + + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_.*' + } + ] + } + }, + { + files: ['**/*.svelte'], + languageOptions: { + parserOptions: { + parser: tsParser, + extraFileExtensions: ['.svelte'] + } + } + }, + { + files: ['**/*.svelte', '**/*.ts', '**/*.js'], + + rules: { + 'a11y-click-events-have-key-events': 'off', + 'no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_.*' + } + ], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + argsIgnorePattern: '^_.*' + } + ], + 'svelte/no-at-html-tags': 'warn', + 'svelte/require-each-key': 'warn' + }, + + plugins: { + '@typescript-eslint': typescriptEslint + } + } +]); diff --git a/frontend/package.json b/frontend/package.json index e206ad5..fdb64e9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -8,9 +8,9 @@ "preview": "vite preview", "check": "svelte-check --tsconfig ./tsconfig.json", "check:watch": "svelte-check --tsconfig ./tsconfig.json --watch", - "lint": "prettier --ignore-path .gitignore --check --plugin-search-dir=. . '!src/lib/i18n/locales/*.json' '!pnpm-lock.yaml' '!src/app.html' && eslint --ignore-path .gitignore .", - "lint-without-format-checking": "eslint --ignore-path .gitignore .", - "format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. . '!src/lib/i18n/locales/*.json'", + "lint": "prettier --check --plugin-search-dir=. . '!src/lib/i18n/locales/*.json' '!pnpm-lock.yaml' '!src/app.html' && eslint .", + "lint-without-format-checking": "eslint .", + "format": "prettier --write --plugin-search-dir=. . '!src/lib/i18n/locales/*.json'", "run:prod": "node index.js", "translations-scan": "i18next-scanner --config i18next-scanner.config.engine.cjs src/**/*.svelte" }, @@ -58,6 +58,7 @@ "dompurify": "^3.3.0", "eslint": "^9.38.0", "eslint-config-prettier": "^10.1.8", + "eslint-plugin-svelte": "^3.17.0", "felte": "^1.3.0", "fuse.js": "^7.1.0", "highlight.js": "^11.11.1", @@ -82,6 +83,7 @@ "socket.io-client": "^4.8.1", "svelte": "^5.42.2", "svelte-check": "^4.3.3", + "svelte-eslint-parser": "^1.6.0", "svelte-preprocess": "^6.0.3", "svelte-range-slider-pips": "^4.1.0", "svelte-tippy": "^1.3.2", diff --git a/frontend/pnpm-lock.yaml b/frontend/pnpm-lock.yaml index ba3cb98..d1a184d 100644 --- a/frontend/pnpm-lock.yaml +++ b/frontend/pnpm-lock.yaml @@ -136,6 +136,9 @@ importers: eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8(eslint@9.38.0(jiti@2.6.1)) + eslint-plugin-svelte: + specifier: ^3.17.0 + version: 3.17.0(eslint@9.38.0(jiti@2.6.1))(svelte@5.42.2) felte: specifier: ^1.3.0 version: 1.3.0(svelte@5.42.2) @@ -208,6 +211,9 @@ importers: svelte-check: specifier: ^4.3.3 version: 4.3.3(picomatch@4.0.3)(svelte@5.42.2)(typescript@5.9.3) + svelte-eslint-parser: + specifier: ^1.6.0 + version: 1.6.0(svelte@5.42.2) svelte-preprocess: specifier: ^6.0.3 version: 6.0.3(postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6)(sass@1.93.2)(svelte@5.42.2)(typescript@5.9.3) @@ -2850,6 +2856,19 @@ packages: peerDependencies: eslint: '>=7.0.0' + eslint-plugin-svelte@3.17.0: + resolution: + { + integrity: sha512-sF6wgd5FLS2P8CCaOy2HdYYYEcZ6TwL251dLHUkNmtLnWECk1Dwc+j6VeulmmnFxr7Xs0WNtjweOA+bJ0PnaFw== + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0 } + peerDependencies: + eslint: ^8.57.1 || ^9.0.0 || ^10.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + eslint-scope@8.4.0: resolution: { @@ -3109,6 +3128,13 @@ packages: } engines: { node: '>=18' } + globals@16.5.0: + resolution: + { + integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== + } + engines: { node: '>=18' } + graceful-fs@4.2.11: resolution: { @@ -3445,6 +3471,12 @@ packages: } engines: { node: '>=6' } + known-css-properties@0.37.0: + resolution: + { + integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ== + } + konva@9.3.22: resolution: { @@ -3564,6 +3596,13 @@ packages: } engines: { node: '>= 12.0.0' } + lilconfig@2.1.0: + resolution: + { + integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + } + engines: { node: '>=10' } + lilconfig@3.1.3: resolution: { @@ -4236,6 +4275,21 @@ packages: peerDependencies: postcss: ^8.0.0 + postcss-load-config@3.1.4: + resolution: + { + integrity: sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg== + } + engines: { node: '>= 10' } + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + postcss-load-config@6.0.1: resolution: { @@ -4419,6 +4473,24 @@ packages: peerDependencies: postcss: ^8.4.32 + postcss-safe-parser@7.0.1: + resolution: + { + integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A== + } + engines: { node: '>=18.0' } + peerDependencies: + postcss: ^8.4.31 + + postcss-scss@4.0.9: + resolution: + { + integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A== + } + engines: { node: '>=12.0' } + peerDependencies: + postcss: ^8.4.29 + postcss-selector-parser@6.0.10: resolution: { @@ -4839,6 +4911,18 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 typescript: '>=5.0.0' + svelte-eslint-parser@1.6.0: + resolution: + { + integrity: sha512-qoB1ehychT6OxEtQAqc/guSqLS20SlA53Uijl7x375s8nlUT0lb9ol/gzraEEatQwsyPTJo87s2CmKL9Xab+Uw== + } + engines: { node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: 10.30.3 } + peerDependencies: + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + svelte: + optional: true + svelte-preprocess@6.0.3: resolution: { @@ -5300,6 +5384,13 @@ packages: integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== } + yaml@1.10.3: + resolution: + { + integrity: sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA== + } + engines: { node: '>= 6' } + yaml@2.8.1: resolution: { @@ -5357,6 +5448,8 @@ snapshots: '@ckeditor/ckeditor5-core': 47.1.0 '@ckeditor/ckeditor5-upload': 47.1.0 ckeditor5: 47.1.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-alignment@47.1.0': dependencies: @@ -5458,12 +5551,16 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 '@ckeditor/ckeditor5-widget': 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-cloud-services@47.1.0': dependencies: '@ckeditor/ckeditor5-core': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-code-block@47.1.0': dependencies: @@ -5506,6 +5603,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-classic@47.1.0': dependencies: @@ -5515,6 +5614,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-decoupled@47.1.0': dependencies: @@ -5524,6 +5625,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-inline@47.1.0': dependencies: @@ -5533,6 +5636,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-editor-multi-root@47.1.0': dependencies: @@ -5563,6 +5668,8 @@ snapshots: dependencies: '@ckeditor/ckeditor5-utils': 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-enter@47.1.0': dependencies: @@ -5591,6 +5698,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-font@47.1.0': dependencies: @@ -5645,6 +5754,8 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 '@ckeditor/ckeditor5-widget': 47.1.0 ckeditor5: 47.1.0 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-html-embed@47.1.0': dependencies: @@ -5782,8 +5893,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 '@ckeditor/ckeditor5-widget': 47.1.0 ckeditor5: 47.1.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-mention@47.1.0': dependencies: @@ -5803,8 +5912,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-page-break@47.1.0': dependencies: @@ -5814,8 +5921,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 '@ckeditor/ckeditor5-widget': 47.1.0 ckeditor5: 47.1.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-paragraph@47.1.0': dependencies: @@ -5839,8 +5944,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-restricted-editing@47.1.0': dependencies: @@ -5866,8 +5969,6 @@ snapshots: '@ckeditor/ckeditor5-ui': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-source-editing@47.1.0': dependencies: @@ -5898,8 +5999,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-table@47.1.0': dependencies: @@ -5912,8 +6011,6 @@ snapshots: '@ckeditor/ckeditor5-widget': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@ckeditor/ckeditor5-theme-lark@47.1.0': dependencies: @@ -5968,6 +6065,8 @@ snapshots: '@ckeditor/ckeditor5-engine': 47.1.0 '@ckeditor/ckeditor5-utils': 47.1.0 es-toolkit: 1.39.5 + transitivePeerDependencies: + - supports-color '@ckeditor/ckeditor5-widget@47.1.0': dependencies: @@ -5987,8 +6086,6 @@ snapshots: '@ckeditor/ckeditor5-utils': 47.1.0 ckeditor5: 47.1.0 es-toolkit: 1.39.5 - transitivePeerDependencies: - - supports-color '@esbuild/aix-ppc64@0.25.11': optional: true @@ -7356,6 +7453,24 @@ snapshots: dependencies: eslint: 9.38.0(jiti@2.6.1) + eslint-plugin-svelte@3.17.0(eslint@9.38.0(jiti@2.6.1))(svelte@5.42.2): + dependencies: + '@eslint-community/eslint-utils': 4.9.0(eslint@9.38.0(jiti@2.6.1)) + '@jridgewell/sourcemap-codec': 1.5.5 + eslint: 9.38.0(jiti@2.6.1) + esutils: 2.0.3 + globals: 16.5.0 + known-css-properties: 0.37.0 + postcss: 8.5.6 + postcss-load-config: 3.1.4(postcss@8.5.6) + postcss-safe-parser: 7.0.1(postcss@8.5.6) + semver: 7.7.3 + svelte-eslint-parser: 1.6.0(svelte@5.42.2) + optionalDependencies: + svelte: 5.42.2 + transitivePeerDependencies: + - ts-node + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -7513,6 +7628,8 @@ snapshots: globals@14.0.0: {} + globals@16.5.0: {} + graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -7718,6 +7835,8 @@ snapshots: kleur@4.1.5: {} + known-css-properties@0.37.0: {} + konva@9.3.22: {} levn@0.4.1: @@ -7774,6 +7893,8 @@ snapshots: lightningcss-win32-arm64-msvc: 1.30.2 lightningcss-win32-x64-msvc: 1.30.2 + lilconfig@2.1.0: {} + lilconfig@3.1.3: {} locate-character@3.0.0: {} @@ -8287,6 +8408,13 @@ snapshots: read-cache: 1.0.0 resolve: 1.22.11 + postcss-load-config@3.1.4(postcss@8.5.6): + dependencies: + lilconfig: 2.1.0 + yaml: 1.10.3 + optionalDependencies: + postcss: 8.5.6 + postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1): dependencies: lilconfig: 3.1.3 @@ -8396,6 +8524,14 @@ snapshots: postcss: 8.5.6 postcss-value-parser: 4.2.0 + postcss-safe-parser@7.0.1(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + + postcss-scss@4.0.9(postcss@8.5.6): + dependencies: + postcss: 8.5.6 + postcss-selector-parser@6.0.10: dependencies: cssesc: 3.0.0 @@ -8676,6 +8812,18 @@ snapshots: transitivePeerDependencies: - picomatch + svelte-eslint-parser@1.6.0(svelte@5.42.2): + dependencies: + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 + postcss: 8.5.6 + postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.0 + semver: 7.7.3 + optionalDependencies: + svelte: 5.42.2 + svelte-preprocess@6.0.3(postcss-load-config@6.0.1(jiti@2.6.1)(postcss@8.5.6)(yaml@2.8.1))(postcss@8.5.6)(sass@1.93.2)(svelte@5.42.2)(typescript@5.9.3): dependencies: svelte: 5.42.2 @@ -8915,6 +9063,8 @@ snapshots: y18n@4.0.3: {} + yaml@1.10.3: {} + yaml@2.8.1: optional: true