From 18a2bbddccb6c336809136edfeaeb8c94f641b36 Mon Sep 17 00:00:00 2001 From: Hendrik de Graaf Date: Mon, 14 Sep 2026 16:16:02 +0200 Subject: [PATCH 1/8] chore(lint): move eslint and prettier onto the shared style configs Replaces the `@dhis2/cli-style` eslint and prettier configs with `@dhis2/config-eslint/react` and `@dhis2/config-prettier`, which means eslint 7 -> 9 and flat config, and prettier 2 -> 3. The shared eslint config is written for single-package apps, so this repo re-opens the paths it ignores (`./*.js`, and `src/`-scoped globs that never match `components/*/src`) and re-enables four rules it drops: `import/extensions`, `import/no-unresolved`, and the two React-in-scope rules, which matter here because cli-app-scripts still builds JSX with babel's classic runtime. The ignore lists grow because `d2-style` applied a hardcoded blacklist on top of them: build output, CHANGELOG.md and the generated icon sources were never passed to either tool, and now have to be named. `yarn lint` is red after this commit: prettier 3 reformats 66 files and the new eslint rules report 21 errors. The next two commits clear them. Co-Authored-By: Claude Opus 5 --- .eslintignore | 4 - .eslintrc.js | 91 ------ .prettierignore | 8 + .prettierrc.js | 5 - .prettierrc.mjs | 6 + eslint.config.mjs | 121 ++++++++ package.json | 10 +- scripts/build-world.sh | 6 +- yarn.lock | 637 ++++++++++++++++++++++++++++++++++++++++- 9 files changed, 774 insertions(+), 114 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js delete mode 100644 .prettierrc.js create mode 100644 .prettierrc.mjs create mode 100644 eslint.config.mjs diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index c260bbe6cd..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,4 +0,0 @@ -.yarn/ -utilities/icons/src/react/**/*.js -**/locales/ -*.d.ts diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index d35a160c28..0000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,91 +0,0 @@ -const cliStyle = require('@dhis2/cli-style') - -const config = { - extends: [cliStyle.config.eslintReact], - globals: { - cy: 'readonly', - Cypress: 'readonly', - }, - rules: { - 'import/no-webpack-loader-syntax': 'error', - 'import/no-useless-path-segments': 'error', - 'react/no-unknown-property': ['error', { ignore: ['jsx', 'global'] }], - }, - overrides: [ - { - files: [ - '*.stories.{js,jsx,ts,tsx}', - '*.stories.e2e.{js,jsx,ts,tsx}', - '**/__stories__/*.{js,jsx,ts,tsx}', - ], - rules: { - 'import/no-extraneous-dependencies': 'off', - 'react/display-name': 'off', - 'react/prop-types': 'off', - }, - }, - { - files: [ - 'components/*/src/**/*.{js,jsx,ts,tsx}', - 'collections/*/src/**/*.{js,jsx,ts,tsx}', - 'utilities/*/src/**/*.{js,jsx,ts,tsx}', - ], - excludedFiles: [ - '**/features/**/*.{js,jsx,ts,tsx}', - '**/__tests__/**/*.{js,jsx,ts,tsx}', - '*.test.{js,jsx,ts,tsx}', - '*.stories*.{js,jsx,ts,tsx}', - '**/__stories__/*.{js,jsx,ts,tsx}', - '**/__stories__/**/*.{js,jsx,ts,tsx}', - '*.d.ts', - ], - rules: { - 'import/no-extraneous-dependencies': 'error', - }, - }, - { - files: ['**/*.{ts,tsx}'], - parser: require.resolve('@typescript-eslint/parser'), - // TypeScript ambient namespaces, which `no-undef` does not know. - globals: { JSX: 'readonly', NodeJS: 'readonly' }, - settings: { - // Lets `import/no-unresolved` follow an extensionless relative - // import to a `.ts`/`.tsx` file. - 'import/resolver': { - node: { extensions: ['.js', '.jsx', '.ts', '.tsx'] }, - }, - }, - rules: { - /* - * TypeScript sources import siblings without an extension - * (`./ou-tree` resolves to `ou-tree.tsx`), the inverse of the - * `ignorePackages` rule the JavaScript packages follow. - */ - 'import/extensions': [ - 'error', - 'never', - { ts: 'never', tsx: 'never' }, - ], - }, - }, - ], -} - -// Run cpu intensive checks only on CI -const isCI = !!process.env.CI - -if (isCI) { - if (!config.rules) { - config.rules = {} - } - - config.rules['import/no-cycle'] = 'error' - config.rules['import/no-self-import'] = 'error' - - // for newer versions of import plugin - //config.rules['import/no-internal-modules'] = 'error' - //config.rules['import/no-relative-parent-imports'] = 'error' - //config.rules['import/no-relative-packages'] = 'error' -} - -module.exports = config diff --git a/.prettierignore b/.prettierignore index efc07066f8..7d691955fb 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,12 +1,20 @@ .yarn/ +.d2/ **/locales/ cypress/assets/*.js # Documentation files that are generated on CI API.md +# Generated from the SVG sources by `yarn setup` +icons/src/react/ + # Build output, generated locally by `yarn build` (docusaurus site into dist/, # its build cache into docs/.docusaurus/). Without these, `yarn build` followed # by `yarn lint` fails on generated files nobody wrote. dist/ +**/build/ **/.docusaurus/ + +# Release notes, written by semantic-release +CHANGELOG.md diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index def7934e3d..0000000000 --- a/.prettierrc.js +++ /dev/null @@ -1,5 +0,0 @@ -const { config } = require('@dhis2/cli-style') - -module.exports = { - ...require(config.prettier), -} diff --git a/.prettierrc.mjs b/.prettierrc.mjs new file mode 100644 index 0000000000..b5f556b791 --- /dev/null +++ b/.prettierrc.mjs @@ -0,0 +1,6 @@ +import config from '@dhis2/config-prettier' + +/** + * @type {import("prettier").Config} + */ +export default { ...config } diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..5b53619c66 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,121 @@ +import config from '@dhis2/config-eslint/react' +import { defineConfig, globalIgnores } from 'eslint/config' + +// Run cpu intensive checks only on CI +const isCI = !!process.env.CI + +export default defineConfig([ + config, + + /* + * Must follow the shared config: a negation only undoes an earlier + * pattern. On eslint 10 `includeIgnoreFile` could read most of this from + * .gitignore (eslint-plugin-import#3230, eslint-plugin-react#3979). + */ + globalIgnores([ + '!*.js', + '!eslint.config.mjs', + '**/locales/**', + 'icons/src/react/**', + 'dist/**', + '**/build/**', + '**/.docusaurus/**', + 'cypress/assets/**', + '.d2/**', + // `react` rules misread type declarations as components, which + // costs ~350 false positives across these files. + '**/*.d.ts', + ]), + + { + languageOptions: { + globals: { cy: 'readonly', Cypress: 'readonly' }, + }, + // ESLint only warns about these by default. + linterOptions: { reportUnusedDisableDirectives: 'error' }, + rules: { + 'import/no-webpack-loader-syntax': 'error', + 'import/no-useless-path-segments': 'error', + 'react/no-unknown-property': [ + 'error', + { ignore: ['jsx', 'global'] }, + ], + /* + * The shared config leaves these four off. They are on here + * because the JavaScript packages import siblings *with* an + * extension (the TypeScript override below is the inverse), the + * resolver issue behind `import/no-unresolved` does not affect + * this repo, and `@dhis2/cli-app-scripts` compiles JSX with + * `@babel/preset-react` in classic mode, so the React import is + * load-bearing. + */ + 'import/extensions': ['error', 'ignorePackages'], + 'import/no-unresolved': 'error', + 'react/react-in-jsx-scope': 'error', + 'react/jsx-uses-react': 'error', + }, + }, + + { + // These entry points are declared through an `exports` map, which + // the resolver cannot read. + files: ['eslint.config.mjs', '.prettierrc.mjs'], + rules: { 'import/no-unresolved': 'off' }, + }, + + { + files: [ + '**/*.stories.{js,jsx,ts,tsx}', + '**/*.stories.e2e.{js,jsx,ts,tsx}', + '**/__stories__/*.{js,jsx,ts,tsx}', + ], + rules: { + 'import/no-extraneous-dependencies': 'off', + 'react/display-name': 'off', + 'react/prop-types': 'off', + }, + }, + + { + files: [ + 'components/*/src/**/*.{js,jsx,ts,tsx}', + 'collections/*/src/**/*.{js,jsx,ts,tsx}', + 'utilities/*/src/**/*.{js,jsx,ts,tsx}', + ], + ignores: [ + '**/features/**', + '**/__tests__/**', + '**/*.test.{js,jsx,ts,tsx}', + '**/*.stories*.{js,jsx,ts,tsx}', + '**/__stories__/**', + ], + rules: { + 'import/no-extraneous-dependencies': 'error', + }, + }, + + { + files: ['**/*.{ts,tsx}'], + rules: { + // TypeScript sources import siblings without an extension + // (`./ou-tree` resolves to `ou-tree.tsx`), the inverse of the + // `ignorePackages` rule the JavaScript packages follow. + 'import/extensions': [ + 'error', + 'never', + { ts: 'never', tsx: 'never' }, + ], + }, + }, + + ...(isCI + ? [ + { + rules: { + 'import/no-cycle': 'error', + 'import/no-self-import': 'error', + }, + }, + ] + : []), +]) diff --git a/package.json b/package.json index 02904b5120..89d188b635 100644 --- a/package.json +++ b/package.json @@ -33,11 +33,9 @@ "cy:open": "wait-on 'http://localhost:5000' && cypress open", "cy:run": "wait-on 'http://localhost:5000' && cypress run", "cy:test": "./scripts/cypress.js", - "format": "d2-style apply", - "format:staged": "d2-style apply --staged", - "lint": "d2-style check", + "format": "eslint --fix . && prettier --write .", + "lint": "eslint . && prettier --check .", "typecheck": "tsc --noEmit", - "lint:staged": "d2-style check --staged", "test": "d2-app-scripts test", "start": "yarn workspace ui-storybook start", "start:docs": "yarn workspace ui-docusaurus start" @@ -61,6 +59,8 @@ "@dhis2/cli-app-scripts": "^12.11.3", "@dhis2/cli-style": "10.4.2", "@dhis2/cli-utils-docsite": "^3.1.2", + "@dhis2/config-eslint": "^0.2.2", + "@dhis2/config-prettier": "^0.2.2", "@dhis2/cypress-commands": "^10.0.5", "@dhis2/cypress-plugins": "^10.0.5", "@manypkg/cli": "^0.18.0", @@ -78,9 +78,11 @@ "concurrently": "^6.2.1", "cypress": "^13.8.0", "enzyme": "^3.11.0", + "eslint": "^9", "execa": "^5.1.1", "fast-glob": "^3.2.7", "find-up": "^5.0.0", + "prettier": "^3", "react-dev-utils": "^10.2.1", "react-docgen": "^5.4.0", "rimraf": "^3.0.2", diff --git a/scripts/build-world.sh b/scripts/build-world.sh index b9fe4e726e..f9e333460d 100755 --- a/scripts/build-world.sh +++ b/scripts/build-world.sh @@ -17,6 +17,6 @@ yarn workspace ui-storybook build || echo "::warning::storybook build failed (no set -e -# If there are changes to files after we built, we need to run them -# through d2-style to avoid style-based diffs. -git diff --name-only -z | xargs -r0 yarn d2-style apply +# Format whatever the build regenerated, so it leaves no style diff. +git diff --name-only -z | xargs -r0 yarn eslint --fix --no-error-on-unmatched-pattern +git diff --name-only -z | xargs -r0 yarn prettier --write --ignore-unknown diff --git a/yarn.lock b/yarn.lock index d5787aa97c..a05cfdf968 100644 --- a/yarn.lock +++ b/yarn.lock @@ -487,7 +487,7 @@ dependencies: "@babel/types" "^7.26.0" -"@babel/parser@^7.25.9", "@babel/parser@^7.26.2", "@babel/parser@^7.29.8": +"@babel/parser@^7.24.4", "@babel/parser@^7.25.9", "@babel/parser@^7.26.2", "@babel/parser@^7.29.8": version "7.29.8" resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.29.8.tgz#9653716a2f10c677b98fbc63d4bfb000c302cf17" integrity sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA== @@ -2190,6 +2190,28 @@ react-docgen "^6.0.0-alpha.0" url-join "^4.0.1" +"@dhis2/config-eslint@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@dhis2/config-eslint/-/config-eslint-0.2.2.tgz#340d08e05b7011d666212fc56b3ae3593fc392ae" + integrity sha512-fgo03MdLRCiZueJXYNz5a1NWdtxFMqIm4+LcbFf0eOeOg3Yh9gAgmSeGEFls+pe/WqpjRZVnlRmh0LzSLQuf/g== + dependencies: + "@eslint/compat" "^2.0.0" + "@eslint/eslintrc" "^3.3.1" + "@eslint/js" "^9.39.1" + "@typescript-eslint/parser" "^8.48.0" + eslint-config-prettier "^10.1.8" + eslint-plugin-import "^2.32.0" + eslint-plugin-react "^7.37.5" + eslint-plugin-react-hooks "^7.0.1" + globals "^16.5.0" + typescript "^5.9.3" + typescript-eslint "^8.48.0" + +"@dhis2/config-prettier@^0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@dhis2/config-prettier/-/config-prettier-0.2.2.tgz#2bf8d2b37657d89bf19b12fe6b32981440cb9059" + integrity sha512-2r0lfD3sUZa2WYYIyi76XyDmI5hemP1Yaz9bfjKBvEW4kQFAnQcf+d1lB0i97+Jnj17TtfMABLjQZgWdhXK6LA== + "@dhis2/cypress-commands@^10.0.5": version "10.0.6" resolved "https://registry.npmjs.org/@dhis2/cypress-commands/-/cypress-commands-10.0.6.tgz" @@ -3028,11 +3050,60 @@ dependencies: eslint-visitor-keys "^3.3.0" +"@eslint-community/eslint-utils@^4.8.0", "@eslint-community/eslint-utils@^4.9.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.10.1.tgz#8911bd72b2c3640a543609e0400b8c4d2e7e7cb6" + integrity sha512-cuadcxVFE8sDK6iWJbs8Sn0av2Nrh2QSGQhVlBW9AaAHqHwjWsZHT8LJ4hFGPh7ASBV2deFdM7H/DPjulmh8rg== + dependencies: + eslint-visitor-keys "^3.4.3" + +"@eslint-community/regexpp@^4.12.1", "@eslint-community/regexpp@^4.12.2": + version "4.12.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.12.2.tgz#bccdf615bcf7b6e8db830ec0b8d21c9a25de597b" + integrity sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew== + "@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": version "4.11.0" resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.11.0.tgz#b0ffd0312b4a3fd2d6f77237e7248a5ad3a680ae" integrity sha512-G/M/tIiMrTAxEWRfLfQJMmGNX28IxBg4PBz8XqQhqUHLFI6TL2htpIB1iQCj144V5ee/JaKyT9/WZ0MGZWfA7A== +"@eslint/compat@^2.0.0": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@eslint/compat/-/compat-2.1.1.tgz#0284d648b62c44f7653804d615d2b4b3b8eaeef1" + integrity sha512-rMcy8GSrwNzcISX/BlTDY/GLB4eCopEuy9woIls3To+15OLxykZrxxq+WUcylCPCQ6F4MujjBM1DX5V1aqI3Vw== + dependencies: + "@eslint/core" "^1.2.1" + +"@eslint/config-array@^0.21.2": + version "0.21.2" + resolved "https://registry.yarnpkg.com/@eslint/config-array/-/config-array-0.21.2.tgz#f29e22057ad5316cf23836cee9a34c81fffcb7e6" + integrity sha512-nJl2KGTlrf9GjLimgIru+V/mzgSK0ABCDQRvxw5BjURL7WfH5uoWmizbH7QB6MmnMBd8cIC9uceWnezL1VZWWw== + dependencies: + "@eslint/object-schema" "^2.1.7" + debug "^4.3.1" + minimatch "^3.1.5" + +"@eslint/config-helpers@^0.4.2": + version "0.4.2" + resolved "https://registry.yarnpkg.com/@eslint/config-helpers/-/config-helpers-0.4.2.tgz#1bd006ceeb7e2e55b2b773ab318d300e1a66aeda" + integrity sha512-gBrxN88gOIf3R7ja5K9slwNayVcZgK6SOUORm2uBzTeIEfeVaIhOpCtTox3P6R7o2jLFwLFTLnC7kU/RGcYEgw== + dependencies: + "@eslint/core" "^0.17.0" + +"@eslint/core@^0.17.0": + version "0.17.0" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-0.17.0.tgz#77225820413d9617509da9342190a2019e78761c" + integrity sha512-yL/sLrpmtDaFEiUj1osRP4TI2MDz1AddJL+jZ7KSqvBuliN4xqYY54IfdN8qD8Toa6g1iloph1fxQNkjOxrrpQ== + dependencies: + "@types/json-schema" "^7.0.15" + +"@eslint/core@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@eslint/core/-/core-1.2.1.tgz#c1da7cd1b82fa8787f98b5629fb811848a1b63ce" + integrity sha512-MwcE1P+AZ4C6DWlpin/OmOA54mmIZ/+xZuJiQd4SyB29oAJjN30UW9wkKNptW2ctp4cEsvhlLY/CsQ1uoHDloQ== + dependencies: + "@types/json-schema" "^7.0.15" + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz" @@ -3063,11 +3134,44 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^3.3.1", "@eslint/eslintrc@^3.3.6": + version "3.3.7" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-3.3.7.tgz#76d3dedec4a30ea32df797bf8a0085c1311b7316" + integrity sha512-F42g89Qd5oAWtp0k0nnSrjziAKza7w8SVT4mStc18LZMaRb4J1HQAHLCalEtDCxrTuksx7NU9qsmeLwpOfPqWw== + dependencies: + ajv "^6.14.0" + debug "^4.3.2" + espree "^10.0.1" + globals "^14.0.0" + ignore "^5.2.0" + import-fresh "^3.2.1" + js-yaml "^4.3.2" + minimatch "^3.1.5" + strip-json-comments "^3.1.1" + "@eslint/js@8.57.0": version "8.57.0" resolved "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz" integrity sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g== +"@eslint/js@9.39.5", "@eslint/js@^9.39.1": + version "9.39.5" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-9.39.5.tgz#6f2fbcff75500d229d535e0a949ae13472c84787" + integrity sha512-QywQuszQh77pIXCsq998c8hbhSTI/azTty1Z6N53dmAudKHhy573j3yvRLsX2BSp8YpLtoCEG8E9DJe+8zUh4A== + +"@eslint/object-schema@^2.1.7": + version "2.1.7" + resolved "https://registry.yarnpkg.com/@eslint/object-schema/-/object-schema-2.1.7.tgz#6e2126a1347e86a4dedf8706ec67ff8e107ebbad" + integrity sha512-VtAOaymWVfZcmZbp6E2mympDIHvyjXs/12LqWYjVw6qjrfF+VK+fyG33kChz3nnK+SU5/NeHOqrTEHS8sXO3OA== + +"@eslint/plugin-kit@^0.4.1": + version "0.4.1" + resolved "https://registry.yarnpkg.com/@eslint/plugin-kit/-/plugin-kit-0.4.1.tgz#9779e3fd9b7ee33571a57435cf4335a1794a6cb2" + integrity sha512-43/qtrDUokr7LJqoF2c3+RInu/t4zfrpYdoSDfYyhg52rwLV6TnOvdG4fXm7IkSB3wErkcmJS9iEhjVtOSEjjA== + dependencies: + "@eslint/core" "^0.17.0" + levn "^0.4.1" + "@fontsource/roboto@^4.5.0": version "4.5.8" resolved "https://registry.npmjs.org/@fontsource/roboto/-/roboto-4.5.8.tgz" @@ -3085,6 +3189,27 @@ dependencies: "@hapi/hoek" "^9.0.0" +"@humanfs/core@^0.19.2": + version "0.19.2" + resolved "https://registry.yarnpkg.com/@humanfs/core/-/core-0.19.2.tgz#a8272ca03b2acf492670222b2320b6c421bfde60" + integrity sha512-UhXNm+CFMWcbChXywFwkmhqjs3PRCmcSa/hfBgLIb7oQ5HNb1wS0icWsGtSAUNgefHeI+eBrA8I1fxmbHsGdvA== + dependencies: + "@humanfs/types" "^0.15.0" + +"@humanfs/node@^0.16.6": + version "0.16.8" + resolved "https://registry.yarnpkg.com/@humanfs/node/-/node-0.16.8.tgz#8f800cccc13f4f8cd3116e2d9c0a94939da3e3ed" + integrity sha512-gE1eQNZ3R++kTzFUpdGlpmy8kDZD/MLyHqDwqjkVQI0JMdI1D51sy1H958PNXYkM2rAac7e5/CnIKZrHtPh3BQ== + dependencies: + "@humanfs/core" "^0.19.2" + "@humanfs/types" "^0.15.0" + "@humanwhocodes/retry" "^0.4.0" + +"@humanfs/types@^0.15.0": + version "0.15.0" + resolved "https://registry.yarnpkg.com/@humanfs/types/-/types-0.15.0.tgz#f2a09f62012390b2bff3fc6fb248ddec8c09a090" + integrity sha512-ZZ1w0aoQkwuUuC7Yf+7sdeaNfqQiiLcSRbfI08oAxqLtpXQr9AIVX7Ay7HLDuiLYAaFPu8oBYNq/QIi9URHJ3Q== + "@humanwhocodes/config-array@^0.11.14": version "0.11.14" resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz" @@ -3118,6 +3243,11 @@ resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@humanwhocodes/retry@^0.4.0", "@humanwhocodes/retry@^0.4.2": + version "0.4.3" + resolved "https://registry.yarnpkg.com/@humanwhocodes/retry/-/retry-0.4.3.tgz#c2b9d2e374ee62c586d3adbea87199b1d7a7a6ba" + integrity sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ== + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz" @@ -3838,6 +3968,11 @@ resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.2.tgz#3671ce3f9b928d5c01f879792d5c0b60ae14d4ad" integrity sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA== +"@rtsao/scc@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@rtsao/scc/-/scc-1.1.0.tgz#927dd2fae9bc3361403ac2c7a00c32ddce9ad7e8" + integrity sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g== + "@rushstack/eslint-patch@^1.1.0": version "1.10.4" resolved "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.10.4.tgz" @@ -4639,7 +4774,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@1.0.9", "@types/estree@^1.0.0", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@1.0.9", "@types/estree@^1.0.0", "@types/estree@^1.0.5", "@types/estree@^1.0.6": version "1.0.9" resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.9.tgz#cf3f0e876d7bee15a93ab925b82bf570a3904a24" integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== @@ -4745,7 +4880,7 @@ jest-matcher-utils "^27.0.0" pretty-format "^27.0.0" -"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": +"@types/json-schema@*", "@types/json-schema@^7.0.15", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": version "7.0.15" resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz" integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== @@ -5045,6 +5180,20 @@ dependencies: "@types/node" "*" +"@typescript-eslint/eslint-plugin@8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.70.0.tgz#59f635c74dd1e2bffb6aecbda557b24dadffd3dc" + integrity sha512-/v8HZt6RlyIZxB3ntehELOcUcfxKPVGWXnQdJuHRmzrqgF8nQypcC/oxGW+Ot4VGKDq81XugPKxx0n5PBtf9PA== + dependencies: + "@eslint-community/regexpp" "^4.12.2" + "@typescript-eslint/scope-manager" "8.70.0" + "@typescript-eslint/type-utils" "8.70.0" + "@typescript-eslint/utils" "8.70.0" + "@typescript-eslint/visitor-keys" "8.70.0" + ignore "^7.0.5" + natural-compare "^1.4.0" + ts-api-utils "^2.5.0" + "@typescript-eslint/eslint-plugin@^5.5.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" @@ -5068,6 +5217,17 @@ dependencies: "@typescript-eslint/utils" "5.62.0" +"@typescript-eslint/parser@8.70.0", "@typescript-eslint/parser@^8.48.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-8.70.0.tgz#96ce2de96c06c8442fea1a8f7b07855a56b3c5e3" + integrity sha512-zYvrmj9Yxd63UGaXw+kdt6A0F0s0qveJyuatIM77bYC2DE4pgmg7a50u8LR7PRtXd0x+h+Tl3eXabGm06SWd3Q== + dependencies: + "@typescript-eslint/scope-manager" "8.70.0" + "@typescript-eslint/types" "8.70.0" + "@typescript-eslint/typescript-estree" "8.70.0" + "@typescript-eslint/visitor-keys" "8.70.0" + debug "^4.4.3" + "@typescript-eslint/parser@^5.5.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" @@ -5089,6 +5249,15 @@ "@typescript-eslint/visitor-keys" "7.18.0" debug "^4.3.4" +"@typescript-eslint/project-service@8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/project-service/-/project-service-8.70.0.tgz#a62e837362f26c604ad15b20bacce1c3f4d6b552" + integrity sha512-hFHbTNqhU9G+2eKFXCBVb1tjFT/LceiJ4+HfLO4pTpDI0KHi6iajpcFFkaSQ9gXmCh7n82A0PthaayEdN6mspQ== + dependencies: + "@typescript-eslint/tsconfig-utils" "^8.70.0" + "@typescript-eslint/types" "^8.70.0" + debug "^4.4.3" + "@typescript-eslint/scope-manager@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" @@ -5105,6 +5274,19 @@ "@typescript-eslint/types" "7.18.0" "@typescript-eslint/visitor-keys" "7.18.0" +"@typescript-eslint/scope-manager@8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-8.70.0.tgz#b77628b03c9c56ef21fb5a6bc2f4a4335163b999" + integrity sha512-8nP3Kwh5hlgZ4FicGvmznAmJe8UL4sdU8tLukrPaMuQmDuk4Y8xYfzu/aYZW4xT2JCgc7H/TpDI5cGlxcWJSqQ== + dependencies: + "@typescript-eslint/types" "8.70.0" + "@typescript-eslint/visitor-keys" "8.70.0" + +"@typescript-eslint/tsconfig-utils@8.70.0", "@typescript-eslint/tsconfig-utils@^8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.70.0.tgz#f583ca72159c4fd8e775c153da3241de6b77974f" + integrity sha512-adnkeeNq9Sq1sUf4+FRVc0KdgYghzsgFpZSQVZVvY0LCuUuN0FnQgyGzCJeC4fW1cdXseBAjU2EOqUIjbNcZUw== + "@typescript-eslint/type-utils@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" @@ -5115,6 +5297,17 @@ debug "^4.3.4" tsutils "^3.21.0" +"@typescript-eslint/type-utils@8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-8.70.0.tgz#7f9c01c24e56bfad2a089167926c7cdded9de5f6" + integrity sha512-NUMKIhYVaVIVLnRL9CRt+VVcuLgSHUCpXn4/+K8wql+vdInUzvx8BjUO1oJ7cG9shjFJKtF8F8Hh2kCh3/KBVw== + dependencies: + "@typescript-eslint/types" "8.70.0" + "@typescript-eslint/typescript-estree" "8.70.0" + "@typescript-eslint/utils" "8.70.0" + debug "^4.4.3" + ts-api-utils "^2.5.0" + "@typescript-eslint/types@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" @@ -5125,6 +5318,11 @@ resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-7.18.0.tgz#b90a57ccdea71797ffffa0321e744f379ec838c9" integrity sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ== +"@typescript-eslint/types@8.70.0", "@typescript-eslint/types@^8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-8.70.0.tgz#9ee52888cdeca604fe9436935219b967fa7f6053" + integrity sha512-asTOIYhDg4zdzOScCyaytrsV3cR6B4ecPQlXw/dJIm7J/MZTtCtfVII9JD8Geh4jTCrK/Xe6cg5UevoleMcoJQ== + "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz" @@ -5152,6 +5350,21 @@ semver "^7.6.0" ts-api-utils "^1.3.0" +"@typescript-eslint/typescript-estree@8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-8.70.0.tgz#79cfcd9678ee28ea69cc13032c0f89bb1d298917" + integrity sha512-d9NmHMPEKQ7QCLLm1jI3zmoQBwT5KwFYjXBJ9ymZfKCUU+5rmTRykKAFvH5Qn/ZCds3CEAFS9OC9M/jkl0X2bA== + dependencies: + "@typescript-eslint/project-service" "8.70.0" + "@typescript-eslint/tsconfig-utils" "8.70.0" + "@typescript-eslint/types" "8.70.0" + "@typescript-eslint/visitor-keys" "8.70.0" + debug "^4.4.3" + minimatch "^10.2.2" + semver "^7.7.3" + tinyglobby "^0.2.15" + ts-api-utils "^2.5.0" + "@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.58.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" @@ -5166,6 +5379,16 @@ eslint-scope "^5.1.1" semver "^7.3.7" +"@typescript-eslint/utils@8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-8.70.0.tgz#78a78b4c52dd8523e5321993cb46ebe6d7934510" + integrity sha512-oZmtKJz/4fufZ2p3+Cn3ijEojcdfR+1zYDH2xKYrEly0dR/Q/1xUPRCOlKGxod78nWlU2UnDe09GZ3TaknBFGA== + dependencies: + "@eslint-community/eslint-utils" "^4.9.1" + "@typescript-eslint/scope-manager" "8.70.0" + "@typescript-eslint/types" "8.70.0" + "@typescript-eslint/typescript-estree" "8.70.0" + "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" @@ -5182,6 +5405,14 @@ "@typescript-eslint/types" "7.18.0" eslint-visitor-keys "^3.4.3" +"@typescript-eslint/visitor-keys@8.70.0": + version "8.70.0" + resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-8.70.0.tgz#b451c8aea76dc97fc768b8d9d7f61019bf789628" + integrity sha512-BoC8PiO4Hkdo0TVJh9Ntxr5MxPDI7/oFsrygN5ADelFSeXG/qgNuucIGA+L5Z6JpPTE/uRfcTWtscjbUaufepQ== + dependencies: + "@typescript-eslint/types" "8.70.0" + eslint-visitor-keys "^5.0.0" + "@ungap/structured-clone@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz" @@ -5442,6 +5673,11 @@ acorn@^8.0.4, acorn@^8.11.0, acorn@^8.12.1, acorn@^8.2.4, acorn@^8.7.1, acorn@^8 resolved "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz" integrity sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg== +acorn@^8.15.0: + version "8.18.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.18.0.tgz#4faf01b2d6d326bfeed97aea1f52220b5f4c1940" + integrity sha512-lGq+9yr1/GuAWaVYIHRjvvySG5/4VfKIvC8EWxStPdcDh/Ka7FG3twP6v4d5BkravUilhIAsG4Qj83t02LWUPQ== + address@1.1.2: version "1.1.2" resolved "https://registry.npmjs.org/address/-/address-1.1.2.tgz" @@ -5504,6 +5740,16 @@ ajv@^6.10.0, ajv@^6.12.2, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ajv@^6.14.0: + version "6.15.0" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.15.0.tgz#07e982c74626167aa7a2495c53817892d7139492" + integrity sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw== + dependencies: + fast-deep-equal "^3.1.1" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.4.1" + uri-js "^4.2.2" + ajv@^8.0.0, ajv@^8.0.1, ajv@^8.6.0, ajv@^8.9.0: version "8.17.1" resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" @@ -5803,6 +6049,20 @@ array-includes@^3.1.6, array-includes@^3.1.7, array-includes@^3.1.8: get-intrinsic "^1.2.4" is-string "^1.0.7" +array-includes@^3.1.9: + version "3.2.0" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.2.0.tgz#18771e6837351aa139c3b58873371d0afa64964a" + integrity sha512-VXY5eFRarnXcYxwBjJzPmEhH55+rmP79/+ueDhi0F+TuqfHCItagIHqxeUZrmgrOPa31QTh9H85DjX3FfJ0FTg== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.2" + es-object-atoms "^1.1.2" + es-shim-unscopables "^1.1.0" + is-string "^1.1.1" + math-intrinsics "^1.1.0" + array-union@^1.0.1, array-union@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" @@ -5861,6 +6121,19 @@ array.prototype.findlastindex@^1.2.3: es-object-atoms "^1.0.0" es-shim-unscopables "^1.0.2" +array.prototype.findlastindex@^1.2.6: + version "1.2.6" + resolved "https://registry.yarnpkg.com/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.6.tgz#cfa1065c81dcb64e34557c9b81d012f6a421c564" + integrity sha512-F/TKATkzseUExPlfvmwQKGITM3DGTK+vkAsCZoDc5daVygbJBnjEUCbgkAvVFsgfXfX4YIqZ/27G3k3tdXrTxQ== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.23.9" + es-errors "^1.3.0" + es-object-atoms "^1.1.1" + es-shim-unscopables "^1.1.0" + array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1, array.prototype.flat@^1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz" @@ -5871,6 +6144,16 @@ array.prototype.flat@^1.2.3, array.prototype.flat@^1.3.1, array.prototype.flat@^ es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" +array.prototype.flat@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flat/-/array.prototype.flat-1.3.3.tgz#534aaf9e6e8dd79fb6b9a9917f839ef1ec63afe5" + integrity sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + array.prototype.flatmap@^1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz" @@ -5881,6 +6164,16 @@ array.prototype.flatmap@^1.3.2: es-abstract "^1.22.1" es-shim-unscopables "^1.0.0" +array.prototype.flatmap@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/array.prototype.flatmap/-/array.prototype.flatmap-1.3.3.tgz#712cc792ae70370ae40586264629e33aab5dd38b" + integrity sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg== + dependencies: + call-bind "^1.0.8" + define-properties "^1.2.1" + es-abstract "^1.23.5" + es-shim-unscopables "^1.0.2" + array.prototype.reduce@^1.0.6: version "1.0.7" resolved "https://registry.npmjs.org/array.prototype.reduce/-/array.prototype.reduce-1.0.7.tgz" @@ -6547,6 +6840,13 @@ brace-expansion@^5.0.5: dependencies: balanced-match "^4.0.2" +brace-expansion@^5.0.8: + version "5.0.9" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-5.0.9.tgz#7c72438809b5fa5babf54199a1f1c281a6984fcf" + integrity sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg== + dependencies: + balanced-match "^4.0.2" + braces@^2.3.1, braces@^2.3.2: version "2.3.2" resolved "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz" @@ -9043,6 +9343,28 @@ es-iterator-helpers@^1.0.19: iterator.prototype "^1.1.2" safe-array-concat "^1.1.2" +es-iterator-helpers@^1.2.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/es-iterator-helpers/-/es-iterator-helpers-1.4.0.tgz#2b4635ee3e8db2285378a47a1ea8f8dd34adb653" + integrity sha512-c/A0P0oxkACDc+cKWw8evLXK83oBKgn0qPOqCYT4x9uolpCIJAcYvJC9QYKNDRPsTeGyCrQ326jrvgZWdCdK5Q== + dependencies: + call-bind "^1.0.9" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-abstract "^1.24.2" + es-errors "^1.3.0" + es-set-tostringtag "^2.1.0" + function-bind "^1.1.2" + get-intrinsic "^1.3.0" + globalthis "^1.0.4" + gopd "^1.2.0" + has-property-descriptors "^1.0.2" + has-proto "^1.2.0" + has-symbols "^1.1.0" + internal-slot "^1.1.0" + iterator.prototype "^1.1.5" + math-intrinsics "^1.1.0" + es-module-lexer@^1.2.1, es-module-lexer@^1.5.0, es-module-lexer@^1.5.4: version "1.5.4" resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz" @@ -9072,6 +9394,13 @@ es-shim-unscopables@^1.0.0, es-shim-unscopables@^1.0.2: dependencies: hasown "^2.0.0" +es-shim-unscopables@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.1.0.tgz#438df35520dac5d105f3943d927549ea3b00f4b5" + integrity sha512-d9T8ucsEhh8Bi1woXCf+TIKDIROLG5WCkxg8geBCbvk22kzwC5G2OnXVMO6FUsvQlgUUXQ2itephWDLqDzbeCw== + dependencies: + hasown "^2.0.2" + es-to-primitive@^1.3.0: version "1.3.4" resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.4.tgz#0c854291cf0d7b439d6b9e5771ea837ffaf1f991" @@ -9237,6 +9566,11 @@ escodegen@^2.0.0: optionalDependencies: source-map "~0.6.1" +eslint-config-prettier@^10.1.8: + version "10.1.8" + resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-10.1.8.tgz#15734ce4af8c2778cc32f0b01b37b0b5cd1ecb97" + integrity sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w== + eslint-config-prettier@^8.3.0: version "8.10.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" @@ -9271,6 +9605,13 @@ eslint-import-resolver-node@^0.3.9: is-core-module "^2.13.0" resolve "^1.22.4" +eslint-module-utils@^2.12.1: + version "2.14.0" + resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.14.0.tgz#611f8e1c6ceb29a93eb949e1cc670b8287764819" + integrity sha512-W2WCRZ9Dqntd+2u8jJcVMV2PKulc6RdLgUUoh/yQr3uB6lo/ZOeGx11sv60/8S4QFFKNslAlWhr9u0Ef7ZW6Ig== + dependencies: + debug "^3.2.7" + eslint-module-utils@^2.8.0: version "2.8.1" resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.1.tgz" @@ -9309,6 +9650,31 @@ eslint-plugin-import@^2.22.1, eslint-plugin-import@^2.25.3: semver "^6.3.1" tsconfig-paths "^3.15.0" +eslint-plugin-import@^2.32.0: + version "2.32.0" + resolved "https://registry.yarnpkg.com/eslint-plugin-import/-/eslint-plugin-import-2.32.0.tgz#602b55faa6e4caeaa5e970c198b5c00a37708980" + integrity sha512-whOE1HFo/qJDyX4SnXzP4N6zOWn79WhnCUY/iDR0mPfQZO8wcYE4JClzI2oZrhBnnMUCBCHZhO6VQyoBU95mZA== + dependencies: + "@rtsao/scc" "^1.1.0" + array-includes "^3.1.9" + array.prototype.findlastindex "^1.2.6" + array.prototype.flat "^1.3.3" + array.prototype.flatmap "^1.3.3" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.9" + eslint-module-utils "^2.12.1" + hasown "^2.0.2" + is-core-module "^2.16.1" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.8" + object.groupby "^1.0.3" + object.values "^1.2.1" + semver "^6.3.1" + string.prototype.trimend "^1.0.9" + tsconfig-paths "^3.15.0" + eslint-plugin-jest@^25.3.0: version "25.7.0" resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-25.7.0.tgz" @@ -9343,6 +9709,17 @@ eslint-plugin-react-hooks@^4.3.0: resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz" integrity sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ== +eslint-plugin-react-hooks@^7.0.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-7.1.1.tgz#e6742cad75d970c0a3f30d7d3fa80a4784f55927" + integrity sha512-f2I7Gw6JbvCexzIInuSbZpfdQ44D7iqdWX01FKLvrPgqxoE7oMj8clOfto8U6vYiz4yd5oKu39rRSVOe1zRu0g== + dependencies: + "@babel/core" "^7.24.4" + "@babel/parser" "^7.24.4" + hermes-parser "^0.25.1" + zod "^3.25.0 || ^4.0.0" + zod-validation-error "^3.5.0 || ^4.0.0" + eslint-plugin-react@^7.26.0, eslint-plugin-react@^7.27.1: version "7.35.0" resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.35.0.tgz" @@ -9367,6 +9744,30 @@ eslint-plugin-react@^7.26.0, eslint-plugin-react@^7.27.1: string.prototype.matchall "^4.0.11" string.prototype.repeat "^1.0.0" +eslint-plugin-react@^7.37.5: + version "7.37.5" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.37.5.tgz#2975511472bdda1b272b34d779335c9b0e877065" + integrity sha512-Qteup0SqU15kdocexFNAJMvCJEfa2xUKNV4CC1xsVMrIIqEy3SQ/rqyxCWNzfrd3/ldy6HMlD2e0JDVpDg2qIA== + dependencies: + array-includes "^3.1.8" + array.prototype.findlast "^1.2.5" + array.prototype.flatmap "^1.3.3" + array.prototype.tosorted "^1.1.4" + doctrine "^2.1.0" + es-iterator-helpers "^1.2.1" + estraverse "^5.3.0" + hasown "^2.0.2" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.9" + object.fromentries "^2.0.8" + object.values "^1.2.1" + prop-types "^15.8.1" + resolve "^2.0.0-next.5" + semver "^6.3.1" + string.prototype.matchall "^4.0.12" + string.prototype.repeat "^1.0.0" + eslint-plugin-testing-library@^5.0.1: version "5.11.1" resolved "https://registry.npmjs.org/eslint-plugin-testing-library/-/eslint-plugin-testing-library-5.11.1.tgz" @@ -9390,6 +9791,14 @@ eslint-scope@^7.2.2: esrecurse "^4.3.0" estraverse "^5.2.0" +eslint-scope@^8.4.0: + version "8.4.0" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-8.4.0.tgz#88e646a207fad61436ffa39eb505147200655c82" + integrity sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + eslint-utils@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz" @@ -9412,6 +9821,16 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== +eslint-visitor-keys@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz#4cfea60fe7dd0ad8e816e1ed026c1d5251b512c1" + integrity sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ== + +eslint-visitor-keys@^5.0.0: + version "5.0.1" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-5.0.1.tgz#9e3c9489697824d2d4ce3a8ad12628f91e9f59be" + integrity sha512-tD40eHxA35h0PEIZNeIjkHoDR4YjjJp34biM0mDvplBe//mB+IHCqHDGV7pxF+7MklTvighcCPPZC7ynWyjdTA== + eslint-webpack-plugin@^3.1.1: version "3.2.0" resolved "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-3.2.0.tgz" @@ -9513,6 +9932,55 @@ eslint@^8.3.0: strip-ansi "^6.0.1" text-table "^0.2.0" +eslint@^9: + version "9.39.5" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-9.39.5.tgz#2a4e3c8b0f753196efae943c8ffaa8730fc6a3fa" + integrity sha512-DgZS62aPLXKlnxILS/AYCoRvHaZeXceIzlXPkkGGzJWSow1aEk0lbTlxUSlyjC8jcaKxAdOnTDz+o1JFSBsyjw== + dependencies: + "@eslint-community/eslint-utils" "^4.8.0" + "@eslint-community/regexpp" "^4.12.1" + "@eslint/config-array" "^0.21.2" + "@eslint/config-helpers" "^0.4.2" + "@eslint/core" "^0.17.0" + "@eslint/eslintrc" "^3.3.6" + "@eslint/js" "9.39.5" + "@eslint/plugin-kit" "^0.4.1" + "@humanfs/node" "^0.16.6" + "@humanwhocodes/module-importer" "^1.0.1" + "@humanwhocodes/retry" "^0.4.2" + "@types/estree" "^1.0.6" + ajv "^6.14.0" + chalk "^4.0.0" + cross-spawn "^7.0.6" + debug "^4.3.2" + escape-string-regexp "^4.0.0" + eslint-scope "^8.4.0" + eslint-visitor-keys "^4.2.1" + espree "^10.4.0" + esquery "^1.5.0" + esutils "^2.0.2" + fast-deep-equal "^3.1.3" + file-entry-cache "^8.0.0" + find-up "^5.0.0" + glob-parent "^6.0.2" + ignore "^5.2.0" + imurmurhash "^0.1.4" + is-glob "^4.0.0" + json-stable-stringify-without-jsonify "^1.0.1" + lodash.merge "^4.6.2" + minimatch "^3.1.5" + natural-compare "^1.4.0" + optionator "^0.9.3" + +espree@^10.0.1, espree@^10.4.0: + version "10.4.0" + resolved "https://registry.yarnpkg.com/espree/-/espree-10.4.0.tgz#d54f4949d4629005a1fa168d937c3ff1f7e2a837" + integrity sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ== + dependencies: + acorn "^8.15.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^4.2.1" + espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz" @@ -9553,6 +10021,13 @@ esquery@^1.4.0, esquery@^1.4.2: dependencies: estraverse "^5.1.0" +esquery@^1.5.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.7.0.tgz#08d048f261f0ddedb5bae95f46809463d9c9496d" + integrity sha512-Ap6G0WQwcU/LHsvLwON1fAQX9Zp0A2Y6Y/cJBl9r/JbW90Zyg4/zbG6zzKa2OTALELarYHmKu0GhpM5EO+7T0g== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" @@ -9957,6 +10432,11 @@ fd-slicer@~1.1.0: dependencies: pend "~1.2.0" +fdir@^6.5.0: + version "6.5.0" + resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350" + integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg== + feed@^4.2.2: version "4.2.2" resolved "https://registry.npmjs.org/feed/-/feed-4.2.2.tgz" @@ -9978,6 +10458,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +file-entry-cache@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-8.0.0.tgz#7787bddcf1131bffb92636c69457bbc0edd6d81f" + integrity sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ== + dependencies: + flat-cache "^4.0.0" + file-loader@^6.2.0: version "6.2.0" resolved "https://registry.npmjs.org/file-loader/-/file-loader-6.2.0.tgz" @@ -10131,6 +10618,14 @@ flat-cache@^3.0.4: keyv "^4.5.3" rimraf "^3.0.2" +flat-cache@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-4.0.1.tgz#0ece39fcb14ee012f4b0410bd33dd9c1f011127c" + integrity sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw== + dependencies: + flatted "^3.2.9" + keyv "^4.5.4" + flat@^5.0.2: version "5.0.2" resolved "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz" @@ -10449,7 +10944,7 @@ get-package-type@^0.1.0: resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== -get-proto@^1.0.1: +get-proto@^1.0.0, get-proto@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1" integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g== @@ -10681,6 +11176,16 @@ globals@^13.19.0, globals@^13.6.0, globals@^13.9.0: dependencies: type-fest "^0.20.2" +globals@^14.0.0: + version "14.0.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-14.0.0.tgz#898d7413c29babcf6bafe56fcadded858ada724e" + integrity sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ== + +globals@^16.5.0: + version "16.5.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-16.5.0.tgz#ccf1594a437b97653b2be13ed4d8f5c9f850cac1" + integrity sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ== + globalthis@^1.0.3, globalthis@^1.0.4: version "1.0.4" resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz" @@ -11044,6 +11549,18 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +hermes-estree@0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.25.1.tgz#6aeec17d1983b4eabf69721f3aa3eb705b17f480" + integrity sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw== + +hermes-parser@^0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/hermes-parser/-/hermes-parser-0.25.1.tgz#5be0e487b2090886c62bd8a11724cd766d5f54d1" + integrity sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA== + dependencies: + hermes-estree "0.25.1" + history@^4.9.0: version "4.10.1" resolved "https://registry.npmjs.org/history/-/history-4.10.1.tgz" @@ -11400,6 +11917,11 @@ ignore@^5.2.0, ignore@^5.2.4: resolved "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz" integrity sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw== +ignore@^7.0.5: + version "7.0.9" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-7.0.9.tgz#475b2197ade916edab05ade35c691518e8543382" + integrity sha512-brTTsvFRt5C1gGHtPst/281UjPD5t9fBqbgoMPlVWy11ZLTPfu7HxK4ZYqO9H7o/yC9rSTCI85EaQ4OoY12qYw== + image-size@^1.0.1: version "1.1.1" resolved "https://registry.npmjs.org/image-size/-/image-size-1.1.1.tgz" @@ -12178,6 +12700,18 @@ iterator.prototype@^1.1.2: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" +iterator.prototype@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/iterator.prototype/-/iterator.prototype-1.1.5.tgz#12c959a29de32de0aa3bbbb801f4d777066dae39" + integrity sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g== + dependencies: + define-data-property "^1.1.4" + es-object-atoms "^1.0.0" + get-intrinsic "^1.2.6" + get-proto "^1.0.0" + has-symbols "^1.1.0" + set-function-name "^2.0.2" + jackspeak@^3.1.2: version "3.4.3" resolved "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz" @@ -12749,6 +13283,13 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" +js-yaml@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.3.2.tgz#8e44fb14a2643c59726bb15787b5f1512cb3d3fb" + integrity sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA== + dependencies: + argparse "^2.0.1" + js2xmlparser@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/js2xmlparser/-/js2xmlparser-4.0.2.tgz" @@ -13019,7 +13560,7 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -keyv@^4.5.3: +keyv@^4.5.3, keyv@^4.5.4: version "4.5.4" resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz" integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw== @@ -13789,6 +14330,20 @@ minimatch@^10.1.1: dependencies: brace-expansion "^5.0.5" +minimatch@^10.2.2: + version "10.2.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.2.6.tgz#fd956bbe0b77241e9f15ac5dccb1c638060968ef" + integrity sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A== + dependencies: + brace-expansion "^5.0.8" + +minimatch@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.5.tgz#580c88f8d5445f2bd6aa8f3cadefa0de79fbd69e" + integrity sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w== + dependencies: + brace-expansion "^1.1.7" + minimatch@^5.0.1, minimatch@^5.1.0, minimatch@^5.1.6: version "5.1.9" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.9.tgz#1293ef15db0098b394540e8f9f744f9fda8dee4b" @@ -14254,6 +14809,16 @@ object.entries@^1.1.1, object.entries@^1.1.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +object.entries@^1.1.9: + version "1.1.9" + resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.9.tgz#e4770a6a1444afb61bd39f984018b5bede25f8b3" + integrity sha512-8u/hfXFRBD1O0hPUjioLhoWFHRmt6tKA4/vZPyckBr18l1KE9uHrFaFaUi8MDRTpi4uak2goyPTSNJLXX2k2Hw== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.4" + define-properties "^1.2.1" + es-object-atoms "^1.1.1" + object.fromentries@^2.0.7, object.fromentries@^2.0.8: version "2.0.8" resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz" @@ -14277,7 +14842,7 @@ object.getownpropertydescriptors@^2.1.0: gopd "^1.0.1" safe-array-concat "^1.1.2" -object.groupby@^1.0.1: +object.groupby@^1.0.1, object.groupby@^1.0.3: version "1.0.3" resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz" integrity sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ== @@ -14302,6 +14867,16 @@ object.values@^1.1.0, object.values@^1.1.1, object.values@^1.1.6, object.values@ define-properties "^1.2.1" es-object-atoms "^1.0.0" +object.values@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.2.1.tgz#deed520a50809ff7f75a7cfd4bc64c7a038c6216" + integrity sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA== + dependencies: + call-bind "^1.0.8" + call-bound "^1.0.3" + define-properties "^1.2.1" + es-object-atoms "^1.0.0" + objectorarray@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/objectorarray/-/objectorarray-1.0.5.tgz" @@ -14763,6 +15338,11 @@ picomatch@^4.0.2: resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.2.tgz#77c742931e8f3b8820946c76cd0c1f13730d1dab" integrity sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg== +picomatch@^4.0.4: + version "4.0.7" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-4.0.7.tgz#6313360034ccb36b3dc61ecbdff78121f90fe21f" + integrity sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA== + pify@^2.2.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" @@ -15454,6 +16034,11 @@ prettier@^2.1.2, prettier@^2.4.1: resolved "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz" integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q== +prettier@^3: + version "3.9.6" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.9.6.tgz#b3ea5146515d40fc53f18aa63f74dfab1e10dbf6" + integrity sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g== + prettier@^3.1.1: version "3.3.3" resolved "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz" @@ -17038,7 +17623,7 @@ semver@^7.2.1, semver@^7.3.2, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semve resolved "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz" integrity sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A== -semver@^7.6.0: +semver@^7.6.0, semver@^7.7.3: version "7.8.5" resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69" integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA== @@ -18420,6 +19005,14 @@ tiny-warning@^1.0.0: resolved "https://registry.npmjs.org/tiny-warning/-/tiny-warning-1.0.3.tgz" integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA== +tinyglobby@^0.2.15: + version "0.2.17" + resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.17.tgz#562a9a6c9eb2b3b123d39719f9af5bb44fcd7631" + integrity sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g== + dependencies: + fdir "^6.5.0" + picomatch "^4.0.4" + tmp@0.2.3, tmp@~0.2.3: version "0.2.3" resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" @@ -18581,6 +19174,11 @@ ts-api-utils@^1.3.0: resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-1.4.3.tgz#bfc2215fe6528fecab2b0fba570a2e8a4263b064" integrity sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw== +ts-api-utils@^2.5.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.5.0.tgz#4acd4a155e22734990a5ed1fe9e97f113bcb37c1" + integrity sha512-OJ/ibxhPlqrMM0UiNHJ/0CKQkoKF243/AEmplt3qpRgkW8VG7IfOS41h7V8TjITqdByHzrjcS/2si+y4lIh8NA== + ts-dedent@^2.0.0: version "2.2.0" resolved "https://registry.npmjs.org/ts-dedent/-/ts-dedent-2.2.0.tgz" @@ -18778,6 +19376,21 @@ typeface-roboto@^0.0.75: resolved "https://registry.npmjs.org/typeface-roboto/-/typeface-roboto-0.0.75.tgz" integrity sha512-VrR/IiH00Z1tFP4vDGfwZ1esNqTiDMchBEXYY9kilT6wRGgFoCAlgkEUMHb1E3mB0FsfZhv756IF0+R+SFPfdg== +typescript-eslint@^8.48.0: + version "8.70.0" + resolved "https://registry.yarnpkg.com/typescript-eslint/-/typescript-eslint-8.70.0.tgz#6c90c532079132ba7d4a386bf0882c56d82fe5af" + integrity sha512-P/W5cz70/cQAuKfY3xwQMWWTV7BvJ0mAQmi+9mBcsVPaBUpd6Ohpa+fECv9rBFrQcig86jAiNBFNWUqnTjr4pw== + dependencies: + "@typescript-eslint/eslint-plugin" "8.70.0" + "@typescript-eslint/parser" "8.70.0" + "@typescript-eslint/typescript-estree" "8.70.0" + "@typescript-eslint/utils" "8.70.0" + +typescript@^5.9.3: + version "5.9.3" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.9.3.tgz#5b4f59e15310ab17a216f5d6cf53ee476ede670f" + integrity sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw== + typescript@~5.5.4: version "5.5.4" resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.5.4.tgz#d9852d6c82bad2d2eda4fd74a5762a8f5909e9ba" @@ -20418,6 +21031,16 @@ zip-stream@^6.0.1: compress-commons "^6.0.2" readable-stream "^4.0.0" +"zod-validation-error@^3.5.0 || ^4.0.0": + version "4.0.2" + resolved "https://registry.yarnpkg.com/zod-validation-error/-/zod-validation-error-4.0.2.tgz#bc605eba49ce0fcd598c127fee1c236be3f22918" + integrity sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ== + +"zod@^3.25.0 || ^4.0.0": + version "4.6.5" + resolved "https://registry.yarnpkg.com/zod/-/zod-4.6.5.tgz#e3af3edbdc260239c52f73caad05dbbffe6e82cd" + integrity sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q== + zwitch@^1.0.0: version "1.0.5" resolved "https://registry.npmjs.org/zwitch/-/zwitch-1.0.5.tgz" From 0d3718b5f7f437bd80054bc105369dddb2c2b51d Mon Sep 17 00:00:00 2001 From: Hendrik de Graaf Date: Mon, 14 Sep 2026 17:05:15 +0200 Subject: [PATCH 2/8] style: reflow markdown list markers for prettier 3 Prettier 2 padded a list marker out to the tab width (`- item`); prettier 3 always uses a single space (`- item`). There is no option for it: `tabWidth` still controls the indentation of nested items, but the space after the marker is fixed. Nothing but whitespace changes here, in its own commit so it can be skipped rather than read. Co-Authored-By: Claude Opus 5 --- .github/pull_request_template.md | 8 +- ARCHITECTURE.md | 18 +- CONTRIBUTING.md | 48 ++-- README.md | 10 +- components/ou-tree/CLAUDE.md | 72 ++--- docs/docs/components/alertbar.md | 64 ++--- docs/docs/components/avatar.md | 10 +- docs/docs/components/button.md | 84 +++--- docs/docs/components/calendar-input.md | 34 +-- docs/docs/components/calendar.md | 10 +- docs/docs/components/card.md | 4 +- docs/docs/components/checkbox.md | 14 +- docs/docs/components/chip.md | 40 +-- docs/docs/components/data-table.md | 66 ++--- docs/docs/components/elevation.md | 12 +- docs/docs/components/fileinput.md | 14 +- docs/docs/components/inputfield.md | 70 ++--- docs/docs/components/loading.md | 16 +- docs/docs/components/menu.md | 58 ++-- docs/docs/components/modal.md | 40 +-- docs/docs/components/notice-box.md | 36 +-- docs/docs/components/org-unit-tree.md | 10 +- docs/docs/components/pagination.md | 24 +- docs/docs/components/popover.md | 10 +- docs/docs/components/radio.md | 20 +- docs/docs/components/segmented-control.md | 16 +- docs/docs/components/select.md | 58 ++-- docs/docs/components/switch.md | 10 +- docs/docs/components/tab.md | 24 +- docs/docs/components/tag.md | 18 +- docs/docs/components/tooltip.md | 22 +- docs/docs/components/transfer.md | 28 +- docs/docs/getting-started/installation.md | 6 +- docs/docs/getting-started/readme.md | 4 +- docs/docs/patterns/designing-with-time.md | 36 +-- docs/docs/patterns/glossary.md | 252 +++++++++--------- docs/docs/patterns/large-data.md | 10 +- docs/docs/patterns/writing.md | 112 ++++---- docs/docs/principles/color.md | 18 +- docs/docs/principles/content-communication.md | 34 +-- docs/docs/principles/design-for-use.md | 18 +- docs/docs/principles/forms.md | 6 +- docs/docs/principles/layout.md | 6 +- docs/docs/recipes/recipes.md | 4 +- ...ple-single-select-server-side-filtering.md | 36 +-- 45 files changed, 755 insertions(+), 755 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index d2b752c157..f7f6525af4 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -10,15 +10,15 @@ _text_ ### Known issues -- [ ] _issue_ +- [ ] _issue_ --- ### Checklist -- [ ] API docs are generated -- [ ] Tests were added -- [ ] Storybook demos were added +- [ ] API docs are generated +- [ ] Tests were added +- [ ] Storybook demos were added _All points above should be relevant for feature PRs. For bugfixes, some points might not be relevant. In that case, just check them anyway to signal the work is done._ diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index e05806ffee..75e82a6bad 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -54,16 +54,16 @@ In React fashion we rely on composition to enable the goal of having This means that: -- complex components are constructed by connecting several simple - components, +- complex components are constructed by connecting several simple + components, -- a consumer must have direct access to the building blocks that make up - composed components, +- a consumer must have direct access to the building blocks that make up + composed components, -- components need to be isolated from each other with a well defined - interface and scope, +- components need to be isolated from each other with a well defined + interface and scope, -- components needs to be reusable across many contexts. +- components needs to be reusable across many contexts. > _Note_: Components are published under the `@dhis2-ui` scope, and will > eventually be considered part of the external API as things stabilize. @@ -110,6 +110,6 @@ through that collection. UI uses two different scopes on NPM to publish: -- `@dhis2/ui*`: Collections and utilities. +- `@dhis2/ui*`: Collections and utilities. -- `@dhis2-ui/*`: Component packages are published under this scope. +- `@dhis2-ui/*`: Component packages are published under this scope. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 494031bedc..f2c941e59e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -38,9 +38,9 @@ Our commit message standard is one of the areas that trips up first-time contrib In practice, this means that you should have a prefix and a description, i.e. `fix: make clear button not focusable`, notice: -- The `fix` (or `feat` or `docs` etc..) prefix, followed by a colon `:` and a `space`, then the message starts with a lower-case letter - all of these parts are important, even the space! Otherwise your PR will fail on CI checks. +- The `fix` (or `feat` or `docs` etc..) prefix, followed by a colon `:` and a `space`, then the message starts with a lower-case letter - all of these parts are important, even the space! Otherwise your PR will fail on CI checks. -- You can optionally - and we encourage you to do so - add a scope to the prefix, this can be the UI component you worked on, so `fix(transfer): make clear button not focusable`. Some people also choose to use the JIRA ticket number for the scope. +- You can optionally - and we encourage you to do so - add a scope to the prefix, this can be the UI component you worked on, so `fix(transfer): make clear button not focusable`. Some people also choose to use the JIRA ticket number for the scope. Additionally, some [general advice](https://www.gitkraken.com/learn/git/best-practices/git-commit-message#quick-git-commit-message-tips) is to: @@ -61,18 +61,18 @@ These are not enforced by CI, but they help keep the commit history clean, and t Try in your PR to give as much information and context as possible to the reviewer. Some things to keep in mind: -- Add a link to the JIRA ticket: this makes it easier to find the ticket, but also - more importantly - it allows JIRA automation to link the tickcet to your PR. -- Add a short description of your changes - - if you made some coding or design decisions you'd like to highlight, then expand on these decisions in the description -- Add a video or screenshot of the change. +- Add a link to the JIRA ticket: this makes it easier to find the ticket, but also - more importantly - it allows JIRA automation to link the tickcet to your PR. +- Add a short description of your changes + - if you made some coding or design decisions you'd like to highlight, then expand on these decisions in the description +- Add a video or screenshot of the change. These are some examples of good PRs: -- [https://github.com/dhis2/ui/pull/1694](https://github.com/dhis2/ui/pull/1694) +- [https://github.com/dhis2/ui/pull/1694](https://github.com/dhis2/ui/pull/1694) -- [https://github.com/dhis2/ui/pull/1629](https://github.com/dhis2/ui/pull/1629) -- [https://github.com/dhis2/ui/pull/1672](https://github.com/dhis2/ui/pull/1672) -- [https://github.com/dhis2/ui/pull/1681](https://github.com/dhis2/ui/pull/1681) +- [https://github.com/dhis2/ui/pull/1629](https://github.com/dhis2/ui/pull/1629) +- [https://github.com/dhis2/ui/pull/1672](https://github.com/dhis2/ui/pull/1672) +- [https://github.com/dhis2/ui/pull/1681](https://github.com/dhis2/ui/pull/1681) Note that these good PRs are not about having a long and verbose description - sometimes that makes the PR harder to review. Just try and put yourself in the reviewers' shoes and make their lives as easy as possible, so they understand the PR context and approach (the How and the Why). @@ -80,18 +80,18 @@ Note that these good PRs are not about having a long and verbose description - s Make sure you followed our coding conventions in the repo. While this might vary between repos, since there are some legacy ones, here some general high-level things to look for: -- Your code is well formatted - run `yarn format` at the end of your work - - This should be done automatically in your IDE, but some of our legacy repos are not well configured. -- Add relevant tests to your PR, and ensure that all tests are passing -- Ensure sure the documentation was updated, especially for library projects (like UI or app-platform). +- Your code is well formatted - run `yarn format` at the end of your work + - This should be done automatically in your IDE, but some of our legacy repos are not well configured. +- Add relevant tests to your PR, and ensure that all tests are passing +- Ensure sure the documentation was updated, especially for library projects (like UI or app-platform). ## Report an issue We track our issues with Jira at https://jira.dhis2.org under the [LIBS](https://jira.dhis2.org/projects/LIBS) project. You can use the links below to open an issue with the relevant fields prepopulated: -- [Bug](https://jira.dhis2.org/secure/CreateIssueDetails!init.jspa?pid=10700&issuetype=10006&components=11015) -- [Feature](https://jira.dhis2.org/secure/CreateIssueDetails!init.jspa?pid=10700&issuetype=10300&components=11015) -- [Task](https://jira.dhis2.org/secure/CreateIssueDetails!init.jspa?pid=10700&issuetype=10003&components=11015) +- [Bug](https://jira.dhis2.org/secure/CreateIssueDetails!init.jspa?pid=10700&issuetype=10006&components=11015) +- [Feature](https://jira.dhis2.org/secure/CreateIssueDetails!init.jspa?pid=10700&issuetype=10300&components=11015) +- [Task](https://jira.dhis2.org/secure/CreateIssueDetails!init.jspa?pid=10700&issuetype=10003&components=11015) ## Automated releases @@ -99,15 +99,15 @@ We use semantic release to publish the changes to `@dhis2/ui` automatically. Thi To allow semantic release to analyse our commits we use [conventional commits](https://www.conventionalcommits.org) for our allowed commit types. See [this list](https://github.com/commitizen/conventional-commit-types/blob/master/index.json) for a summary of the available types and their usage. Since semantic release analyses commits, preserving commit hashes between branches is sometimes important. There are [recipes](https://github.com/semantic-release/semantic-release/blob/master/docs/recipes/distribution-channels.md#publishing-on-distribution-channels) available in the semantic-release repository for most scenarios, but for convenience these are the merge types you can use for the two most common scenarios: -- When merging from a feature branch to a release branch we recommend you use a squash merge. A regular merge, squash merge, and rebase merge are all technically ok, but a squash merge ensures that only the PR title and squash commit message will be used for generating the changelog. -- When merging from a release branch to another release branch you must use a regular merge so that the commit hashes are preserved. +- When merging from a feature branch to a release branch we recommend you use a squash merge. A regular merge, squash merge, and rebase merge are all technically ok, but a squash merge ensures that only the PR title and squash commit message will be used for generating the changelog. +- When merging from a release branch to another release branch you must use a regular merge so that the commit hashes are preserved. ## Adding icons to ui-icons The `@dhis2/ui-icons` build process will take care of most things for you. If you want to add an icon you can follow these steps: -- Add the icon as an svg to `packages/icons/src/svg` -- Ensure that you're matching the existing naming conventions, i.e. kebab-case and icon name followed by the variant and then the size -- The svg does not have to be optimized, the build process already includes svgo -- Any path fill colors should be set to `#010101` so that we can set all path fills to `currentColor` -- Use `feat` as your conventional commit type, so that the change will be published automatically when the PR is merged +- Add the icon as an svg to `packages/icons/src/svg` +- Ensure that you're matching the existing naming conventions, i.e. kebab-case and icon name followed by the variant and then the size +- The svg does not have to be optimized, the build process already includes svgo +- Any path fill colors should be set to `#010101` so that we can set all path fills to `currentColor` +- Use `feat` as your conventional commit type, so that the change will be published automatically when the PR is merged diff --git a/README.md b/README.md index dab1085fcf..1aa1f9770a 100644 --- a/README.md +++ b/README.md @@ -24,9 +24,9 @@ We recommend that you use `@dhis2/ui` as the entrypoint for all imports of our f `@dhis2/ui` is based on the specifications in our design-system: https://github.com/dhis2/design-system. See the documentation there for more information. -- Docs: [Developer Portal](https://developers.dhis2.org/docs/tutorials/ui-library) -- Live demo: [Demo](https://developers.dhis2.org/demo/) -- Components reference: [Components](https://developers.dhis2.org/docs/ui/webcomponents) +- Docs: [Developer Portal](https://developers.dhis2.org/docs/tutorials/ui-library) +- Live demo: [Demo](https://developers.dhis2.org/demo/) +- Components reference: [Components](https://developers.dhis2.org/docs/ui/webcomponents) ## Bundled packages @@ -92,8 +92,8 @@ For the `yarn start` command, you can run it at the top-level directory if you a To record e2e tests in Cypress Cloud, you can use one of the following methods based on your needs: -- **Commit Message**: Include `[e2e record]` in your commit messages to activate recording. -- **GitHub Labels**: Apply the `e2e record` label to your pull request to trigger recording. +- **Commit Message**: Include `[e2e record]` in your commit messages to activate recording. +- **GitHub Labels**: Apply the `e2e record` label to your pull request to trigger recording. This setup helps in managing Cypress Cloud credits more efficiently, ensuring recordings are only made when explicitly required. diff --git a/components/ou-tree/CLAUDE.md b/components/ou-tree/CLAUDE.md index c68992b469..1358ed710d 100644 --- a/components/ou-tree/CLAUDE.md +++ b/components/ou-tree/CLAUDE.md @@ -5,10 +5,10 @@ apply anything here to the other component packages. ## Conventions -- **Relative imports carry NO extension**, the inverse of the JavaScript packages: - `import { OuTree } from './ou-tree'` resolves to `ou-tree.tsx`. Enforced by - `import/extensions: ['error', 'never', …]` in the root `.eslintrc.js`, scoped to - `.ts`/`.tsx`; the JavaScript packages keep their `ignorePackages` rule. +- **Relative imports carry NO extension**, the inverse of the JavaScript packages: + `import { OuTree } from './ou-tree'` resolves to `ou-tree.tsx`. Enforced by + `import/extensions: ['error', 'never', …]` in the root `.eslintrc.js`, scoped to + `.ts`/`.tsx`; the JavaScript packages keep their `ignorePackages` rule. Writing `./ou-tree.js` instead would name the compiled output rather than a file on disk. TypeScript resolves that, but eslint-plugin-import, Jest and webpack do @@ -16,41 +16,41 @@ apply anything here to the other component packages. specifiers, which Node's _native_ ESM loader rejects — fine for apps that bundle, and `exports.require` routes Node to the CJS build. -- **Type-only re-exports must use `export type`.** `isolatedModules` is on because - Babel compiles file-by-file; a plain `export { SomeType }` compiles to a runtime - import of a value that does not exist. -- **`src/index.ts` is the module boundary.** Import from a subcomponent's - `index.ts`, never reach past it into its internals. -- **Styles are styled-jsx** (` diff --git a/components/header-bar/src/debug-info/debug-info-menu-item.js b/components/header-bar/src/debug-info/debug-info-menu-item.js index 89e7cd759a..59f93d4170 100644 --- a/components/header-bar/src/debug-info/debug-info-menu-item.js +++ b/components/header-bar/src/debug-info/debug-info-menu-item.js @@ -33,10 +33,10 @@ export const DebugInfoMenuItem = ({ hideProfileMenu, showDebugInfoModal }) => { appName: debugInfo.app_name, }) : debugInfo.app_version - ? i18n.t('App {{appVersion}}', { - appVersion: debugInfo.app_version, - }) - : i18n.t('App version unknown')} + ? i18n.t('App {{appVersion}}', { + appVersion: debugInfo.app_version, + }) + : i18n.t('App version unknown')} {} diff --git a/components/select/types/index.d.ts b/components/select/types/index.d.ts index f9c163ac54..0f63772394 100644 --- a/components/select/types/index.d.ts +++ b/components/select/types/index.d.ts @@ -16,7 +16,7 @@ export interface MultiSelectEventPayload extends BaseEventPayload { type SelectEventHandler< T extends BaseEventPayload, - Event extends React.SyntheticEvent + Event extends React.SyntheticEvent, > = (payload: T, event: Event) => void export type SelectOnBlurHandler = diff --git a/components/selector-bar/src/selector-bar-item/selector-bar-item.e2e.stories.js b/components/selector-bar/src/selector-bar-item/selector-bar-item.e2e.stories.js index 38d5f3167c..343e86b6af 100644 --- a/components/selector-bar/src/selector-bar-item/selector-bar-item.e2e.stories.js +++ b/components/selector-bar/src/selector-bar-item/selector-bar-item.e2e.stories.js @@ -18,34 +18,31 @@ const createStateDecorator = (args) => { const createStory = () => - (_, { open, setOpen, selected, setSelected }) => - ( - value === selected)?.label || '' - } + (_, { open, setOpen, selected, setSelected }) => ( + value === selected)?.label || ''} + > + { + setSelected(nextSelected) + setOpen(false) + }} > - { - setSelected(nextSelected) - setOpen(false) - }} - > - {options.map(({ value, label }) => ( - - ))} - - - ) + {options.map(({ value, label }) => ( + + ))} + + + ) export default { title: 'SelectorBarItem' } diff --git a/components/sharing-dialog/src/access-list/list-item-context.js b/components/sharing-dialog/src/access-list/list-item-context.js index 894fa4a73a..00eedf212b 100644 --- a/components/sharing-dialog/src/access-list/list-item-context.js +++ b/components/sharing-dialog/src/access-list/list-item-context.js @@ -17,7 +17,7 @@ const LABELS = { export const ListItemContext = ({ target, id }) => { return ( <> -

{target === SHARE_TARGET_USER ? id : LABELS[target] ?? ''}

+

{target === SHARE_TARGET_USER ? id : (LABELS[target] ?? '')}