diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index d4930e1f52..0000000000 --- a/.eslintignore +++ /dev/null @@ -1,13 +0,0 @@ -/build/** -/coverage/** -/db/** -/lib/** -/log/** -/node_modules/** -/nonobox/** -/public/** -!/public/embed.js -/spec/** -/tmp/** -/vendor/** -!.eslintrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 1a7d0e218a..0000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,384 +0,0 @@ -// @ts-check -const { defineConfig } = require('eslint-define-config'); - -module.exports = defineConfig({ - root: true, - - extends: [ - 'eslint:recommended', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:jsx-a11y/recommended', - 'plugin:import/recommended', - 'plugin:promise/recommended', - 'plugin:jsdoc/recommended', - ], - - env: { - browser: true, - node: true, - es6: true, - }, - - parser: '@typescript-eslint/parser', - - plugins: [ - 'react', - 'jsx-a11y', - 'import', - 'promise', - '@typescript-eslint', - 'formatjs', - ], - - parserOptions: { - sourceType: 'module', - ecmaFeatures: { - jsx: true, - }, - ecmaVersion: 2021, - requireConfigFile: false, - babelOptions: { - configFile: false, - presets: ['@babel/react', '@babel/env'], - }, - }, - - settings: { - react: { - version: 'detect', - }, - 'import/ignore': [ - 'node_modules', - '\\.(css|scss|json)$', - ], - 'import/resolver': { - typescript: {}, - }, - }, - - rules: { - 'consistent-return': 'error', - 'dot-notation': 'error', - eqeqeq: ['error', 'always', { 'null': 'ignore' }], - 'indent': ['error', 2], - 'jsx-quotes': ['error', 'prefer-single'], - 'semi': ['error', 'always'], - 'no-catch-shadow': 'error', - 'no-console': [ - 'warn', - { - allow: [ - 'error', - 'warn', - ], - }, - ], - 'no-empty': ['error', { "allowEmptyCatch": true }], - 'no-restricted-properties': [ - 'error', - { property: 'substring', message: 'Use .slice instead of .substring.' }, - { property: 'substr', message: 'Use .slice instead of .substr.' }, - ], - 'no-restricted-syntax': [ - 'error', - { - // eslint-disable-next-line no-restricted-syntax - selector: 'Literal[value=/•/], JSXText[value=/•/]', - // eslint-disable-next-line no-restricted-syntax - message: "Use '·' (middle dot) instead of '•' (bullet)", - }, - ], - 'no-unused-expressions': 'error', - 'no-unused-vars': 'off', - '@typescript-eslint/no-unused-vars': [ - 'error', - { - vars: 'all', - args: 'after-used', - destructuredArrayIgnorePattern: '^_', - ignoreRestSiblings: true, - }, - ], - 'valid-typeof': 'error', - - 'react/jsx-filename-extension': ['error', { extensions: ['.jsx', 'tsx'] }], - 'react/jsx-boolean-value': 'error', - 'react/display-name': 'off', - 'react/jsx-fragments': ['error', 'syntax'], - 'react/jsx-equals-spacing': 'error', - 'react/jsx-no-bind': 'error', - 'react/jsx-no-useless-fragment': 'error', - 'react/jsx-no-target-blank': ['error', { allowReferrer: true }], - 'react/jsx-tag-spacing': 'error', - 'react/jsx-uses-react': 'off', // not needed with new JSX transform - 'react/jsx-wrap-multilines': 'error', - 'react/react-in-jsx-scope': 'off', // not needed with new JSX transform - 'react/self-closing-comp': 'error', - - // recommended values found in https://github.com/jsx-eslint/eslint-plugin-jsx-a11y/blob/v6.8.0/src/index.js#L46 - 'jsx-a11y/click-events-have-key-events': 'off', - 'jsx-a11y/label-has-associated-control': 'off', - 'jsx-a11y/media-has-caption': 'off', - 'jsx-a11y/no-autofocus': 'off', - // recommended rule is: - // 'jsx-a11y/no-interactive-element-to-noninteractive-role': [ - // 'error', - // { - // tr: ['none', 'presentation'], - // canvas: ['img'], - // }, - // ], - 'jsx-a11y/no-interactive-element-to-noninteractive-role': 'off', - // recommended rule is: - // 'jsx-a11y/no-noninteractive-tabindex': [ - // 'error', - // { - // tags: [], - // roles: ['tabpanel'], - // allowExpressionValues: true, - // }, - // ], - 'jsx-a11y/no-noninteractive-tabindex': 'off', - // recommended is full 'error' - 'jsx-a11y/no-static-element-interactions': [ - 'warn', - { - handlers: [ - 'onClick', - ], - }, - ], - - // See https://github.com/import-js/eslint-plugin-import/blob/v2.29.1/config/recommended.js - 'import/extensions': [ - 'error', - 'always', - { - js: 'never', - jsx: 'never', - mjs: 'never', - ts: 'never', - tsx: 'never', - }, - ], - 'import/first': 'error', - 'import/newline-after-import': 'error', - 'import/no-anonymous-default-export': 'error', - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: [ - '.eslintrc.js', - 'config/webpack/**', - 'app/javascript/mastodon/performance.js', - 'app/javascript/mastodon/test_setup.js', - 'app/javascript/**/__tests__/**', - ], - }, - ], - 'import/no-amd': 'error', - 'import/no-commonjs': 'error', - 'import/no-import-module-exports': 'error', - 'import/no-relative-packages': 'error', - 'import/no-self-import': 'error', - 'import/no-useless-path-segments': 'error', - 'import/no-webpack-loader-syntax': 'error', - - 'import/order': [ - 'error', - { - alphabetize: { order: 'asc' }, - 'newlines-between': 'always', - groups: [ - 'builtin', - 'external', - 'internal', - 'parent', - ['index', 'sibling'], - 'object', - ], - pathGroups: [ - // React core packages - { - pattern: '{react,react-dom,react-dom/client,prop-types}', - group: 'builtin', - position: 'after', - }, - // I18n - { - pattern: '{react-intl,intl-messageformat}', - group: 'builtin', - position: 'after', - }, - // Common React utilities - { - pattern: '{classnames,react-helmet,react-router,react-router-dom}', - group: 'external', - position: 'before', - }, - // Immutable / Redux / data store - { - pattern: '{immutable,@reduxjs/toolkit,react-redux,react-immutable-proptypes,react-immutable-pure-component}', - group: 'external', - position: 'before', - }, - // Internal packages - { - pattern: '{mastodon/**}', - group: 'internal', - position: 'after', - }, - { - pattern: '{flavours/glitch-soc/**}', - group: 'internal', - position: 'after', - }, - ], - pathGroupsExcludedImportTypes: [], - }, - ], - - // Forbid imports from vanilla in glitch flavour - 'import/no-restricted-paths': [ - 'error', - { - zones: [{ - target: 'app/javascript/flavours/glitch/', - from: 'app/javascript/mastodon/', - message: 'Import from /flavours/glitch/ instead' - }] - } - ], - - 'promise/always-return': 'off', - 'promise/catch-or-return': [ - 'error', - { - allowFinally: true, - }, - ], - 'promise/no-callback-in-promise': 'off', - 'promise/no-nesting': 'off', - 'promise/no-promise-in-callback': 'off', - - 'formatjs/blocklist-elements': 'error', - 'formatjs/enforce-default-message': ['error', 'literal'], - 'formatjs/enforce-description': 'off', // description values not currently used - 'formatjs/enforce-id': 'off', // Explicit IDs are used in the project - 'formatjs/enforce-placeholders': 'off', // Issues in short_number.jsx - 'formatjs/enforce-plural-rules': 'error', - 'formatjs/no-camel-case': 'off', // disabledAccount is only non-conforming - 'formatjs/no-complex-selectors': 'error', - 'formatjs/no-emoji': 'error', - 'formatjs/no-id': 'off', // IDs are used for translation keys - 'formatjs/no-invalid-icu': 'error', - 'formatjs/no-literal-string-in-jsx': 'off', // Should be looked at, but mainly flagging punctuation outside of strings - 'formatjs/no-multiple-whitespaces': 'error', - 'formatjs/no-offset': 'error', - 'formatjs/no-useless-message': 'error', - 'formatjs/prefer-formatted-message': 'error', - 'formatjs/prefer-pound-in-plural': 'error', - - 'jsdoc/check-types': 'off', - 'jsdoc/no-undefined-types': 'off', - 'jsdoc/require-jsdoc': 'off', - 'jsdoc/require-param-description': 'off', - 'jsdoc/require-property-description': 'off', - 'jsdoc/require-returns-description': 'off', - 'jsdoc/require-returns': 'off', - }, - - overrides: [ - { - files: [ - '.eslintrc.js', - '*.config.js', - '.*rc.js', - 'ide-helper.js', - 'config/webpack/**/*', - 'config/formatjs-formatter.js', - ], - - env: { - commonjs: true, - }, - - parserOptions: { - sourceType: 'script', - }, - - rules: { - 'import/no-commonjs': 'off', - }, - }, - { - files: [ - '**/*.ts', - '**/*.tsx', - ], - - extends: [ - 'eslint:recommended', - 'plugin:@typescript-eslint/strict-type-checked', - 'plugin:@typescript-eslint/stylistic-type-checked', - 'plugin:react/recommended', - 'plugin:react-hooks/recommended', - 'plugin:jsx-a11y/recommended', - 'plugin:import/recommended', - 'plugin:import/typescript', - 'plugin:promise/recommended', - 'plugin:jsdoc/recommended-typescript', - ], - - parserOptions: { - projectService: true, - tsconfigRootDir: __dirname, - }, - - rules: { - // Disable formatting rules that have been enabled in the base config - 'indent': 'off', - - // This is not needed as we use noImplicitReturns, which handles this in addition to understanding types - 'consistent-return': 'off', - - 'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], - - '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'], - '@typescript-eslint/consistent-type-exports': 'error', - '@typescript-eslint/consistent-type-imports': 'error', - "@typescript-eslint/prefer-nullish-coalescing": ['error', { ignorePrimitives: { boolean: true } }], - "@typescript-eslint/no-restricted-imports": [ - "warn", - { - "name": "react-redux", - "importNames": ["useSelector", "useDispatch"], - "message": "Use typed hooks `useAppDispatch` and `useAppSelector` instead." - } - ], - "@typescript-eslint/restrict-template-expressions": ['warn', { allowNumber: true }], - 'jsdoc/require-jsdoc': 'off', - - // Those rules set stricter rules for TS files - // to enforce better practices when converting from JS - 'import/no-default-export': 'warn', - 'react/prefer-stateless-function': 'warn', - 'react/function-component-definition': ['error', { namedComponents: 'arrow-function' }], - 'react/jsx-uses-react': 'off', // not needed with new JSX transform - 'react/react-in-jsx-scope': 'off', // not needed with new JSX transform - 'react/prop-types': 'off', - }, - }, - { - files: [ - '**/__tests__/*.js', - '**/__tests__/*.jsx', - ], - - env: { - jest: true, - }, - } - ], -}); diff --git a/.github/renovate.json5 b/.github/renovate.json5 index 8a10676283..849789fe2c 100644 --- a/.github/renovate.json5 +++ b/.github/renovate.json5 @@ -97,7 +97,13 @@ { // Group all eslint-related packages with `eslint` in the same PR matchManagers: ['npm'], - matchPackageNames: ['eslint', 'eslint-*', '@typescript-eslint/*'], + matchPackageNames: [ + 'eslint', + 'eslint-*', + 'typescript-eslint', + '@eslint/*', + 'globals', + ], matchUpdateTypes: ['patch', 'minor'], groupName: 'eslint (non-major)', }, diff --git a/.github/workflows/lint-js.yml b/.github/workflows/lint-js.yml index 7d31a5e20e..86e9af23e7 100644 --- a/.github/workflows/lint-js.yml +++ b/.github/workflows/lint-js.yml @@ -11,7 +11,7 @@ on: - 'tsconfig.json' - '.nvmrc' - '.prettier*' - - '.eslint*' + - 'eslint.config.mjs' - '**/*.js' - '**/*.jsx' - '**/*.ts' @@ -25,7 +25,7 @@ on: - 'tsconfig.json' - '.nvmrc' - '.prettier*' - - '.eslint*' + - 'eslint.config.mjs' - '**/*.js' - '**/*.jsx' - '**/*.ts' @@ -44,7 +44,7 @@ jobs: uses: ./.github/actions/setup-javascript - name: ESLint - run: yarn lint:js --max-warnings 0 + run: yarn workspaces foreach --all --parallel run lint:js --max-warnings 0 - name: Typecheck run: yarn typecheck diff --git a/.prettierrc.js b/.prettierrc.js index af39b253f6..65ec869c33 100644 --- a/.prettierrc.js +++ b/.prettierrc.js @@ -1,4 +1,4 @@ module.exports = { singleQuote: true, jsxSingleQuote: true -} +}; diff --git a/Gemfile.lock b/Gemfile.lock index 2d724b397b..89397cb8bc 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -404,7 +404,7 @@ GEM llhttp-ffi (0.5.1) ffi-compiler (~> 1.0) rake (~> 13.0) - logger (1.6.6) + logger (1.7.0) lograge (0.14.0) actionpack (>= 4) activesupport (>= 4) @@ -446,7 +446,7 @@ GEM net-smtp (0.5.1) net-protocol nio4r (2.7.4) - nokogiri (1.18.6) + nokogiri (1.18.7) mini_portile2 (~> 2.8.2) racc (~> 1.4) oj (3.16.10) @@ -586,7 +586,7 @@ GEM ox (2.14.22) bigdecimal (>= 3.0) parallel (1.26.3) - parser (3.3.7.3) + parser (3.3.7.4) ast (~> 2.4.1) racc parslet (2.0.0) @@ -760,15 +760,15 @@ GEM rubocop-i18n (3.2.3) lint_roller (~> 1.1) rubocop (>= 1.72.1) - rubocop-performance (1.24.0) + rubocop-performance (1.25.0) lint_roller (~> 1.1) - rubocop (>= 1.72.1, < 2.0) + rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) - rubocop-rails (2.30.3) + rubocop-rails (2.31.0) activesupport (>= 4.2.0) lint_roller (~> 1.1) rack (>= 1.1) - rubocop (>= 1.72.1, < 2.0) + rubocop (>= 1.75.0, < 2.0) rubocop-ast (>= 1.38.0, < 2.0) rubocop-rspec (3.5.0) lint_roller (~> 1.1) diff --git a/app/javascript/entrypoints/public.tsx b/app/javascript/entrypoints/public.tsx index 0560e76628..9374d6b2d1 100644 --- a/app/javascript/entrypoints/public.tsx +++ b/app/javascript/entrypoints/public.tsx @@ -68,7 +68,7 @@ function loaded() { if (id) message = localeData[id]; - if (!message) message = defaultMessage as string; + message ??= defaultMessage as string; const messageFormat = new IntlMessageFormat(message, locale); return messageFormat.format(values) as string; diff --git a/app/javascript/flavours/glitch/components/counters.tsx b/app/javascript/flavours/glitch/components/counters.tsx index 35b0ad8d60..151b25a3f7 100644 --- a/app/javascript/flavours/glitch/components/counters.tsx +++ b/app/javascript/flavours/glitch/components/counters.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import { FormattedMessage } from 'react-intl'; diff --git a/app/javascript/flavours/glitch/components/router.tsx b/app/javascript/flavours/glitch/components/router.tsx index 46477b96ff..0175e1b44f 100644 --- a/app/javascript/flavours/glitch/components/router.tsx +++ b/app/javascript/flavours/glitch/components/router.tsx @@ -1,5 +1,5 @@ import type { PropsWithChildren } from 'react'; -import React from 'react'; +import type React from 'react'; import { Router as OriginalRouter, useHistory } from 'react-router'; diff --git a/app/javascript/flavours/glitch/entrypoints/public.tsx b/app/javascript/flavours/glitch/entrypoints/public.tsx index e22e2cc85f..279a16ef57 100644 --- a/app/javascript/flavours/glitch/entrypoints/public.tsx +++ b/app/javascript/flavours/glitch/entrypoints/public.tsx @@ -68,7 +68,7 @@ function loaded() { if (id) message = localeData[id]; - if (!message) message = defaultMessage as string; + message ??= defaultMessage as string; const messageFormat = new IntlMessageFormat(message, locale); return messageFormat.format(values) as string; diff --git a/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js b/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js index 5bc70b209c..58f9bedbb8 100644 --- a/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js +++ b/app/javascript/flavours/glitch/features/emoji/emoji_compressed.js @@ -1,5 +1,3 @@ -/* eslint-disable import/no-commonjs -- - We need to use CommonJS here due to preval */ // @preval // http://www.unicode.org/Public/emoji/5.0/emoji-test.txt // This file contains the compressed version of the emoji data from diff --git a/app/javascript/flavours/glitch/features/emoji/emoji_unicode_mapping_light.ts b/app/javascript/flavours/glitch/features/emoji/emoji_unicode_mapping_light.ts index adf4e2bb7b..0a5a4c1d76 100644 --- a/app/javascript/flavours/glitch/features/emoji/emoji_unicode_mapping_light.ts +++ b/app/javascript/flavours/glitch/features/emoji/emoji_unicode_mapping_light.ts @@ -33,11 +33,8 @@ function processEmojiMapData( shortCode?: ShortCodesToEmojiDataKey, ) { const [native, _filename] = emojiMapData; - let filename = emojiMapData[1]; - if (!filename) { - // filename name can be derived from unicodeToFilename - filename = unicodeToFilename(native); - } + // filename name can be derived from unicodeToFilename + const filename = emojiMapData[1] ?? unicodeToFilename(native); unicodeMapping[native] = { shortCode, filename, diff --git a/app/javascript/flavours/glitch/features/emoji/unicode_to_filename.js b/app/javascript/flavours/glitch/features/emoji/unicode_to_filename.js index 3395c77174..c75c4cd7d0 100644 --- a/app/javascript/flavours/glitch/features/emoji/unicode_to_filename.js +++ b/app/javascript/flavours/glitch/features/emoji/unicode_to_filename.js @@ -1,6 +1,3 @@ -/* eslint-disable import/no-commonjs -- - We need to use CommonJS here as its imported into a preval file (`emoji_compressed.js`) */ - // taken from: // https://github.com/twitter/twemoji/blob/47732c7/twemoji-generator.js#L848-L866 exports.unicodeToFilename = (str) => { diff --git a/app/javascript/flavours/glitch/features/emoji/unicode_to_unified_name.js b/app/javascript/flavours/glitch/features/emoji/unicode_to_unified_name.js index 108b911222..d29550f122 100644 --- a/app/javascript/flavours/glitch/features/emoji/unicode_to_unified_name.js +++ b/app/javascript/flavours/glitch/features/emoji/unicode_to_unified_name.js @@ -1,6 +1,3 @@ -/* eslint-disable import/no-commonjs -- - We need to use CommonJS here as its imported into a preval file (`emoji_compressed.js`) */ - function padLeft(str, num) { while (str.length < num) { str = '0' + str; diff --git a/app/javascript/flavours/glitch/features/status/components/detailed_status.tsx b/app/javascript/flavours/glitch/features/status/components/detailed_status.tsx index 2b15d7b50b..f2817f03b7 100644 --- a/app/javascript/flavours/glitch/features/status/components/detailed_status.tsx +++ b/app/javascript/flavours/glitch/features/status/components/detailed_status.tsx @@ -4,7 +4,7 @@ @typescript-eslint/no-unsafe-assignment */ import type { CSSProperties } from 'react'; -import React, { useState, useRef, useCallback } from 'react'; +import { useState, useRef, useCallback } from 'react'; import { FormattedMessage } from 'react-intl'; diff --git a/app/javascript/mastodon/components/counters.tsx b/app/javascript/mastodon/components/counters.tsx index 35b0ad8d60..151b25a3f7 100644 --- a/app/javascript/mastodon/components/counters.tsx +++ b/app/javascript/mastodon/components/counters.tsx @@ -1,4 +1,4 @@ -import React from 'react'; +import type React from 'react'; import { FormattedMessage } from 'react-intl'; diff --git a/app/javascript/mastodon/components/router.tsx b/app/javascript/mastodon/components/router.tsx index 558d0307e7..815b4b59ab 100644 --- a/app/javascript/mastodon/components/router.tsx +++ b/app/javascript/mastodon/components/router.tsx @@ -1,5 +1,5 @@ import type { PropsWithChildren } from 'react'; -import React from 'react'; +import type React from 'react'; import { Router as OriginalRouter, useHistory } from 'react-router'; diff --git a/app/javascript/mastodon/features/compose/components/upload_progress.tsx b/app/javascript/mastodon/features/compose/components/upload_progress.tsx index 35af03306f..be15917784 100644 --- a/app/javascript/mastodon/features/compose/components/upload_progress.tsx +++ b/app/javascript/mastodon/features/compose/components/upload_progress.tsx @@ -9,48 +9,39 @@ import { reduceMotion } from 'mastodon/initial_state'; interface UploadProgressProps { active: boolean; progress: number; - isProcessing: boolean; + isProcessing?: boolean; } export const UploadProgress: React.FC = ({ active, progress, - isProcessing, + isProcessing = false, }) => { const styles = useSpring({ from: { width: '0%' }, to: { width: `${progress}%` }, - reset: true, - immediate: reduceMotion, + immediate: reduceMotion || !active, // If this is not active, update the UI immediately. }); if (!active) { return null; } - let message; - - if (isProcessing) { - message = ( - - ); - } else { - message = ( - - ); - } - return (
- {message} + {isProcessing ? ( + + ) : ( + + )}
diff --git a/app/javascript/mastodon/features/emoji/emoji_compressed.js b/app/javascript/mastodon/features/emoji/emoji_compressed.js index 3b6a918104..5cd3a1317d 100644 --- a/app/javascript/mastodon/features/emoji/emoji_compressed.js +++ b/app/javascript/mastodon/features/emoji/emoji_compressed.js @@ -1,5 +1,3 @@ -/* eslint-disable import/no-commonjs -- - We need to use CommonJS here due to preval */ // @preval // http://www.unicode.org/Public/emoji/5.0/emoji-test.txt // This file contains the compressed version of the emoji data from diff --git a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts index adf4e2bb7b..0a5a4c1d76 100644 --- a/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts +++ b/app/javascript/mastodon/features/emoji/emoji_unicode_mapping_light.ts @@ -33,11 +33,8 @@ function processEmojiMapData( shortCode?: ShortCodesToEmojiDataKey, ) { const [native, _filename] = emojiMapData; - let filename = emojiMapData[1]; - if (!filename) { - // filename name can be derived from unicodeToFilename - filename = unicodeToFilename(native); - } + // filename name can be derived from unicodeToFilename + const filename = emojiMapData[1] ?? unicodeToFilename(native); unicodeMapping[native] = { shortCode, filename, diff --git a/app/javascript/mastodon/features/emoji/unicode_to_filename.js b/app/javascript/mastodon/features/emoji/unicode_to_filename.js index 3395c77174..c75c4cd7d0 100644 --- a/app/javascript/mastodon/features/emoji/unicode_to_filename.js +++ b/app/javascript/mastodon/features/emoji/unicode_to_filename.js @@ -1,6 +1,3 @@ -/* eslint-disable import/no-commonjs -- - We need to use CommonJS here as its imported into a preval file (`emoji_compressed.js`) */ - // taken from: // https://github.com/twitter/twemoji/blob/47732c7/twemoji-generator.js#L848-L866 exports.unicodeToFilename = (str) => { diff --git a/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js b/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js index 108b911222..d29550f122 100644 --- a/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js +++ b/app/javascript/mastodon/features/emoji/unicode_to_unified_name.js @@ -1,6 +1,3 @@ -/* eslint-disable import/no-commonjs -- - We need to use CommonJS here as its imported into a preval file (`emoji_compressed.js`) */ - function padLeft(str, num) { while (str.length < num) { str = '0' + str; diff --git a/app/javascript/mastodon/locales/fi.json b/app/javascript/mastodon/locales/fi.json index 35d1816fa6..3e5a327301 100644 --- a/app/javascript/mastodon/locales/fi.json +++ b/app/javascript/mastodon/locales/fi.json @@ -911,6 +911,6 @@ "video.skip_backward": "Siirry taaksepäin", "video.skip_forward": "Siirry eteenpäin", "video.unmute": "Poista mykistys", - "video.volume_down": "Laske äänenvoimakkuutta", - "video.volume_up": "Nosta äänenvoimakkuutta" + "video.volume_down": "Vähennä äänenvoimakkuutta", + "video.volume_up": "Lisää äänenvoimakkuutta" } diff --git a/app/javascript/mastodon/locales/ko.json b/app/javascript/mastodon/locales/ko.json index b7bcc10a59..76f94fb43f 100644 --- a/app/javascript/mastodon/locales/ko.json +++ b/app/javascript/mastodon/locales/ko.json @@ -905,6 +905,12 @@ "video.expand": "동영상 확장", "video.fullscreen": "전체화면", "video.hide": "동영상 숨기기", + "video.mute": "음소거", "video.pause": "일시정지", - "video.play": "재생" + "video.play": "재생", + "video.skip_backward": "뒤로 건너뛰기", + "video.skip_forward": "앞으로 건너뛰기", + "video.unmute": "음소거 해제", + "video.volume_down": "음량 감소", + "video.volume_up": "음량 증가" } diff --git a/app/javascript/mastodon/locales/pt-BR.json b/app/javascript/mastodon/locales/pt-BR.json index 89d69a79d5..3ac1946503 100644 --- a/app/javascript/mastodon/locales/pt-BR.json +++ b/app/javascript/mastodon/locales/pt-BR.json @@ -697,6 +697,7 @@ "poll_button.remove_poll": "Remover enquete", "privacy.change": "Alterar privacidade do toot", "privacy.direct.long": "Todos mencionados na publicação", + "privacy.direct.short": "Menção privada", "privacy.private.long": "Apenas seus seguidores", "privacy.private.short": "Seguidores", "privacy.public.long": "Qualquer um dentro ou fora do Mastodon", @@ -871,7 +872,9 @@ "subscribed_languages.target": "Alterar idiomas inscritos para {target}", "tabs_bar.home": "Página inicial", "tabs_bar.notifications": "Notificações", + "terms_of_service.effective_as_of": "Em vigor a partir de {date}", "terms_of_service.title": "Termos de serviço", + "terms_of_service.upcoming_changes_on": "Próximas mudanças em {date}", "time_remaining.days": "{number, plural, one {# dia restante} other {# dias restantes}}", "time_remaining.hours": "{number, plural, one {# hora restante} other {# horas restantes}}", "time_remaining.minutes": "{number, plural, one {# minuto restante} other {# minutos restantes}}", @@ -902,6 +905,12 @@ "video.expand": "Abrir vídeo", "video.fullscreen": "Tela cheia", "video.hide": "Ocultar mídia", + "video.mute": "Silenciar", "video.pause": "Pausar", - "video.play": "Executar" + "video.play": "Executar", + "video.skip_backward": "Retroceder", + "video.skip_forward": "Avançar", + "video.unmute": "Ativar som", + "video.volume_down": "Diminuir o volume", + "video.volume_up": "Aumentar o volume" } diff --git a/app/javascript/mastodon/locales/ru.json b/app/javascript/mastodon/locales/ru.json index 9ac8f72ff6..bc19a93c60 100644 --- a/app/javascript/mastodon/locales/ru.json +++ b/app/javascript/mastodon/locales/ru.json @@ -156,7 +156,7 @@ "column.firehose": "Живая лента", "column.follow_requests": "Запросы на подписку", "column.home": "Главная", - "column.list_members": "Управление пользователями в списке", + "column.list_members": "Добавить или удалить из списка", "column.lists": "Списки", "column.mutes": "Игнорируемые пользователи", "column.notifications": "Уведомления", @@ -173,7 +173,7 @@ "column_subheading.settings": "Настройки", "community.column_settings.local_only": "Только локальные", "community.column_settings.media_only": "Только с медиафайлами", - "community.column_settings.remote_only": "Только удалённые", + "community.column_settings.remote_only": "Только с других серверов", "compose.language.change": "Изменить язык", "compose.language.search": "Найти язык...", "compose.published.body": "Пост опубликован.", @@ -181,7 +181,7 @@ "compose.saved.body": "Пост отредактирован.", "compose_form.direct_message_warning_learn_more": "Узнать больше", "compose_form.encryption_warning": "Посты в Mastodon не защищены сквозным шифрованием. Не делитесь конфиденциальной информацией через Mastodon.", - "compose_form.hashtag_warning": "Этот пост не будет виден ни под одним из хэштегов, так как он не публичный. Только публичные посты можно найти по хэштегу.", + "compose_form.hashtag_warning": "Этот пост не появится в поиске по хэштегам, так как он не обозначен как публичный. Только публичные посты можно найти по хэштегу.", "compose_form.lock_disclaimer": "Ваша учётная запись {locked}. Любой пользователь сможет подписаться на вас и просматривать посты для подписчиков.", "compose_form.lock_disclaimer.lock": "не закрыта", "compose_form.placeholder": "О чём думаете?", @@ -189,8 +189,8 @@ "compose_form.poll.multiple": "Несколько вариантов ответа", "compose_form.poll.option_placeholder": "Вариант {number}", "compose_form.poll.single": "Один вариант ответа", - "compose_form.poll.switch_to_multiple": "Разрешить выбор нескольких вариантов", - "compose_form.poll.switch_to_single": "Переключить в режим выбора одного ответа", + "compose_form.poll.switch_to_multiple": "Переключить в режим выбора нескольких вариантов ответа", + "compose_form.poll.switch_to_single": "Переключить в режим выбора одного варианта ответа", "compose_form.poll.type": "Тип", "compose_form.publish": "Опубликовать", "compose_form.publish_form": "Опубликовать", @@ -208,11 +208,11 @@ "confirmations.delete_list.message": "Вы уверены, что хотите навсегда удалить этот список?", "confirmations.delete_list.title": "Удалить список?", "confirmations.discard_edit_media.confirm": "Сбросить", - "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения в описании мультимедиа или предпросмотре, сбросить их?", + "confirmations.discard_edit_media.message": "У вас есть несохранённые изменения, касающиеся описания медиа или области предпросмотра, сбросить их?", "confirmations.edit.confirm": "Редактировать", "confirmations.edit.message": "Если вы начнёте редактировать сейчас, то набираемый в данный момент пост будет стёрт. Вы уверены, что хотите продолжить?", "confirmations.edit.title": "Стереть несохранённый черновик поста?", - "confirmations.follow_to_list.confirm": "Подписаться, а затем добавить в список", + "confirmations.follow_to_list.confirm": "Подписаться и добавить", "confirmations.follow_to_list.message": "Чтобы добавить пользователя {name} в список, вы должны быть на него подписаны.", "confirmations.follow_to_list.title": "Подписаться на пользователя?", "confirmations.logout.confirm": "Выйти", @@ -224,8 +224,8 @@ "confirmations.missing_alt_text.title": "Добавить альтернативный текст?", "confirmations.mute.confirm": "Игнорировать", "confirmations.redraft.confirm": "Удалить и исправить", - "confirmations.redraft.message": "Вы уверены, что хотите удалить и переписать этот пост? Отметки «избранного», продвижения и ответы к оригинальному посту будут потеряны.", - "confirmations.redraft.title": "Создать пост заново?", + "confirmations.redraft.message": "Вы уверены, что хотите удалить этот пост и создать его заново? Взаимодействия, такие как добавление в избранное или продвижение, будут потеряны, а ответы к оригинальному посту перестанут на него ссылаться.", + "confirmations.redraft.title": "Удалить и создать пост заново?", "confirmations.reply.confirm": "Ответить", "confirmations.reply.message": "Если вы начнёте составлять ответ сейчас, то набираемый в данный момент пост будет стёрт. Вы уверены, что хотите продолжить?", "confirmations.reply.title": "Стереть несохранённый черновик поста?", @@ -293,7 +293,7 @@ "emoji_button.search_results": "Результаты поиска", "emoji_button.symbols": "Символы", "emoji_button.travel": "Путешествия и места", - "empty_column.account_hides_collections": "Данный пользователь решил не предоставлять эту информацию", + "empty_column.account_hides_collections": "Пользователь предпочёл не раскрывать эту информацию", "empty_column.account_suspended": "Учётная запись заблокирована", "empty_column.account_timeline": "Здесь нет постов!", "empty_column.account_unavailable": "Профиль недоступен", @@ -409,8 +409,9 @@ "home.show_announcements": "Показать объявления", "ignore_notifications_modal.disclaimer": "Mastodon не может сообщить пользователям, что вы игнорируете их уведомления. Игнорирование уведомлений не остановит отправку самих сообщений.", "ignore_notifications_modal.filter_instead": "Фильтровать", - "ignore_notifications_modal.filter_to_avoid_confusion": "Фильтрация помогает избежать потенциальной путаницы", - "ignore_notifications_modal.filter_to_review_separately": "Вы можете просматривать отфильтрованные уведомления отдельно", + "ignore_notifications_modal.filter_to_act_users": "Вы по-прежнему сможете принимать и отклонять запросы, а также отправлять жалобы на пользователей", + "ignore_notifications_modal.filter_to_avoid_confusion": "Фильтрация поможет избежать возможной путаницы", + "ignore_notifications_modal.filter_to_review_separately": "Отфильтрованные уведомления можно просматривать отдельно", "ignore_notifications_modal.ignore": "Игнорировать уведомления", "ignore_notifications_modal.limited_accounts_title": "Игнорировать уведомления от модерируемых учётных записей?", "ignore_notifications_modal.new_accounts_title": "Игнорировать уведомления от новых учётных записей?", diff --git a/app/javascript/mastodon/reducers/compose.js b/app/javascript/mastodon/reducers/compose.js index d16c8a0d2e..73468c04fe 100644 --- a/app/javascript/mastodon/reducers/compose.js +++ b/app/javascript/mastodon/reducers/compose.js @@ -113,6 +113,7 @@ function clearAll(state) { map.set('sensitive', state.get('default_sensitive')); map.set('language', state.get('default_language')); map.update('media_attachments', list => list.clear()); + map.set('progress', 0); map.set('poll', null); map.set('idempotencyKey', uuid()); }); @@ -128,6 +129,7 @@ function appendMedia(state, media, file) { map.update('media_attachments', list => list.push(media.set('unattached', true))); map.set('is_uploading', false); map.set('is_processing', false); + map.set('progress', 0); map.set('resetFileKey', Math.floor((Math.random() * 0x10000))); map.set('idempotencyKey', uuid()); map.update('pending_media_attachments', n => n - 1); @@ -296,6 +298,8 @@ const updatePoll = (state, index, value, maxOptions) => state.updateIn(['poll', return tmp; }); +const calculateProgress = (loaded, total) => Math.min(Math.round((loaded / total) * 100), 100); + /** @type {import('@reduxjs/toolkit').Reducer} */ export const composeReducer = (state = initialState, action) => { if (changeUploadCompose.fulfilled.match(action)) { @@ -402,15 +406,19 @@ export const composeReducer = (state = initialState, action) => { case COMPOSE_UPLOAD_SUCCESS: return appendMedia(state, fromJS(action.media), action.file); case COMPOSE_UPLOAD_FAIL: - return state.set('is_uploading', false).set('is_processing', false).update('pending_media_attachments', n => n - 1); + return state + .set('is_uploading', false) + .set('is_processing', false) + .set('progress', 0) + .update('pending_media_attachments', n => n - 1); case COMPOSE_UPLOAD_UNDO: return removeMedia(state, action.media_id); case COMPOSE_UPLOAD_PROGRESS: - return state.set('progress', Math.round((action.loaded / action.total) * 100)); + return state.set('progress', calculateProgress(action.loaded, action.total)); case THUMBNAIL_UPLOAD_REQUEST: return state.set('isUploadingThumbnail', true); case THUMBNAIL_UPLOAD_PROGRESS: - return state.set('thumbnailProgress', Math.round((action.loaded / action.total) * 100)); + return state.set('thumbnailProgress', calculateProgress(action.loaded, action.total)); case THUMBNAIL_UPLOAD_FAIL: return state.set('isUploadingThumbnail', false); case THUMBNAIL_UPLOAD_SUCCESS: diff --git a/app/javascript/mastodon/service_worker/web_push_locales.js b/app/javascript/mastodon/service_worker/web_push_locales.js index 3e39c9a4ed..f3d61e0195 100644 --- a/app/javascript/mastodon/service_worker/web_push_locales.js +++ b/app/javascript/mastodon/service_worker/web_push_locales.js @@ -1,6 +1,3 @@ -/* eslint-disable import/no-commonjs -- - We need to use CommonJS here as its imported into a preval file (`emoji_compressed.js`) */ - /* @preval */ const fs = require('fs'); diff --git a/config/locales/activerecord.pt-BR.yml b/config/locales/activerecord.pt-BR.yml index e9b4437035..8b77ed7e83 100644 --- a/config/locales/activerecord.pt-BR.yml +++ b/config/locales/activerecord.pt-BR.yml @@ -39,7 +39,7 @@ pt-BR: import: attributes: data: - malformed: Está malformado + malformed: está malformado list_account: attributes: account_id: @@ -49,13 +49,19 @@ pt-BR: attributes: reblog: taken: do toot já existe + terms_of_service: + attributes: + effective_date: + too_soon: está muito próxima, deve ser posterior a %{date} user: attributes: + date_of_birth: + below_limit: está abaixo do limite de idade email: blocked: usa provedor de e-mail não permitido unreachable: parece não existir role_id: - elevated: não pode maior que sua função atual + elevated: não pode ser maior que a sua função atual user_role: attributes: permissions_as_keys: diff --git a/config/locales/devise.pt-BR.yml b/config/locales/devise.pt-BR.yml index 6c33d0e30a..aa1190dfd0 100644 --- a/config/locales/devise.pt-BR.yml +++ b/config/locales/devise.pt-BR.yml @@ -14,7 +14,7 @@ pt-BR: not_found_in_database: "%{authentication_keys} ou senha inválida." omniauth_user_creation_failure: Erro ao criar uma conta para esta identidade. pending: Sua conta está sendo revisada. - timeout: Sua sessão expirou. Faça ‘login’ novamente para continuar. + timeout: Sua sessão expirou. Por favor, entre novamente para continuar. unauthenticated: Você precisa entrar ou criar uma conta antes de continuar. unconfirmed: Você precisa confirmar o seu endereço de e-mail antes de continuar. mailer: @@ -48,12 +48,12 @@ pt-BR: subject: 'Mastodon: Instruções para alterar senha' title: Redefinir senha two_factor_disabled: - explanation: O ‘login’ agora é possível usando apenas o endereço eletrônico e senha. + explanation: Agora você pode entrar usando apenas seu e-mail e senha. subject: 'Mastodon: Autenticação de dois fatores desativada' subtitle: A autenticação de dois fatores foi desativada. title: 2FA desativada two_factor_enabled: - explanation: Será necessário um código gerado pelo aplicativo de autenticação TOTP para fazer login. + explanation: Um código de autenticação de dois fatores será necessário para entrar em sua conta. subject: 'Mastodon: Autenticação de dois fatores ativada' subtitle: A autenticação de dois fatores foi ativada para sua conta. title: 2FA ativada @@ -75,11 +75,11 @@ pt-BR: title: Uma das suas chaves de segurança foi excluída webauthn_disabled: explanation: A autenticação por chaves de segurança foi desativada para sua conta. - extra: Agora você pode fazer login usando apenas o código gerado pelo aplicativo de autenticação TOTP. + extra: Agora você pode entrar usando apenas o código de autenticação de dois fatores. subject: 'Mastodon: Autenticação por chaves de segurança desativada' title: Chaves de segurança desativadas webauthn_enabled: - explanation: A autenticação por chave de segurança foi ativada para sua conta. + explanation: A autenticação por chave de segurança foi ativada. extra: Sua chave de segurança agora pode ser usada para ‘login’. subject: 'Mastodon: Autenticação por chaves de segurança ativada' title: Chaves de segurança ativadas diff --git a/config/locales/doorkeeper.pt-BR.yml b/config/locales/doorkeeper.pt-BR.yml index 85bf5d60c0..a92819bf68 100644 --- a/config/locales/doorkeeper.pt-BR.yml +++ b/config/locales/doorkeeper.pt-BR.yml @@ -61,7 +61,7 @@ pt-BR: title: Ocorreu um erro new: prompt_html: "%{client_name} gostaria de permissão para acessar sua conta. Aprove esta solicitação apenas se você reconhecer e confiar nesta fonte." - review_permissions: Rever permissões + review_permissions: Revisar permissões title: Autorização necessária show: title: Copie este código de autorização e cole no aplicativo. @@ -130,7 +130,7 @@ pt-BR: crypto: Criptografia de ponta a ponta favourites: Favoritos filters: Filtros - follow: Seguimentos, Silenciamentos e Bloqueios + follow: Seguidos, Silenciados e Bloqueados follows: Seguidos lists: Listas media: Mídias anexadas @@ -165,7 +165,7 @@ pt-BR: admin:write:email_domain_blocks: executar ações de moderação em domínios de e-mail bloqueados admin:write:ip_blocks: executar ações de moderação em IPs bloqueados admin:write:reports: executar ações de moderação em denúncias - crypto: usar criptografia de ponta-a-ponta + crypto: usar criptografia de ponta a ponta follow: alterar o relacionamento das contas profile: ler somente as informações do perfil da sua conta push: receber notificações push diff --git a/config/locales/eo.yml b/config/locales/eo.yml index 303d068619..a514d332a8 100644 --- a/config/locales/eo.yml +++ b/config/locales/eo.yml @@ -479,6 +479,16 @@ eo: new: title: Importi domajnblokojn no_file: Neniu dosiero elektita + fasp: + debug: + callbacks: + delete: Forigi + providers: + delete: Forigi + name: Nomo + registrations: + confirm: Konfirmi + sign_in: Ensaluti follow_recommendations: description_html: "Sekvorekomendoj helpi novajn uzantojn rapide trovi interesa enhavo. Ili rekalkulitas ĉiutage lau interagoj kaj sekvantokvantoj." language: Por la lingvo diff --git a/config/locales/ko.yml b/config/locales/ko.yml index ca40a2abcd..c4ba1fa9e7 100644 --- a/config/locales/ko.yml +++ b/config/locales/ko.yml @@ -473,6 +473,36 @@ ko: new: title: 도메인 차단 불러오기 no_file: 선택된 파일이 없습니다 + fasp: + debug: + callbacks: + created_at: 생성일 + delete: 삭제 + ip: IP 주소 + request_body: 요청 바디 + title: 디버그 콜백 + providers: + active: 활성 + base_url: Base URL + callback: 콜백 + delete: 삭제 + edit: 제공자 편집 + finish_registration: 등록 완료 + name: 이름 + providers: 제공자 + public_key_fingerprint: 공개키 핑거프린트 + registration_requested: 가입 요청됨 + registrations: + confirm: 확인 + description: FASP로부터 등록을 받았습니다. 본인이 시작하지 않았다면 거부하세요. 본인이 시작했다면 등록을 확인하기 전에 이름과 키 핑거프린트를 주의 깊게 비교하세요. + reject: 거부 + title: FASP 가입 확인 + save: 저장 + select_capabilities: 권한 선택 + sign_in: 가입 + status: 상태 + title: 연합우주 보조 서비스 제공자 + title: FASP follow_recommendations: description_html: "팔로우 추천은 새 사용자들이 관심 가는 콘텐트를 빠르게 찾을 수 있도록 도와줍니다. 사용자가 개인화 된 팔로우 추천이 만들어지기 위한 충분한 상호작용을 하지 않은 경우, 이 계정들이 대신 추천 됩니다. 이들은 해당 언어에 대해 많은 관심을 갖거나 많은 로컬 팔로워를 가지고 있는 계정들을 섞어서 날마다 다시 계산 됩니다." language: 언어 필터 diff --git a/config/locales/lv.yml b/config/locales/lv.yml index 819b9d0edb..a029dcd185 100644 --- a/config/locales/lv.yml +++ b/config/locales/lv.yml @@ -957,10 +957,15 @@ lv: allow: Atļaut approved: Apstiprināts confirm_allow: Vai tiešām atļaut atlasītos tēmturus? + confirm_disallow: Vai tiešām neatļaut atlasītās birkas? disallow: Neatļaut links: allow: Atļaut saiti allow_provider: Atļaut publicētāju + confirm_allow: Vai tiešām atļaut atlasītās saites? + confirm_allow_provider: Vai tiešām atļaut atlasītos nodrošinātājus? + confirm_disallow: Vai tiešām neatļaut atlasītās saites? + confirm_disallow_provider: Vai tiešām neatļaut atlasītos nodrošinātājus? description_html: Šīs ir saites, kuras pašlaik bieži koplieto konti, no kuriem Tavs serveris redz ziņas. Tas var palīdzēt Taviem lietotājiem uzzināt, kas notiek pasaulē. Neviena saite netiek publiski rādīta, līdz tu apstiprini izdevēju. Tu vari arī atļaut vai noraidīt atsevišķas saites. disallow: Neatļaut saiti disallow_provider: Neatļaut publicētāju @@ -985,6 +990,10 @@ lv: statuses: allow: Ļaut veikt ierakstus allow_account: Atļaut autoru + confirm_allow: Vai tiešām atļaut atlasītos stāvokļus? + confirm_allow_account: Vai tiešām atļaut atlasītos kontus? + confirm_disallow: Vai tiešām neatļaut atlasītos stāvokļus? + confirm_disallow_account: Vai tiešām neatļaut atlasītos kontus? description_html: Šie ir ieraksti, par kuriem zina Tavs serveris un kuri pašlaik tiek daudz kopīgoti un pievienoti izlasēm. Tas var palīdzēt jaunajiem lietotājiem un tiem, kuri atgriežas, atrast vairāk cilvēku, kam sekot. Neviens ieraksts netiek publiski rādīts, līdz apstiprināsi autoru un ja autors ļauj savu kontu ieteikt citiem. Tu vari arī atļaut vai noraidīt atsevišķus ierakstus. disallow: Neļaut veikt ierakstus disallow_account: Neatļaut autoru diff --git a/config/locales/pt-BR.yml b/config/locales/pt-BR.yml index 89c179a34b..6a8fdda024 100644 --- a/config/locales/pt-BR.yml +++ b/config/locales/pt-BR.yml @@ -142,7 +142,7 @@ pt-BR: only_password: Apenas senha password_and_2fa: Senha e autenticação de dois fatores sensitive: Sensíveis - sensitized: marcadas como sensíveis + sensitized: Marcadas como sensíveis shared_inbox_url: Link da caixa de entrada compartilhada show: created_reports: Denúncias criadas @@ -309,6 +309,7 @@ pt-BR: title: Auditar histórico unavailable_instance: "(nome de domínio indisponível)" announcements: + back: Voltar aos anúncios destroyed_msg: Anúncio excluído! edit: title: Editar anúncio @@ -317,6 +318,8 @@ pt-BR: new: create: Criar anúncio title: Novo anúncio + preview: + explanation_html: 'Esse e-mail será enviado a %{display_count} usuários. O texto a seguir será incluído ao e-mail:' publish: Publicar published_msg: Anúncio publicado! scheduled_for: Agendado para %{time} @@ -475,6 +478,25 @@ pt-BR: new: title: Importar bloqueio de domínios no_file: Nenhum arquivo selecionado + fasp: + debug: + callbacks: + created_at: Criado em + delete: Apagar + ip: Endereço de IP + providers: + base_url: URL Base + delete: Apagar + finish_registration: Finalizar o cadastro + name: Nome + public_key_fingerprint: Impressão digital de chave pública + registration_requested: Cadastro solicitado + registrations: + confirm: Confirmar + reject: Rejeitar + save: Salvar + sign_in: Entrar + status: Estado follow_recommendations: description_html: "A recomendação de contas ajuda os novos usuários a encontrar rapidamente conteúdo interessante. Quando um usuário ainda não tiver interagido o suficiente para gerar recomendações de contas, essas contas serão recomendadas. Essas recomendações são recalculadas diariamente a partir de uma lista de contas com alto engajamento e maior número de seguidores locais em uma dada língua." language: Na língua @@ -939,6 +961,7 @@ pt-BR: chance_to_review_html: "Os termos de serviço gerado não será publicado automaticamente.Você terá uma chance de revisar os resultados. Preencha os detalhes necessários para continuar" explanation_html: O modelo de termos de serviço fornecido é apenas para fins informativos e não deve ser interpretado como aconselhamento jurídico sobre qualquer assunto. Consulte seu próprio advogado para esclarecer sua situação e dúvidas jurídicas específicas. title: Configuração dos Termos de Serviço + going_live_on_html: Em vigor a partir de %{date} history: Histórico live: Em vigor no_history: Ainda não há alterações registradas nos termos de serviço. @@ -1936,6 +1959,8 @@ pt-BR: terms_of_service_changed: agreement: Ao continuar a usar %{domain}, você concorda com estes termos. Se discordar dos termos atualizados, poderá encerrar seu acordo com %{domain} a qualquer momento excluindo sua conta. changelog: 'Em resumo, veja o que essa atualização significa para você:' + description: 'Você recebeu este e-mail porque faremos algumas mudanças nos Termos de Serviço do %{domain}. Essas atualizações entrarão em vigor a partir de %{date}. Veja o que mudou aqui:' + description_html: Você recebeu este e-mail porque faremos algumas mudanças nos Termos de Serviço do %{domain}. Essas atualizações entrarão em vigor a partir de %{date}. Veja o que mudou aqui. sign_off: A equipe do %{domain} subject: Atualizações dos nossos termos de serviço subtitle: Os termos de serviço do %{domain} estão mudando. diff --git a/config/locales/simple_form.bg.yml b/config/locales/simple_form.bg.yml index b3a5882562..6180f51dd3 100644 --- a/config/locales/simple_form.bg.yml +++ b/config/locales/simple_form.bg.yml @@ -139,6 +139,7 @@ bg: terms_of_service_generator: admin_email: Правните бележки включват насрещни известия, постановления на съда, заявки за сваляне и заявки от правоохранителните органи. arbitration_address: Може да е същото като физическия адрес горе или "неприложимо", ако се употребява имейл. + arbitration_website: Може да е уеб формуляр или "неналично", ако употребявате имейл. choice_of_law: Град, регион, територия, щат или държава, чиито вътрешни материални права ще уреждат всички искове. dmca_email: Може да е същият имейл, използван за "Имейл адрес за правни известия" по-горе. domain: Неповторимо идентифициране на онлайн услугата, която предоставяте. diff --git a/config/locales/simple_form.pt-BR.yml b/config/locales/simple_form.pt-BR.yml index 0b62009648..64221777d7 100644 --- a/config/locales/simple_form.pt-BR.yml +++ b/config/locales/simple_form.pt-BR.yml @@ -8,9 +8,9 @@ pt-BR: display_name: Seu nome completo ou apelido. fields: Sua página inicial, pronomes, idade ou qualquer coisa que quiser. indexable: Suas publicações públicas podem aparecer nos resultados da pesquisa em Mastodon. As pessoas que interagiram com suas publicações podem conseguir pesquisá-las independentemente disso. - note: 'Você pode @mencionar outras pessoas ou #hashtags.' - show_collections: As pessoas poderão navegar entre os seus seguidores e seguidores. As pessoas que você segue verão que você as segue independentemente disso. - unlocked: As pessoas poderão seguir você sem solicitar aprovação. Desmarque caso você queira revisar as solicitações de seguidor e escolha se queira aceitar ou rejeitar novos seguidores. + note: 'Você pode @mencionar outras pessoas ou usar #hashtags.' + show_collections: As pessoas podem ver seus seguidores e quem você está seguindo. Os perfis que você seguir saberão que você os segue independentemente do que selecionar. + unlocked: As pessoas poderão te seguir sem solicitar aprovação. Desmarque caso você queira revisar as solicitações. account_alias: acct: Especifique o usuário@domínio de onde veio account_migration: @@ -27,8 +27,8 @@ pt-BR: disable: Impede o usuário de usar a conta, porém sem excluí-la ou suspendê-la. none: Use isto para enviar uma advertência ao usuário, sem nenhuma outra ação. sensitive: Marca todas as mídias do usuário como sensível. - silence: Impede o usuário de enviar postagens visualmente públicas, além de ocultar suas publicações e notificações dos que não o seguem. Ademais, fecha todas as denúncias contra esta conta. - suspend: Impede qualquer interação de ou para esta conta e exclui seu conteúdo. Reversível dentro de 30 dias. Ademais, fecha todas as denúncias contra esta conta. + silence: Impede o usuário de postar publicamente, restringe suas publicações e notificações a somente quem o segue. Encerra todas as denúncias contra esta conta. + suspend: Impede qualquer interação de ou para esta conta e exclui seu conteúdo. Reversível dentro de 30 dias. Encerra todas as denúncias contra esta conta. warning_preset_id: Opcional. Você pode adicionar texto personalizado no final da advertência pré-definida announcement: all_day: Quando marcada, apenas as datas do período serão mostradas @@ -37,11 +37,11 @@ pt-BR: starts_at: Opcional. Caso o comunicado esteja vinculado a um período específico text: Você pode usar a sintaxe do toot. Considere o espaço que o comunicado ocupará na tela do usuário appeal: - text: Você só pode solicitar uma revisão uma vez + text: Você só pode recorrer uma vez defaults: autofollow: Pessoas que criarem conta através de seu convite te seguirão automaticamente avatar: WEBP, PNG, GIF ou JPG. No máximo %{size}. Será reduzido para %{dimensions}px - bot: Essa conta executa principalmente ações automatizadas e pode não ser monitorada + bot: Sinaliza aos outros de que essa conta executa principalmente ações automatizadas e pode não ser monitorada context: Um ou mais contextos onde o filtro deve atuar current_password: Para fins de segurança, digite a senha da conta atual current_username: Para confirmar, digite o nome de usuário da conta atual @@ -54,7 +54,7 @@ pt-BR: password: Use pelo menos 8 caracteres phrase: Corresponderá independente de maiúsculas ou minúsculas, no texto ou no Aviso de Conteúdo de um toot scopes: Quais APIs o aplicativo vai ter permissão de acessar. Se você selecionar uma autorização de alto nível, você não precisa selecionar individualmente os outros. - setting_aggregate_reblogs: Não mostra novos impulsos para publicações já receberam recentemente (afeta somente os impulsos mais recentes) + setting_aggregate_reblogs: Não mostrar novos impulsos para publicações que já foram impulsionadas recentemente (afeta somente os impulsos mais recentes) setting_always_send_emails: Normalmente, as notificações por e-mail não serão enviadas enquanto você estiver usando ativamente o Mastodon setting_default_sensitive: Mídia sensível está oculta por padrão e pode ser revelada com um clique setting_display_media_default: Sempre ocultar mídia sensível @@ -75,12 +75,13 @@ pt-BR: filters: action: Escolher qual ação executar quando uma publicação corresponder ao filtro actions: + blur: Oculte a mídia com um aviso, porém mantenha o texto visível hide: Esconder completamente o conteúdo filtrado, comportando-se como se ele não existisse warn: Ocultar o conteúdo filtrado por trás de um aviso mencionando o título do filtro form_admin_settings: activity_api_enabled: Contagem de publicações locais, usuários ativos e novos usuários semanais app_icon: WEBP, PNG, GIF ou JPG. Sobrescrever o ícone padrão do aplicativo em dispositivos móveis com um ícone personalizado. - backups_retention_period: Os usuários têm a capacidade de gerar arquivos de suas postagens para baixar mais tarde. Quando definido como um valor positivo, esses arquivos serão automaticamente excluídos do seu armazenamento após o número especificado de dias. + backups_retention_period: Os usuários podem gerar arquivos de suas postagens para baixar mais tarde. Quando definido como um valor positivo, esses arquivos serão automaticamente excluídos do seu armazenamento após o número especificado de dias. bootstrap_timeline_accounts: Estas contas serão fixadas no topo das recomendações de novos usuários para seguir. closed_registrations_message: Exibido quando as inscrições estiverem fechadas content_cache_retention_period: Todas as postagens de outros servidores (incluindo boosts e respostas) serão excluídas após o número especificado de dias, sem levar a qualquer interação do usuário local com esses posts. Isto inclui postagens onde um usuário local o marcou como favorito ou favoritos. Menções privadas entre usuários de diferentes instâncias também serão perdidas e impossíveis de restaurar. O uso desta configuração destina-se a instâncias especiais de propósitos e quebra muitas expectativas dos usuários quando implementadas para uso de propósito geral. @@ -88,6 +89,7 @@ pt-BR: favicon: WEBP, PNG, GIF ou JPG. Sobrescreve o favicon padrão do Mastodon com um ícone personalizado. mascot: Substitui a ilustração na interface web avançada. media_cache_retention_period: Arquivos de mídia de mensagens de usuários remotos são armazenados em cache no seu servidor. Quando definido como valor positivo, a mídia será excluída após o número especificado de dias. Se os dados da mídia forem solicitados depois de excluídos, eles serão baixados novamente, se o conteúdo fonte ainda estiver disponível. Devido a restrições de quantas vezes os cartões de visualização de links sondam sites de terceiros, é recomendado definir este valor em pelo menos 14 dias, ou pré-visualização de links não serão atualizados a pedido antes desse tempo. + min_age: Os usuários precisarão confirmar sua data de nascimento no cadastro peers_api_enabled: Uma lista de nomes de domínio que este servidor encontrou no "fediverse". Nenhum dado é incluído aqui sobre se você concorda com os padroes operacionais de um determinado servidor, apenas que o seu servidor sabe disso. Esta ferramenta é utilizado por serviços que recolhem estatísticas sob as normas da federação (grupo de empresas que concordam sob paramentros operacionais específicos), em termos gerais. profile_directory: O diretório de perfis lista todos os usuários que optaram por permitir que suas contas sejam descobertas. require_invite_text: 'Quando o cadastro de novas contas exigir aprovação manual, tornar obrigatório, ao invés de opcional, o texto de solicitação de convite: "Por que você deseja ingressar nessa comunidade?"' @@ -132,14 +134,21 @@ pt-BR: name: Você pode mudar a capitalização das letras, por exemplo, para torná-la mais legível terms_of_service: changelog: Pode ser estruturado com a sintaxe Markdown. + effective_date: Um intervalo de tempo razoável pode variar de 10 a 30 dias a partir da data em que notificar seus usuários. text: Pode ser estruturado com a sintaxe Markdown. terms_of_service_generator: admin_email: Avisos legais incluem contra-notificações, ordens judiciais, solicitações de remoção e solicitações de órgãos de fiscalização. + arbitration_address: Pode ser o mesmo do endereço colocado cima, ou use "N/A" se estiver utilizando e-mail. + arbitration_website: Pode ser um formulário online, ou use "N/A" caso esteja utilizando um e-mail. + choice_of_law: Cidade, região, território ou estado cujas leis substantivas internas serão aplicáveis a todas e quaisquer reivindicações. dmca_address: Para operadores dos EUA, utilize o endereço registrado no Diretório de Agentes Designados pela DMCA. Um endereço de Caixa Postal está disponível mediante solicitação direta; use a Solicitação de Isenção de Caixa Postal de Agente Designado pela DMCA para enviar um e-mail ao Escritório de Direitos Autorais, explicando que você é um moderador de conteúdo que trabalha em casa e teme vingança ou retaliação por suas ações, precisando usar uma Caixa Postal para remover seu endereço residencial da visualização pública. + dmca_email: Pode ser o mesmo e-mail utilizado acima em "Endereço de e-mail para avisos legais". domain: Identificação única do serviço online que você está fornecendo. jurisdiction: Liste o país onde quem paga as contas reside. Se for uma empresa ou outra entidade, liste o país onde ela está incorporada, e a cidade, região, território ou estado, conforme apropriado. + min_age: Não deve ter menos que a idade mínima exigida pelas suas leis locais. user: chosen_languages: Apenas as publicações dos idiomas selecionados serão exibidas nas linhas públicas + date_of_birth: Precisamos ter certeza de que você tem, no mínimo, %{age} anos para usar o Mastodon. Não armazenaremos essa informação. role: A função controla quais permissões o usuário tem. user_role: color: Cor a ser usada para o cargo em toda a interface do usuário, como RGB no formato hexadecimal @@ -252,6 +261,7 @@ pt-BR: name: Hashtag filters: actions: + blur: Oculte a mídia com um aviso hide: Ocultar completamente warn: Ocultar com um aviso form_admin_settings: @@ -265,6 +275,7 @@ pt-BR: favicon: Favicon mascot: Mascote personalizado (legado) media_cache_retention_period: Período de retenção do cachê de mídia + min_age: Requisito de idade mínimia peers_api_enabled: Publicar lista de instâncias de servidor descobertas na API profile_directory: Ativar diretório de perfis registrations_mode: Quem pode se inscrever @@ -330,16 +341,22 @@ pt-BR: usable: Permitir que as publicações usem esta hashtag localmente terms_of_service: changelog: O que mudou? + effective_date: Data de vigência text: Termos de Serviço terms_of_service_generator: - admin_email: Endereço de e-mail para avisos legais. + admin_email: Endereço de e-mail para avisos legais arbitration_address: Endereço físico para avisos de arbitragem. arbitration_website: Site para submissão de notificações de arbitragem + choice_of_law: Lei de regência dmca_address: Endereço físico para notificações de DMCA/direitos autorais dmca_email: Endereço de e-mail para notificações de DMCA/direitos autorais domain: Domínio - jurisdiction: Jurisdicação legal + jurisdiction: Jurisdição legal + min_age: Idade mínima user: + date_of_birth_1i: Dia + date_of_birth_2i: Mês + date_of_birth_3i: Ano role: Cargo time_zone: Fuso horário user_role: diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 0000000000..d6a46638dc --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,419 @@ +// @ts-check + +import js from '@eslint/js'; +import { globalIgnores } from 'eslint/config'; +import formatjs from 'eslint-plugin-formatjs'; +// @ts-expect-error -- No typings +import importPlugin from 'eslint-plugin-import'; +import jsdoc from 'eslint-plugin-jsdoc'; +import jsxA11Y from 'eslint-plugin-jsx-a11y'; +import promisePlugin from 'eslint-plugin-promise'; +import react from 'eslint-plugin-react'; +import reactHooks from 'eslint-plugin-react-hooks'; +import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +/** @type {import('typescript-eslint').ConfigArray} */ +export const baseConfig = [ + js.configs.recommended, + importPlugin.flatConfigs.recommended, + jsdoc.configs['flat/recommended'], + promisePlugin.configs['flat/recommended'], + { + linterOptions: { + reportUnusedDisableDirectives: 'error', + reportUnusedInlineConfigs: 'error', + }, + rules: { + 'consistent-return': 'error', + 'dot-notation': 'error', + + eqeqeq: [ + 'error', + 'always', + { + null: 'ignore', + }, + ], + + 'no-console': [ + 'warn', + { + allow: ['error', 'warn'], + }, + ], + + 'no-empty': [ + 'error', + { + allowEmptyCatch: true, + }, + ], + + 'no-restricted-properties': [ + 'error', + { + property: 'substring', + message: 'Use .slice instead of .substring.', + }, + { + property: 'substr', + message: 'Use .slice instead of .substr.', + }, + ], + + 'no-unused-expressions': 'error', + 'no-unused-vars': 'off', + + 'valid-typeof': 'error', + + 'import/extensions': [ + 'error', + 'always', + { + js: 'never', + jsx: 'never', + mjs: 'never', + ts: 'never', + mts: 'never', + tsx: 'never', + }, + ], + 'import/first': 'error', + 'import/newline-after-import': 'error', + 'import/no-anonymous-default-export': 'error', + 'import/no-amd': 'error', + 'import/no-commonjs': 'error', + 'import/no-import-module-exports': 'error', + 'import/no-relative-packages': 'error', + 'import/no-self-import': 'error', + 'import/no-useless-path-segments': 'error', + 'import/order': [ + 'error', + { + alphabetize: { + order: 'asc', + }, + + 'newlines-between': 'always', + + groups: [ + 'builtin', + 'external', + 'internal', + 'parent', + ['index', 'sibling'], + 'object', + ], + + pathGroups: [ + { + pattern: '{react,react-dom,react-dom/client,prop-types}', + group: 'builtin', + position: 'after', + }, + { + pattern: '{react-intl,intl-messageformat}', + group: 'builtin', + position: 'after', + }, + { + pattern: + '{classnames,react-helmet,react-router,react-router-dom}', + group: 'external', + position: 'before', + }, + { + pattern: + '{immutable,@reduxjs/toolkit,react-redux,react-immutable-proptypes,react-immutable-pure-component}', + group: 'external', + position: 'before', + }, + { + pattern: '{mastodon/**}', + group: 'internal', + position: 'after', + }, + { + pattern: '{flavours/glitch-soc/**}', + group: 'internal', + position: 'after', + }, + ], + + pathGroupsExcludedImportTypes: [], + }, + ], + + 'jsdoc/check-types': 'off', + 'jsdoc/no-undefined-types': 'off', + 'jsdoc/require-jsdoc': 'off', + 'jsdoc/require-param-description': 'off', + 'jsdoc/require-property-description': 'off', + 'jsdoc/require-returns-description': 'off', + 'jsdoc/require-returns': 'off', + + // Forbid imports from vanilla in glitch flavour + 'import/no-restricted-paths': [ + 'error', + { + zones: [ + { + target: 'app/javascript/flavours/glitch/', + from: 'app/javascript/mastodon/', + message: 'Import from /flavours/glitch/ instead', + }, + ], + }, + ], + + 'promise/always-return': 'off', + 'promise/catch-or-return': [ + 'error', + { + allowFinally: true, + }, + ], + 'promise/no-callback-in-promise': 'off', + 'promise/no-nesting': 'off', + 'promise/no-promise-in-callback': 'off', + }, + }, +]; + +export default tseslint.config([ + baseConfig, + globalIgnores([ + 'build/**/*', + 'coverage/**/*', + 'db/**/*', + 'lib/**/*', + 'log/**/*', + 'node_modules/**/*', + 'public/**/*', + '!public/embed.js', + 'spec/**/*', + 'tmp/**/*', + 'vendor/**/*', + 'streaming/**/*', + ]), + react.configs.flat.recommended, + react.configs.flat['jsx-runtime'], + reactHooks.configs['recommended-latest'], + jsxA11Y.flatConfigs.recommended, + importPlugin.flatConfigs.react, + // @ts-expect-error -- For some reason the formatjs package exports an empty object? + formatjs.configs.strict, + { + languageOptions: { + globals: { + ...globals.browser, + }, + + parser: tseslint.parser, + ecmaVersion: 2021, + sourceType: 'module', + }, + + settings: { + react: { + version: 'detect', + }, + + 'import/ignore': ['node_modules', '\\.(css|scss|json)$'], + + 'import/resolver': { + typescript: {}, + }, + }, + + rules: { + 'no-restricted-syntax': [ + 'error', + { + // eslint-disable-next-line no-restricted-syntax + selector: 'Literal[value=/•/], JSXText[value=/•/]', + // eslint-disable-next-line no-restricted-syntax + message: "Use '·' (middle dot) instead of '•' (bullet)", + }, + ], + + 'formatjs/enforce-description': 'off', // description values not currently used + 'formatjs/enforce-id': 'off', // Explicit IDs are used in the project + 'formatjs/enforce-placeholders': 'off', // Issues in short_number.jsx + 'formatjs/no-invalid-icu': 'error', + 'formatjs/no-literal-string-in-jsx': 'off', // Should be looked at, but mainly flagging punctuation outside of strings + 'formatjs/no-multiple-plurals': 'off', // Should be looked at + + 'jsx-a11y/click-events-have-key-events': 'off', + 'jsx-a11y/label-has-associated-control': 'off', + 'jsx-a11y/media-has-caption': 'off', + 'jsx-a11y/no-autofocus': 'off', + 'jsx-a11y/no-interactive-element-to-noninteractive-role': 'off', + 'jsx-a11y/no-noninteractive-tabindex': 'off', + 'jsx-a11y/no-static-element-interactions': [ + 'warn', + { + handlers: ['onClick'], + }, + ], + + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: [ + 'eslint.config.mjs', + 'config/webpack/**', + 'app/javascript/mastodon/performance.js', + 'app/javascript/mastodon/test_setup.js', + 'app/javascript/**/__tests__/**', + ], + }, + ], + 'import/no-webpack-loader-syntax': 'error', + + 'react/jsx-filename-extension': [ + 'error', + { + extensions: ['.jsx', 'tsx'], + }, + ], + + 'react/jsx-boolean-value': 'error', + 'react/display-name': 'off', + 'react/jsx-fragments': ['error', 'syntax'], + 'react/jsx-equals-spacing': 'error', + 'react/jsx-no-bind': 'error', + 'react/jsx-no-useless-fragment': 'error', + 'react/jsx-no-target-blank': [ + 'error', + { + allowReferrer: true, + }, + ], + 'react/jsx-tag-spacing': 'error', + 'react/jsx-wrap-multilines': 'error', + 'react/self-closing-comp': 'error', + }, + }, + { + files: [ + 'app/javascript/mastodon/common.js', + 'app/javascript/mastodon/features/emoji/unicode_to_unified_name.js', + 'app/javascript/mastodon/features/emoji/emoji_compressed.js', + 'app/javascript/mastodon/features/emoji/unicode_to_filename.js', + 'app/javascript/flavours/glitch/common.js', + 'app/javascript/flavours/glitch/entrypoints/common.js', + 'app/javascript/flavours/glitch/features/emoji/unicode_to_unified_name.js', + 'app/javascript/flavours/glitch/features/emoji/emoji_compressed.js', + 'app/javascript/flavours/glitch/features/emoji/unicode_to_filename.js', + 'app/javascript/mastodon/service_worker/web_push_locales.js', + '**/*.config.js', + '**/.*rc.js', + '**/ide-helper.js', + 'config/webpack/**/*', + 'config/formatjs-formatter.js', + ], + + languageOptions: { + globals: { + ...globals.commonjs, + ...globals.node, + }, + + ecmaVersion: 5, + sourceType: 'commonjs', + }, + + rules: { + 'import/no-commonjs': 'off', + }, + }, + { + files: ['**/*.ts', '**/*.tsx'], + + extends: [ + tseslint.configs.strictTypeChecked, + tseslint.configs.stylisticTypeChecked, + react.configs.flat.recommended, + react.configs.flat['jsx-runtime'], + reactHooks.configs['recommended-latest'], + jsxA11Y.flatConfigs.recommended, + importPlugin.flatConfigs.react, + importPlugin.flatConfigs.typescript, + jsdoc.configs['flat/recommended-typescript'], + ], + + languageOptions: { + parserOptions: { + projectService: true, + }, + }, + + rules: { + // This is not needed as we use noImplicitReturns, which handles this in addition to understanding types + 'consistent-return': 'off', + + 'formatjs/enforce-plural-rules': 'off', + + 'import/consistent-type-specifier-style': ['error', 'prefer-top-level'], + 'import/no-default-export': 'warn', + + 'jsdoc/require-jsdoc': 'off', + + 'react/prefer-stateless-function': 'warn', + 'react/function-component-definition': [ + 'error', + { + namedComponents: 'arrow-function', + }, + ], + 'react/prop-types': 'off', + + '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'], + '@typescript-eslint/consistent-type-exports': 'error', + '@typescript-eslint/consistent-type-imports': 'error', + '@typescript-eslint/prefer-nullish-coalescing': [ + 'error', + { + ignorePrimitives: { + boolean: true, + }, + }, + ], + '@typescript-eslint/no-restricted-imports': [ + 'warn', + { + name: 'react-redux', + importNames: ['useSelector', 'useDispatch'], + message: + 'Use typed hooks `useAppDispatch` and `useAppSelector` instead.', + }, + ], + '@typescript-eslint/no-unused-vars': [ + 'error', + { + vars: 'all', + args: 'after-used', + destructuredArrayIgnorePattern: '^_', + ignoreRestSiblings: true, + }, + ], + '@typescript-eslint/restrict-template-expressions': [ + 'warn', + { + allowNumber: true, + }, + ], + }, + }, + { + files: ['**/__tests__/*.js', '**/__tests__/*.jsx'], + + languageOptions: { + globals: { + ...globals.jest, + }, + }, + }, +]); diff --git a/lib/paperclip/vips_lazy_thumbnail.rb b/lib/paperclip/vips_lazy_thumbnail.rb index fea4b86064..528d5604dc 100644 --- a/lib/paperclip/vips_lazy_thumbnail.rb +++ b/lib/paperclip/vips_lazy_thumbnail.rb @@ -123,7 +123,14 @@ module Paperclip end def needs_convert? - needs_different_geometry? || needs_different_format? || needs_metadata_stripping? + strip_animations? || needs_different_geometry? || needs_different_format? || needs_metadata_stripping? + end + + def strip_animations? + # Detecting whether the source image is animated across all our supported + # input file formats is not trivial, and converting unconditionally is just + # as simple for now + options[:style] == :static end def needs_different_geometry? diff --git a/package.json b/package.json index 46e1bee51d..c3b67841af 100644 --- a/package.json +++ b/package.json @@ -12,14 +12,14 @@ "scripts": { "build:development": "cross-env RAILS_ENV=development NODE_ENV=development ./bin/webpack", "build:production": "cross-env RAILS_ENV=production NODE_ENV=production ./bin/webpack", - "fix:js": "eslint . --ext=.js,.jsx,.ts,.tsx --cache --report-unused-disable-directives --fix", + "fix:js": "eslint . --cache --fix", "fix:css": "stylelint --fix \"**/*.{css,scss}\"", "fix": "yarn fix:js && yarn fix:css", "format": "prettier --write --log-level warn .", "format:check": "prettier --check --ignore-unknown .", "i18n:extract": "formatjs extract 'app/javascript/**/*.{js,jsx,ts,tsx}' --ignore '**/*.d.ts' --out-file app/javascript/flavours/glitch/locales/en.json --format config/formatjs-formatter.js", "jest": "cross-env NODE_ENV=test jest", - "lint:js": "eslint . --ext=.js,.jsx,.ts,.tsx --cache --report-unused-disable-directives", + "lint:js": "cd $INIT_CWD && eslint --cache --report-unused-disable-directives", "lint:css": "stylelint \"**/*.{css,scss}\"", "lint": "yarn lint:js && yarn lint:css", "postversion": "git push --tags", @@ -145,6 +145,7 @@ "workbox-window": "^7.0.0" }, "devDependencies": { + "@eslint/js": "^9.23.0", "@formatjs/cli": "^6.1.1", "@testing-library/dom": "^10.2.0", "@testing-library/jest-dom": "^6.0.0", @@ -176,19 +177,17 @@ "@types/requestidlecallback": "^0.3.5", "@types/webpack": "^4.41.33", "@types/webpack-env": "^1.18.4", - "@typescript-eslint/eslint-plugin": "^8.0.0", - "@typescript-eslint/parser": "^8.0.0", "babel-jest": "^29.5.0", - "eslint": "^8.41.0", - "eslint-define-config": "^2.0.0", - "eslint-import-resolver-typescript": "^3.5.5", - "eslint-plugin-formatjs": "^5.0.0", + "eslint": "^9.23.0", + "eslint-import-resolver-typescript": "^4.2.5", + "eslint-plugin-formatjs": "^5.3.1", "eslint-plugin-import": "~2.31.0", - "eslint-plugin-jsdoc": "^50.0.0", - "eslint-plugin-jsx-a11y": "~6.10.0", - "eslint-plugin-promise": "~7.2.0", - "eslint-plugin-react": "^7.33.2", - "eslint-plugin-react-hooks": "^5.0.0", + "eslint-plugin-jsdoc": "^50.6.9", + "eslint-plugin-jsx-a11y": "~6.10.2", + "eslint-plugin-promise": "~7.2.1", + "eslint-plugin-react": "^7.37.4", + "eslint-plugin-react-hooks": "^5.2.0", + "globals": "^16.0.0", "husky": "^9.0.11", "jest": "^29.5.0", "jest-environment-jsdom": "^29.5.0", @@ -199,6 +198,7 @@ "stylelint-config-prettier-scss": "^1.0.0", "stylelint-config-standard-scss": "^14.0.0", "typescript": "^5.0.4", + "typescript-eslint": "^8.28.0", "webpack-dev-server": "^3.11.3" }, "resolutions": { diff --git a/streaming/.eslintrc.cjs b/streaming/.eslintrc.cjs deleted file mode 100644 index e25cff7df0..0000000000 --- a/streaming/.eslintrc.cjs +++ /dev/null @@ -1,43 +0,0 @@ -/* eslint-disable import/no-commonjs */ - -// @ts-check - -// @ts-ignore - This needs to be a CJS file (eslint does not yet support ESM configs), and TS is complaining we use require -const { defineConfig } = require('eslint-define-config'); - -module.exports = defineConfig({ - extends: ['../.eslintrc.js'], - env: { - browser: false, - }, - parserOptions: { - project: true, - tsconfigRootDir: __dirname, - ecmaFeatures: { - jsx: false, - }, - ecmaVersion: 2021, - }, - rules: { - // In the streaming server we need to delete some variables to ensure - // garbage collection takes place on the values referenced by those objects; - // The alternative is to declare the variable as nullable, but then we need - // to assert it's in existence before every use, which becomes much harder - // to maintain. - 'no-delete-var': 'off', - - // This overrides the base configuration for this rule to pick up - // dependencies for the streaming server from the correct package.json file. - 'import/no-extraneous-dependencies': [ - 'error', - { - devDependencies: ['streaming/.eslintrc.cjs'], - optionalDependencies: false, - peerDependencies: false, - includeTypes: true, - packageDir: __dirname, - }, - ], - 'import/extensions': ['error', 'always'], - }, -}); diff --git a/streaming/eslint.config.mjs b/streaming/eslint.config.mjs new file mode 100644 index 0000000000..51a6551514 --- /dev/null +++ b/streaming/eslint.config.mjs @@ -0,0 +1,45 @@ +// @ts-check + +import globals from 'globals'; +import tseslint from 'typescript-eslint'; + +// eslint-disable-next-line import/no-relative-packages -- Must import from the root +import { baseConfig } from '../eslint.config.mjs'; + +export default tseslint.config([ + baseConfig, + { + languageOptions: { + globals: globals.node, + + parser: tseslint.parser, + ecmaVersion: 2021, + sourceType: 'module', + }, + + settings: { + 'import/ignore': ['node_modules', '\\.(json)$'], + 'import/resolver': { + typescript: {}, + }, + }, + + rules: { + // In the streaming server we need to delete some variables to ensure + // garbage collection takes place on the values referenced by those objects; + // The alternative is to declare the variable as nullable, but then we need + // to assert it's in existence before every use, which becomes much harder + // to maintain. + 'no-delete-var': 'off', + + 'import/no-extraneous-dependencies': [ + 'error', + { + devDependencies: ['**/*.config.mjs'], + }, + ], + + 'import/extensions': ['error', 'always'], + }, + }, +]); diff --git a/streaming/lint-staged.config.mjs b/streaming/lint-staged.config.mjs new file mode 100644 index 0000000000..430a999b9a --- /dev/null +++ b/streaming/lint-staged.config.mjs @@ -0,0 +1,7 @@ +const config = { + '*': 'prettier --ignore-unknown --write', + '*.{js,ts}': 'eslint --fix', + '**/*.ts': () => 'tsc -p tsconfig.json --noEmit', +}; + +export default config; diff --git a/streaming/package.json b/streaming/package.json index 9ecc7bb2fa..a96a3f8c52 100644 --- a/streaming/package.json +++ b/streaming/package.json @@ -31,14 +31,16 @@ "ws": "^8.12.1" }, "devDependencies": { + "@eslint/js": "^9.23.0", "@types/cors": "^2.8.16", "@types/express": "^4.17.17", "@types/pg": "^8.6.6", "@types/uuid": "^10.0.0", "@types/ws": "^8.5.9", - "eslint-define-config": "^2.0.0", + "globals": "^16.0.0", "pino-pretty": "^13.0.0", - "typescript": "^5.0.4" + "typescript": "^5.0.4", + "typescript-eslint": "^8.28.0" }, "optionalDependencies": { "bufferutil": "^4.0.7", diff --git a/streaming/tsconfig.json b/streaming/tsconfig.json index 37e9a7fee0..2f892dc3b6 100644 --- a/streaming/tsconfig.json +++ b/streaming/tsconfig.json @@ -8,5 +8,5 @@ "tsBuildInfoFile": "../tmp/cache/streaming/tsconfig.tsbuildinfo", "paths": {} }, - "include": ["./*.js", "./.eslintrc.cjs"] + "include": ["./*.js"] } diff --git a/yarn.lock b/yarn.lock index 27d1d51fb2..a64eb94e05 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2016,6 +2016,34 @@ __metadata: languageName: node linkType: hard +"@emnapi/core@npm:^1.3.1": + version: 1.3.1 + resolution: "@emnapi/core@npm:1.3.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.1" + tslib: "npm:^2.4.0" + checksum: 10c0/d3be1044ad704e2c486641bc18908523490f28c7d38bd12d9c1d4ce37d39dae6c4aecd2f2eaf44c6e3bd90eaf04e0591acc440b1b038cdf43cce078a355a0ea0 + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.3.1": + version: 1.3.1 + resolution: "@emnapi/runtime@npm:1.3.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/060ffede50f1b619c15083312b80a9e62a5b0c87aa8c1b54854c49766c9d69f8d1d3d87bd963a647071263a320db41b25eaa50b74d6a80dcc763c23dbeaafd6c + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.1": + version: 1.0.1 + resolution: "@emnapi/wasi-threads@npm:1.0.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/1e0c8036b8d53e9b07cc9acf021705ef6c86ab6b13e1acda7fffaf541a2d3565072afb92597419173ced9ea14f6bf32fce149106e669b5902b825e8b499e5c6c + languageName: node + linkType: hard + "@emoji-mart/data@npm:1.2.1": version: 1.2.1 resolution: "@emoji-mart/data@npm:1.2.1" @@ -2162,34 +2190,85 @@ __metadata: languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.1": +"@eslint-community/regexpp@npm:^4.10.0": version: 4.10.0 resolution: "@eslint-community/regexpp@npm:4.10.0" checksum: 10c0/c5f60ef1f1ea7649fa7af0e80a5a79f64b55a8a8fa5086de4727eb4c86c652aedee407a9c143b8995d2c0b2d75c1222bec9ba5d73dbfc1f314550554f0979ef4 languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/eslintrc@npm:2.1.4" +"@eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10c0/a03d98c246bcb9109aec2c08e4d10c8d010256538dcb3f56610191607214523d4fb1b00aa81df830b6dffb74c5fa0be03642513a289c567949d3e550ca11cdf6 + languageName: node + linkType: hard + +"@eslint/config-array@npm:^0.19.2": + version: 0.19.2 + resolution: "@eslint/config-array@npm:0.19.2" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10c0/dd68da9abb32d336233ac4fe0db1e15a0a8d794b6e69abb9e57545d746a97f6f542496ff9db0d7e27fab1438546250d810d90b1904ac67677215b8d8e7573f3d + languageName: node + linkType: hard + +"@eslint/config-helpers@npm:^0.2.0": + version: 0.2.0 + resolution: "@eslint/config-helpers@npm:0.2.0" + checksum: 10c0/743a64653e13177029108f57ab47460ded08e3412c86216a14b7e8ab2dc79c2b64be45bf55c5ef29f83692a707dc34cf1e9217e4b8b4b272a0d9b691fdaf6a2a + languageName: node + linkType: hard + +"@eslint/core@npm:^0.12.0": + version: 0.12.0 + resolution: "@eslint/core@npm:0.12.0" + dependencies: + "@types/json-schema": "npm:^7.0.15" + checksum: 10c0/d032af81195bb28dd800c2b9617548c6c2a09b9490da3c5537fd2a1201501666d06492278bb92cfccac1f7ac249e58601dd87f813ec0d6a423ef0880434fa0c3 + languageName: node + linkType: hard + +"@eslint/eslintrc@npm:^3.3.1": + version: 3.3.1 + resolution: "@eslint/eslintrc@npm:3.3.1" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" - espree: "npm:^9.6.0" - globals: "npm:^13.19.0" + espree: "npm:^10.0.1" + globals: "npm:^14.0.0" ignore: "npm:^5.2.0" import-fresh: "npm:^3.2.1" js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10c0/32f67052b81768ae876c84569ffd562491ec5a5091b0c1e1ca1e0f3c24fb42f804952fdd0a137873bc64303ba368a71ba079a6f691cee25beee9722d94cc8573 + checksum: 10c0/b0e63f3bc5cce4555f791a4e487bf999173fcf27c65e1ab6e7d63634d8a43b33c3693e79f192cbff486d7df1be8ebb2bd2edc6e70ddd486cbfa84a359a3e3b41 languageName: node linkType: hard -"@eslint/js@npm:8.57.1": - version: 8.57.1 - resolution: "@eslint/js@npm:8.57.1" - checksum: 10c0/b489c474a3b5b54381c62e82b3f7f65f4b8a5eaaed126546520bf2fede5532a8ed53212919fed1e9048dcf7f37167c8561d58d0ba4492a4244004e7793805223 +"@eslint/js@npm:9.23.0, @eslint/js@npm:^9.23.0": + version: 9.23.0 + resolution: "@eslint/js@npm:9.23.0" + checksum: 10c0/4e70869372b6325389e0ab51cac6d3062689807d1cef2c3434857571422ce11dde3c62777af85c382b9f94d937127598d605d2086787f08611351bf99faded81 + languageName: node + linkType: hard + +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10c0/b8cdb7edea5bc5f6a96173f8d768d3554a628327af536da2fc6967a93b040f2557114d98dbcdbf389d5a7b290985ad6a9ce5babc547f36fc1fde42e674d11a56 + languageName: node + linkType: hard + +"@eslint/plugin-kit@npm:^0.2.7": + version: 0.2.7 + resolution: "@eslint/plugin-kit@npm:0.2.7" + dependencies: + "@eslint/core": "npm:^0.12.0" + levn: "npm:^0.4.1" + checksum: 10c0/0a1aff1ad63e72aca923217e556c6dfd67d7cd121870eb7686355d7d1475d569773528a8b2111b9176f3d91d2ea81f7413c34600e8e5b73d59e005d70780b633 languageName: node linkType: hard @@ -2254,18 +2333,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/ecma402-abstract@npm:2.3.3": - version: 2.3.3 - resolution: "@formatjs/ecma402-abstract@npm:2.3.3" - dependencies: - "@formatjs/fast-memoize": "npm:2.2.6" - "@formatjs/intl-localematcher": "npm:0.6.0" - decimal.js: "npm:10" - tslib: "npm:2" - checksum: 10c0/63de990c380a1800bc54d97c4aa13a88a92e73b1680f0f561d03f9bf3e23289b7aafd1a92037527c285bd587a44e20504258ac2cbd4564a4138ce2b4612c1495 - languageName: node - linkType: hard - "@formatjs/ecma402-abstract@npm:2.3.4": version: 2.3.4 resolution: "@formatjs/ecma402-abstract@npm:2.3.4" @@ -2278,15 +2345,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/fast-memoize@npm:2.2.6": - version: 2.2.6 - resolution: "@formatjs/fast-memoize@npm:2.2.6" - dependencies: - tslib: "npm:2" - checksum: 10c0/dccdc21105af673e58ec7b04eb17cd6fde1fb1a7e7a446273ca43f7ab97c26d5c0fcc2b9e80d5b54bf9b80354f9e1e681273c0ed26633ec72f0adc2d116dfd7f - languageName: node - linkType: hard - "@formatjs/fast-memoize@npm:2.2.7": version: 2.2.7 resolution: "@formatjs/fast-memoize@npm:2.2.7" @@ -2296,17 +2354,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-messageformat-parser@npm:2.11.1": - version: 2.11.1 - resolution: "@formatjs/icu-messageformat-parser@npm:2.11.1" - dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.3" - "@formatjs/icu-skeleton-parser": "npm:1.8.13" - tslib: "npm:2" - checksum: 10c0/2e4106d564ede73cc52c97fc4270002f2460c3ded10715a095ec6765c48f951b1e9744cc55679abe046e24e4e22c345e738f7477c43d440d1d10a0235b12df37 - languageName: node - linkType: hard - "@formatjs/icu-messageformat-parser@npm:2.11.2": version: 2.11.2 resolution: "@formatjs/icu-messageformat-parser@npm:2.11.2" @@ -2318,16 +2365,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/icu-skeleton-parser@npm:1.8.13": - version: 1.8.13 - resolution: "@formatjs/icu-skeleton-parser@npm:1.8.13" - dependencies: - "@formatjs/ecma402-abstract": "npm:2.3.3" - tslib: "npm:2" - checksum: 10c0/eddea5b7c43745d05178211b25641319e054747e40b42ffaa93ae9940fd42e6f5654d12d42e6998b91b4de4b67a24e3ed779a37394262ec1dd46e693c166729a - languageName: node - linkType: hard - "@formatjs/icu-skeleton-parser@npm:1.8.14": version: 1.8.14 resolution: "@formatjs/icu-skeleton-parser@npm:1.8.14" @@ -2338,15 +2375,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/intl-localematcher@npm:0.6.0": - version: 0.6.0 - resolution: "@formatjs/intl-localematcher@npm:0.6.0" - dependencies: - tslib: "npm:2" - checksum: 10c0/90238e633426ff7237ab2bbe017be044fb2fb185a8d59a0652096ddab9cb1ddf64106d58fafd711ea19c4d3455bd966516ab93574ac3b169d9af2325875fae59 - languageName: node - linkType: hard - "@formatjs/intl-localematcher@npm:0.6.1": version: 0.6.1 resolution: "@formatjs/intl-localematcher@npm:0.6.1" @@ -2386,26 +2414,6 @@ __metadata: languageName: node linkType: hard -"@formatjs/ts-transformer@npm:3.13.32": - version: 3.13.32 - resolution: "@formatjs/ts-transformer@npm:3.13.32" - dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.11.1" - "@types/json-stable-stringify": "npm:1" - "@types/node": "npm:14 || 16 || 17 || 18 || 20 || 22" - chalk: "npm:4" - json-stable-stringify: "npm:1" - tslib: "npm:2" - typescript: "npm:5" - peerDependencies: - ts-jest: 27 || 28 || 29 - peerDependenciesMeta: - ts-jest: - optional: true - checksum: 10c0/f51102e5427f9e22ed8dd4094e0347fa7bf96b99a97c5b48eb23bb11cd319f653c829073040884d0c6381136e227a1d0d2b7b2ac3ec0dba6ed9e26f454b61254 - languageName: node - linkType: hard - "@formatjs/ts-transformer@npm:3.13.34": version: 3.13.34 resolution: "@formatjs/ts-transformer@npm:3.13.34" @@ -2449,14 +2457,20 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/config-array@npm:^0.13.0": - version: 0.13.0 - resolution: "@humanwhocodes/config-array@npm:0.13.0" +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10c0/aa4e0152171c07879b458d0e8a704b8c3a89a8c0541726c6b65b81e84fd8b7564b5d6c633feadc6598307d34564bd53294b533491424e8e313d7ab6c7bc5dc67 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" dependencies: - "@humanwhocodes/object-schema": "npm:^2.0.3" - debug: "npm:^4.3.1" - minimatch: "npm:^3.0.5" - checksum: 10c0/205c99e756b759f92e1f44a3dc6292b37db199beacba8f26c2165d4051fe73a4ae52fdcfd08ffa93e7e5cb63da7c88648f0e84e197d154bbbbe137b2e0dd332e + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10c0/8356359c9f60108ec204cbd249ecd0356667359b2524886b357617c4a7c3b6aace0fd5a369f63747b926a762a88f8a25bc066fa1778508d110195ce7686243e1 languageName: node linkType: hard @@ -2467,10 +2481,17 @@ __metadata: languageName: node linkType: hard -"@humanwhocodes/object-schema@npm:^2.0.3": - version: 2.0.3 - resolution: "@humanwhocodes/object-schema@npm:2.0.3" - checksum: 10c0/80520eabbfc2d32fe195a93557cef50dfe8c8905de447f022675aaf66abc33ae54098f5ea78548d925aa671cd4ab7c7daa5ad704fe42358c9b5e7db60f80696c +"@humanwhocodes/retry@npm:^0.3.0": + version: 0.3.1 + resolution: "@humanwhocodes/retry@npm:0.3.1" + checksum: 10c0/f0da1282dfb45e8120480b9e2e275e2ac9bbe1cf016d046fdad8e27cc1285c45bb9e711681237944445157b430093412b4446c1ab3fc4bb037861b5904101d3b + languageName: node + linkType: hard + +"@humanwhocodes/retry@npm:^0.4.2": + version: 0.4.2 + resolution: "@humanwhocodes/retry@npm:0.4.2" + checksum: 10c0/0235525d38f243bee3bf8b25ed395fbf957fb51c08adae52787e1325673071abe856c7e18e530922ed2dd3ce12ed82ba01b8cee0279ac52a3315fcdc3a69ef0c languageName: node linkType: hard @@ -2814,6 +2835,7 @@ __metadata: "@dnd-kit/sortable": "npm:^10.0.0" "@dnd-kit/utilities": "npm:^3.2.2" "@emoji-mart/data": "npm:1.2.1" + "@eslint/js": "npm:^9.23.0" "@formatjs/cli": "npm:^6.1.1" "@formatjs/intl-pluralrules": "npm:^5.4.4" "@gamestdio/websocket": "npm:^0.3.2" @@ -2852,8 +2874,6 @@ __metadata: "@types/requestidlecallback": "npm:^0.3.5" "@types/webpack": "npm:^4.41.33" "@types/webpack-env": "npm:^1.18.4" - "@typescript-eslint/eslint-plugin": "npm:^8.0.0" - "@typescript-eslint/parser": "npm:^8.0.0" "@use-gesture/react": "npm:^10.3.1" arrow-key-navigation: "npm:^1.2.0" async-mutex: "npm:^0.5.0" @@ -2878,21 +2898,21 @@ __metadata: detect-passive-events: "npm:^2.0.3" emoji-mart: "npm:emoji-mart-lazyload@latest" escape-html: "npm:^1.0.3" - eslint: "npm:^8.41.0" - eslint-define-config: "npm:^2.0.0" - eslint-import-resolver-typescript: "npm:^3.5.5" - eslint-plugin-formatjs: "npm:^5.0.0" + eslint: "npm:^9.23.0" + eslint-import-resolver-typescript: "npm:^4.2.5" + eslint-plugin-formatjs: "npm:^5.3.1" eslint-plugin-import: "npm:~2.31.0" - eslint-plugin-jsdoc: "npm:^50.0.0" - eslint-plugin-jsx-a11y: "npm:~6.10.0" - eslint-plugin-promise: "npm:~7.2.0" - eslint-plugin-react: "npm:^7.33.2" - eslint-plugin-react-hooks: "npm:^5.0.0" + eslint-plugin-jsdoc: "npm:^50.6.9" + eslint-plugin-jsx-a11y: "npm:~6.10.2" + eslint-plugin-promise: "npm:~7.2.1" + eslint-plugin-react: "npm:^7.37.4" + eslint-plugin-react-hooks: "npm:^5.2.0" exif-js: "npm:^2.3.0" favico.js: "npm:^0.3.10" file-loader: "npm:^6.2.0" fuzzysort: "npm:^3.0.0" glob: "npm:^10.2.6" + globals: "npm:^16.0.0" history: "npm:^4.10.1" hoist-non-react-statics: "npm:^3.3.2" http-link-header: "npm:^1.1.1" @@ -2951,6 +2971,7 @@ __metadata: tiny-queue: "npm:^0.2.1" twitter-text: "npm:3.1.0" typescript: "npm:^5.0.4" + typescript-eslint: "npm:^8.28.0" use-debounce: "npm:^10.0.0" webpack: "npm:^4.47.0" webpack-assets-manifest: "npm:^4.0.6" @@ -2979,6 +3000,7 @@ __metadata: version: 0.0.0-use.local resolution: "@mastodon/streaming@workspace:streaming" dependencies: + "@eslint/js": "npm:^9.23.0" "@types/cors": "npm:^2.8.16" "@types/express": "npm:^4.17.17" "@types/pg": "npm:^8.6.6" @@ -2987,8 +3009,8 @@ __metadata: bufferutil: "npm:^4.0.7" cors: "npm:^2.8.5" dotenv: "npm:^16.0.3" - eslint-define-config: "npm:^2.0.0" express: "npm:^4.18.2" + globals: "npm:^16.0.0" ioredis: "npm:^5.3.2" jsdom: "npm:^26.0.0" pg: "npm:^8.5.0" @@ -2998,6 +3020,7 @@ __metadata: pino-pretty: "npm:^13.0.0" prom-client: "npm:^15.0.0" typescript: "npm:^5.0.4" + typescript-eslint: "npm:^8.28.0" utf-8-validate: "npm:^6.0.3" uuid: "npm:^11.0.0" ws: "npm:^8.12.1" @@ -3009,6 +3032,17 @@ __metadata: languageName: unknown linkType: soft +"@napi-rs/wasm-runtime@npm:^0.2.7": + version: 0.2.7 + resolution: "@napi-rs/wasm-runtime@npm:0.2.7" + dependencies: + "@emnapi/core": "npm:^1.3.1" + "@emnapi/runtime": "npm:^1.3.1" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10c0/04a5edd79144bfa4e821a373fb6d4939f10c578c5f3633b5e67a57d0f5e36a593f595834d26654ea757bba7cd80b6c42d0d1405d6a8460c5d774e8cd5c9548a4 + languageName: node + linkType: hard + "@nodelib/fs.scandir@npm:2.1.5": version: 2.1.5 resolution: "@nodelib/fs.scandir@npm:2.1.5" @@ -3026,7 +3060,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -3036,13 +3070,6 @@ __metadata: languageName: node linkType: hard -"@nolyfill/is-core-module@npm:1.0.39": - version: 1.0.39 - resolution: "@nolyfill/is-core-module@npm:1.0.39" - checksum: 10c0/34ab85fdc2e0250879518841f74a30c276bca4f6c3e13526d2d1fe515e1adf6d46c25fcd5989d22ea056d76f7c39210945180b4859fc83b050e2da411aa86289 - languageName: node - linkType: hard - "@npmcli/agent@npm:^2.0.0": version: 2.2.0 resolution: "@npmcli/agent@npm:2.2.0" @@ -3701,6 +3728,15 @@ __metadata: languageName: node linkType: hard +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10c0/f9fde5c554455019f33af6c8215f1a1435028803dc2a2825b077d812bed4209a1a64444a4ca0ce2ea7e1175c8d88e2f9173a36a33c199e8a5c671aa31de8242d + languageName: node + linkType: hard + "@types/aria-query@npm:^5.0.1": version: 5.0.4 resolution: "@types/aria-query@npm:5.0.4" @@ -3802,7 +3838,7 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:9": +"@types/eslint@npm:^9.6.1": version: 9.6.1 resolution: "@types/eslint@npm:9.6.1" dependencies: @@ -3826,6 +3862,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:^1.0.6": + version: 1.0.7 + resolution: "@types/estree@npm:1.0.7" + checksum: 10c0/be815254316882f7c40847336cd484c3bc1c3e34f710d197160d455dc9d6d050ffbf4c3bc76585dba86f737f020ab20bdb137ebe0e9116b0c86c7c0342221b8c + languageName: node + linkType: hard + "@types/express-serve-static-core@npm:^4.17.33": version: 4.17.41 resolution: "@types/express-serve-static-core@npm:4.17.41" @@ -3962,14 +4005,14 @@ __metadata: languageName: node linkType: hard -"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": +"@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.5, @types/json-schema@npm:^7.0.8": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" checksum: 10c0/a996a745e6c5d60292f36731dd41341339d4eeed8180bb09226e5c8d23759067692b1d88e5d91d72ee83dfc00d3aca8e7bd43ea120516c17922cbcb7c3e252db languageName: node linkType: hard -"@types/json-stable-stringify@npm:1, @types/json-stable-stringify@npm:^1.1.0": +"@types/json-stable-stringify@npm:^1.1.0": version: 1.1.0 resolution: "@types/json-stable-stringify@npm:1.1.0" checksum: 10c0/8f69944701510243cd3a83aa44363a8a4d366f11a659b258f69fb3ad0f94ab1e2533206a2c929ac7fd18784d201b663b3f02a45934f545c926f051d8cb4df095 @@ -4011,7 +4054,7 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:*, @types/node@npm:14 || 16 || 17 || 18 || 20 || 22": +"@types/node@npm:*": version: 22.8.6 resolution: "@types/node@npm:22.8.6" dependencies: @@ -4054,7 +4097,7 @@ __metadata: languageName: node linkType: hard -"@types/picomatch@npm:3": +"@types/picomatch@npm:^3": version: 3.0.2 resolution: "@types/picomatch@npm:3.0.2" checksum: 10c0/f35d16fe10a6e13ead6499dd7d7d317e4fd78e48260398104e837e5ca83d393024bdc6f432cb644c0a69b0726a071fcc6eb09befbbcfafb3c3c5f71dbbfde487 @@ -4374,15 +4417,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^8.0.0": - version: 8.26.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.26.0" +"@typescript-eslint/eslint-plugin@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.28.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.26.0" - "@typescript-eslint/type-utils": "npm:8.26.0" - "@typescript-eslint/utils": "npm:8.26.0" - "@typescript-eslint/visitor-keys": "npm:8.26.0" + "@typescript-eslint/scope-manager": "npm:8.28.0" + "@typescript-eslint/type-utils": "npm:8.28.0" + "@typescript-eslint/utils": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" @@ -4391,99 +4434,64 @@ __metadata: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/b270467672c5cb7fb9085ae063364252af2910a424899f2a9f54cfbe84aba6ce80dbbf5027f1f33f17cc587da9883de212a4b3dc969f22ded30076889b499dd8 + checksum: 10c0/f01b7d231b01ec2c1cc7c40599ddceb329532f2876664a39dec9d25c0aed4cfdbef3ec07f26bac357df000d798f652af6fdb6a2481b6120e43bfa38f7c7a7c48 languageName: node linkType: hard -"@typescript-eslint/parser@npm:^8.0.0": - version: 8.26.0 - resolution: "@typescript-eslint/parser@npm:8.26.0" +"@typescript-eslint/parser@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/parser@npm:8.28.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.26.0" - "@typescript-eslint/types": "npm:8.26.0" - "@typescript-eslint/typescript-estree": "npm:8.26.0" - "@typescript-eslint/visitor-keys": "npm:8.26.0" + "@typescript-eslint/scope-manager": "npm:8.28.0" + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/typescript-estree": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/b937a80aeca4e508a67cbf2e42dfd268316336de265aaf836d04e49008a6ff4d754e73ad30075c183d98756677d1f54061c34e618c97d5fb61a04903c65d4851 + checksum: 10c0/4bde6887bbf3fe031c01e46db90f9f384a8cac2e67c2972b113a62d607db75e01db943601279aac847b9187960a038981814042cb02fd5aa27ea4613028f9313 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.20.0": - version: 8.20.0 - resolution: "@typescript-eslint/scope-manager@npm:8.20.0" +"@typescript-eslint/scope-manager@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/scope-manager@npm:8.28.0" dependencies: - "@typescript-eslint/types": "npm:8.20.0" - "@typescript-eslint/visitor-keys": "npm:8.20.0" - checksum: 10c0/a8074768d06c863169294116624a45c19377ff0b8635ad5fa4ae673b43cf704d1b9b79384ceef0ff0abb78b107d345cd90fe5572354daf6ad773fe462ee71e6a + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" + checksum: 10c0/f3bd76b3f54e60f1efe108b233b2d818e44ecf0dc6422cc296542f784826caf3c66d51b8acc83d8c354980bd201e1d9aa1ea01011de96e0613d320c00e40ccfd languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.26.0": - version: 8.26.0 - resolution: "@typescript-eslint/scope-manager@npm:8.26.0" +"@typescript-eslint/type-utils@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/type-utils@npm:8.28.0" dependencies: - "@typescript-eslint/types": "npm:8.26.0" - "@typescript-eslint/visitor-keys": "npm:8.26.0" - checksum: 10c0/f93b12daf6a4df3050ca3fc6db1f534b5c521861509ee09a45a8a17d97f2fbb20c2d34975f07291481d69998aac9f2975f8facad0d47f533db56ec8f70f533a0 - languageName: node - linkType: hard - -"@typescript-eslint/type-utils@npm:8.26.0": - version: 8.26.0 - resolution: "@typescript-eslint/type-utils@npm:8.26.0" - dependencies: - "@typescript-eslint/typescript-estree": "npm:8.26.0" - "@typescript-eslint/utils": "npm:8.26.0" + "@typescript-eslint/typescript-estree": "npm:8.28.0" + "@typescript-eslint/utils": "npm:8.28.0" debug: "npm:^4.3.4" ts-api-utils: "npm:^2.0.1" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/840b7551dcea7304632564612a2460f869c5330c50661cf21ac5992359aba7539f1466ac7dbde6f2d0bd56f6f769c9f3fed8564045c82d4914a88745da846870 + checksum: 10c0/b8936edc2153bf794efba39bfb06393a228217830051767360f4b691fed7c82f3831c4fc6deac6d78b90a58596e61f866c17eaee9dd793c3efda3ebdcf5a71d8 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.20.0": - version: 8.20.0 - resolution: "@typescript-eslint/types@npm:8.20.0" - checksum: 10c0/21292d4ca089897015d2bf5ab99909a7b362902f63f4ba10696676823b50d00c7b4cd093b4b43fba01d12bc3feca3852d2c28528c06d8e45446b7477887dbee7 +"@typescript-eslint/types@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/types@npm:8.28.0" + checksum: 10c0/1f95895e20dac1cf063dc93c99142fd1871e53be816bcbbee93f22a05e6b2a82ca83c20ce3a551f65555910aa0956443a23268edbb004369d0d5cb282d13c377 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.26.0": - version: 8.26.0 - resolution: "@typescript-eslint/types@npm:8.26.0" - checksum: 10c0/b16c0f67d12092c204a5935b430854b3a41c80934b386a5a4526acc9c8a829d8ee4f78732e71587e605de7845fa9a801b59fff015471dab7bf33676ee68c0100 - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.20.0": - version: 8.20.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.20.0" +"@typescript-eslint/typescript-estree@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.28.0" dependencies: - "@typescript-eslint/types": "npm:8.20.0" - "@typescript-eslint/visitor-keys": "npm:8.20.0" - debug: "npm:^4.3.4" - fast-glob: "npm:^3.3.2" - is-glob: "npm:^4.0.3" - minimatch: "npm:^9.0.4" - semver: "npm:^7.6.0" - ts-api-utils: "npm:^2.0.0" - peerDependencies: - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/54a2c1da7d1c5f7e865b941e8a3c98eb4b5f56ed8741664a84065173bde9602cdb8866b0984b26816d6af885c1528311c11e7286e869ed424483b74366514cbd - languageName: node - linkType: hard - -"@typescript-eslint/typescript-estree@npm:8.26.0": - version: 8.26.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.26.0" - dependencies: - "@typescript-eslint/types": "npm:8.26.0" - "@typescript-eslint/visitor-keys": "npm:8.26.0" + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/visitor-keys": "npm:8.28.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" @@ -4492,64 +4500,139 @@ __metadata: ts-api-utils: "npm:^2.0.1" peerDependencies: typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/898bf7ec8ee1f3454d0e38a0bb3d7bd3cbd39f530857c9b1851650ec1647bcb6997622e86d24332d81848afd9b65ce4c080437ab1c3c023b23915a745dd0b363 + checksum: 10c0/97a91c95b1295926098c12e2d2c2abaa68994dc879da132dcce1e75ec9d7dee8187695eaa5241d09cbc42b5e633917b6d35c624e78e3d3ee9bda42d1318080b6 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.20.0": - version: 8.20.0 - resolution: "@typescript-eslint/utils@npm:8.20.0" +"@typescript-eslint/utils@npm:8.28.0, @typescript-eslint/utils@npm:^8.27.0": + version: 8.28.0 + resolution: "@typescript-eslint/utils@npm:8.28.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.20.0" - "@typescript-eslint/types": "npm:8.20.0" - "@typescript-eslint/typescript-estree": "npm:8.20.0" - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: ">=4.8.4 <5.8.0" - checksum: 10c0/dd36c3b22a2adde1e1462aed0c8b4720f61859b4ebb0c3ef935a786a6b1cb0ec21eb0689f5a8debe8db26d97ebb979bab68d6f8fe7b0098e6200a485cfe2991b - languageName: node - linkType: hard - -"@typescript-eslint/utils@npm:8.26.0": - version: 8.26.0 - resolution: "@typescript-eslint/utils@npm:8.26.0" - dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.26.0" - "@typescript-eslint/types": "npm:8.26.0" - "@typescript-eslint/typescript-estree": "npm:8.26.0" + "@typescript-eslint/scope-manager": "npm:8.28.0" + "@typescript-eslint/types": "npm:8.28.0" + "@typescript-eslint/typescript-estree": "npm:8.28.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: ">=4.8.4 <5.9.0" - checksum: 10c0/594838a865d385ad5206c8b948678d4cb4010d0c9b826913968ce9e8af4d1c58b1f044de49f91d8dc36cda2ddb121ee7d2c5b53822a05f3e55002b10a42b3bfb + checksum: 10c0/d3425be7f86c1245a11f0ea39136af681027797417348d8e666d38c76646945eaed7b35eb8db66372b067dee8b02a855caf2c24c040ec9c31e59681ab223b59d languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.20.0": - version: 8.20.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.20.0" +"@typescript-eslint/visitor-keys@npm:8.28.0": + version: 8.28.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.28.0" dependencies: - "@typescript-eslint/types": "npm:8.20.0" + "@typescript-eslint/types": "npm:8.28.0" eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/e95d8b2685e8beb6637bf2e9d06e4177a400d3a2b142ba749944690f969ee3186b750082fd9bf34ada82acf1c5dd5970201dfd97619029c8ecca85fb4b50dbd8 + checksum: 10c0/245a78ed983fe95fbd1b0f2d4cb9e9d1d964bddc0aa3e3d6ab10c19c4273855bfb27d840bb1fd55deb7ae3078b52f26592472baf6fd2c7019a5aa3b1da974f35 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.26.0": - version: 8.26.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.26.0" +"@unrs/resolver-binding-darwin-arm64@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-darwin-arm64@npm:1.3.2" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-darwin-x64@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-darwin-x64@npm:1.3.2" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-freebsd-x64@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-freebsd-x64@npm:1.3.2" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-arm-gnueabihf@npm:1.3.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm-musleabihf@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-arm-musleabihf@npm:1.3.2" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-gnu@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-arm64-gnu@npm:1.3.2" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-arm64-musl@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-arm64-musl@npm:1.3.2" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-ppc64-gnu@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-ppc64-gnu@npm:1.3.2" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-s390x-gnu@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-s390x-gnu@npm:1.3.2" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-gnu@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-x64-gnu@npm:1.3.2" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@unrs/resolver-binding-linux-x64-musl@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-linux-x64-musl@npm:1.3.2" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@unrs/resolver-binding-wasm32-wasi@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-wasm32-wasi@npm:1.3.2" dependencies: - "@typescript-eslint/types": "npm:8.26.0" - eslint-visitor-keys: "npm:^4.2.0" - checksum: 10c0/6428c1ba199d962060d43f06ba8a98b874ba6fe875a23b10e8f01550838d8be8ee689ae4da3e8b045d4c7bb01e38385e6a8ae17a9d566cf7cd21f7090b573f61 + "@napi-rs/wasm-runtime": "npm:^0.2.7" + conditions: cpu=wasm32 languageName: node linkType: hard -"@ungap/structured-clone@npm:^1.2.0": - version: 1.2.0 - resolution: "@ungap/structured-clone@npm:1.2.0" - checksum: 10c0/8209c937cb39119f44eb63cf90c0b73e7c754209a6411c707be08e50e29ee81356dca1a848a405c8bdeebfe2f5e4f831ad310ae1689eeef65e7445c090c6657d +"@unrs/resolver-binding-win32-arm64-msvc@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-win32-arm64-msvc@npm:1.3.2" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-ia32-msvc@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-win32-ia32-msvc@npm:1.3.2" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@unrs/resolver-binding-win32-x64-msvc@npm:1.3.2": + version: 1.3.2 + resolution: "@unrs/resolver-binding-win32-x64-msvc@npm:1.3.2" + conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -4825,7 +4908,7 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.12.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2, acorn@npm:^8.9.0": +"acorn@npm:^8.0.4, acorn@npm:^8.1.0, acorn@npm:^8.12.0, acorn@npm:^8.8.1, acorn@npm:^8.8.2": version: 8.12.1 resolution: "acorn@npm:8.12.1" bin: @@ -4834,6 +4917,15 @@ __metadata: languageName: node linkType: hard +"acorn@npm:^8.14.0": + version: 8.14.1 + resolution: "acorn@npm:8.14.1" + bin: + acorn: bin/acorn + checksum: 10c0/dbd36c1ed1d2fa3550140000371fcf721578095b18777b85a79df231ca093b08edc6858d75d6e48c73e431c174dcf9214edbd7e6fa5911b93bd8abfa54e47123 + languageName: node + linkType: hard + "agent-base@npm:6": version: 6.0.2 resolution: "agent-base@npm:6.0.2" @@ -6058,7 +6150,7 @@ __metadata: languageName: node linkType: hard -"call-bind@npm:^1.0.2, call-bind@npm:^1.0.5, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": +"call-bind@npm:^1.0.2, call-bind@npm:^1.0.7, call-bind@npm:^1.0.8": version: 1.0.8 resolution: "call-bind@npm:1.0.8" dependencies: @@ -6120,16 +6212,6 @@ __metadata: languageName: node linkType: hard -"chalk@npm:4, chalk@npm:^4.0, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": - version: 4.1.2 - resolution: "chalk@npm:4.1.2" - dependencies: - ansi-styles: "npm:^4.1.0" - supports-color: "npm:^7.1.0" - checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 - languageName: node - linkType: hard - "chalk@npm:^2.4.1, chalk@npm:^2.4.2": version: 2.4.2 resolution: "chalk@npm:2.4.2" @@ -6151,6 +6233,16 @@ __metadata: languageName: node linkType: hard +"chalk@npm:^4.0, chalk@npm:^4.0.0, chalk@npm:^4.0.2, chalk@npm:^4.1.0, chalk@npm:^4.1.2": + version: 4.1.2 + resolution: "chalk@npm:4.1.2" + dependencies: + ansi-styles: "npm:^4.1.0" + supports-color: "npm:^7.1.0" + checksum: 10c0/4a3fef5cc34975c898ffe77141450f679721df9dde00f6c304353fa9c8b571929123b26a0e4617bde5018977eb655b31970c297b91b63ee83bb82aeb04666880 + languageName: node + linkType: hard + "chalk@npm:~5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" @@ -6768,7 +6860,7 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.1, cross-spawn@npm:^7.0.3": version: 7.0.3 resolution: "cross-spawn@npm:7.0.3" dependencies: @@ -6779,6 +6871,17 @@ __metadata: languageName: node linkType: hard +"cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" + dependencies: + path-key: "npm:^3.1.0" + shebang-command: "npm:^2.0.0" + which: "npm:^2.0.1" + checksum: 10c0/053ea8b2135caff68a9e81470e845613e374e7309a47731e81639de3eaeb90c3d01af0e0b44d2ab9d50b43467223b88567dfeb3262db942dc063b9976718ffc1 + languageName: node + linkType: hard + "crypto-browserify@npm:^3.11.0": version: 3.12.0 resolution: "crypto-browserify@npm:3.12.0" @@ -7196,7 +7299,7 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:~4.4.0": +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.4, debug@npm:^4.3.6, debug@npm:^4.3.7, debug@npm:^4.4.0, debug@npm:~4.4.0": version: 4.4.0 resolution: "debug@npm:4.4.0" dependencies: @@ -7224,7 +7327,7 @@ __metadata: languageName: node linkType: hard -"decimal.js@npm:10, decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3": +"decimal.js@npm:^10.4.2, decimal.js@npm:^10.4.3": version: 10.4.3 resolution: "decimal.js@npm:10.4.3" checksum: 10c0/6d60206689ff0911f0ce968d40f163304a6c1bc739927758e6efc7921cfa630130388966f16bf6ef6b838cb33679fbe8e7a78a2f3c478afce841fd55ac8fb8ee @@ -7513,15 +7616,6 @@ __metadata: languageName: node linkType: hard -"doctrine@npm:^3.0.0": - version: 3.0.0 - resolution: "doctrine@npm:3.0.0" - dependencies: - esutils: "npm:^2.0.2" - checksum: 10c0/c96bdccabe9d62ab6fea9399fdff04a66e6563c1d6fb3a3a063e8d53c3bb136ba63e84250bbf63d00086a769ad53aef92d2bd483f03f837fc97b71cbee6b2520 - languageName: node - linkType: hard - "dom-accessibility-api@npm:^0.5.9": version: 0.5.16 resolution: "dom-accessibility-api@npm:0.5.16" @@ -7806,16 +7900,6 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.15.0": - version: 5.17.1 - resolution: "enhanced-resolve@npm:5.17.1" - dependencies: - graceful-fs: "npm:^4.2.4" - tapable: "npm:^2.2.0" - checksum: 10c0/81a0515675eca17efdba2cf5bad87abc91a528fc1191aad50e275e74f045b41506167d420099022da7181c8d787170ea41e4a11a0b10b7a16f6237daecb15370 - languageName: node - linkType: hard - "entities@npm:^2.0.0": version: 2.2.0 resolution: "entities@npm:2.2.0" @@ -8085,13 +8169,6 @@ __metadata: languageName: node linkType: hard -"eslint-define-config@npm:^2.0.0": - version: 2.1.0 - resolution: "eslint-define-config@npm:2.1.0" - checksum: 10c0/034bd6bfbfec2db6c720a51815de6b072efeef7afbf99d90c23a1871f9cd741bb77f9d34e0bc2465262298c6110c5c45b704714d8575c6567fd2df963fb792ea - languageName: node - linkType: hard - "eslint-import-resolver-node@npm:^0.3.9": version: 0.3.9 resolution: "eslint-import-resolver-node@npm:0.3.9" @@ -8103,17 +8180,16 @@ __metadata: languageName: node linkType: hard -"eslint-import-resolver-typescript@npm:^3.5.5": - version: 3.8.3 - resolution: "eslint-import-resolver-typescript@npm:3.8.3" +"eslint-import-resolver-typescript@npm:^4.2.5": + version: 4.2.5 + resolution: "eslint-import-resolver-typescript@npm:4.2.5" dependencies: - "@nolyfill/is-core-module": "npm:1.0.39" - debug: "npm:^4.3.7" - enhanced-resolve: "npm:^5.15.0" + debug: "npm:^4.4.0" get-tsconfig: "npm:^4.10.0" - is-bun-module: "npm:^1.0.2" - stable-hash: "npm:^0.0.4" + is-bun-module: "npm:^2.0.0" + stable-hash: "npm:^0.0.5" tinyglobby: "npm:^0.2.12" + unrs-resolver: "npm:^1.3.2" peerDependencies: eslint: "*" eslint-plugin-import: "*" @@ -8123,7 +8199,7 @@ __metadata: optional: true eslint-plugin-import-x: optional: true - checksum: 10c0/886ceeab4cad14958d7c7d3432ead2486374616c8ada7925ab96e55f919f2dbbbdbe7c3081d7d238231e84699849e82930417a66e05638bcc8202e1263edddeb + checksum: 10c0/9134c4dd6e8b3cf1356d6bff68939153c81255c0ac7f694e829c3c7f5e785936591cfe43209d866c8a3b379d3a8dcd203651ec49bd99361fcb54dc0c2b9ce8fc languageName: node linkType: hard @@ -8139,22 +8215,22 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-formatjs@npm:^5.0.0": - version: 5.2.14 - resolution: "eslint-plugin-formatjs@npm:5.2.14" +"eslint-plugin-formatjs@npm:^5.3.1": + version: 5.3.1 + resolution: "eslint-plugin-formatjs@npm:5.3.1" dependencies: - "@formatjs/icu-messageformat-parser": "npm:2.11.1" - "@formatjs/ts-transformer": "npm:3.13.32" - "@types/eslint": "npm:9" - "@types/picomatch": "npm:3" - "@typescript-eslint/utils": "npm:8.20.0" + "@formatjs/icu-messageformat-parser": "npm:2.11.2" + "@formatjs/ts-transformer": "npm:3.13.34" + "@types/eslint": "npm:^9.6.1" + "@types/picomatch": "npm:^3" + "@typescript-eslint/utils": "npm:^8.27.0" magic-string: "npm:^0.30.0" picomatch: "npm:2 || 3 || 4" - tslib: "npm:2" + tslib: "npm:^2.8.0" unicode-emoji-utils: "npm:^1.2.0" peerDependencies: - eslint: 9 - checksum: 10c0/6d0b40cebb5e3e7ca426831b610963f02d36ec37aab784756e701a454f43193106cae4919138a77d3ba0229549214eef4e06f008b466c706bf475a40e575db9e + eslint: ^9.23.0 + checksum: 10c0/fb8ba06e0718cd098f2393aea04eb4a6037ca3ead1c9450bd38926d0adecba4cefdebfb661c56c36685e0f003331520c3330544c45803f397b827713ab5e1d7d languageName: node linkType: hard @@ -8187,9 +8263,9 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-jsdoc@npm:^50.0.0": - version: 50.6.3 - resolution: "eslint-plugin-jsdoc@npm:50.6.3" +"eslint-plugin-jsdoc@npm:^50.6.9": + version: 50.6.9 + resolution: "eslint-plugin-jsdoc@npm:50.6.9" dependencies: "@es-joy/jsdoccomment": "npm:~0.49.0" are-docs-informative: "npm:^0.0.2" @@ -8204,11 +8280,11 @@ __metadata: synckit: "npm:^0.9.1" peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 - checksum: 10c0/7e0c46675b7cd2133b83969254597bbd3a15694ee2e646a4b7bc8d10babaebe52444d372195649869bcd4d82bcc1fb6b9e21f9a1d187dabd0ac3295d2d3faaff + checksum: 10c0/cad199d262c2e889a3af4e402f6adc624e4273b3d5ca1940e7227b37d87af8090ca3444f7fff57f58dab9a827faed8722fc2f5d4daf31ec085eb00e9f5a338a7 languageName: node linkType: hard -"eslint-plugin-jsx-a11y@npm:~6.10.0": +"eslint-plugin-jsx-a11y@npm:~6.10.2": version: 6.10.2 resolution: "eslint-plugin-jsx-a11y@npm:6.10.2" dependencies: @@ -8233,7 +8309,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-promise@npm:~7.2.0": +"eslint-plugin-promise@npm:~7.2.1": version: 7.2.1 resolution: "eslint-plugin-promise@npm:7.2.1" dependencies: @@ -8244,7 +8320,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react-hooks@npm:^5.0.0": +"eslint-plugin-react-hooks@npm:^5.2.0": version: 5.2.0 resolution: "eslint-plugin-react-hooks@npm:5.2.0" peerDependencies: @@ -8253,7 +8329,7 @@ __metadata: languageName: node linkType: hard -"eslint-plugin-react@npm:^7.33.2": +"eslint-plugin-react@npm:^7.37.4": version: 7.37.4 resolution: "eslint-plugin-react@npm:7.37.4" dependencies: @@ -8291,17 +8367,17 @@ __metadata: languageName: node linkType: hard -"eslint-scope@npm:^7.2.2": - version: 7.2.2 - resolution: "eslint-scope@npm:7.2.2" +"eslint-scope@npm:^8.3.0": + version: 8.3.0 + resolution: "eslint-scope@npm:8.3.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10c0/613c267aea34b5a6d6c00514e8545ef1f1433108097e857225fed40d397dd6b1809dffd11c2fde23b37ca53d7bf935fe04d2a18e6fc932b31837b6ad67e1c116 + checksum: 10c0/23bf54345573201fdf06d29efa345ab508b355492f6c6cc9e2b9f6d02b896f369b6dd5315205be94b8853809776c4d13353b85c6b531997b164ff6c3328ecf5b languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.1, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.3.0": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10c0/92708e882c0a5ffd88c23c0b404ac1628cf20104a108c745f240a13c332a11aac54f49a22d5762efbffc18ecbc9a580d1b7ad034bf5f3cc3307e5cbff2ec9820 @@ -8315,51 +8391,64 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.41.0": - version: 8.57.1 - resolution: "eslint@npm:8.57.1" +"eslint@npm:^9.23.0": + version: 9.23.0 + resolution: "eslint@npm:9.23.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.6.1" - "@eslint/eslintrc": "npm:^2.1.4" - "@eslint/js": "npm:8.57.1" - "@humanwhocodes/config-array": "npm:^0.13.0" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.19.2" + "@eslint/config-helpers": "npm:^0.2.0" + "@eslint/core": "npm:^0.12.0" + "@eslint/eslintrc": "npm:^3.3.1" + "@eslint/js": "npm:9.23.0" + "@eslint/plugin-kit": "npm:^0.2.7" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@nodelib/fs.walk": "npm:^1.2.8" - "@ungap/structured-clone": "npm:^1.2.0" + "@humanwhocodes/retry": "npm:^0.4.2" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" - doctrine: "npm:^3.0.0" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^7.2.2" - eslint-visitor-keys: "npm:^3.4.3" - espree: "npm:^9.6.1" - esquery: "npm:^1.4.2" + eslint-scope: "npm:^8.3.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" + esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" - file-entry-cache: "npm:^6.0.1" + file-entry-cache: "npm:^8.0.0" find-up: "npm:^5.0.0" glob-parent: "npm:^6.0.2" - globals: "npm:^13.19.0" - graphemer: "npm:^1.4.0" ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" - js-yaml: "npm:^4.1.0" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" + peerDependencies: + jiti: "*" + peerDependenciesMeta: + jiti: + optional: true bin: eslint: bin/eslint.js - checksum: 10c0/1fd31533086c1b72f86770a4d9d7058ee8b4643fd1cfd10c7aac1ecb8725698e88352a87805cf4b2ce890aa35947df4b4da9655fb7fdfa60dbb448a43f6ebcf1 + checksum: 10c0/9616c308dfa8d09db8ae51019c87d5d05933742214531b077bd6ab618baab3bec7938256c14dcad4dc47f5ba93feb0bc5e089f68799f076374ddea21b6a9be45 + languageName: node + linkType: hard + +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" + dependencies: + acorn: "npm:^8.14.0" + acorn-jsx: "npm:^5.3.2" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10c0/272beeaca70d0a1a047d61baff64db04664a33d7cfb5d144f84bc8a5c6194c6c8ebe9cc594093ca53add88baa23e59b01e69e8a0160ab32eac570482e165c462 languageName: node linkType: hard @@ -8374,17 +8463,6 @@ __metadata: languageName: node linkType: hard -"espree@npm:^9.6.0, espree@npm:^9.6.1": - version: 9.6.1 - resolution: "espree@npm:9.6.1" - dependencies: - acorn: "npm:^8.9.0" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^3.4.1" - checksum: 10c0/1a2e9b4699b715347f62330bcc76aee224390c28bb02b31a3752e9d07549c473f5f986720483c6469cf3cfb3c9d05df612ffc69eb1ee94b54b739e67de9bb460 - languageName: node - linkType: hard - "esprima@npm:^4.0.0, esprima@npm:^4.0.1": version: 4.0.1 resolution: "esprima@npm:4.0.1" @@ -8395,7 +8473,7 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.4.2, esquery@npm:^1.6.0": +"esquery@npm:^1.5.0, esquery@npm:^1.6.0": version: 1.6.0 resolution: "esquery@npm:1.6.0" dependencies: @@ -8783,12 +8861,12 @@ __metadata: languageName: node linkType: hard -"file-entry-cache@npm:^6.0.1": - version: 6.0.1 - resolution: "file-entry-cache@npm:6.0.1" +"file-entry-cache@npm:^8.0.0": + version: 8.0.0 + resolution: "file-entry-cache@npm:8.0.0" dependencies: - flat-cache: "npm:^3.0.4" - checksum: 10c0/58473e8a82794d01b38e5e435f6feaf648e3f36fdb3a56e98f417f4efae71ad1c0d4ebd8a9a7c50c3ad085820a93fc7494ad721e0e4ebc1da3573f4e1c3c7cdd + flat-cache: "npm:^4.0.0" + checksum: 10c0/9e2b5938b1cd9b6d7e3612bdc533afd4ac17b2fc646569e9a8abbf2eb48e5eb8e316bc38815a3ef6a1b456f4107f0d0f055a614ca613e75db6bf9ff4d72c1638 languageName: node linkType: hard @@ -8924,14 +9002,13 @@ __metadata: languageName: node linkType: hard -"flat-cache@npm:^3.0.4": - version: 3.2.0 - resolution: "flat-cache@npm:3.2.0" +"flat-cache@npm:^4.0.0": + version: 4.0.1 + resolution: "flat-cache@npm:4.0.1" dependencies: flatted: "npm:^3.2.9" - keyv: "npm:^4.5.3" - rimraf: "npm:^3.0.2" - checksum: 10c0/b76f611bd5f5d68f7ae632e3ae503e678d205cf97a17c6ab5b12f6ca61188b5f1f7464503efae6dc18683ed8f0b41460beb48ac4b9ac63fe6201296a91ba2f75 + keyv: "npm:^4.5.4" + checksum: 10c0/2c59d93e9faa2523e4fda6b4ada749bed432cfa28c8e251f33b25795e426a1c6dbada777afb1f74fcfff33934fdbdea921ee738fcc33e71adc9d6eca984a1cfc languageName: node linkType: hard @@ -9372,12 +9449,17 @@ __metadata: languageName: node linkType: hard -"globals@npm:^13.19.0": - version: 13.23.0 - resolution: "globals@npm:13.23.0" - dependencies: - type-fest: "npm:^0.20.2" - checksum: 10c0/fc05e184b3be59bffa2580f28551a12a758c3a18df4be91444202982c76f13f52821ad54ffaf7d3f2a4d2498fdf54aeaca8d4540fd9e860a9edb09d34ef4c507 +"globals@npm:^14.0.0": + version: 14.0.0 + resolution: "globals@npm:14.0.0" + checksum: 10c0/b96ff42620c9231ad468d4c58ff42afee7777ee1c963013ff8aabe095a451d0ceeb8dcd8ef4cbd64d2538cef45f787a78ba3a9574f4a634438963e334471302d + languageName: node + linkType: hard + +"globals@npm:^16.0.0": + version: 16.0.0 + resolution: "globals@npm:16.0.0" + checksum: 10c0/8906d5f01838df64a81d6c2a7b7214312e2216cf65c5ed1546dc9a7d0febddf55ffa906cf04efd5b01eec2534d6f14859a89535d1a68241832810e41ef3fd5bb languageName: node linkType: hard @@ -9432,7 +9514,7 @@ __metadata: languageName: node linkType: hard -"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.4, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": +"graceful-fs@npm:^4.1.11, graceful-fs@npm:^4.1.2, graceful-fs@npm:^4.1.6, graceful-fs@npm:^4.2.0, graceful-fs@npm:^4.2.6, graceful-fs@npm:^4.2.9": version: 4.2.11 resolution: "graceful-fs@npm:4.2.11" checksum: 10c0/386d011a553e02bc594ac2ca0bd6d9e4c22d7fa8cfbfc448a6d148c59ea881b092db9dbe3547ae4b88e55f1b01f7c4a2ecc53b310c042793e63aa44cf6c257f2 @@ -10240,12 +10322,12 @@ __metadata: languageName: node linkType: hard -"is-bun-module@npm:^1.0.2": - version: 1.1.0 - resolution: "is-bun-module@npm:1.1.0" +"is-bun-module@npm:^2.0.0": + version: 2.0.0 + resolution: "is-bun-module@npm:2.0.0" dependencies: - semver: "npm:^7.6.3" - checksum: 10c0/17cae968c3fe08e2bd66f8477e4d5a166d6299b5e7ce5c7558355551c50267f77dd386297fada6b68e4a32f01ce8920b0423e4d258242ea463b45901ec474beb + semver: "npm:^7.7.1" + checksum: 10c0/7d27a0679cfa5be1f5052650391f9b11040cd70c48d45112e312c56bc6b6ca9c9aea70dcce6cc40b1e8947bfff8567a5c5715d3b066fb478522dab46ea379240 languageName: node linkType: hard @@ -10501,13 +10583,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10c0/cf7d4ac35fb96bab6a1d2c3598fe5ebb29aafb52c0aaa482b5a3ed9d8ba3edc11631e3ec2637660c44b3ce0e61a08d54946e8af30dec0b60a7c27296c68ffd05 - languageName: node - linkType: hard - "is-plain-object@npm:^2.0.3, is-plain-object@npm:^2.0.4": version: 2.0.4 resolution: "is-plain-object@npm:2.0.4" @@ -11467,18 +11542,6 @@ __metadata: languageName: node linkType: hard -"json-stable-stringify@npm:1": - version: 1.1.1 - resolution: "json-stable-stringify@npm:1.1.1" - dependencies: - call-bind: "npm:^1.0.5" - isarray: "npm:^2.0.5" - jsonify: "npm:^0.0.1" - object-keys: "npm:^1.1.1" - checksum: 10c0/3801e3eeccbd030afb970f54bea690a079cfea7d9ed206a1b17ca9367f4b7772c764bf77a48f03e56b50e5f7ee7d11c52339fe20d8d7ccead003e4ca69e4cfde - languageName: node - linkType: hard - "json-stable-stringify@npm:^1.1.1": version: 1.2.1 resolution: "json-stable-stringify@npm:1.2.1" @@ -11558,7 +11621,7 @@ __metadata: languageName: node linkType: hard -"keyv@npm:^4.5.3, keyv@npm:^4.5.4": +"keyv@npm:^4.5.4": version: 4.5.4 resolution: "keyv@npm:4.5.4" dependencies: @@ -12290,7 +12353,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^3.0.4, minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": +"minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" dependencies: @@ -15887,6 +15950,15 @@ __metadata: languageName: node linkType: hard +"semver@npm:^7.7.1": + version: 7.7.1 + resolution: "semver@npm:7.7.1" + bin: + semver: bin/semver.js + checksum: 10c0/fd603a6fb9c399c6054015433051bdbe7b99a940a8fb44b85c2b524c4004b023d7928d47cb22154f8d054ea7ee8597f586605e05b52047f048278e4ac56ae958 + languageName: node + linkType: hard + "send@npm:0.19.0": version: 0.19.0 resolution: "send@npm:0.19.0" @@ -16509,10 +16581,10 @@ __metadata: languageName: node linkType: hard -"stable-hash@npm:^0.0.4": - version: 0.0.4 - resolution: "stable-hash@npm:0.0.4" - checksum: 10c0/53d010d2a1b014fb60d398c095f43912c353b7b44774e55222bb26fd428bc75b73d7bdfcae509ce927c23ca9c5aff2dc1bc82f191d30e57a879550bc2952bdb0 +"stable-hash@npm:^0.0.5": + version: 0.0.5 + resolution: "stable-hash@npm:0.0.5" + checksum: 10c0/ca670cb6d172f1c834950e4ec661e2055885df32fee3ebf3647c5df94993b7c2666a5dbc1c9a62ee11fc5c24928579ec5e81bb5ad31971d355d5a341aab493b3 languageName: node linkType: hard @@ -17197,13 +17269,6 @@ __metadata: languageName: node linkType: hard -"tapable@npm:^2.2.0": - version: 2.2.1 - resolution: "tapable@npm:2.2.1" - checksum: 10c0/bc40e6efe1e554d075469cedaba69a30eeb373552aaf41caeaaa45bf56ffacc2674261b106245bd566b35d8f3329b52d838e851ee0a852120acae26e622925c9 - languageName: node - linkType: hard - "tar@npm:^6.0.2, tar@npm:^6.1.11, tar@npm:^6.1.2": version: 6.2.0 resolution: "tar@npm:6.2.0" @@ -17314,13 +17379,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10c0/02805740c12851ea5982686810702e2f14369a5f4c5c40a836821e3eefc65ffeec3131ba324692a37608294b0fd8c1e55a2dd571ffed4909822787668ddbee5c - languageName: node - linkType: hard - "thread-stream@npm:^3.0.0": version: 3.0.0 resolution: "thread-stream@npm:3.0.0" @@ -17525,7 +17583,7 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^2.0.0, ts-api-utils@npm:^2.0.1": +"ts-api-utils@npm:^2.0.1": version: 2.0.1 resolution: "ts-api-utils@npm:2.0.1" peerDependencies: @@ -17546,7 +17604,7 @@ __metadata: languageName: node linkType: hard -"tslib@npm:2, tslib@npm:^2.0.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": +"tslib@npm:^2.0.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": version: 2.8.0 resolution: "tslib@npm:2.8.0" checksum: 10c0/31e4d14dc1355e9b89e4d3c893a18abb7f90b6886b089c2da91224d0a7752c79f3ddc41bc1aa0a588ac895bd97bb99c5bc2bfdb2f86de849f31caeb3ba79bbe5 @@ -17609,13 +17667,6 @@ __metadata: languageName: node linkType: hard -"type-fest@npm:^0.20.2": - version: 0.20.2 - resolution: "type-fest@npm:0.20.2" - checksum: 10c0/dea9df45ea1f0aaa4e2d3bed3f9a0bfe9e5b2592bddb92eb1bf06e50bcf98dbb78189668cd8bc31a0511d3fc25539b4cd5c704497e53e93e2d40ca764b10bfc3 - languageName: node - linkType: hard - "type-fest@npm:^0.21.3": version: 0.21.3 resolution: "type-fest@npm:0.21.3" @@ -17686,7 +17737,21 @@ __metadata: languageName: node linkType: hard -"typescript@npm:5, typescript@npm:^5.0.4": +"typescript-eslint@npm:^8.28.0": + version: 8.28.0 + resolution: "typescript-eslint@npm:8.28.0" + dependencies: + "@typescript-eslint/eslint-plugin": "npm:8.28.0" + "@typescript-eslint/parser": "npm:8.28.0" + "@typescript-eslint/utils": "npm:8.28.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10c0/bf1c1e4b2f21a95930758d5b285c39a394a50e3b6983f373413b93b80a6cb5aabc1d741780e60c63cb42ad5d645ea9c1e6d441d98174c5a2884ab88f4ac46df6 + languageName: node + linkType: hard + +"typescript@npm:^5.0.4": version: 5.7.3 resolution: "typescript@npm:5.7.3" bin: @@ -17706,7 +17771,7 @@ __metadata: languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5#optional!builtin, typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": +"typescript@patch:typescript@npm%3A^5.0.4#optional!builtin": version: 5.7.3 resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" bin: @@ -17891,6 +17956,60 @@ __metadata: languageName: node linkType: hard +"unrs-resolver@npm:^1.3.2": + version: 1.3.2 + resolution: "unrs-resolver@npm:1.3.2" + dependencies: + "@unrs/resolver-binding-darwin-arm64": "npm:1.3.2" + "@unrs/resolver-binding-darwin-x64": "npm:1.3.2" + "@unrs/resolver-binding-freebsd-x64": "npm:1.3.2" + "@unrs/resolver-binding-linux-arm-gnueabihf": "npm:1.3.2" + "@unrs/resolver-binding-linux-arm-musleabihf": "npm:1.3.2" + "@unrs/resolver-binding-linux-arm64-gnu": "npm:1.3.2" + "@unrs/resolver-binding-linux-arm64-musl": "npm:1.3.2" + "@unrs/resolver-binding-linux-ppc64-gnu": "npm:1.3.2" + "@unrs/resolver-binding-linux-s390x-gnu": "npm:1.3.2" + "@unrs/resolver-binding-linux-x64-gnu": "npm:1.3.2" + "@unrs/resolver-binding-linux-x64-musl": "npm:1.3.2" + "@unrs/resolver-binding-wasm32-wasi": "npm:1.3.2" + "@unrs/resolver-binding-win32-arm64-msvc": "npm:1.3.2" + "@unrs/resolver-binding-win32-ia32-msvc": "npm:1.3.2" + "@unrs/resolver-binding-win32-x64-msvc": "npm:1.3.2" + dependenciesMeta: + "@unrs/resolver-binding-darwin-arm64": + optional: true + "@unrs/resolver-binding-darwin-x64": + optional: true + "@unrs/resolver-binding-freebsd-x64": + optional: true + "@unrs/resolver-binding-linux-arm-gnueabihf": + optional: true + "@unrs/resolver-binding-linux-arm-musleabihf": + optional: true + "@unrs/resolver-binding-linux-arm64-gnu": + optional: true + "@unrs/resolver-binding-linux-arm64-musl": + optional: true + "@unrs/resolver-binding-linux-ppc64-gnu": + optional: true + "@unrs/resolver-binding-linux-s390x-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-gnu": + optional: true + "@unrs/resolver-binding-linux-x64-musl": + optional: true + "@unrs/resolver-binding-wasm32-wasi": + optional: true + "@unrs/resolver-binding-win32-arm64-msvc": + optional: true + "@unrs/resolver-binding-win32-ia32-msvc": + optional: true + "@unrs/resolver-binding-win32-x64-msvc": + optional: true + checksum: 10c0/f9b6d18193bcaae7ef9e284a74c85d4cb3d8c833851f1b23254a947297e672826223d82798dbff818455fefeda02084340aca904300fd5060468c2f243767cc1 + languageName: node + linkType: hard + "unset-value@npm:^1.0.0": version: 1.0.0 resolution: "unset-value@npm:1.0.0"