Add stricter ESLint rules for Typescript files (#24926)
This commit is contained in:
		
							parent
							
								
									b0dd260a7a
								
							
						
					
					
						commit
						6a3211876c
					
				
					 39 changed files with 432 additions and 149 deletions
				
			
		
							
								
								
									
										72
									
								
								.eslintrc.js
									
									
									
									
									
								
							
							
						
						
									
										72
									
								
								.eslintrc.js
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -55,10 +55,7 @@ module.exports = {
 | 
			
		|||
      '\\.(css|scss|json)$',
 | 
			
		||||
    ],
 | 
			
		||||
    'import/resolver': {
 | 
			
		||||
      node: {
 | 
			
		||||
        paths: ['app/javascript'],
 | 
			
		||||
        extensions: ['.js', '.jsx', '.ts', '.tsx'],
 | 
			
		||||
      },
 | 
			
		||||
      typescript: {},
 | 
			
		||||
    },
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -167,11 +164,14 @@ module.exports = {
 | 
			
		|||
      {
 | 
			
		||||
        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',
 | 
			
		||||
      {
 | 
			
		||||
| 
						 | 
				
			
			@ -186,6 +186,9 @@ module.exports = {
 | 
			
		|||
    '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',
 | 
			
		||||
 | 
			
		||||
    'promise/always-return': 'off',
 | 
			
		||||
| 
						 | 
				
			
			@ -257,6 +260,7 @@ module.exports = {
 | 
			
		|||
      extends: [
 | 
			
		||||
        'eslint:recommended',
 | 
			
		||||
        'plugin:@typescript-eslint/recommended',
 | 
			
		||||
        'plugin:@typescript-eslint/recommended-requiring-type-checking',
 | 
			
		||||
        'plugin:react/recommended',
 | 
			
		||||
        'plugin:react-hooks/recommended',
 | 
			
		||||
        'plugin:jsx-a11y/recommended',
 | 
			
		||||
| 
						 | 
				
			
			@ -267,8 +271,66 @@ module.exports = {
 | 
			
		|||
        'plugin:prettier/recommended',
 | 
			
		||||
      ],
 | 
			
		||||
 | 
			
		||||
      parserOptions: {
 | 
			
		||||
        project: './tsconfig.json',
 | 
			
		||||
        tsconfigRootDir: __dirname,
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      rules: {
 | 
			
		||||
        '@typescript-eslint/no-explicit-any': 'off',
 | 
			
		||||
        'import/consistent-type-specifier-style': ['error', 'prefer-top-level'],
 | 
			
		||||
 | 
			
		||||
        '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,prop-types}',
 | 
			
		||||
                group: 'builtin',
 | 
			
		||||
                position: 'after',
 | 
			
		||||
              },
 | 
			
		||||
              // I18n
 | 
			
		||||
              {
 | 
			
		||||
                pattern: 'react-intl',
 | 
			
		||||
                group: 'builtin',
 | 
			
		||||
                position: 'after',
 | 
			
		||||
              },
 | 
			
		||||
              // Common React utilities
 | 
			
		||||
              {
 | 
			
		||||
                pattern: '{classnames,react-helmet}',
 | 
			
		||||
                group: 'external',
 | 
			
		||||
                position: 'before',
 | 
			
		||||
              },
 | 
			
		||||
              // Immutable / Redux / data store
 | 
			
		||||
              {
 | 
			
		||||
                pattern: '{immutable,react-redux,react-immutable-proptypes,react-immutable-pure-component,reselect}',
 | 
			
		||||
                group: 'external',
 | 
			
		||||
                position: 'before',
 | 
			
		||||
              },
 | 
			
		||||
              // Internal packages
 | 
			
		||||
              {
 | 
			
		||||
                pattern: '{mastodon/**}',
 | 
			
		||||
                group: 'internal',
 | 
			
		||||
                position: 'after',
 | 
			
		||||
              },
 | 
			
		||||
            ],
 | 
			
		||||
            pathGroupsExcludedImportTypes: [],
 | 
			
		||||
          },
 | 
			
		||||
        ],
 | 
			
		||||
 | 
			
		||||
        '@typescript-eslint/consistent-type-definitions': ['warn', 'interface'],
 | 
			
		||||
        '@typescript-eslint/consistent-type-exports': 'error',
 | 
			
		||||
        '@typescript-eslint/consistent-type-imports': 'error',
 | 
			
		||||
 | 
			
		||||
        'jsdoc/require-jsdoc': 'off',
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,11 +1,12 @@
 | 
			
		|||
import { createAction } from '@reduxjs/toolkit';
 | 
			
		||||
 | 
			
		||||
import type { LayoutType } from '../is_mobile';
 | 
			
		||||
 | 
			
		||||
export const focusApp = createAction('APP_FOCUS');
 | 
			
		||||
export const unfocusApp = createAction('APP_UNFOCUS');
 | 
			
		||||
 | 
			
		||||
type ChangeLayoutPayload = {
 | 
			
		||||
interface ChangeLayoutPayload {
 | 
			
		||||
  layout: LayoutType;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
export const changeLayout =
 | 
			
		||||
  createAction<ChangeLayoutPayload>('APP_LAYOUT_CHANGE');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,12 @@
 | 
			
		|||
import api from '../api';
 | 
			
		||||
import { importFetchedStatuses } from './importer';
 | 
			
		||||
 | 
			
		||||
import { me } from '../initial_state';
 | 
			
		||||
 | 
			
		||||
export const PINNED_STATUSES_FETCH_REQUEST = 'PINNED_STATUSES_FETCH_REQUEST';
 | 
			
		||||
export const PINNED_STATUSES_FETCH_SUCCESS = 'PINNED_STATUSES_FETCH_SUCCESS';
 | 
			
		||||
export const PINNED_STATUSES_FETCH_FAIL = 'PINNED_STATUSES_FETCH_FAIL';
 | 
			
		||||
 | 
			
		||||
import { me } from '../initial_state';
 | 
			
		||||
 | 
			
		||||
export function fetchPinnedStatuses() {
 | 
			
		||||
  return (dispatch, getState) => {
 | 
			
		||||
    dispatch(fetchPinnedStatusesRequest());
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,11 @@
 | 
			
		|||
import React, { useCallback, useState } from 'react';
 | 
			
		||||
import ShortNumber from './short_number';
 | 
			
		||||
 | 
			
		||||
import { TransitionMotion, spring } from 'react-motion';
 | 
			
		||||
 | 
			
		||||
import { reduceMotion } from '../initial_state';
 | 
			
		||||
 | 
			
		||||
import ShortNumber from './short_number';
 | 
			
		||||
 | 
			
		||||
const obfuscatedCount = (count: number) => {
 | 
			
		||||
  if (count < 0) {
 | 
			
		||||
    return 0;
 | 
			
		||||
| 
						 | 
				
			
			@ -13,10 +16,10 @@ const obfuscatedCount = (count: number) => {
 | 
			
		|||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  value: number;
 | 
			
		||||
  obfuscate?: boolean;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
export const AnimatedNumber: React.FC<Props> = ({ value, obfuscate }) => {
 | 
			
		||||
  const [previousValue, setPreviousValue] = useState(value);
 | 
			
		||||
  const [direction, setDirection] = useState<1 | -1>(1);
 | 
			
		||||
| 
						 | 
				
			
			@ -64,7 +67,11 @@ export const AnimatedNumber: React.FC<Props> = ({ value, obfuscate }) => {
 | 
			
		|||
                transform: `translateY(${style.y * 100}%)`,
 | 
			
		||||
              }}
 | 
			
		||||
            >
 | 
			
		||||
              {obfuscate ? obfuscatedCount(data) : <ShortNumber value={data} />}
 | 
			
		||||
              {obfuscate ? (
 | 
			
		||||
                obfuscatedCount(data as number)
 | 
			
		||||
              ) : (
 | 
			
		||||
                <ShortNumber value={data as number} />
 | 
			
		||||
              )}
 | 
			
		||||
            </span>
 | 
			
		||||
          ))}
 | 
			
		||||
        </span>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,16 +1,18 @@
 | 
			
		|||
import * as React from 'react';
 | 
			
		||||
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
import { autoPlayGif } from '../initial_state';
 | 
			
		||||
 | 
			
		||||
import { useHovering } from '../../hooks/useHovering';
 | 
			
		||||
import type { Account } from '../../types/resources';
 | 
			
		||||
import { autoPlayGif } from '../initial_state';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  account: Account;
 | 
			
		||||
  size: number;
 | 
			
		||||
  style?: React.CSSProperties;
 | 
			
		||||
  inline?: boolean;
 | 
			
		||||
  animate?: boolean;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const Avatar: React.FC<Props> = ({
 | 
			
		||||
  account,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,16 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
import type { Account } from '../../types/resources';
 | 
			
		||||
 | 
			
		||||
import { useHovering } from '../../hooks/useHovering';
 | 
			
		||||
import type { Account } from '../../types/resources';
 | 
			
		||||
import { autoPlayGif } from '../initial_state';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  account: Account;
 | 
			
		||||
  friend: Account;
 | 
			
		||||
  size?: number;
 | 
			
		||||
  baseSize?: number;
 | 
			
		||||
  overlaySize?: number;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const AvatarOverlay: React.FC<Props> = ({
 | 
			
		||||
  account,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,14 @@
 | 
			
		|||
import { decode } from 'blurhash';
 | 
			
		||||
import React, { useRef, useEffect } from 'react';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
import { decode } from 'blurhash';
 | 
			
		||||
 | 
			
		||||
interface Props extends React.HTMLAttributes<HTMLCanvasElement> {
 | 
			
		||||
  hash: string;
 | 
			
		||||
  width?: number;
 | 
			
		||||
  height?: number;
 | 
			
		||||
  dummy?: boolean; // Whether dummy mode is enabled. If enabled, nothing is rendered and canvas left untouched
 | 
			
		||||
  children?: never;
 | 
			
		||||
  [key: string]: any;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
const Blurhash: React.FC<Props> = ({
 | 
			
		||||
  hash,
 | 
			
		||||
  width = 32,
 | 
			
		||||
| 
						 | 
				
			
			@ -21,6 +21,7 @@ const Blurhash: React.FC<Props> = ({
 | 
			
		|||
  useEffect(() => {
 | 
			
		||||
    // eslint-disable-next-line @typescript-eslint/no-non-null-assertion
 | 
			
		||||
    const canvas = canvasRef.current!;
 | 
			
		||||
 | 
			
		||||
    // eslint-disable-next-line no-self-assign
 | 
			
		||||
    canvas.width = canvas.width; // resets canvas
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,17 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
import { autoPlayGif } from '..//initial_state';
 | 
			
		||||
import Skeleton from './skeleton';
 | 
			
		||||
import { Account } from '../../types/resources';
 | 
			
		||||
import { List } from 'immutable';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
import type { List } from 'immutable';
 | 
			
		||||
 | 
			
		||||
import type { Account } from '../../types/resources';
 | 
			
		||||
import { autoPlayGif } from '../initial_state';
 | 
			
		||||
 | 
			
		||||
import Skeleton from './skeleton';
 | 
			
		||||
 | 
			
		||||
interface Props {
 | 
			
		||||
  account: Account;
 | 
			
		||||
  others: List<Account>;
 | 
			
		||||
  localDomain: string;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
export class DisplayName extends React.PureComponent<Props> {
 | 
			
		||||
  handleMouseEnter: React.ReactEventHandler<HTMLSpanElement> = ({
 | 
			
		||||
    currentTarget,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,9 @@
 | 
			
		|||
import React, { useCallback } from 'react';
 | 
			
		||||
 | 
			
		||||
import type { InjectedIntl } from 'react-intl';
 | 
			
		||||
import { defineMessages, injectIntl } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
import { IconButton } from './icon_button';
 | 
			
		||||
import { InjectedIntl, defineMessages, injectIntl } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
const messages = defineMessages({
 | 
			
		||||
  unblockDomain: {
 | 
			
		||||
| 
						 | 
				
			
			@ -9,11 +12,11 @@ const messages = defineMessages({
 | 
			
		|||
  },
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  domain: string;
 | 
			
		||||
  onUnblockDomain: (domain: string) => void;
 | 
			
		||||
  intl: InjectedIntl;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
const _Domain: React.FC<Props> = ({ domain, onUnblockDomain, intl }) => {
 | 
			
		||||
  const handleDomainUnblock = useCallback(() => {
 | 
			
		||||
    onUnblockDomain(domain);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
import React, { useCallback, useState } from 'react';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  src: string;
 | 
			
		||||
  key: string;
 | 
			
		||||
  alt?: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -8,7 +8,7 @@ type Props = {
 | 
			
		|||
  width: number;
 | 
			
		||||
  height: number;
 | 
			
		||||
  onClick?: () => void;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const GIFV: React.FC<Props> = ({
 | 
			
		||||
  src,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,14 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props extends React.HTMLAttributes<HTMLImageElement> {
 | 
			
		||||
  id: string;
 | 
			
		||||
  className?: string;
 | 
			
		||||
  fixedWidth?: boolean;
 | 
			
		||||
  children?: never;
 | 
			
		||||
  [key: string]: any;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const Icon: React.FC<Props> = ({
 | 
			
		||||
  id,
 | 
			
		||||
  className,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,11 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
import { Icon } from './icon';
 | 
			
		||||
import { AnimatedNumber } from './animated_number';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
 | 
			
		||||
import { AnimatedNumber } from './animated_number';
 | 
			
		||||
import { Icon } from './icon';
 | 
			
		||||
 | 
			
		||||
interface Props {
 | 
			
		||||
  className?: string;
 | 
			
		||||
  title: string;
 | 
			
		||||
  icon: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -25,11 +27,11 @@ type Props = {
 | 
			
		|||
  obfuscateCount?: boolean;
 | 
			
		||||
  href?: string;
 | 
			
		||||
  ariaHidden: boolean;
 | 
			
		||||
};
 | 
			
		||||
type States = {
 | 
			
		||||
}
 | 
			
		||||
interface States {
 | 
			
		||||
  activate: boolean;
 | 
			
		||||
  deactivate: boolean;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
export class IconButton extends React.PureComponent<Props, States> {
 | 
			
		||||
  static defaultProps = {
 | 
			
		||||
    size: 18,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,14 +1,15 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
 | 
			
		||||
import { Icon } from './icon';
 | 
			
		||||
 | 
			
		||||
const formatNumber = (num: number): number | string => (num > 40 ? '40+' : num);
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  id: string;
 | 
			
		||||
  count: number;
 | 
			
		||||
  issueBadge: boolean;
 | 
			
		||||
  className: string;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
export const IconWithBadge: React.FC<Props> = ({
 | 
			
		||||
  id,
 | 
			
		||||
  count,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
 | 
			
		||||
import logo from 'mastodon/../images/logo.svg';
 | 
			
		||||
 | 
			
		||||
export const WordmarkLogo: React.FC = () => (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
 | 
			
		||||
import { FormattedMessage } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
export const NotSignedInIndicator: React.FC = () => (
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,14 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  value: string;
 | 
			
		||||
  checked: boolean;
 | 
			
		||||
  name: string;
 | 
			
		||||
  onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;
 | 
			
		||||
  label: React.ReactNode;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const RadioButton: React.FC<Props> = ({
 | 
			
		||||
  name,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,7 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
import { injectIntl, defineMessages, InjectedIntl } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
import type { InjectedIntl } from 'react-intl';
 | 
			
		||||
import { injectIntl, defineMessages } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
const messages = defineMessages({
 | 
			
		||||
  today: { id: 'relative_time.today', defaultMessage: 'today' },
 | 
			
		||||
| 
						 | 
				
			
			@ -187,16 +189,16 @@ const timeRemainingString = (
 | 
			
		|||
  return relativeTime;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  intl: InjectedIntl;
 | 
			
		||||
  timestamp: string;
 | 
			
		||||
  year: number;
 | 
			
		||||
  futureDate?: boolean;
 | 
			
		||||
  short?: boolean;
 | 
			
		||||
};
 | 
			
		||||
type States = {
 | 
			
		||||
}
 | 
			
		||||
interface States {
 | 
			
		||||
  now: number;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
class RelativeTimestamp extends React.Component<Props, States> {
 | 
			
		||||
  state = {
 | 
			
		||||
    now: this.props.intl.now(),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,13 +1,15 @@
 | 
			
		|||
import React, { useCallback, useState } from 'react';
 | 
			
		||||
import { Blurhash } from './blurhash';
 | 
			
		||||
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
import { Blurhash } from './blurhash';
 | 
			
		||||
 | 
			
		||||
interface Props {
 | 
			
		||||
  src: string;
 | 
			
		||||
  srcSet?: string;
 | 
			
		||||
  blurhash?: string;
 | 
			
		||||
  className?: string;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export const ServerHeroImage: React.FC<Props> = ({
 | 
			
		||||
  src,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,10 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
 | 
			
		||||
import { Icon } from './icon';
 | 
			
		||||
 | 
			
		||||
type Props = {
 | 
			
		||||
interface Props {
 | 
			
		||||
  link: string;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
export const VerifiedBadge: React.FC<Props> = ({ link }) => (
 | 
			
		||||
  <span className='verified-badge'>
 | 
			
		||||
    <Icon id='check' className='verified-badge__mark' />
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,7 +3,7 @@ import { connect } from 'react-redux';
 | 
			
		|||
import ImmutablePropTypes from 'react-immutable-proptypes';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import { lookupAccount, fetchAccount } from '../../actions/accounts';
 | 
			
		||||
import { expandAccountFeaturedTimeline, expandAccountTimeline } from '../../actions/timelines';
 | 
			
		||||
import { expandAccountFeaturedTimeline, expandAccountTimeline, connectTimeline, disconnectTimeline } from '../../actions/timelines';
 | 
			
		||||
import StatusList from '../../components/status_list';
 | 
			
		||||
import LoadingIndicator from '../../components/loading_indicator';
 | 
			
		||||
import Column from '../ui/components/column';
 | 
			
		||||
| 
						 | 
				
			
			@ -14,7 +14,6 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
			
		|||
import { FormattedMessage } from 'react-intl';
 | 
			
		||||
import TimelineHint from 'mastodon/components/timeline_hint';
 | 
			
		||||
import { me } from 'mastodon/initial_state';
 | 
			
		||||
import { connectTimeline, disconnectTimeline } from 'mastodon/actions/timelines';
 | 
			
		||||
import LimitedAccountHint from './components/limited_account_hint';
 | 
			
		||||
import { getAccountHidden } from 'mastodon/selectors';
 | 
			
		||||
import { fetchFeaturedTags } from '../../actions/featured_tags';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@ import {
 | 
			
		|||
  BookmarkedStatuses,
 | 
			
		||||
  ListTimeline,
 | 
			
		||||
  Directory,
 | 
			
		||||
} from '../../ui/util/async-components';
 | 
			
		||||
} from '../util/async-components';
 | 
			
		||||
import ComposePanel from './compose_panel';
 | 
			
		||||
import NavigationPanel from './navigation_panel';
 | 
			
		||||
import { supportsPassiveEvents } from 'detect-passive-events';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -5,11 +5,10 @@ import ImmutablePureComponent from 'react-immutable-pure-component';
 | 
			
		|||
import { connect } from 'react-redux';
 | 
			
		||||
import classNames from 'classnames';
 | 
			
		||||
import { changeUploadCompose, uploadThumbnail, onChangeMediaDescription, onChangeMediaFocus } from '../../../actions/compose';
 | 
			
		||||
import { getPointerPosition } from '../../video';
 | 
			
		||||
import Video, { getPointerPosition } from '../../video';
 | 
			
		||||
import { FormattedMessage, defineMessages, injectIntl } from 'react-intl';
 | 
			
		||||
import { IconButton } from 'mastodon/components/icon_button';
 | 
			
		||||
import Button from 'mastodon/components/button';
 | 
			
		||||
import Video from 'mastodon/features/video';
 | 
			
		||||
import Audio from 'mastodon/features/audio';
 | 
			
		||||
import Textarea from 'react-textarea-autosize';
 | 
			
		||||
import UploadProgress from 'mastodon/features/compose/components/upload_progress';
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,6 @@
 | 
			
		|||
import React from 'react';
 | 
			
		||||
import PropTypes from 'prop-types';
 | 
			
		||||
import Motion from '../../ui/util/optional_motion';
 | 
			
		||||
import Motion from '../util/optional_motion';
 | 
			
		||||
import spring from 'react-motion/lib/spring';
 | 
			
		||||
import { FormattedMessage } from 'react-intl';
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,5 @@
 | 
			
		|||
import { supportsPassiveEvents } from 'detect-passive-events';
 | 
			
		||||
 | 
			
		||||
import { forceSingleColumn } from './initial_state';
 | 
			
		||||
 | 
			
		||||
const LAYOUT_BREAKPOINT = 630;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
/*eslint no-nested-ternary: "off"*/
 | 
			
		||||
/*eslint quotes: "off"*/
 | 
			
		||||
 | 
			
		||||
export default [{
 | 
			
		||||
const rules = [{
 | 
			
		||||
  locale: "co",
 | 
			
		||||
  pluralRuleFunction: function (e, a) {
 | 
			
		||||
    return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other";
 | 
			
		||||
| 
						 | 
				
			
			@ -106,3 +106,5 @@ export default [{
 | 
			
		|||
    },
 | 
			
		||||
  },
 | 
			
		||||
}];
 | 
			
		||||
 | 
			
		||||
export default rules;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,7 +2,7 @@
 | 
			
		|||
/*eslint no-nested-ternary: "off"*/
 | 
			
		||||
/*eslint quotes: "off"*/
 | 
			
		||||
 | 
			
		||||
export default [{
 | 
			
		||||
const rules = [{
 | 
			
		||||
  locale: "oc",
 | 
			
		||||
  pluralRuleFunction: function (e, a) {
 | 
			
		||||
    return a ? 1 == e ? "one" : "other" : e >= 0 && e < 2 ? "one" : "other";
 | 
			
		||||
| 
						 | 
				
			
			@ -106,3 +106,5 @@ export default [{
 | 
			
		|||
    },
 | 
			
		||||
  },
 | 
			
		||||
}];
 | 
			
		||||
 | 
			
		||||
export default rules;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,9 +2,8 @@
 | 
			
		|||
/*eslint no-nested-ternary: "off"*/
 | 
			
		||||
/*eslint quotes: "off"*/
 | 
			
		||||
/*eslint comma-dangle: "off"*/
 | 
			
		||||
/*eslint semi: "off"*/
 | 
			
		||||
 | 
			
		||||
export default [
 | 
			
		||||
const rules = [
 | 
			
		||||
  {
 | 
			
		||||
    locale: "sa",
 | 
			
		||||
    fields: {
 | 
			
		||||
| 
						 | 
				
			
			@ -94,4 +93,6 @@ export default [
 | 
			
		|||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
]
 | 
			
		||||
];
 | 
			
		||||
 | 
			
		||||
export default rules;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,8 +10,13 @@ if (!HTMLCanvasElement.prototype.toBlob) {
 | 
			
		|||
  const BASE64_MARKER = ';base64,';
 | 
			
		||||
 | 
			
		||||
  Object.defineProperty(HTMLCanvasElement.prototype, 'toBlob', {
 | 
			
		||||
    value(callback: BlobCallback, type = 'image/png', quality: any) {
 | 
			
		||||
      const dataURL = this.toDataURL(type, quality);
 | 
			
		||||
    value: function (
 | 
			
		||||
      this: HTMLCanvasElement,
 | 
			
		||||
      callback: BlobCallback,
 | 
			
		||||
      type = 'image/png',
 | 
			
		||||
      quality: unknown
 | 
			
		||||
    ) {
 | 
			
		||||
      const dataURL: string = this.toDataURL(type, quality);
 | 
			
		||||
      let data;
 | 
			
		||||
 | 
			
		||||
      if (dataURL.indexOf(BASE64_MARKER) >= 0) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,46 +1,47 @@
 | 
			
		|||
import { combineReducers } from 'redux-immutable';
 | 
			
		||||
import dropdown_menu from './dropdown_menu';
 | 
			
		||||
import timelines from './timelines';
 | 
			
		||||
import meta from './meta';
 | 
			
		||||
import alerts from './alerts';
 | 
			
		||||
import { loadingBarReducer } from 'react-redux-loading-bar';
 | 
			
		||||
import modal from './modal';
 | 
			
		||||
import user_lists from './user_lists';
 | 
			
		||||
import domain_lists from './domain_lists';
 | 
			
		||||
import { combineReducers } from 'redux-immutable';
 | 
			
		||||
 | 
			
		||||
import accounts from './accounts';
 | 
			
		||||
import accounts_counters from './accounts_counters';
 | 
			
		||||
import statuses from './statuses';
 | 
			
		||||
import relationships from './relationships';
 | 
			
		||||
import settings from './settings';
 | 
			
		||||
import push_notifications from './push_notifications';
 | 
			
		||||
import status_lists from './status_lists';
 | 
			
		||||
import mutes from './mutes';
 | 
			
		||||
import accounts_map from './accounts_map';
 | 
			
		||||
import alerts from './alerts';
 | 
			
		||||
import announcements from './announcements';
 | 
			
		||||
import blocks from './blocks';
 | 
			
		||||
import boosts from './boosts';
 | 
			
		||||
import server from './server';
 | 
			
		||||
import contexts from './contexts';
 | 
			
		||||
import compose from './compose';
 | 
			
		||||
import search from './search';
 | 
			
		||||
import media_attachments from './media_attachments';
 | 
			
		||||
import notifications from './notifications';
 | 
			
		||||
import height_cache from './height_cache';
 | 
			
		||||
import custom_emojis from './custom_emojis';
 | 
			
		||||
import lists from './lists';
 | 
			
		||||
import listEditor from './list_editor';
 | 
			
		||||
import listAdder from './list_adder';
 | 
			
		||||
import filters from './filters';
 | 
			
		||||
import contexts from './contexts';
 | 
			
		||||
import conversations from './conversations';
 | 
			
		||||
import suggestions from './suggestions';
 | 
			
		||||
import polls from './polls';
 | 
			
		||||
import trends from './trends';
 | 
			
		||||
import { missedUpdatesReducer } from './missed_updates';
 | 
			
		||||
import announcements from './announcements';
 | 
			
		||||
import markers from './markers';
 | 
			
		||||
import picture_in_picture from './picture_in_picture';
 | 
			
		||||
import accounts_map from './accounts_map';
 | 
			
		||||
import history from './history';
 | 
			
		||||
import tags from './tags';
 | 
			
		||||
import custom_emojis from './custom_emojis';
 | 
			
		||||
import domain_lists from './domain_lists';
 | 
			
		||||
import dropdown_menu from './dropdown_menu';
 | 
			
		||||
import filters from './filters';
 | 
			
		||||
import followed_tags from './followed_tags';
 | 
			
		||||
import height_cache from './height_cache';
 | 
			
		||||
import history from './history';
 | 
			
		||||
import listAdder from './list_adder';
 | 
			
		||||
import listEditor from './list_editor';
 | 
			
		||||
import lists from './lists';
 | 
			
		||||
import markers from './markers';
 | 
			
		||||
import media_attachments from './media_attachments';
 | 
			
		||||
import meta from './meta';
 | 
			
		||||
import { missedUpdatesReducer } from './missed_updates';
 | 
			
		||||
import modal from './modal';
 | 
			
		||||
import mutes from './mutes';
 | 
			
		||||
import notifications from './notifications';
 | 
			
		||||
import picture_in_picture from './picture_in_picture';
 | 
			
		||||
import polls from './polls';
 | 
			
		||||
import push_notifications from './push_notifications';
 | 
			
		||||
import relationships from './relationships';
 | 
			
		||||
import search from './search';
 | 
			
		||||
import server from './server';
 | 
			
		||||
import settings from './settings';
 | 
			
		||||
import status_lists from './status_lists';
 | 
			
		||||
import statuses from './statuses';
 | 
			
		||||
import suggestions from './suggestions';
 | 
			
		||||
import tags from './tags';
 | 
			
		||||
import timelines from './timelines';
 | 
			
		||||
import trends from './trends';
 | 
			
		||||
import user_lists from './user_lists';
 | 
			
		||||
 | 
			
		||||
const reducers = {
 | 
			
		||||
  announcements,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,13 +2,13 @@ import {
 | 
			
		|||
  MARKERS_SUBMIT_SUCCESS,
 | 
			
		||||
} from '../actions/markers';
 | 
			
		||||
 | 
			
		||||
import { Map as ImmutableMap } from 'immutable';
 | 
			
		||||
 | 
			
		||||
const initialState = ImmutableMap({
 | 
			
		||||
  home: '0',
 | 
			
		||||
  notifications: '0',
 | 
			
		||||
});
 | 
			
		||||
 | 
			
		||||
import { Map as ImmutableMap } from 'immutable';
 | 
			
		||||
 | 
			
		||||
export default function markers(state = initialState, action) {
 | 
			
		||||
  switch(action.type) {
 | 
			
		||||
  case MARKERS_SUBMIT_SUCCESS:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,14 @@
 | 
			
		|||
import { Record } from 'immutable';
 | 
			
		||||
import type { Action } from 'redux';
 | 
			
		||||
import { NOTIFICATIONS_UPDATE } from '../actions/notifications';
 | 
			
		||||
import { focusApp, unfocusApp } from '../actions/app';
 | 
			
		||||
 | 
			
		||||
type MissedUpdatesState = {
 | 
			
		||||
import type { Action } from 'redux';
 | 
			
		||||
 | 
			
		||||
import { focusApp, unfocusApp } from '../actions/app';
 | 
			
		||||
import { NOTIFICATIONS_UPDATE } from '../actions/notifications';
 | 
			
		||||
 | 
			
		||||
interface MissedUpdatesState {
 | 
			
		||||
  focused: boolean;
 | 
			
		||||
  unread: number;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
const initialState = Record<MissedUpdatesState>({
 | 
			
		||||
  focused: true,
 | 
			
		||||
  unread: 0,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,9 +1,13 @@
 | 
			
		|||
import type { TypedUseSelectorHook } from 'react-redux';
 | 
			
		||||
import { useDispatch, useSelector } from 'react-redux';
 | 
			
		||||
 | 
			
		||||
import { configureStore } from '@reduxjs/toolkit';
 | 
			
		||||
 | 
			
		||||
import { rootReducer } from '../reducers';
 | 
			
		||||
import { loadingBarMiddleware } from './middlewares/loading_bar';
 | 
			
		||||
 | 
			
		||||
import { errorsMiddleware } from './middlewares/errors';
 | 
			
		||||
import { loadingBarMiddleware } from './middlewares/loading_bar';
 | 
			
		||||
import { soundsMiddleware } from './middlewares/sounds';
 | 
			
		||||
import { TypedUseSelectorHook, useDispatch, useSelector } from 'react-redux';
 | 
			
		||||
 | 
			
		||||
export const store = configureStore({
 | 
			
		||||
  reducer: rootReducer,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,17 +1,18 @@
 | 
			
		|||
import { Middleware } from 'redux';
 | 
			
		||||
import type { AnyAction, Middleware } from 'redux';
 | 
			
		||||
 | 
			
		||||
import type { RootState } from '..';
 | 
			
		||||
import { showAlertForError } from '../../actions/alerts';
 | 
			
		||||
import { RootState } from '..';
 | 
			
		||||
 | 
			
		||||
const defaultFailSuffix = 'FAIL';
 | 
			
		||||
 | 
			
		||||
export const errorsMiddleware: Middleware<Record<string, never>, RootState> =
 | 
			
		||||
  ({ dispatch }) =>
 | 
			
		||||
  (next) =>
 | 
			
		||||
  (action) => {
 | 
			
		||||
  (action: AnyAction & { skipAlert?: boolean; skipNotFound?: boolean }) => {
 | 
			
		||||
    if (action.type && !action.skipAlert) {
 | 
			
		||||
      const isFail = new RegExp(`${defaultFailSuffix}$`, 'g');
 | 
			
		||||
 | 
			
		||||
      if (action.type.match(isFail)) {
 | 
			
		||||
      if (typeof action.type === 'string' && action.type.match(isFail)) {
 | 
			
		||||
        dispatch(showAlertForError(action.error, action.skipNotFound));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,6 +1,7 @@
 | 
			
		|||
import { showLoading, hideLoading } from 'react-redux-loading-bar';
 | 
			
		||||
import { Middleware } from 'redux';
 | 
			
		||||
import { RootState } from '..';
 | 
			
		||||
import type { AnyAction, Middleware } from 'redux';
 | 
			
		||||
 | 
			
		||||
import type { RootState } from '..';
 | 
			
		||||
 | 
			
		||||
interface Config {
 | 
			
		||||
  promiseTypeSuffixes?: string[];
 | 
			
		||||
| 
						 | 
				
			
			@ -19,7 +20,7 @@ export const loadingBarMiddleware = (
 | 
			
		|||
 | 
			
		||||
  return ({ dispatch }) =>
 | 
			
		||||
    (next) =>
 | 
			
		||||
    (action) => {
 | 
			
		||||
    (action: AnyAction) => {
 | 
			
		||||
      if (action.type && !action.skipLoading) {
 | 
			
		||||
        const [PENDING, FULFILLED, REJECTED] = promiseTypeSuffixes;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -27,13 +28,15 @@ export const loadingBarMiddleware = (
 | 
			
		|||
        const isFulfilled = new RegExp(`${FULFILLED}$`, 'g');
 | 
			
		||||
        const isRejected = new RegExp(`${REJECTED}$`, 'g');
 | 
			
		||||
 | 
			
		||||
        if (action.type.match(isPending)) {
 | 
			
		||||
          dispatch(showLoading());
 | 
			
		||||
        } else if (
 | 
			
		||||
          action.type.match(isFulfilled) ||
 | 
			
		||||
          action.type.match(isRejected)
 | 
			
		||||
        ) {
 | 
			
		||||
          dispatch(hideLoading());
 | 
			
		||||
        if (typeof action.type === 'string') {
 | 
			
		||||
          if (action.type.match(isPending)) {
 | 
			
		||||
            dispatch(showLoading());
 | 
			
		||||
          } else if (
 | 
			
		||||
            action.type.match(isFulfilled) ||
 | 
			
		||||
            action.type.match(isRejected)
 | 
			
		||||
          ) {
 | 
			
		||||
            dispatch(hideLoading());
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,6 @@
 | 
			
		|||
import { Middleware, AnyAction } from 'redux';
 | 
			
		||||
import { RootState } from '..';
 | 
			
		||||
import type { Middleware, AnyAction } from 'redux';
 | 
			
		||||
 | 
			
		||||
import type { RootState } from '..';
 | 
			
		||||
 | 
			
		||||
interface AudioSource {
 | 
			
		||||
  src: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -27,7 +28,7 @@ const play = (audio: HTMLAudioElement) => {
 | 
			
		|||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  audio.play();
 | 
			
		||||
  void audio.play();
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
export const soundsMiddleware = (): Middleware<
 | 
			
		||||
| 
						 | 
				
			
			@ -47,13 +48,15 @@ export const soundsMiddleware = (): Middleware<
 | 
			
		|||
    ]),
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  return () => (next) => (action: AnyAction) => {
 | 
			
		||||
    const sound = action?.meta?.sound;
 | 
			
		||||
  return () =>
 | 
			
		||||
    (next) =>
 | 
			
		||||
    (action: AnyAction & { meta?: { sound?: string } }) => {
 | 
			
		||||
      const sound = action?.meta?.sound;
 | 
			
		||||
 | 
			
		||||
    if (sound && soundCache[sound]) {
 | 
			
		||||
      play(soundCache[sound]);
 | 
			
		||||
    }
 | 
			
		||||
      if (sound && soundCache[sound]) {
 | 
			
		||||
        play(soundCache[sound]);
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
    return next(action);
 | 
			
		||||
  };
 | 
			
		||||
      return next(action);
 | 
			
		||||
    };
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,8 +1,9 @@
 | 
			
		|||
export function uuid(a?: string): string {
 | 
			
		||||
  return a
 | 
			
		||||
    ? (
 | 
			
		||||
        (a as any as number) ^
 | 
			
		||||
        ((Math.random() * 16) >> ((a as any as number) / 4))
 | 
			
		||||
        (a as unknown as number) ^
 | 
			
		||||
        ((Math.random() * 16) >> ((a as unknown as number) / 4))
 | 
			
		||||
      ).toString(16)
 | 
			
		||||
    : ('' + 1e7 + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid);
 | 
			
		||||
    : // eslint-disable-next-line @typescript-eslint/restrict-plus-operands
 | 
			
		||||
      ('' + 1e7 + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, uuid);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -12,7 +12,7 @@ type AccountField = Record<{
 | 
			
		|||
  verified_at: string | null;
 | 
			
		||||
}>;
 | 
			
		||||
 | 
			
		||||
type AccountApiResponseValues = {
 | 
			
		||||
interface AccountApiResponseValues {
 | 
			
		||||
  acct: string;
 | 
			
		||||
  avatar: string;
 | 
			
		||||
  avatar_static: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -34,7 +34,7 @@ type AccountApiResponseValues = {
 | 
			
		|||
  statuses_count: number;
 | 
			
		||||
  url: string;
 | 
			
		||||
  username: string;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type NormalizedAccountField = Record<{
 | 
			
		||||
  name_emojified: string;
 | 
			
		||||
| 
						 | 
				
			
			@ -42,12 +42,12 @@ type NormalizedAccountField = Record<{
 | 
			
		|||
  value_plain: string;
 | 
			
		||||
}>;
 | 
			
		||||
 | 
			
		||||
type NormalizedAccountValues = {
 | 
			
		||||
interface NormalizedAccountValues {
 | 
			
		||||
  display_name_html: string;
 | 
			
		||||
  fields: NormalizedAccountField[];
 | 
			
		||||
  note_emojified: string;
 | 
			
		||||
  note_plain: string;
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
export type Account = Record<
 | 
			
		||||
  AccountApiResponseValues & NormalizedAccountValues
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -181,6 +181,7 @@
 | 
			
		|||
    "babel-jest": "^29.5.0",
 | 
			
		||||
    "eslint": "^8.39.0",
 | 
			
		||||
    "eslint-config-prettier": "^8.8.0",
 | 
			
		||||
    "eslint-import-resolver-typescript": "^3.5.5",
 | 
			
		||||
    "eslint-plugin-formatjs": "^4.10.1",
 | 
			
		||||
    "eslint-plugin-import": "~2.27.5",
 | 
			
		||||
    "eslint-plugin-jsdoc": "^43.1.1",
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										172
									
								
								yarn.lock
									
									
									
									
									
								
							
							
						
						
									
										172
									
								
								yarn.lock
									
									
									
									
									
								
							| 
						 | 
				
			
			@ -1678,6 +1678,18 @@
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
 | 
			
		||||
  integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
 | 
			
		||||
 | 
			
		||||
"@pkgr/utils@^2.3.1":
 | 
			
		||||
  version "2.4.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@pkgr/utils/-/utils-2.4.0.tgz#b6373d2504aedaf2fc7cdf2d13ab1f48fa5f12d5"
 | 
			
		||||
  integrity sha512-2OCURAmRtdlL8iUDTypMrrxfwe8frXTeXaxGsVOaYtc/wrUyk8Z/0OBetM7cdlsy7ZFWlMX72VogKeh+A4Xcjw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    cross-spawn "^7.0.3"
 | 
			
		||||
    fast-glob "^3.2.12"
 | 
			
		||||
    is-glob "^4.0.3"
 | 
			
		||||
    open "^9.1.0"
 | 
			
		||||
    picocolors "^1.0.0"
 | 
			
		||||
    tslib "^2.5.0"
 | 
			
		||||
 | 
			
		||||
"@polka/url@^1.0.0-next.9":
 | 
			
		||||
  version "1.0.0-next.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.11.tgz#aeb16f50649a91af79dbe36574b66d0f9e4d9f71"
 | 
			
		||||
| 
						 | 
				
			
			@ -3374,6 +3386,11 @@ batch@0.6.1:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz#dc34314f4e679318093fc760272525f94bf25c16"
 | 
			
		||||
  integrity sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=
 | 
			
		||||
 | 
			
		||||
big-integer@^1.6.44:
 | 
			
		||||
  version "1.6.51"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/big-integer/-/big-integer-1.6.51.tgz#0df92a5d9880560d3ff2d5fd20245c889d130686"
 | 
			
		||||
  integrity sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==
 | 
			
		||||
 | 
			
		||||
big.js@^5.2.2:
 | 
			
		||||
  version "5.2.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
 | 
			
		||||
| 
						 | 
				
			
			@ -3456,6 +3473,13 @@ boolbase@^1.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
 | 
			
		||||
  integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
 | 
			
		||||
 | 
			
		||||
bplist-parser@^0.2.0:
 | 
			
		||||
  version "0.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bplist-parser/-/bplist-parser-0.2.0.tgz#43a9d183e5bf9d545200ceac3e712f79ebbe8d0e"
 | 
			
		||||
  integrity sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    big-integer "^1.6.44"
 | 
			
		||||
 | 
			
		||||
brace-expansion@^1.1.7:
 | 
			
		||||
  version "1.1.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd"
 | 
			
		||||
| 
						 | 
				
			
			@ -3631,6 +3655,13 @@ builtin-status-codes@^3.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz#85982878e21b98e1c66425e03d0174788f569ee8"
 | 
			
		||||
  integrity sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=
 | 
			
		||||
 | 
			
		||||
bundle-name@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bundle-name/-/bundle-name-3.0.0.tgz#ba59bcc9ac785fb67ccdbf104a2bf60c099f0e1a"
 | 
			
		||||
  integrity sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    run-applescript "^5.0.0"
 | 
			
		||||
 | 
			
		||||
bytes@3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048"
 | 
			
		||||
| 
						 | 
				
			
			@ -4531,6 +4562,24 @@ deepmerge@^4.0, deepmerge@^4.2.2:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.2.2.tgz#44d2ea3679b8f4d4ffba33f03d865fc1e7bf4955"
 | 
			
		||||
  integrity sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==
 | 
			
		||||
 | 
			
		||||
default-browser-id@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/default-browser-id/-/default-browser-id-3.0.0.tgz#bee7bbbef1f4e75d31f98f4d3f1556a14cea790c"
 | 
			
		||||
  integrity sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    bplist-parser "^0.2.0"
 | 
			
		||||
    untildify "^4.0.0"
 | 
			
		||||
 | 
			
		||||
default-browser@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/default-browser/-/default-browser-4.0.0.tgz#53c9894f8810bf86696de117a6ce9085a3cbc7da"
 | 
			
		||||
  integrity sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    bundle-name "^3.0.0"
 | 
			
		||||
    default-browser-id "^3.0.0"
 | 
			
		||||
    execa "^7.1.1"
 | 
			
		||||
    titleize "^3.0.0"
 | 
			
		||||
 | 
			
		||||
default-gateway@^4.2.0:
 | 
			
		||||
  version "4.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz#167104c7500c2115f6dd69b0a536bb8ed720552b"
 | 
			
		||||
| 
						 | 
				
			
			@ -4539,6 +4588,11 @@ default-gateway@^4.2.0:
 | 
			
		|||
    execa "^1.0.0"
 | 
			
		||||
    ip-regex "^2.1.0"
 | 
			
		||||
 | 
			
		||||
define-lazy-prop@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz#dbb19adfb746d7fc6d734a06b72f4a00d021255f"
 | 
			
		||||
  integrity sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==
 | 
			
		||||
 | 
			
		||||
define-properties@^1.1.3, define-properties@^1.1.4:
 | 
			
		||||
  version "1.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.4.tgz#0b14d7bd7fbeb2f3572c3a7eda80ea5d57fb05b1"
 | 
			
		||||
| 
						 | 
				
			
			@ -4877,6 +4931,14 @@ enhanced-resolve@^4.1.1, enhanced-resolve@^4.5.0:
 | 
			
		|||
    memory-fs "^0.5.0"
 | 
			
		||||
    tapable "^1.0.0"
 | 
			
		||||
 | 
			
		||||
enhanced-resolve@^5.12.0:
 | 
			
		||||
  version "5.13.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.13.0.tgz#26d1ecc448c02de997133217b5c1053f34a0a275"
 | 
			
		||||
  integrity sha512-eyV8f0y1+bzyfh8xAwW/WTSZpLbjhqc4ne9eGSH4Zo2ejdyiNG9pU6mf9DG8a7+Auk6MFTlNOT4Y2y/9k8GKVg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    graceful-fs "^4.2.4"
 | 
			
		||||
    tapable "^2.2.0"
 | 
			
		||||
 | 
			
		||||
entities@^4.2.0, entities@^4.4.0:
 | 
			
		||||
  version "4.4.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/entities/-/entities-4.4.0.tgz#97bdaba170339446495e653cfd2db78962900174"
 | 
			
		||||
| 
						 | 
				
			
			@ -5015,6 +5077,20 @@ eslint-import-resolver-node@^0.3.7:
 | 
			
		|||
    is-core-module "^2.11.0"
 | 
			
		||||
    resolve "^1.22.1"
 | 
			
		||||
 | 
			
		||||
eslint-import-resolver-typescript@^3.5.5:
 | 
			
		||||
  version "3.5.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-import-resolver-typescript/-/eslint-import-resolver-typescript-3.5.5.tgz#0a9034ae7ed94b254a360fbea89187b60ea7456d"
 | 
			
		||||
  integrity sha512-TdJqPHs2lW5J9Zpe17DZNQuDnox4xo2o+0tE7Pggain9Rbc19ik8kFtXdxZ250FVx2kF4vlt2RSf4qlUpG7bhw==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    debug "^4.3.4"
 | 
			
		||||
    enhanced-resolve "^5.12.0"
 | 
			
		||||
    eslint-module-utils "^2.7.4"
 | 
			
		||||
    get-tsconfig "^4.5.0"
 | 
			
		||||
    globby "^13.1.3"
 | 
			
		||||
    is-core-module "^2.11.0"
 | 
			
		||||
    is-glob "^4.0.3"
 | 
			
		||||
    synckit "^0.8.5"
 | 
			
		||||
 | 
			
		||||
eslint-module-utils@^2.7.4:
 | 
			
		||||
  version "2.7.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz#4f3e41116aaf13a20792261e61d3a2e7e0583974"
 | 
			
		||||
| 
						 | 
				
			
			@ -5320,7 +5396,7 @@ execa@^5.0.0:
 | 
			
		|||
    signal-exit "^3.0.3"
 | 
			
		||||
    strip-final-newline "^2.0.0"
 | 
			
		||||
 | 
			
		||||
execa@^7.0.0:
 | 
			
		||||
execa@^7.0.0, execa@^7.1.1:
 | 
			
		||||
  version "7.1.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43"
 | 
			
		||||
  integrity sha512-wH0eMf/UXckdUYnO21+HDztteVv05rq2GXksxT4fCGeHkBhw1DROXh40wcjMcRqDOWE7iPJ4n3M7e2+YFP+76Q==
 | 
			
		||||
| 
						 | 
				
			
			@ -5447,7 +5523,7 @@ fast-diff@^1.1.2:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
 | 
			
		||||
  integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
 | 
			
		||||
 | 
			
		||||
fast-glob@^3.2.12, fast-glob@^3.2.9:
 | 
			
		||||
fast-glob@^3.2.11, fast-glob@^3.2.12, fast-glob@^3.2.9:
 | 
			
		||||
  version "3.2.12"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.12.tgz#7f39ec99c2e6ab030337142da9e0c18f37afae80"
 | 
			
		||||
  integrity sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==
 | 
			
		||||
| 
						 | 
				
			
			@ -5814,6 +5890,11 @@ get-symbol-description@^1.0.0:
 | 
			
		|||
    call-bind "^1.0.2"
 | 
			
		||||
    get-intrinsic "^1.1.1"
 | 
			
		||||
 | 
			
		||||
get-tsconfig@^4.5.0:
 | 
			
		||||
  version "4.5.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.5.0.tgz#6d52d1c7b299bd3ee9cd7638561653399ac77b0f"
 | 
			
		||||
  integrity sha512-MjhiaIWCJ1sAU4pIQ5i5OfOuHHxVo1oYeNsWTON7jxYkod8pHocXeh+SSbmu5OZZZK73B6cbJ2XADzXehLyovQ==
 | 
			
		||||
 | 
			
		||||
get-value@^2.0.3, get-value@^2.0.6:
 | 
			
		||||
  version "2.0.6"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28"
 | 
			
		||||
| 
						 | 
				
			
			@ -5924,6 +6005,17 @@ globby@^11.1.0:
 | 
			
		|||
    merge2 "^1.4.1"
 | 
			
		||||
    slash "^3.0.0"
 | 
			
		||||
 | 
			
		||||
globby@^13.1.3:
 | 
			
		||||
  version "13.1.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/globby/-/globby-13.1.4.tgz#2f91c116066bcec152465ba36e5caa4a13c01317"
 | 
			
		||||
  integrity sha512-iui/IiiW+QrJ1X1hKH5qwlMQyv34wJAYwH1vrf8b9kBA4sNiif3gKsMHa+BrdnOpEudWjpotfa7LrTzB1ERS/g==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    dir-glob "^3.0.1"
 | 
			
		||||
    fast-glob "^3.2.11"
 | 
			
		||||
    ignore "^5.2.0"
 | 
			
		||||
    merge2 "^1.4.1"
 | 
			
		||||
    slash "^4.0.0"
 | 
			
		||||
 | 
			
		||||
globby@^6.1.0:
 | 
			
		||||
  version "6.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz#f5a6d70e8395e21c858fb0489d64df02424d506c"
 | 
			
		||||
| 
						 | 
				
			
			@ -5952,6 +6044,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0,
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
 | 
			
		||||
  integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
 | 
			
		||||
 | 
			
		||||
graceful-fs@^4.2.4:
 | 
			
		||||
  version "4.2.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
 | 
			
		||||
  integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
 | 
			
		||||
 | 
			
		||||
grapheme-splitter@^1.0.4:
 | 
			
		||||
  version "1.0.4"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e"
 | 
			
		||||
| 
						 | 
				
			
			@ -6607,6 +6704,16 @@ is-descriptor@^1.0.0, is-descriptor@^1.0.2:
 | 
			
		|||
    is-data-descriptor "^1.0.0"
 | 
			
		||||
    kind-of "^6.0.2"
 | 
			
		||||
 | 
			
		||||
is-docker@^2.0.0:
 | 
			
		||||
  version "2.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
 | 
			
		||||
  integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
 | 
			
		||||
 | 
			
		||||
is-docker@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-3.0.0.tgz#90093aa3106277d8a77a5910dbae71747e15a200"
 | 
			
		||||
  integrity sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==
 | 
			
		||||
 | 
			
		||||
is-electron@^2.2.0:
 | 
			
		||||
  version "2.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-electron/-/is-electron-2.2.0.tgz#8943084f09e8b731b3a7a0298a7b5d56f6b7eef0"
 | 
			
		||||
| 
						 | 
				
			
			@ -6663,6 +6770,13 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    is-extglob "^2.1.1"
 | 
			
		||||
 | 
			
		||||
is-inside-container@^1.0.0:
 | 
			
		||||
  version "1.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-inside-container/-/is-inside-container-1.0.0.tgz#e81fba699662eb31dbdaf26766a61d4814717ea4"
 | 
			
		||||
  integrity sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-docker "^3.0.0"
 | 
			
		||||
 | 
			
		||||
is-map@^2.0.1, is-map@^2.0.2:
 | 
			
		||||
  version "2.0.2"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.2.tgz#00922db8c9bf73e81b7a335827bc2a43f2b91127"
 | 
			
		||||
| 
						 | 
				
			
			@ -6846,6 +6960,13 @@ is-wsl@^1.1.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
 | 
			
		||||
  integrity sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=
 | 
			
		||||
 | 
			
		||||
is-wsl@^2.2.0:
 | 
			
		||||
  version "2.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
 | 
			
		||||
  integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    is-docker "^2.0.0"
 | 
			
		||||
 | 
			
		||||
isarray@0.0.1:
 | 
			
		||||
  version "0.0.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
 | 
			
		||||
| 
						 | 
				
			
			@ -8493,6 +8614,16 @@ onetime@^6.0.0:
 | 
			
		|||
  dependencies:
 | 
			
		||||
    mimic-fn "^4.0.0"
 | 
			
		||||
 | 
			
		||||
open@^9.1.0:
 | 
			
		||||
  version "9.1.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/open/-/open-9.1.0.tgz#684934359c90ad25742f5a26151970ff8c6c80b6"
 | 
			
		||||
  integrity sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    default-browser "^4.0.0"
 | 
			
		||||
    define-lazy-prop "^3.0.0"
 | 
			
		||||
    is-inside-container "^1.0.0"
 | 
			
		||||
    is-wsl "^2.2.0"
 | 
			
		||||
 | 
			
		||||
opencollective-postinstall@^2.0.2:
 | 
			
		||||
  version "2.0.3"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/opencollective-postinstall/-/opencollective-postinstall-2.0.3.tgz#7a0fff978f6dbfa4d006238fbac98ed4198c3259"
 | 
			
		||||
| 
						 | 
				
			
			@ -10099,6 +10230,13 @@ rrweb-cssom@^0.6.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1"
 | 
			
		||||
  integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==
 | 
			
		||||
 | 
			
		||||
run-applescript@^5.0.0:
 | 
			
		||||
  version "5.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/run-applescript/-/run-applescript-5.0.0.tgz#e11e1c932e055d5c6b40d98374e0268d9b11899c"
 | 
			
		||||
  integrity sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    execa "^5.0.0"
 | 
			
		||||
 | 
			
		||||
run-parallel@^1.1.9:
 | 
			
		||||
  version "1.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
 | 
			
		||||
| 
						 | 
				
			
			@ -10411,6 +10549,11 @@ slash@^3.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
 | 
			
		||||
  integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 | 
			
		||||
 | 
			
		||||
slash@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/slash/-/slash-4.0.0.tgz#2422372176c4c6c5addb5e2ada885af984b396a7"
 | 
			
		||||
  integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==
 | 
			
		||||
 | 
			
		||||
slice-ansi@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
 | 
			
		||||
| 
						 | 
				
			
			@ -11055,6 +11198,14 @@ symbol-tree@^3.2.4:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
 | 
			
		||||
  integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
 | 
			
		||||
 | 
			
		||||
synckit@^0.8.5:
 | 
			
		||||
  version "0.8.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3"
 | 
			
		||||
  integrity sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==
 | 
			
		||||
  dependencies:
 | 
			
		||||
    "@pkgr/utils" "^2.3.1"
 | 
			
		||||
    tslib "^2.5.0"
 | 
			
		||||
 | 
			
		||||
table@^6.8.1:
 | 
			
		||||
  version "6.8.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/table/-/table-6.8.1.tgz#ea2b71359fe03b017a5fbc296204471158080bdf"
 | 
			
		||||
| 
						 | 
				
			
			@ -11071,6 +11222,11 @@ tapable@^1.0, tapable@^1.0.0, tapable@^1.1.3:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz#a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2"
 | 
			
		||||
  integrity sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==
 | 
			
		||||
 | 
			
		||||
tapable@^2.2.0:
 | 
			
		||||
  version "2.2.1"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
 | 
			
		||||
  integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
 | 
			
		||||
 | 
			
		||||
tar@^6.0.2:
 | 
			
		||||
  version "6.1.11"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
 | 
			
		||||
| 
						 | 
				
			
			@ -11193,6 +11349,11 @@ tiny-warning@^1.0.0:
 | 
			
		|||
  resolved "https://registry.yarnpkg.com/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
 | 
			
		||||
  integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
 | 
			
		||||
 | 
			
		||||
titleize@^3.0.0:
 | 
			
		||||
  version "3.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/titleize/-/titleize-3.0.0.tgz#71c12eb7fdd2558aa8a44b0be83b8a76694acd53"
 | 
			
		||||
  integrity sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==
 | 
			
		||||
 | 
			
		||||
tmpl@1.0.5:
 | 
			
		||||
  version "1.0.5"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc"
 | 
			
		||||
| 
						 | 
				
			
			@ -11301,7 +11462,7 @@ tsconfig-paths@^3.14.1:
 | 
			
		|||
    minimist "^1.2.6"
 | 
			
		||||
    strip-bom "^3.0.0"
 | 
			
		||||
 | 
			
		||||
tslib@2.5.0, tslib@^2.1.0, tslib@^2.4.0:
 | 
			
		||||
tslib@2.5.0, tslib@^2.1.0, tslib@^2.4.0, tslib@^2.5.0:
 | 
			
		||||
  version "2.5.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
 | 
			
		||||
  integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==
 | 
			
		||||
| 
						 | 
				
			
			@ -11519,6 +11680,11 @@ unset-value@^1.0.0:
 | 
			
		|||
    has-value "^0.3.1"
 | 
			
		||||
    isobject "^3.0.0"
 | 
			
		||||
 | 
			
		||||
untildify@^4.0.0:
 | 
			
		||||
  version "4.0.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/untildify/-/untildify-4.0.0.tgz#2bc947b953652487e4600949fb091e3ae8cd919b"
 | 
			
		||||
  integrity sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==
 | 
			
		||||
 | 
			
		||||
upath@^1.1.1, upath@^1.2.0:
 | 
			
		||||
  version "1.2.0"
 | 
			
		||||
  resolved "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz#8f66dbcd55a883acdae4408af8b035a5044c1894"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue