diff --git a/.eslintrc b/.eslintrc index d10e3be..e667c02 100644 --- a/.eslintrc +++ b/.eslintrc @@ -4,7 +4,7 @@ "ecmaVersion": 12, "sourceType": "module" }, - "plugins": ["@typescript-eslint"], + "plugins": ["@typescript-eslint", "import"], "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", @@ -14,7 +14,9 @@ ], "rules": { "@typescript-eslint/no-var-requires": "off", - "@typescript-eslint/no-explicit-any": "off" + "@typescript-eslint/no-explicit-any": "off", + "@typescript-eslint/consistent-type-imports": ["error", { "fixStyle": "separate-type-imports" }], + "import/consistent-type-specifier-style": ["error", "prefer-top-level"] }, "env": { "browser": true, diff --git a/examples/next-app/app/[locale]/client/layout.tsx b/examples/next-app/app/[locale]/client/layout.tsx index 35a235c..8361959 100644 --- a/examples/next-app/app/[locale]/client/layout.tsx +++ b/examples/next-app/app/[locale]/client/layout.tsx @@ -1,4 +1,4 @@ -import { ReactNode } from 'react'; +import type { ReactNode } from 'react'; import { Provider } from '../provider'; export default function Layout({ params: { locale }, children }: { params: { locale: string }; children: ReactNode }) { diff --git a/examples/next-app/app/[locale]/layout.tsx b/examples/next-app/app/[locale]/layout.tsx index f804773..fdde03c 100644 --- a/examples/next-app/app/[locale]/layout.tsx +++ b/examples/next-app/app/[locale]/layout.tsx @@ -1,4 +1,4 @@ -import { ReactElement } from 'react'; +import type { ReactElement } from 'react'; import './globals.css'; import { Switch } from './switch'; import Link from 'next/link'; diff --git a/examples/next-app/app/[locale]/provider.tsx b/examples/next-app/app/[locale]/provider.tsx index 42cf22c..92e71f3 100644 --- a/examples/next-app/app/[locale]/provider.tsx +++ b/examples/next-app/app/[locale]/provider.tsx @@ -1,6 +1,6 @@ 'use client'; -import { ReactNode } from 'react'; +import type { ReactNode } from 'react'; import { I18nProviderClient } from '../../locales/client'; type ProviderProps = { diff --git a/examples/next-app/middleware.ts b/examples/next-app/middleware.ts index afd4267..b119315 100644 --- a/examples/next-app/middleware.ts +++ b/examples/next-app/middleware.ts @@ -1,5 +1,5 @@ import { createI18nMiddleware } from 'next-international/middleware'; -import { NextRequest } from 'next/server'; +import type { NextRequest } from 'next/server'; const I18nMiddleware = createI18nMiddleware({ locales: ['en', 'fr'], diff --git a/examples/next-pages/pages/_app.tsx b/examples/next-pages/pages/_app.tsx index 0156132..0049814 100644 --- a/examples/next-pages/pages/_app.tsx +++ b/examples/next-pages/pages/_app.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { AppProps } from 'next/app'; +import type { AppProps } from 'next/app'; import { I18nProvider } from '../locales'; import en from '../locales/en'; diff --git a/examples/next-pages/pages/ssr-ssg.tsx b/examples/next-pages/pages/ssr-ssg.tsx index 4c846e7..b1f38fe 100644 --- a/examples/next-pages/pages/ssr-ssg.tsx +++ b/examples/next-pages/pages/ssr-ssg.tsx @@ -1,4 +1,4 @@ -import { GetServerSideProps } from 'next'; +import type { GetServerSideProps } from 'next'; import { getLocaleProps, useChangeLocale, useCurrentLocale, useI18n, useScopedI18n } from '../locales'; export const getServerSideProps: GetServerSideProps = getLocaleProps(); diff --git a/package.json b/package.json index eb13385..f513441 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "@vitest/coverage-v8": "^0.32.2", "eslint": "^8.47.0", "eslint-config-prettier": "^9.0.0", + "eslint-plugin-import": "^2.28.1", "eslint-plugin-prettier": "^5.0.0", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "5.0.0-canary-7118f5dd7-20230705", diff --git a/packages/next-international/src/app/client/create-i18n-provider-client.tsx b/packages/next-international/src/app/client/create-i18n-provider-client.tsx index a1966a2..cd3fffc 100644 --- a/packages/next-international/src/app/client/create-i18n-provider-client.tsx +++ b/packages/next-international/src/app/client/create-i18n-provider-client.tsx @@ -1,8 +1,8 @@ -import React, { Context, ReactNode, Suspense, use, useMemo } from 'react'; import type { BaseLocale, ImportedLocales } from 'international-types'; - -import type { LocaleContext } from '../../types'; +import type { Context, ReactNode } from 'react'; +import React, { Suspense, use, useMemo } from 'react'; import { flattenLocale } from '../../common/flatten-locale'; +import type { LocaleContext } from '../../types'; type I18nProviderProps = Omit; diff --git a/packages/next-international/src/app/client/create-use-current-locale.ts b/packages/next-international/src/app/client/create-use-current-locale.ts index bae0787..a0ff92a 100644 --- a/packages/next-international/src/app/client/create-use-current-locale.ts +++ b/packages/next-international/src/app/client/create-use-current-locale.ts @@ -1,7 +1,7 @@ import { notFound, useParams } from 'next/navigation'; import { useMemo } from 'react'; import { DEFAULT_SEGMENT_NAME } from '../../common/constants'; -import { I18nClientConfig } from '../../types'; +import type { I18nClientConfig } from '../../types'; import { error } from '../../helpers/log'; export function createUseCurrentLocale(locales: LocalesKeys[], config: I18nClientConfig) { diff --git a/packages/next-international/src/app/middleware/index.ts b/packages/next-international/src/app/middleware/index.ts index 530d07f..f22c86c 100644 --- a/packages/next-international/src/app/middleware/index.ts +++ b/packages/next-international/src/app/middleware/index.ts @@ -1,4 +1,5 @@ -import { NextRequest, NextResponse } from 'next/server'; +import type { NextRequest } from 'next/server'; +import { NextResponse } from 'next/server'; import { LOCALE_COOKIE, LOCALE_HEADER } from '../../common/constants'; import type { I18nMiddlewareConfig } from '../../types'; @@ -78,7 +79,7 @@ function localeFromRequest( const defaultResolveLocaleFromRequest: NonNullable['resolveLocaleFromRequest']> = request => { const header = request.headers.get('Accept-Language'); - const locale = header?.split(',')?.[0]?.split('-')?.[0]; + const locale = header?.split(',', 1)?.[0]?.split('-', 1)?.[0]; return locale ?? null; }; diff --git a/packages/next-international/src/app/server/create-get-i18n.ts b/packages/next-international/src/app/server/create-get-i18n.ts index 63cc058..64f064d 100644 --- a/packages/next-international/src/app/server/create-get-i18n.ts +++ b/packages/next-international/src/app/server/create-get-i18n.ts @@ -1,8 +1,8 @@ import type { BaseLocale, ImportedLocales } from 'international-types'; import { createT } from '../../common/create-t'; -import { I18nServerConfig, LocaleContext } from '../../types'; -import { getLocaleCache } from './get-locale-cache'; import { flattenLocale } from '../../common/flatten-locale'; +import type { I18nServerConfig, LocaleContext } from '../../types'; +import { getLocaleCache } from './get-locale-cache'; export function createGetI18n( locales: Locales, diff --git a/packages/next-international/src/app/server/create-get-scoped-i18n.ts b/packages/next-international/src/app/server/create-get-scoped-i18n.ts index 93382db..0f65f03 100644 --- a/packages/next-international/src/app/server/create-get-scoped-i18n.ts +++ b/packages/next-international/src/app/server/create-get-scoped-i18n.ts @@ -1,6 +1,6 @@ import type { BaseLocale, ImportedLocales, Scopes } from 'international-types'; import { createT } from '../../common/create-t'; -import { I18nServerConfig, LocaleContext } from '../../types'; +import type { I18nServerConfig, LocaleContext } from '../../types'; import { getLocaleCache } from './get-locale-cache'; import { flattenLocale } from '../../common/flatten-locale'; diff --git a/packages/next-international/src/app/server/create-get-static-params.ts b/packages/next-international/src/app/server/create-get-static-params.ts index f8ba57a..2779de1 100644 --- a/packages/next-international/src/app/server/create-get-static-params.ts +++ b/packages/next-international/src/app/server/create-get-static-params.ts @@ -1,5 +1,5 @@ import type { ImportedLocales } from 'international-types'; -import { I18nServerConfig } from '../../types'; +import type { I18nServerConfig } from '../../types'; import { DEFAULT_SEGMENT_NAME } from '../../common/constants'; export function createGetStaticParams(locales: Locales, config: I18nServerConfig) { diff --git a/packages/next-international/src/app/server/index.ts b/packages/next-international/src/app/server/index.ts index e19a179..7346e50 100644 --- a/packages/next-international/src/app/server/index.ts +++ b/packages/next-international/src/app/server/index.ts @@ -1,11 +1,11 @@ import 'server-only'; import type { ExplicitLocales, FlattenLocale, GetLocaleType, ImportedLocales } from 'international-types'; +import type { I18nServerConfig } from '../../types'; +import { createGetCurrentLocale } from './create-get-current-locale'; import { createGetI18n } from './create-get-i18n'; import { createGetScopedI18n } from './create-get-scoped-i18n'; -import { createGetCurrentLocale } from './create-get-current-locale'; import { createGetStaticParams } from './create-get-static-params'; -import { I18nServerConfig } from '../../types'; export { setStaticParamsLocale } from './get-locale-cache'; diff --git a/packages/next-international/src/common/create-t.ts b/packages/next-international/src/common/create-t.ts index 6516b25..d25f9eb 100644 --- a/packages/next-international/src/common/create-t.ts +++ b/packages/next-international/src/common/create-t.ts @@ -1,4 +1,3 @@ -import { isValidElement, cloneElement, ReactNode } from 'react'; import type { BaseLocale, CreateParams, @@ -8,7 +7,9 @@ import type { ScopedValue, Scopes, } from 'international-types'; -import type { ReactParamsObject, LocaleContext, LocaleMap } from '../types'; +import type { ReactNode } from 'react'; +import { cloneElement, isValidElement } from 'react'; +import type { LocaleContext, LocaleMap, ReactParamsObject } from '../types'; export function createT | undefined>( context: LocaleContext, @@ -25,7 +26,7 @@ export function createT const pluralKeys = new Set( Object.keys(content) .filter(key => key.includes('#')) - .map(key => key.split('#')[0]), + .map(key => key.split('#', 1)[0]), ); const pluralRules = new Intl.PluralRules(context.locale); @@ -62,7 +63,7 @@ export function createT let value = scope ? content[`${scope}.${key}`] : content[key]; if (!value && isPlural) { - const baseKey = key.split('#')[0] as Key; + const baseKey = key.split('#', 1)[0] as Key; value = (content[`${baseKey}#other`] || key)?.toString(); } else { value = (value || key)?.toString(); diff --git a/packages/next-international/src/common/create-use-i18n.ts b/packages/next-international/src/common/create-use-i18n.ts index 960d6ce..db973c7 100644 --- a/packages/next-international/src/common/create-use-i18n.ts +++ b/packages/next-international/src/common/create-use-i18n.ts @@ -1,4 +1,5 @@ -import { useContext, Context } from 'react'; +import type { Context } from 'react'; +import { useContext } from 'react'; import type { BaseLocale } from 'international-types'; import type { LocaleContext } from '../types'; import { createT } from './create-t'; diff --git a/packages/next-international/src/common/create-use-scoped-i18n.ts b/packages/next-international/src/common/create-use-scoped-i18n.ts index 2c01d33..e2a3812 100644 --- a/packages/next-international/src/common/create-use-scoped-i18n.ts +++ b/packages/next-international/src/common/create-use-scoped-i18n.ts @@ -1,4 +1,5 @@ -import { useContext, Context } from 'react'; +import type { Context } from 'react'; +import { useContext } from 'react'; import type { BaseLocale, Scopes } from 'international-types'; import type { LocaleContext } from '../types'; import { createT } from '../common/create-t'; diff --git a/packages/next-international/src/common/flatten-locale.ts b/packages/next-international/src/common/flatten-locale.ts index f145da6..4aa1e32 100644 --- a/packages/next-international/src/common/flatten-locale.ts +++ b/packages/next-international/src/common/flatten-locale.ts @@ -1,4 +1,4 @@ -import { BaseLocale } from 'international-types'; +import type { BaseLocale } from 'international-types'; export const flattenLocale = (locale: Record, prefix = ''): Locale => Object.entries(locale).reduce( diff --git a/packages/next-international/src/pages/create-i18n-provider.tsx b/packages/next-international/src/pages/create-i18n-provider.tsx index e2fd993..0b16762 100644 --- a/packages/next-international/src/pages/create-i18n-provider.tsx +++ b/packages/next-international/src/pages/create-i18n-provider.tsx @@ -1,9 +1,10 @@ -import React, { Context, ReactElement, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import type { LocaleContext } from '../types'; import type { BaseLocale, ImportedLocales } from 'international-types'; import { useRouter } from 'next/router'; -import { error, warn } from '../helpers/log'; +import type { Context, ReactElement, ReactNode } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { flattenLocale } from '../common/flatten-locale'; +import { error, warn } from '../helpers/log'; +import type { LocaleContext } from '../types'; type I18nProviderProps = { locale: Locale; diff --git a/packages/next-international/src/pages/index.ts b/packages/next-international/src/pages/index.ts index 50a4733..7e5fca2 100644 --- a/packages/next-international/src/pages/index.ts +++ b/packages/next-international/src/pages/index.ts @@ -1,5 +1,5 @@ import { createContext } from 'react'; -import { ImportedLocales, ExplicitLocales, GetLocaleType, FlattenLocale } from 'international-types'; +import type { ImportedLocales, ExplicitLocales, GetLocaleType, FlattenLocale } from 'international-types'; import type { LocaleContext } from '../types'; import { createDefineLocale } from '../common/create-define-locale'; import { createGetLocaleProps } from './create-get-locale-props'; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 72c8120..e107cfc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -47,6 +47,9 @@ importers: eslint-config-prettier: specifier: ^9.0.0 version: 9.0.0(eslint@8.47.0) + eslint-plugin-import: + specifier: ^2.28.1 + version: 2.28.1(@typescript-eslint/parser@6.3.0)(eslint@8.47.0) eslint-plugin-prettier: specifier: ^5.0.0 version: 5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.1) @@ -279,7 +282,7 @@ packages: debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 - semver: 6.3.0 + semver: 6.3.1 transitivePeerDependencies: - supports-color @@ -328,7 +331,7 @@ packages: '@babel/helper-validator-option': 7.22.5 browserslist: 4.21.9 lru-cache: 5.1.1 - semver: 6.3.0 + semver: 6.3.1 /@babel/helper-create-class-features-plugin@7.22.10(@babel/core@7.22.5): resolution: {integrity: sha512-5IBb77txKYQPpOEdUdIhBx8VrZyDCQ+H82H0+5dX1TmuscP5vJKEE3cKurjtIw/vFwzbVH48VweE78kVDBrqjA==} @@ -3197,7 +3200,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 es-abstract: 1.21.2 get-intrinsic: 1.2.0 is-string: 1.0.7 @@ -3217,6 +3220,17 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.2 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + /array.prototype.flat@1.3.1: resolution: {integrity: sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==} engines: {node: '>= 0.4'} @@ -3231,8 +3245,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 es-shim-unscopables: 1.0.0 dev: true @@ -3254,6 +3268,19 @@ packages: es-shim-unscopables: 1.0.0 get-intrinsic: 1.2.0 + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + dev: true + /assertion-error@1.1.0: resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} dev: true @@ -3596,7 +3623,7 @@ packages: dev: false /concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} /concordance@5.0.4: resolution: {integrity: sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==} @@ -4132,18 +4159,19 @@ packages: execa: 7.2.0 titleize: 3.0.0 - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - - /define-properties@1.1.4: - resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + /define-data-property@1.1.0: + resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} engines: {node: '>= 0.4'} dependencies: + get-intrinsic: 1.2.1 + gopd: 1.0.1 has-property-descriptors: 1.0.0 - object-keys: 1.1.1 dev: true + /define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -4284,46 +4312,57 @@ packages: is-arrayish: 0.2.1 dev: true - /es-abstract@1.20.1: - resolution: {integrity: sha512-WEm2oBhfoI2sImeM4OF2zE2V3BYdSF+KnSi9Sidz51fQHd7+JuF8Xgcj9/0o+OWeIeIS/MiuNnlruQrJf16GQA==} + /es-abstract@1.21.2: + resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} dependencies: + array-buffer-byte-length: 1.0.0 + available-typed-arrays: 1.0.5 call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function-bind: 1.1.1 function.prototype.name: 1.1.5 get-intrinsic: 1.2.0 get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 has: 1.0.3 has-property-descriptors: 1.0.0 + has-proto: 1.0.1 has-symbols: 1.0.3 internal-slot: 1.0.5 - is-callable: 1.2.4 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 is-negative-zero: 2.0.2 is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 + is-typed-array: 1.1.10 is-weakref: 1.0.2 - object-inspect: 1.12.2 + object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 regexp.prototype.flags: 1.5.0 - string.prototype.trimend: 1.0.5 - string.prototype.trimstart: 1.0.5 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.7 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - dev: true + which-typed-array: 1.1.9 - /es-abstract@1.21.2: - resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} + /es-abstract@1.22.2: + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} engines: {node: '>= 0.4'} dependencies: array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 available-typed-arrays: 1.0.5 call-bind: 1.0.2 es-set-tostringtag: 2.0.1 es-to-primitive: 1.2.1 - function.prototype.name: 1.1.5 - get-intrinsic: 1.2.0 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.1 get-symbol-description: 1.0.0 globalthis: 1.0.3 gopd: 1.0.1 @@ -4338,19 +4377,24 @@ packages: is-regex: 1.1.4 is-shared-array-buffer: 1.0.2 is-string: 1.0.7 - is-typed-array: 1.1.10 + is-typed-array: 1.1.12 is-weakref: 1.0.2 object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 safe-regex-test: 1.0.0 - string.prototype.trim: 1.2.7 - string.prototype.trimend: 1.0.6 - string.prototype.trimstart: 1.0.6 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 typed-array-length: 1.0.4 unbox-primitive: 1.0.2 - which-typed-array: 1.1.9 + which-typed-array: 1.1.11 + dev: true /es-get-iterator@1.1.3: resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==} @@ -4513,7 +4557,7 @@ packages: resolution: {integrity: sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==} dependencies: debug: 3.2.7 - is-core-module: 2.12.0 + is-core-module: 2.13.0 resolve: 1.22.2 transitivePeerDependencies: - supports-color @@ -4595,13 +4639,48 @@ packages: minimatch: 3.1.2 object.values: 1.1.6 resolve: 1.22.2 - semver: 6.3.0 + semver: 6.3.1 tsconfig-paths: 3.14.2 transitivePeerDependencies: - eslint-import-resolver-typescript - eslint-import-resolver-webpack - supports-color + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@6.3.0)(eslint@8.47.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 6.3.0(eslint@8.47.0)(typescript@5.1.6) + array-includes: 3.1.6 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.1 + array.prototype.flatmap: 1.3.1 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.47.0 + eslint-import-resolver-node: 0.3.7 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@6.3.0)(eslint-import-resolver-node@0.3.7)(eslint-import-resolver-typescript@3.5.5)(eslint@8.47.0) + has: 1.0.3 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.6 + object.groupby: 1.0.1 + object.values: 1.1.6 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + /eslint-plugin-jsx-a11y@6.7.1(eslint@8.47.0): resolution: {integrity: sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==} engines: {node: '>=4.0'} @@ -4624,7 +4703,7 @@ packages: minimatch: 3.1.2 object.entries: 1.1.6 object.fromentries: 2.0.6 - semver: 6.3.0 + semver: 6.3.1 /eslint-plugin-prettier@5.0.0(eslint-config-prettier@9.0.0)(eslint@8.47.0)(prettier@3.0.1): resolution: {integrity: sha512-AgaZCVuYDXHUGxj/ZGu1u8H8CYgDY3iG6w5kUFw4AzMVXzB7VvbKgYR4nATIN+OvUrghMbiDLeimVjVY5ilq3w==} @@ -4698,7 +4777,7 @@ packages: object.values: 1.1.6 prop-types: 15.8.1 resolve: 2.0.0-next.4 - semver: 6.3.0 + semver: 6.3.1 string.prototype.matchall: 4.0.8 /eslint-scope@7.2.2: @@ -4994,6 +5073,16 @@ packages: es-abstract: 1.21.2 functions-have-names: 1.2.3 + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.2 + functions-have-names: 1.2.3 + dev: true + /functions-have-names@1.2.3: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} @@ -5005,20 +5094,21 @@ packages: resolution: {integrity: sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==} dev: true - /get-intrinsic@1.1.2: - resolution: {integrity: sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==} + /get-intrinsic@1.2.0: + resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} dependencies: function-bind: 1.1.1 has: 1.0.3 has-symbols: 1.0.3 - dev: true - /get-intrinsic@1.2.0: - resolution: {integrity: sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==} + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: function-bind: 1.1.1 has: 1.0.3 + has-proto: 1.0.1 has-symbols: 1.0.3 + dev: true /get-stream@3.0.0: resolution: {integrity: sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ==} @@ -5397,15 +5487,6 @@ packages: resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} dev: false - /internal-slot@1.0.3: - resolution: {integrity: sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==} - engines: {node: '>= 0.4'} - dependencies: - get-intrinsic: 1.2.0 - has: 1.0.3 - side-channel: 1.0.4 - dev: true - /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -5480,11 +5561,6 @@ packages: engines: {node: '>=4'} dev: false - /is-callable@1.2.4: - resolution: {integrity: sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==} - engines: {node: '>= 0.4'} - dev: true - /is-callable@1.2.7: resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} engines: {node: '>= 0.4'} @@ -5494,6 +5570,11 @@ packages: dependencies: has: 1.0.3 + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.3 + /is-date-object@1.0.5: resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} engines: {node: '>= 0.4'} @@ -5647,6 +5728,13 @@ packages: gopd: 1.0.1 has-tostringtag: 1.0.0 + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + dev: true + /is-weakmap@2.0.1: resolution: {integrity: sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==} @@ -6065,7 +6153,7 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: - semver: 6.3.0 + semver: 6.3.1 dev: true /markdown-extensions@1.1.1: @@ -7000,10 +7088,6 @@ packages: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} - /object-inspect@1.12.2: - resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} - dev: true - /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} @@ -7032,8 +7116,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 dev: true /object.entries@1.1.6: @@ -7049,8 +7133,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 dev: true /object.fromentries@2.0.6: @@ -7061,11 +7145,20 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + dev: true + /object.hasown@1.1.1: resolution: {integrity: sha512-LYLe4tivNQzq4JdaWW6WO3HMZZJWzkkH8fnI6EebWl0VZth2wL2Lovm74ep2/gZzlaTdV62JZHEqHQ2yVn8Q/A==} dependencies: - define-properties: 1.1.4 - es-abstract: 1.20.1 + define-properties: 1.2.0 + es-abstract: 1.21.2 dev: true /object.hasown@1.1.2: @@ -7079,7 +7172,7 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 + define-properties: 1.2.0 es-abstract: 1.21.2 dev: true @@ -7471,22 +7564,22 @@ packages: '@babel/runtime': 7.22.5 dev: true - /regexp.prototype.flags@1.4.3: - resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} + /regexp.prototype.flags@1.5.0: + resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 functions-have-names: 1.2.3 - dev: true - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - functions-have-names: 1.2.3 + set-function-name: 2.0.1 + dev: true /regexpu-core@5.3.2: resolution: {integrity: sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==} @@ -7607,7 +7700,7 @@ packages: resolution: {integrity: sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==} hasBin: true dependencies: - is-core-module: 2.12.0 + is-core-module: 2.13.0 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -7675,6 +7768,16 @@ packages: mri: 1.2.0 dev: false + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + dev: true + /safe-buffer@5.1.2: resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} @@ -7717,11 +7820,11 @@ packages: /semver@6.3.0: resolution: {integrity: sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==} hasBin: true + dev: true /semver@6.3.1: resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} hasBin: true - dev: true /semver@7.5.4: resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} @@ -7734,6 +7837,15 @@ packages: resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} dev: false + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + dev: true + /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -7874,12 +7986,12 @@ packages: resolution: {integrity: sha512-f48okCX7JiwVi1NXCVWcFnZgADDC/n2vePlQ/KUCNqCikLLilQvwjMO8+BHVKvgzH0JB0J9LEPgxOGT02RoETg==} dependencies: call-bind: 1.0.2 - define-properties: 1.1.4 - es-abstract: 1.20.1 - get-intrinsic: 1.1.2 + define-properties: 1.2.0 + es-abstract: 1.21.2 + get-intrinsic: 1.2.0 has-symbols: 1.0.3 - internal-slot: 1.0.3 - regexp.prototype.flags: 1.4.3 + internal-slot: 1.0.5 + regexp.prototype.flags: 1.5.0 side-channel: 1.0.4 dev: true @@ -7903,12 +8015,13 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 - /string.prototype.trimend@1.0.5: - resolution: {integrity: sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==} + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.2 + es-abstract: 1.22.2 dev: true /string.prototype.trimend@1.0.6: @@ -7918,12 +8031,12 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 - /string.prototype.trimstart@1.0.5: - resolution: {integrity: sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==} + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} dependencies: call-bind: 1.0.2 define-properties: 1.2.0 - es-abstract: 1.21.2 + es-abstract: 1.22.2 dev: true /string.prototype.trimstart@1.0.6: @@ -7933,6 +8046,14 @@ packages: define-properties: 1.2.0 es-abstract: 1.21.2 + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.0 + es-abstract: 1.22.2 + dev: true + /stringify-entities@4.0.3: resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} dependencies: @@ -8286,6 +8407,36 @@ packages: resolution: {integrity: sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==} engines: {node: '>=10'} + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + dev: true + /typed-array-length@1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -8741,6 +8892,17 @@ packages: is-weakmap: 2.0.1 is-weakset: 2.0.2 + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + dev: true + /which-typed-array@1.1.9: resolution: {integrity: sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==} engines: {node: '>= 0.4'}